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-bin
server-id=1
## 同步日志
sync-binlog=1
## 忽略一些库
binlog-ignore-db=performance_schema
binlog-ignore-db=informance_schema
binlog-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;
##安装semi
install plugin rpl_semi_sync_master soname 'semisync_master.so';
##查看
show variables like '%semi%';
//============下面部分无视
##开启semi
set global rpl_semi_sync_master_enabled=1;
##1000毫秒
set global rpl_semi_sync_master_timeout=1000;
从库安装semi
进入mysql 安装配置semi##安装semi
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
##查看
show variables like '%semi%';
##开启semi
set 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文件
```sql
relay_log_recovery=1
slave_parallel_type=LOGICAL_CLOCK
slave_parallel_workers=8
relay_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_CLOCK
slave-parallel-workers=16
slave_pending_jobs_size_max = 2147483648
slave_preserve_commit_order=1
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON