mysql主从、基于GTID主从、半同步复制、双主、多源、并行、组复制

一、主从复制

1.Master配置

1.1 配置文件my.cnf的修改

#编辑my.cnf文件
[root@localhost mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=1
log_bin=master-bin
#log_bin_index=master-bin.index
#binlog_do_db=test
#备注:
#server-id 服务器唯一标识。
#log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
#binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
#binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。

1.2 创建从服务器的用户和权限

#创建从数据库的masterbackup用户和权限
mysql> create user 'repl'@'192.168.17.%' identified by '123456';
mysql> grant replication slave on *.* to repl@'192.168.17.%' identified by '123456';
mysql> flush privileges;
#备注
#192.168.17.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
#若将 192.168.17.% 改为 %,则任何ip均可作为其从数据库来访问主服务器

1.3 重启mysql服务

[root@localhost mysql]# service mysql restart

1.4 查看主服务器状态

mysql> show master status;

2 Slave从服务器配置

2.1 配置文件my.cnf的修改

#编辑my.cnf文件
[root@localhost mysql]# vim /etc/my.cnf
#在[mysqld]中添加:
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test
#备注:
#server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
#relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。
#replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
#replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。

2.2 重启mysql服务

[root@localhost mysql]# service mysql restart

2.3 连接master服务器

#连接master主服务器
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='repl',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#备注:
#master_host对应主服务器的IP地址。
#master_port对应主服务器的端口。
#master_log_file对应show master status显示的File列:master-bin.000001。
#master_log_pos对应show master status显示的Position列:154。

2.4 启动slave数据同步

#启动slave数据同步
mysql> start slave;
 
#停止slave数据同步(若有需要)
mysql> stop slave;

2.5 查看slave信息

mysql> show slave status\G;
Slave_IO_Running和Slave_SQL_Running都为yes,则表示同步成功。

————————————————

二、基于GTID主从复制

1、Master配置

<1>修改配置文件并重新启动

[root@master ~]# vim /etc/my.cnf
  server-id=1
  log-bin=mysql-bin 
  gtid_mode=ON           ##开启gtid模块
  enforce-gtid-consistency=ON
 [root@master ~]# /etc/init.d/mysqld restart

<2>master授权配置

mysql> create user 'repl'@'192.168.17.%' identified by '123456';
mysql> grant replication slave on *.* to repl@'192.168.17.%' identified by '123456';
mysql> flush privileges;

2、Slave配置

<1>修改配置文件并重新启动

[root@slave~]# vim /etc/my.cnf
  server-id=2
  gtid_mode=ON           ##开启gtid模块
  enforce-gtid-consistency=ON
 [root@master ~]# /etc/init.d/mysqld restart

<2> slave配置同步

mysql> change master to master_host='192.168.17.132', master_user='repl',master_password='123',master_port=3306,master_auto_position=1;
mysql> start slave;

3、查看状态

mysql>  select * from gtid_executed;
mysql>  show master status\G;
mysql>  show slave status\G;

————————————————

三、半同步复制

注:先实现一主从复制配置步骤,再实现以下半同步配置
Master执行:
<1>安装插件

mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
#查看插件是否加载成功
mysql> show global variables like 'Rpl_semi%';
mysql> show plugins;

<2>修改配置文件

主库my.cnf配置文件中添加:
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1

<3>查看半同步是否在运行

mysql> show status like 'Rpl_semi_sync_master_status';

Slave执行:
<1>安装插件

mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#查看插件是否加载成功
mysql> show global variables like 'Rpl_semi%';
mysql> show plugins;

<2>修改配置文件

从库my.cnf配置文件中添加:
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1

在个别高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制!即在主从数据库的my.cnf配置文件中都要添加:

plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1

<3>从数据库上的IO线程重启

mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;

<4>查看半同步是否在运行

mysql> show status like 'Rpl_semi_sync_slave_status';

————————————————

四、双主复制

环境
master:182.148.15.238
slave: 182.148.15.237

1、Master配置
<1>在master上的my.cnf配置:

[root@master ~]# vim /usr/local/mysql/my.cnf
server-id = 1       
log-bin = mysql-bin 
sync_binlog = 1
auto-increment-increment = 2   
auto-increment-offset = 1  
binlog-ignore-db = mysql,information_schema
binlog_checksum = none
binlog_format = mixed
slave-skip-errors = all    
    
[root@master ~]# /etc/init.d/mysql restart

<2>数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql)

mysql> grant replication slave,replication client on *.* to slave@'182.148.15.237' identified by "slave@123";
mysql> flush privileges;

