主开启二进制日志
从开启中继日志(binlog)
1.主库数据更新写入二进制日志
2.从库开启io线程向主库请求二进制日志事件
3.主库为每个io线程开启dump线程向从库发送二进制日志事件
4.从库保存二进制日志事件到中继日志
5.从库开启SQL线程读取中继日志中的二进制事件并解析成sql语句进行重放/逐一执行。
1)STATEMENT:基于语句的复制(mysql默认采用基于语句的复制,执行效率高)
2)ROW:基于行的复制。
3)MIXED:混合类型的复制(默认采用基于语句复制,一旦发现无法精确复制时,就会采用基于行复制。
实验准备
1台主数据库,两台从数据库
主:192.168.116.60
从1:192.168.116.70
从2:192.168.116.80
systemctl status ntpd #检查ntpd服务是否开启
systemctl enable --now ntpd #设置永久并立即开启ntpd服务
vim /etc/ntp.conf
将第8行注释,并复制到下一行
restrict default nomodify #客户端不可以修改时间参数,但可以同步时间服务器
将22-25行注释,在下面添加时间同步:
server ntp.aliyun.com iburst #阿里云的服务器
server timel.aliyun.com iburst
systemctl restart ntpd #重启ntpd服务
netstat -lntup | grep ntpd #查看ntpd端口
date #查看当前时间
ntpq -p #查看当前ntp服务器状态
切到从服务器里
ntpdate 192.168.116.60 #跟主服务器做同步
crontab -e #创建计划任务
*/30 * * * * /usr/sbin/ntpdate 192.168.116.60 &> /dev/null
crontab -l #检查计划任务
vim /etc/my.cnf
server-id=1
log-bin=mysql_bin #添加,主服务器开启二进制日志
binlog_format=mixed #设置复制类型
配置完后重启
systemctl restart mysqld
给服务器做授权
grant replication slave on *.* to 'myslave'@'192.168.116.%' identified by '123456';
flush privileges;
show master status\G #查看当前状态
vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
innodb_buffer_pool_size=2048M
------------------------------------------------
server-id = 2 #修改,注意id与主的不同,两个从的id也要不同
relay-log=relay-log-bin #开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=relay-log-bin.index #定义中继日志文件的位置和名称,一般和relay-log在同一目录
systemctl restart mysqld #重启mysqld服务
mysql
change master to master_host='192.168.116.60',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与主机查询的一致
start slave; #刷新
show slave status\G; #查看bin-log日志通道连接状态
vim /etc/my.cnf
server-id = 3
relay-log=relay-log-bin
relay-log-index=relay-log-bin.index
innodb_buffer_pool_size=2048M
systemctl restart mysqld #重启服务
mysql
change master to master_host='192.168.116.60',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
在主服务器新建一个cxk的库
1、master服务器高并发,形成大量事务
2、网络延迟
3、主从硬件设备导致 (cpu主频、内存io、硬盘io)
4、是同步复制、而不是异步复制
从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。 从库使用SSD磁盘 网络优化,避免跨机房实现同步
mysql默认模式,效率最快,安全性最差
安全性最好,性能最差
介于二者之间,安全性和性能最均衡,一般情况下都会选择
//主数据库配置
vim /etc/my.cnf #在 [mysqld] 区域添加下面内容
......
plugin-load=rpl_semi_sync_master=semisync_master.so #加载mysql半同步复制的插件
rpl_semi_sync_master_enabled=ON #或者设置为"1",即开启半同步复制功能
rpl-semi-sync-master-timeout=1000 #超时时间为1000ms,即1s
systemctl restart mysqld
//从数据库配置
vim /etc/my.cnf
......
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=ON
systemctl restart mysqld
答:在半同步复制时,从库的响应时间超过了主库的响应时间,会自动降为异步模式
答:当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制。
5.7 版本的半同步复制中,独立出一个 ack collector thread ,专门用于接收 slave 的反馈信息。这样 master 上有两个线程独立工作,可以同时发送 binlog 到 slave ,和接收 slave 的反馈,达成并行。