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.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,则表示同步成功。
————————————————
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
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>修改配置文件
[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
<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