您现在的位置是:首页 >学无止境 >mysql主从复制网站首页学无止境
mysql主从复制
系列文章目录
`
文章目录
一、mysql主从复制原理
1.mysql的复制类型
基于SQL语句的复制(STATEMENT默认)
基于行的复制(ROW)
混合类型的复制(MIXED)
2.mysql主从复制的工作原理
主服务器 master 记录数据库通过 dump 线程将操作记录到二进制线程。
从服务器开启I/O线程向主服务器发送同步日志的请求。
主服务器把二进制日志内容发送给从服务器。
从服务器将二进制日志记录的操作同步到中继日志。
从服务器中的sql线程将中继日志记录的操作在从服务器执行后写入从服务器数据库。
主从复制延迟
二、mysql数据库三种同步方式
1. 异步复制(Async Replication)
默认同步方式是异步复制。主库将更新写入Binlog日志文件后,不需要等待数据更新是否已经复制到从库中,就可以继续处理更多的请求。Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。MySQL复制默认是异步复制,异步复制提供了最佳性能。
2. 同步复制(Sync Replication)
主库将更新写入Binlog日志文件后,需要等待数据更新已经复制到从库中,并且已经在从库执行成功,然后才能返回继续处理其它的请求。同步复制提供了最佳安全性,保证数据安全,数据不会丢失,但对性能有一定的影响。
3. 半同步复制(Semi-Sync Replication)
主库提交更新写入二进制日志文件后,等待数据更新写入了从服务器中继日志中,然后才能再继续处理其它请求。该功能确保至少有1个从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面了,才会通知主库上面的等待线程,该操作完毕。
半同步复制,是最佳安全性与最佳性能之间的一个折中。
MySQL 5.5版本之后引入了半同步复制功能,主从服务器必须安装半同步复制插件,才能开启该复制功能。如果等待超时,超过rpl_semi_sync_master_timeout参数设置时间(默认值为10000,表示10秒),则关闭半同步复制,并自动转换为异步复制模式。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为增强半同步复制。
ACK (Acknowledge character)即是确认字符。
三、mysql主从复制实验
Mysql主从服务器时间同步
主服务器(192.168.169.20)
yum -y install ntp
vim /etc/ntp.conf
server 127.127.169.0 #设置本地是时钟源,注意修改网段
fudge 127.127.169.0 stratum 8 #设置时间层级为8(限制在15内)
systemctl start ntpd
从服务器配置
从服务器(192.168.169.30)、(192.168.169.40)
yum -y install ntp ntpdate
service ntpd start
/usr/sbin/ntpdate 192.168.169.20 #进行时间同步,指向Master服务器IP
创建定时任务
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.169.20
主服务器的mysql配置
vim /etc/my.cnf2
server-id = 1
log-bin=master-bin #添加,主服务器开启二进制日志
log-slave-updates=true #添加,允许从服务器更新二进制日志
binlog_format = MIXED
systemctl restart mysqld
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.169.10' IDENTIFIED BY 'abc123';
#给从服务器授权
FLUSH PRIVILEGES;
show master status;
#File 列显示日志名,Fosition 列显示偏移量
从服务器mysql配置
vim /etc/my.cnf
server-id = 2 #修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin #添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index #添加,定义中继日志文件的位置和名称
relay_log_recovery = 1 #选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。
systemctl restart mysqld
mysql -u root -p
change master to master192.168.169.10',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=604;
#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,这里的是例子,每个人的都不一样
start slave; #启动同步,如有报错执行 reset slave;
show slave statusG #查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes #负责与主机的io通信
Slave_SQL_Running: Yes #负责自己的slave mysql进程
实验结果
在主创建一个wj库
查看从一
查看从二
总结
面试题:从服务器如何去查看它的状态?
查看线程状态,要保证同数据库下的两个线程都为YES
IO线程:
SQL线程:
为NO的原因,主从的网络不通,主的地址、名称、密码等有问题。
检查防火墙有没有打开,端口号有没有开放,主的mysql文件和从的mysql文件