MySQL主从模式是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,从节点可以复制主数据库中的所有数据库,或者特定的数据库,或者特定的表。
mysql主从复制用途:
- 实时灾备,用于故障切换(高可用)
- 读写分离,提供查询服务(读扩展)
- 数据备份,避免影响业务(高可用)
主从复制整体分为以下三个步骤:
- 主库将数据库的变更操作记录到Binlog日志文件中
- 从库读取主库中的Binlog日志文件信息写入到从库的Relay Log中继日志中
- 从库读取中继日志信息在从库中进行Replay,更新从库数据信息
搭建流程
- 主服务器master
- 从服务器 slave
主服务器
- 从库服务器能连通主库
- 主库开启binlog日志(设置log-bin参数)
- 主从server-id不同
配置etc下的my.cnf(my.ini)文件
#开启binlog日期log_bin=mysql-binserver-id=1## 同步日志sync-binlog=1## 忽略一些库binlog-ignore-db=performance_schemabinlog-ignore-db=informance_schemabinlog-ignore-db=sys## 同步一些表binlog-do-db=xxx(表名)
修改后重启mysql
systemctl restart mysqld
授权
进入mysql的命令行
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by 'root';GRANT all privileges ON *.* TO 'root'@'%' identified by 'root';//刷新flush privileges;
查询主库状态
show master status
从服务器
配置etc下的my.cnf(my.ini)文件
## 同步日志sync-binlog=1## 中继日志relay_log=mysql-relay-bin##只读属性read_only=1
修改后重启mysql
systemctl restart mysqld
清楚库状态
show master status ## 从库中如果有值,说明之前做过stop slave; ##先停步slave服务线程,这个是很重要的,
同步复制进入mysql的命令行
change master to master_host='192.168.182.128',master_port=3306,master_user='root',master_password='root',master_log_file='nysql_bin.000002',master_log_pos=154;
查询从库状态
show master status \G; ## 从库中如果有值,说明之前做过start slave;
问题
mysql主从复制存在的问题:
- 主库宕机后,数据可能丢失
从库只有一个SQL Thread,主库写压力大,复制很可能延时
解决方法:
- 半同步复制—解决数据丢失的问题
并行复制——解决从库复制延迟的问题半同步复制
semi-sync意思是MASTER只需要接收到其中一台SLAVE的返回信息,就会commit;否则需等待直至切换成异步再提交主库安装semi
进入mysql 安装配置semi##是否支持动态加载select @@have_dynamic_loading;##开启插件show plugins;##安装semiinstall plugin rpl_semi_sync_master soname 'semisync_master.so';##查看show variables like '%semi%';//============下面部分无视##开启semiset global rpl_semi_sync_master_enabled=1;##1000毫秒set global rpl_semi_sync_master_timeout=1000;
从库安装semi
进入mysql 安装配置semi##安装semiinstall plugin rpl_semi_sync_slave soname 'semisync_slave.so';##查看show variables like '%semi%';##开启semiset global rpl_semi_sync_master_enabled=1;## 重启stop slave;start slave;
全同步复制
为了兼容MySQL 5.6基于库的并行复制,5.7引入了新的变量slave-parallel-type,其可以配置的值有:
DATABASE(默认值,基于库的并行复制方式)、LOGICAL_CLOCK(基于组提交的并行复制方式)。 ```sql show variables like ‘%binlog_group%’;先关闭
stop slave;提交的时间
set global binlog_group_commit_sync_delay=1000;提交的组数量
set global binlog_group_commit_sync_no_delay_count=100;
show variables like ‘%slave%’;
并行组提交方式
set global slave_parallel_type=LOGICAL_CLOCK;
线程数
set global slave_parallel_workers=8;
show variables like ‘%relay_log%’;
转发的日志回复
set global relay_log_recovery=1;
存储方式
set relay_log_info_repository=’table’;
直接写配置文件与set global的区别<br />set global后重启服务,配置属性消失<br />写到my.ini文件中,不会消失<br />配置etc下的my.ini文件```sqlrelay_log_recovery=1slave_parallel_type=LOGICAL_CLOCKslave_parallel_workers=8relay_log_info_repository=table;master_info_repository=table;#重启systemctl restart mysqld# 查询show variables like '%relay_log%';
并行复制配置与调优
binlog_transaction_dependency_history_size 用于控制集合变量的大小
binlog_transaction_depandency_tracking 控制binlog文件中事务之间的依赖关系
transaction_write_set_extraction 用于控制事务的检测算法
master_info_repository 性能提升
slave_parallel_workers SQL线程
slave_preserve_commit_order 实现更小粒度的并行复制
slave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=16slave_pending_jobs_size_max = 2147483648slave_preserve_commit_order=1master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ON