<3>查看状态

mysql> show master status;

<4>最好将库锁住,仅仅允许读,以保证数据一致性;待主主同步环境部署后再解锁;锁住后,就不能往表里写数据,但是重启mysql服务后就会自动解锁!

mysql> FLUSH TABLES WITH READ LOCK;    //注意该参数设置后,如果自己同步对方数据,同步前一定要记得先解锁!

2、Slave复制
<1>编辑配置文件

[root@slave ~]# vim /usr/local/mysql/my.cnf
server-id = 2      
log-bin = mysql-bin 
auto-increment-increment = 2   
auto-increment-offset = 2  
binlog-ignore-db = mysql,information_schema
sync_binlog = 1
binlog_checksum = none
binlog_format = mixed
slave-skip-errors = all
  
[root@slave ~]# /etc/init.d/mysql restart

<2>数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql)
同理,slave也要授权给master机器远程同步数据的权限

mysql> grant replication slave ,replication client on *.* to slave@'182.148.15.238' identified by "slave@123"; 
mysql> flush privileges;

<3>查看状态

mysql> show master status;

<4>最好将库锁住,仅仅允许读,以保证数据一致性;待主主同步环境部署后再解锁;锁住后,就不能往表里写数据,但是重启mysql服务后就会自动解锁!

mysql> FLUSH TABLES WITH READ LOCK;    //注意该参数设置后,如果自己同步对方数据,同步前一定要记得先解锁!

3)执行主主同步操作

#(1)在slave数据库上做同步master的设置(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)
mysql> unlock tables;     //先解锁,将对方数据同步到自己的数据库中
mysql> slave stop;
mysql> change master to master_host='182.148.15.238',master_user='slave',master_password='slave@123',master_log_file='master-bin.000001',master_log_pos=1970;
mysql> start slave;
mysql> show slave status \G;

#(2)在master数据库上做同步slave的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)
mysql> unlock tables;
mysql> slave stop;
mysql> change master to master_host='182.148.15.237',master_user='slave',master_password='slave@123',master_log_file='master-bin.000001',master_log_pos=4136;
mysql> start slave;
mysql> show slave status \G;

————————————————

五、多源复制

环境
主库100:IP=192.168.10.212; PORT=4300; server-id=100;
主库200:IP=192.168.10.212; PORT=4400; server-id=200;
主库300:IP=192.168.10.212; PORT=4500; server-id=300;
从库400:IP=192.168.10.212; PORT=4345; server-id=400;

1、【主库100/200/300】分别操作及配置
<1>编辑配置文件

[root@master ~]# vim /etc/my.cnf
  server-id=100/200/300
  log-bin=mysql-bin 
  expire_logs_days =7        #二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。

<2>创建授权用户

连接mysql主数据库,键入命令mysql -u root -p,输入密码后登录数据库。创建用户用于从库同步复制,授予复制、同步访问的权限

mysql> grant replication slave on *.* to 'slave'@'%' identified by '123456';

<3>查看二进制日志是否开启

mysql> show variables like 'log_bin';

<4>查看master状态

mysql> show master status \G;

2、【从库400】操作及配置
<1>编辑配置文件

[root@master ~]# vim /etc/my.cnf
server-id = 400
master_info_repository      = table
relay_log_info_repository   = table     
mysql> stop slave;
Query OK, 0 rows affected

mysql> CHANGE MASTER TO 
MASTER_HOST='192.168.10.212',
MASTER_PORT=4300,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=438 
for channel '300';
Query OK, 0 rows affected

mysql> CHANGE MASTER TO 
MASTER_HOST='192.168.10.212',
MASTER_PORT=4400,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=438 
for channel '400';
Query OK, 0 rows affected

mysql> CHANGE MASTER TO 
MASTER_HOST='192.168.10.212',
MASTER_PORT=4500,
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=438 
for channel '500';
Query OK, 0 rows affected

mysql> start slave;
Query OK, 0 rows affected

五、组复制MGR

MySQL的组复制可以配置为单主模型和多主模型两种工作模式,它们都能保证MySQL的高可用。以下是两种工作模式的特性简介:

单主模型:从复制组中众多个MySQL节点中自动选举一个master节点,只有master节点可以写,其他节点自动设置为read only。当master节点故障时,会自动选举一个新的master节点,选举成功后,它将设置为可写,其他slave将指向这个新的master。
多主模型:复制组中的任何一个节点都可以写,因此没有master和slave的概念,只要突然故障的节点数量不太多,这个多主模型就能继续可用。

