文章目录
引言:在实际生产应用中,成熟的业务通常数据都比较大,单台MySQL在安全性、高可用性和高并发方面都无法满足实际的需求。所以需要配置多台数据库服务器,那么在配置多台数据库服务器时,如何确保各服务器的数据同步呢?
一.MySQL主从与读写分离原理
1.1MySQL主从复制原理
- 在每个事务更新数据完成之前,Master 在二进制日志(Binary loq)记录这些改变。写入二进制日志完成后,Master通知存储引擎提交事务。
- slave 将Master的复制到其中继日志(Relay log)。首先salave开始一个工作线程(I/0) ,I/0线程在Master上打开一个普通的连接,然后开始Binlog dump process. Binlog. dump process 从Master的二进制日志中读取事件,如果已经跟上Master,它会睡眠并等待Master产生新的事件,I/0线程将这些事件写入中继日志。
- SQL slave. thread ( SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与Master 中的数据一致,只要该线程与I/O 线程保持一致,中继日志通常会位于OS缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在slave上是串行化的, 也就是说Master上的并行更新操作不能在Slave上并行操作。
1.2主从复制类型
- 基于语句的复制(STATEMENT, MySQL默认 类型)
- 基于行的复制(ROW)
- 混合类型的复制(MIXED)
1.3MySQL主从复制方式
- 异步复制
默认同步方式是异步复制。主库将更新写入Binlog日志文件后,不需要等待数据更新是否已经复制到从库中,就可以继续处理更多的请求。Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。MySQL复制默认是异步复制,异步复制提供了最佳性能。 - 同步复制
主库将更新写入Binlog日志文件后,需要等待数据更新已经复制到从库中,并且已经在从库执行成功,然后才能返回继续处理其它的请求。同步复制提供了最佳安全性,保证数据安全,数据不会丢失,但对性能有一定的影响。 - 半同步复制
主库提交更新写入二进制日志文件后,等待数据更新写入了从服务器中继日志中,然后才能再继续处理其它请求。该功能确保至少有1个从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面了,才会通知主库上面的等待线程,该操作完毕。
半同步复制,是最佳安全性与最佳性能之间的一个折中。
MySQL 5.5版本之后引入了半同步复制功能,主从服务器必须安装半同步复制插件,才能开启该复制功能。如果等待超时,超过rpl_semi_sync_master_timeout参数设置时间(默认值为10000,表示10秒),则关闭半同步复制,并自动转换为异步复制模式。当master dump线程发送完一个事务的所有事件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为增强半同步复制。
ACK (Acknowledge character)即是确认字符。
二.主从复制服务搭建
2.1主从服务器时间同步
- 主服务器时间同步设置
#关闭防火墙
systemctl stop firewalld
setenforce 0
#安装时间同步软件
yum install ntp -y
#编辑配置文件
vim /etc/ntp.conf
#在最后添加如下配置
server 127.127.48.0
#设置本地是时钟源
fudge 127.127.48.0 stratum 8
#网段固定格式127.127.+自己的网段号,stratum时间层级为8(限制在15内)
#启动服务
systemctl start ntpd
更改ntp配置文件
- 从服务器时间同步设置
#关闭防火墙
systemctl stop firewalld
setenforce 0
#安装时间同步软件
yum install ntpdate -y
#进行时间同步
/usr/sbin/ntpdate 192.168.48.11
#添加周期性计划,定期同步时间
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.48.11
设置主服务器时间
同步从服务器时间,看是否同步
2.2主服务器配置
vim /etc/my.cnf
#添加如下配置
server-id = 1
log-bin=master-bin #添加主服务器
binglog_format = MIXED #开启二进日志
log-slave-updates=true #允许slave从master复制数据时可以写入到自己的二进制日志
#重启服务
systemctl restart mysqld
server-id = 1
log-bin=master-bin
binglog_format = MIXED
log-slave-updates=true
在/etc/my.cnf文件中的mysqld模块中添加如下内容
重启服务
systemctl restart mysqld
进入MySQL对从服务器进行授权
GRANT REPLICATION SLAVE ON *.* TO 'myslave1'@'192.168.48.%' IDENTIFIED BY '123456';
2.3从服务器配置
编辑配置文件
vim /etc/my.cnf
#添加配置如下
server-id = 2 #id号与主不能一样
relay-log