MySQL数据库复制概述

MySQL的主从复制是指从服务器向主服务器获取二进制日志文件,然后在从服务器上对这些日志重新执行,从而使从服务器和主服务器保持同步。但由于是异步的复制,从服务器在一定程度上落后于主服务器,刚写入到主服务器上的数据可能服务在从服务器上查询得到。

MySQL的复制原理:

(1)从服务器创建I/O线程连接主数据库,向主数据库请求二进制日志文件。

(2)主库上启动Binlog Dump,将二进制日志文件发送给I/O线程,I/O线程获取数据后将数据写在从库的中继日志中(relay log)。

(3)SQL线程读取中继日志并执行。

在主服务器上,记录二进制日志的方式有3种:

statement:基于语句级别的binlog,记录的是修改数据的sql语句。

row:基于行级别的binlog逐行记录数据的变更。

mixed:由MySQL数据库自动选择哪种方式记录binlog。

statement格式仅仅是记录操作的SQL语句,row格式会将每行数据的变化都记录到binlog中,相对于statement要详细的多,更能够保证主从数据库的一致性。但是row格式下的二进制日志文件会显得非常庞大,会影响磁盘I/O,在传输过程中也会影响带宽,所以需要根据具体情况来设定。

在一个非常繁忙的数据库上,主库上往往有多个线程并发执行写操作,而这些事件记录到二进制日志中一定是线性的。从库上只有一个SQL线程执行写操作,长此以往,从库与主库的差距会越来越大。这种情况下在从库上可以启动多个SQL线程用于执行写操作,每个线程负责执行主库上某个数据库的所有相关事务。还有在主库上一个事务提交之后,相关的记录不会立刻同步到磁盘上,而是记录在缓冲上,每隔一段时间同步一次。这样也可能会导致主从不一致,可以在主服务器上设置参数sync_binlog=1,一但事务提交,就将二进制日志文件从内存缓冲同步至磁盘上。

数据库复制搭建过程

一主多从架构

实验环境:主服务器(192.168.1.106),从服务器(192.168.1.127)

1)首先确保各服务器时间同步

2)安装MariaDB数据库,这里使用的是mariadb-10,二进制安装方式,mariadb-10中GTID机制已成为标配,不需要再手动启动。

[root@www ansible]# ansible mysql -m shell -a 'tar xf /root/mariadb-10.0.10-linux-x86_64.tar.gz -C /usr/local/'
[root@www ansible]# ansible mysql -m shell -a 'groupadd -g 300 -r mysql'
[root@www ansible]# ansible mysql -m shell -a 'useradd -u 300 -g mysql -r  mysql'
[root@www ansible]# ansible mysql -m shell -a 'ln -sv /usr/local/mariadb-10.0.10-linux-x86_64/ /usr/local/mysql'
[root@www ansible]# ansible mysql -m shell -a 'chown -R root.mysql /usr/local/mysql/*'
[root@www ansible]# ansible mysql -m shell -a 'chown -R mysql.mysql /data'
[root@www ansible]# ansible mysql -m shell -a 'mkdir /etc/mysql'
[root@www ansible]# ansible mysql -m shell -a 'cp /usr/local/mysql/support-files/my-large.cnf /etc/mysql/my.cnf'
[root@www ansible]# ansible mysql -m shell -a 'cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld'
[root@www ansible]# ansible mysql -m shell -a 'chkconfig --add mysqld'

在各个节点上/usr/local/mysql目录下执行初始化操作:

./scripts/mysql_install_db --user=mysql --datadir=/MySQL_DATA/data/

3)修改配置文件

主服务器上:

/etc/mysql/my.cnf:

datadir=/data/mydata                     #数据存放目录
log-bin=/data/binlogs/master-bin         #二进制日志存放位置
binlog_format=mixed                      #记录二进制日志格式
sync_binlog = 1                          #事务一提交,就将二进制日志同步至磁盘上
autocommit = off                         #关闭自动提交
server-id       = 1                      #服务器ID号innodb_support_xa       = 1              #支持分布式事务

从服务器上:

/etc/mysql/my.cnf:

server-id       = 2
datadir = /data/mydata
relay-log = /data/relaylog/relay-log   #中继日志存放目录
read_only       = 1                #从服务器为只读状态(确保数据的一致性)
slave_parallel_threads = 3         #启动的SQL线程数
sync_master_info = 1               #从服务器按需要同步master.info文件
sync_relay_log = 1                 #按需要同步中继日志
sync_relay_log_info = 1            #按需要同步relay.info文件

4)启动服务