单主模型是如何自动选举主节点?

首先,在第一个MySQL节点s1启动时,一般会将其设置为组的引导节点,所谓引导就是在启动组复制功能时去创建一个复制组。当然,这并非强制要求,也可以设置第二个启动节点作为组的引导节点。因为组内没有其他节点,所以这第一个节点会直接选为master节点。

然后,如果有第二个节点要加入组时,新节点需要征得组的同意,因为目前只有一个节点,所以只需s1节点同意即可。新节点在加入组时,首先会联系s1,与s1建立异步复制的通道,并从s1节点处获取s2上目前缺失的数据,等到s1和s2节点上的数据同步后,s2节点就会真正成为组中的新成员。当然,实际过程要比这里复杂一些,本文不会过多讨论。

如果还有新节点(比如s3节点)继续加入组,s3将从s1或s2中选一个,并与之建立异步复制的通道,然后获取缺失的数据,同步结束后,如果s1和s2都同意s3加入,那么s3将会组中的新成员。其余节点加入组也依次类推。

有两点需要注意:

新节点加入组时,如何选择联系对象?

上面说加入第二个节点s2时会联系s1,加入s3时会联系s1、s2中的任意一个。实际上,新节点加入组时联系的对象,称为donor,意为数据供应者。新节点会和选中的donor建立异步复制通道,并从donor处获取缺失的数据。

在配置组复制时,需要指定种子节点列表。当新节点加入组时,只会联系种子节点,也即是说,只有种子节点列表中的节点才有机会成为donor,没有在种子节点列表中的节点不会被新节点选中。但建议,将组中所有节点都加入到种子列表中。

当联系第一个donor失败后,会向后联系第二个donor,再失败将联系第三个donor,如果所有种子节点都联系失败,在等待一段时间后再次从头开始联系第一个donor。依此类推,直到加组失败报错。

环境
192.168.100.21 s1
192.168.100.22 s2
192.168.100.23 s3

1、S1配置

<1>修改配置文件

[mysqld]
datadir=/data
socket=/data/mysql.sock

server-id=100                      # 必须
gtid_mode=on                       # 必须
enforce_gtid_consistency=on        # 必须
log-bin=/data/master-bin           # 必须
binlog_format=row                  # 必须
binlog_checksum=none               # 必须
master_info_repository=TABLE       # 必须
relay_log_info_repository=TABLE    # 必须
relay_log=/data/relay-log          # 必须,如果不给,将采用默认值
log_slave_updates=ON               # 必须
sync-binlog=1                      # 建议
log-error=/data/error.log
pid-file=/data/mysqld.pid

#表示写集合以XXHASH64的算法进行hash。所谓写集,是对事务中所修改的行进行的唯一标识,在后续检测并发事务之间是否修改同一行冲突时使用。它基于主键生成,所以使用组复制,表中必须要有主键。
transaction_write_set_extraction=XXHASH64         # 必须
#表示这个复制组的名称
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"  # 必须
#表示组复制功能不随MySQL实例启动而启动。虽然,可以将组复制插件和启动组复制功能的选项写在配置文件里,但强烈建议不要如此,而是每次手动去配置。
loose-group_replication_start_on_boot=off        # 建议设置为OFF
#表示该节点在组中的权重为40。权重越高,自动选举为primary节点的优先级就越高。
loose-group_replication_member_weigth = 40   # 非必需,mysql 5.7.20才开始支持该选项
表示本机上用于组内各节点之间通信的地址和端口。
loose-group_replication_local_address="192.168.100.21:20001"   # 必须
#设置本组的种子节点
loose-group_replication_group_seeds="192.168.100.21:20001,192.168.100.22:20002"    # 必须

<2>重启mysql
[root@xuexi ~]# systemctl restart mysqld

<3>创建并授权用于复制的用户
mysql> create user repl@‘192.168.100.%’ identified by ‘123456’;
mysql> grant replication slave on . to repl@‘192.168.100.%’;

<4>配置节点加组时的通道
在新节点加入组时,首先要选择donor,新节点和donor之间的异步复制就是通过一个名为group_replication_recovery的通道(通道名固定,不可使用自定义通道)进行数据恢复的,经过数据恢复后,新节点填充了它缺失的那部分数据,这样就和组内其他节点的数据保持了同步。
group_replication_recovery通道的relay log用于新节点加入组时,当新节点联系上donor后,会从donor处以异步复制的方式将其binlog复制到这个通道的relay log中,新节点将从这个recovery通道的relay log中恢复数据。

