MySQL的AB复制

AB复制



目的:
1. 机械故障
2. 远程灾备
3. 高可用HA
4. 负载均衡
5. 读写分离


什么是MySQL的AB复制?
MySql的AB复制(replication、也叫主从复制)是一个异步的复制,从一个MySql实例(Master)复制到另一个mysql实例(Slave)。实现整个主从复制,需要由Master服务器上的IO进程,和Slave服务器上的Sql进程和IO进程共同完成。要实现主从复制,首先必须打开Master端的binary log(bin-log)功能,因为整个MySql复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己slave端完全顺序的执行日志中所记录的各种操作(二进制日志几乎记录了除select以外的所有针对数据库的sql操作语句)。

类型:
1. M
2. M-S
3. M-S-S
4. M-M
5. M-M-S-S


原理

概念
1. 在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中。
2. 备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中。
3. 备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上。

=======================================================================

下面将以一个实例来演示多主多从(MM-SS)AB复制情景:

搭建双主双从复制

第一步:搭建双主

master1:(192.168.1.119)-master2(192.168.1.113)

master1:

(1). 开启二进制日志,GTID
# vim /etc/my.cnf
server_id=1
log_bin=/var/lib/mysql/binlog/mysql-bin
binlog_format=statement
expire_logs_days=5
gtid_mode=ON
enforce_gtid_consistency=1
(2). 授权复制用户rep
# grant replication slave,replication client on *.* to 'rep'@'%' identified by '123';
(3). 备份数据
# mysqldump -p'12345' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
# scp 2019-02-27-mysql-all.sql 192.168.1.113:/tmp

master2:

(1). 测试rep用户:

# mysql -h master -urep -p123
(2). 启动二进制日志,GTID
# vim /etc/my.cnf
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
# service mysqld restart
(3). 恢复手动同步数据
mysql> set sql_log_bin=0;
mysql> source /tmp/2019-2-27-mysql-all.sql
(4). 设置主服务器
mysql> change master to
master_host='192.168.1.119',
master_user='rep',
master_password='12345',
master_auto_position=1;
mysql> start slave;
mysql> show slave status\G

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

master1:

mysql> change master to

master_host='192.168.1.113',

master_user='rep',

master_password='12345',

master_auto_position=1;

mysql> start slave;

mysql> show slave status\G

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

第二步:搭建双从

slave1(192.168.1.114)-slave2(192.168.1.115)

(1) 同步现有数据库:

master1:

# mysqldump -p'12345' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql

# scp 2019-02-27-mysql-all.sql 192.168.1.114:/tmp

# scp 2019-02-27-mysql-all.sql 192.168.1.115:/tmp

slave1:

# mysql -p12345 < /tmp/2019-02-27-mysql-all.sql

slave2:

# mysql -p12345 < /tmp/2019-02-27-mysql-all.sql

(2). 启动从服务器id,gtid

slave1:

# vim /etc/my.cnf

server-id=3

gtid_mode=ON

enforce_gtid_consistency=1

master-info-repository=TABLE

relay-log-info-repository=TABLE

# service mysqld restart

slave2:

# vim /etc/my.cnf

server-id=4

gtid_mode=ON

enforce_gtid_consistency=1

master-info-repository=TABLE

relay-log-info-repository=TABLE

# service mysqld restart

(3). 设置主服务器

slave1:

mysql> change master to

master_host='192.168.1.119',

master_user='rep',

master_password='12345',

master_auto_position=1 for channel '192.168.1.119';

mysql> change master to

master_host='192.168.1.113',

master_user='rep',

master_password='12345',

master_auto_position=1 for channel '192.168.1.113';

mysql> start slave;

mysql> show slave status\G

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

slave2:

同上

图1:master1:192.168.1.119

图2:master2:192.168.1.113

图3:slave1:192.168.1.114:

图4:slave2:192.168.1.115:

=============================================================================================

项目说明:

1. /etc/my.cnf中配置语句:

gtid_mode=ON
enforce_gtid_consistency=1

表示开启GTID。

GTID的组成:
GTID = source_id:transaction_id
source_id源id,用于鉴别原服务器,即mysql服务器唯一的的server_uuid,由于GTID会传递到slave,所以也可以理解为源ID。
transaction_id事务id,为当前服务器上已提交事务的一个序列号,通常从1开始自增长的序列,一个数值对应一个事务。
示例:
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
前面的一串为服务器的server_uuid,即3E11FA47-71CA-11E1-9E33-C80AA9429562,后面的23为transaction_id


GTID的工作原理:
1. master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
2. slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
3. sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
4. 如果有记录,说明该GTID的事务已经执行,slave会忽略。
5. 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。

开启GTID的好处在于从服务器手动执行主服务器mysqldump产生的sql文件后,不用根据手动获取主服务器二进制文件的切断点。

2. MM-SS模式下从服务器的配置文件说明:

会另外添加如下:

master-info-repository=TABLE
relay-log-info-repository=TABLE

从机把主的信息存在主信息仓库里。主信息库可以是文件也可以上表,具体由master-info-repository参数值决定。master-info-repository=file时 会生成master.info 和 relay-log.info两个文件,如果master-info-repository=table,信息就会存在mysql.master_slave_info表中。

实际上,MM-SS模式相当于有两台服务器(MM)的写操作可同时被4台服务器的Mysql所同步。

如上图所示,我们甄别MM-SS模式是否搭建成功的标志是:

在任意一台服务器的MySQL中执行show slave status\G都会得到如下两行提示:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

分别说明从服务器的IO线程和SQL线程处于运行状态。这样AB复制就能正常进行。

常见报错可能Slave_IO_Running一直处于Connecting状态。这时候我们需要验证在当前slave服务器,是否可以正确地用相应master服务器的rep用户登陆。

测试rep用户是否可用
# mysql -h master_ip_addr -urep -pkey

猜你喜欢

转载自blog.csdn.net/Ezra1991/article/details/88046271
ab