[root@www ~]# ansible mysql -m shell -a 'service mysqld start'

5)在主服务器上登录mariadb,创建授权账号

MariaDB [(none)]> grant replication slave,replication client on *.* to repuser@'192.168.1.%' identified by 'repuser';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;

6)从服务器上,登录数据库使用有复制权限的账号连接master

首先查看主服务器二进制日志所处的位置(show master status;),如果服务器已经运行了一段时间,可以先对主服务器进行备份(备份至某个位置),在从服务器上恢复,再从该位置进行同步。

MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000007',master_log_pos=343;

从服务器上启动IO线程和sql线程

MariaDB [(none)]> start slave;或者MariaDB [(none)]> start slave IO_THREAD
MariaDB [(none)]> start slave SQL_THREAD

从服务器上查看运行状况:

相关线程已经启动,其中Seconds_Behind_Master显示了从服务器落后主服务器的时间,这个变量是通过当前服务器时间戳和二进制日志中事件的时间戳对比得到的(null为从库没有处于运行状态,0也有可能是复制中断了,这个参数经供参考)

在主服务器上可同过show slave hosts查看与自己同步的从服务器:

实现半同步复制

半同步就是主服务器上数据发生了更改,需要等待至少一个从节点把数据完整地复制过去,才能继续后续的操作。半同步功能是以插件的方式提供能,要启用此功能需要先安装插件。该插件位于mariadb安装目录下的lib/plugin目录中,登入数据库后直接安装即可。

主节点上安装插件

MariaDB [(none)]> install plugin rpl_semi_sync_master soname 'semisync_master.so';

在配置文件中添加如下几项:

rpl_semi_sync_master_enabled = 1
rpl_semi_sync_master_timeout = 1000

重启服务后查看相关变量:

MariaDB [(none)]> show global variables like '%semi%';
+------------------------------------+-------+
| Variable_name                      | Value |
+------------------------------------+-------+
| rpl_semi_sync_master_enabled       | ON    |
| rpl_semi_sync_master_timeout       | 1000  |
| rpl_semi_sync_master_trace_level   | 32    |
| rpl_semi_sync_master_wait_no_slave | ON    |
+------------------------------------+-------+


从节点上安装插件

MariaDB [(none)]> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

在配置文件中添加:

rpl_semi_sync_slave_enabled = 1

重启服务后查看相关变量:

MariaDB [(none)]> show global variables like '%semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+

该功能已启用.................^_^

双主复制架构

实验环境:node1(192.168.1.106),node2(192.168.1.126)

配置双主模型是需要注意几点:

(1) 双方节点都得创建具有复制权限用户;

(2) 双节点都得启用中继日志和二进制日志;

(3) 为保证具有自动增长功能的字段能正确生成ID,需要配置两个节点分别使用偶数或奇数ID号;

(4) 都要把对方配置为自己的主节点;

node1上配置文件:

[root@node1 ~]# vim /etc/mysql/my.cnf
log-bin = /data/binlog/master-bin
binlog_format = row
datadir = /data/mydata
sync_binlog = 1
autocommit = off
relay-log = /data/relaylog/relay-log    #中继日志存放位置
innodb_support_xa = 1
sync_master_info = 1
sync_relay_log = 1
sync_relay_log_info = 1
auto-increment-increment = 2            #自增长的间隔
auto-increment-offset = 1               #自增长起始值
slave_parallel_threads = 3
log_slave_updates = 1                   #开启从库更新操作写入二进制日志功能
server-id       = 1

node2上配置文件(除了下面3项其余的与node1上的配置一致):

[root@node1 ~]# vim /etc/mysql/my.cnf
.......
.......
auto-increment-increment = 2
auto-increment-offset = 2
server-id       = 2

在node1和node2上都创建具有复制权限的用户:

MariaDB [(none)]> grant replication slave,replication client on *.* to repuser@'192.168.1.%' identified by 'repuser';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;

查看node1和node2上当前数据库二进制日志文件所处的位置:

MariaDB [(none)]> show master status;

在node1上主服务器指向node2:

MariaDB [(none)]> change master to master_host='192.168.1.126',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;

在node2上主服务器指向node1:

MariaDB [(none)]> change master to master_host='192.168.1.106',master_user='repuser',master_password='repuser',master_log_file='master-bin.000004',master_log_pos=657;

最后启动I/O线程和SQL线程:

MariaDB [(none)]> start slave;

node1(192.168.1.106)上查看从节点状态:

node2(192.168.1.126)上查看从节点状态:

在双主模型中应用半同步功能,需要在两个节点上都安装插件,并配置主从相关的参数。

配置完成.................^_^

转载于:https://blog.51cto.com/ljbaby/1687710

MySQL/MariaDB数据库主从复制相关推荐

  1. MySQL Workbench 使用教程 - 如何使用 Workbench 操作 MySQL / MariaDB 数据库中文指南

    MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库管理软件,我们可以在自己的计算机上,使用图形化界面远程管理 MySQL 数据库. 有关 MySQL 远程管理软件,你可以选择 ...

  2. MySQL/MariaDB数据库

    指令 终端指令 mysql -uroot -p 回车 输入密码后再回车 source 全路径/xxx.sql;//导入*.sql批处理文件 show variables like '%collatio ...

  3. centos中用C/C++语言连接MySQL/MariaDB数据库

    centos中用C/C++语言连接MySQL/MariaDB数据库 安装MariaDB 设置字符集(别管是什么,干就完事了) 设置远程链接MariaDB 上C语言 安装MariaDB yum inst ...

  4. 设置MySQL/MariaDB 数据库默认编码为utf8mb4 (推荐)

    MySQL/MariaDB中的UTF-8并不是真正的UTF-8,其中的UTF8MB4才是真正的UTF-8.因此推荐使用UTF8MB4. 先查看自己数据库的默认字符集: MariaDB [(none)] ...

  5. mysql之数据库主从复制配置报错1677

    mysql之数据库某表字符集和数据库字符集不一致导致主从复制配置报错1677 mysql数据库中某张表字符集是utf8而my.cnf设置的数据库的字符集是utf8mb4,导致在配置主从复制时,报如下错 ...

  6. mariab修改mysql端口_修改mysql/MariaDB数据库的端口号+远程

    1.修改端口 2.远程+开放端口 (1)设置远程账号:xxx和密码yyyyyyy grant all privileges on *.* to 'xxx'@'%' identified by 'yyy ...

  7. Mysql linux数据库主从复制服务器搭建

    ** Mysql主从复制服务器搭建步骤 Mysql服务器主主复制容易出现的问题就是: ①数据混乱: ②主键可能重复: 从而为了提高MySQL服务器稳定性 ,就出现了MySQL服务器主从复制.MySQL ...

  8. HikariPool使用MySQL/MariaDB数据库报错解决:java.sql.SQLException: Access denied for user 'root'@'localhost' (u

    在使用HikariPool连接到我的数据库时报错如下,完整的报错放在最后: 2019-06-25 20:24:26.048 ERROR 18204 --- [nio-8080-exec-9] com. ...

  9. [MYSQL / Mariadb]数据库学习-库、表管理

    数据库基础的库.表管理 数据库基础 库管理 MySQL中加上system,可以执行Linux命令 一行写多个命令 表管理 建表 例: 查表架构 创建表记录 查表的创建命令和属性 加\G,可分行显示 修 ...

最新文章

  1. oracle tns 代理配置_OGG实现Oracle到MySQL数据平滑迁移
  2. [导入]阿贾克斯行动(中文版).pdf(2.48 MB)
  3. MySQL本人工具使用
  4. DelayQueue源码
  5. Backend cache is always enabled
  6. 第三届类型文学研讨会小记(转)
  7. [跟我学中小企业架构部署]之一:整体架构设计
  8. secureCRT连接服务器和文件传输( 一步搞定)
  9. linux性能测试工具的记录
  10. java 怎样 thread dump_怎样分析 JAVA 的 Thread Dumps
  11. 阿里程序员双11加班吃什么?
  12. 大白话理解LSTM神经网络(附实例讲解)
  13. 隐私计算技术|深度解读可信隐私计算框架“隐语”
  14. 蓝绿黄车牌识别(附Python代码)
  15. 数据分析:你的城市复工了吗?
  16. 淘宝详情页排版布局怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  17. PHP实现 记录网站访问量
  18. spark on yarn实战 +HA
  19. 计算机安全属性中可用性是,计算机安全的基本概念试题解析
  20. LM393芯片功能及原理

热门文章

  1. frida hook so导出函数
  2. 微软宣布Azure Migrate和Site Recovery服务增强功能
  3. (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  4. 分分钟玩转多进程编程
  5. CentOS 7 yum源安装Nginx
  6. day22 案例 发送邮箱激活码 购物车 分析
  7. 转载:DIV+CSS有可能遇到的问题
  8. 图像滤波与OpenCV中的图像平滑处理
  9. jquery form 序列化
  10. Fabio 安装和简单使用