主从环境搭建:
基础环境:
多个CentOS7,一个主节点,一个从节点
我这里使用docker进行主从节点的配置在一个虚拟机上
首先启动2个mysql容器实例,指定不同的端口,使用docker inspect 容器id查看本实例的ip(这里踩了坑,第一次使用虚拟机的ip来配置后面的从节点导致主从复制失败)
然后使用docker exec进入容器后更改/etc/my.cnf配置
主节点
[mysqld]
server-id=47
log_bin=master-bin
log_bin-index=master-bin.index
从节点
[mysqld]
server-id=48
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
log-bin=mysql-bin
log-slave-updates=1
然后重启容器,给主节点分配一个replication slave的权限
#登录主数据库 mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;
查看主节点同步状态: show master status;
这个指令结果中的File和Position记录的是当前日志的binlog文件以及文件中的索引引。
然后进入从节点容器中,根据获得的ip和刚才获得的File和Position进行填写后执行
CHANGE MASTER TO
MASTER_HOST='172.17.0.4',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=723,
GET_MASTER_PUBLIC_KEY=1;
然后就可以使用show slave status \G;查看状态,并且查看配置是否正确
最后就可以在主节点上操作库表数据来查看主从复制是否成功。
排除复制哪些库和表:
首先在Master端:在my.cnf中,可以通过以下这些属性指定需要针对哪些库或者哪些表记录binlog
#需要同步的二进制数据库名
binlog-do-db=masterdemo
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不备份的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys
然后在Slave端:在my.cnf中,需要配置备份库与主服务的库的对应关系。
#如果salve库名称与master库名相同,使用本配置
replicate-do-db = masterdemo
#如果master库名[mastdemo]与salve库名[mastdemo01]不同,使用以下配置[需要做映射]
replicate-rewrite-db = masterdemo -> masterdemo01
#如果不是要全部同步[默认全部同步],则指定需要同步的表
replicate-wild-do-table=masterdemo01.t_dict
replicate-wild-do-table=masterdemo01.t_num
配置完成了之后,在show master status指令中,就可以看到Binlog_Do_DB和Binlog_Ignore_DB两个参数的作用了。
半同步复制:
主节点安装插件install plugin rpl_semi_sync_master soname 'semisync_master.so';
可以通过show global variables
like
'rpl_semi%'
; 来查看状态
最重要的2个状态
| rpl_semi_sync_master_enabled | OFF | 是否开启
| rpl_semi_sync_master_timeout | 10000 | 超时时间
从节点安装插件
install plugin rpl_semi_sync_slave soname
'semisync_slave.so'
;
可以通过show global variables
like
'rpl_semi%'
; 来查看状态
然后从节点需要
stop slave; 在start slave;
MySQL自5.7版本后就已经支持并行复制了。可以在从服务上设置slave_parallel_workers为一个大于0的数,然后把slave_parallel_type参数设置LOGICAL_CLOCK
后面分库分表将使用ShardingSphere落地。