#执行change master to语句设置恢复通道
mysql> change master to  master_user='repl', master_password='123456'
            for channel 'group_replication_recovery';
#这里的用户名、密码和通道在组复制中有一个专门的术语:通道凭据(channel credentials),是连接donor的关键。

<5>安装组复制插件,并启动组复制功能。

mysql> install plugin group_replication soname 'group_replication.so';
mysql> set @@global.group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set @@global.group_replication_bootstrap_group=off;

这里的过程很重要,需要引起注意。在开启组复制之前,设置全局变量group_replication_bootstrap_group为on,这表示稍后启动的组复制功能将引导组,也就是创建组并配置组,这些都是自动的。配置引导变量为ON后,再开启组复制插件功能,也就是启动组复制。最后将引导变量设回OFF,之所以要设置回OFF,是为了避免下次重启组复制插件功能时再次引导创建一个组,这样会存在两个名称相同实际却不相同的组。

这几个过程不适合放进配置文件中,强烈建议手动执行它们的。否则下次重启mysql实例时,会自动重新引导创建一个组。同理,除了第一个节点,其他节点启动组复制功能时,不应该引导组,所以只需执行其中的start语句,千万不能开启group_replication_bootstrap_group变量引导组。
当启动组复制功能后,将生成另一个通道group_replication_applier的相关文件
常规复制有两个复制线程:io线程和sql线程,在组复制中,不再称之为io_thread和sql_thread,取而代之的是receiver、certifier和applier。

receiver的作用类似于io线程,用于接收组内个节点之间传播的消息和事务。也用于接收外界新发起的事务。
applier的作用类似于sql线程,用于应用relay log中的记录。不过,组复制的relay log不再是relay log,而是这里的组复制relay log:relay-log-group_replication_applier.00000N。
certifier的作用在receiver接收到消息后,验证是否有并发事务存在冲突问题。冲突检测通过后,这条消息就会写入到组复制的relay log中,等待applier去应用。
并不是说组复制中没有io线程和sql线程,而是称呼改变了,receiver和applier实际上就是io_therad和sql_thread。

<6>查看这个节点是否成功加入到组中,成功加入组的标志是被设置为"ONLINE"

select * from performance_schema.replication_group_members\G

2、S2/S3配置

<1>修改配置文件

[mysqld]
datadir=/data
socket=/data/mysql.sock

server-id=110                      # 必须
gtid_mode=on                       # 必须
enforce_gtid_consistency=on        # 必须
log-bin=/data/master-bin           # 必须
binlog_format=row                  # 必须
binlog_checksum=none               # 必须
master_info_repository=TABLE       # 必须
relay_log_info_repository=TABLE    # 必须
relay_log=/data/relay-log          # 必须,如果不给,将采用默认值
log_slave_updates=ON               # 必须
sync-binlog=1                      # 建议
log-error=/data/error.log
pid-file=/data/mysqld.pid

#表示写集合以XXHASH64的算法进行hash。所谓写集,是对事务中所修改的行进行的唯一标识,在后续检测并发事务之间是否修改同一行冲突时使用。它基于主键生成,所以使用组复制,表中必须要有主键。
transaction_write_set_extraction=XXHASH64         # 必须
#表示这个复制组的名称
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"  # 必须
#表示组复制功能不随MySQL实例启动而启动。虽然,可以将组复制插件和启动组复制功能的选项写在配置文件里,但强烈建议不要如此,而是每次手动去配置。
loose-group_replication_start_on_boot=off        # 建议设置为OFF
#表示该节点在组中的权重为40。权重越高,自动选举为primary节点的优先级就越高。
loose-group_replication_member_weigth = 20   # 非必需,mysql 5.7.20才开始支持该选项
#表示本机上用于组内各节点之间通信的地址和端口。
loose-group_replication_local_address="192.168.100.22:20002"   # 必须
#设置本组的种子节点
loose-group_replication_group_seeds="192.168.100.21:20001,192.168.100.22:20002"    # 必须

<2>选择donor并与其建立通道连接

mysql> change master to 
            master_user='repl',
            master_password='123456'
            for channel 'group_replication_recovery';

<3>主库上执行,查询通道连接

 mysql> select * from mysql.slave_master_info\G

<4>安装组复制插件,并开启组复制功能。

mysql> install plugin group_replication soname 'group_replication.so';
mysql> start group_replication;

<5>查看这个节点是否成功加入到组中,成功加入组的标志是被设置为"ONLINE"

mysql> select * from performance_schema.replication_group_members\G 

你可能感兴趣的:(mysql)