为什么要进行主从同步配置
随着数据的增多,单机的数据库往往支撑不住快速发展的业务,所以就需要读写分离的数据集群方式。集群的方式也可以有很多种,如一主一丛,一主多从,多主一丛等等。
而读写分离的实现方式就是通过主从配置,在主库上进行写操作,在从库上进行读操作;主库会同步数据到从库保证数据的一致性。
大部分的业务都是读操作远远大于写,所以当数据库遇到瓶颈的时候,还可以通过增加从库达到水平拓展,增加性能的目的。
主从同步的原理
主从同步的原理是master将写的操作按顺序记录下来,传给slave,然后slave根据操作日志,同步数据。
可以分别从master上slave查看对应的操作。
从master上看
1:当master上的数据发生变化时,按照顺序将该事件写入到bin-log中。
2:假如有slave链接到master,为slave开启binlog dump线程。
3:当binlog发生改变后,bin-log dump线程通知slave,将对应的binlog内容发送给slave。
从slave上看
1:开启主从同步后,首先创建两个线程,I/O线程和Sql线程。
2:I/O线程连接到master,master上的bin-log dump线程会将内容发送给该I/O线程,接收到内容后,将内容写入到本地的relay log中。
3:sql线程读取对应的relay log,根据里面的内容对slave数据库做相应的操作。
主从同步延迟及解决方案
从主从同步原理分析可知,数据的通过是通过master记录操作日志,slave再根据操作日志进行数据通过的,所以两者之间肯定存在延迟现象。
主从同步延迟的主要原因:
1:主库只针对写操作,顺序写binlog,效率很高。
2:从库的I/O线程到主库取日志,效率也比较搞。
3:从库的Sql线程是单线程,同时DML和DDL的IO操作也是随机的,不是有序的,也还有可能会和从库上的其它查询产生lock争用。
4:主库Tps较大,需要同步的数据超过从库一个sql线程所能承受的范围
所以综合来看,主要原因可能是数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机IO太高;次要原因:读写binlog带来的性能影响,网络传输延迟。
那么既然有延迟,应该如何解决呢?
主从同步延迟解决方案
1:架构方面
- 业务持久层采用分库架构,mysql服务平行拓展,分散压力。
- 单库读写分离,一主多从,读写分离,分散压力。
- 在业务层和mysql之间加入cache,降低mysql读压力。
- 不同业务的mysql放在不同机器,分散压力。
- 读库采用比主库更好的硬件设备
2:硬件方面
- 使用较好的服务器
- 加强服务器的I/O性能
3:mysql服务配置方面
主要是对从数据库进行一些配置,加快从数据库对数据的同步。
- 关闭binlog日志
binlog sync_binlog=0
- 不主动触发在提交事务后写入磁盘
innodb_flush_log_at_trx_commit=0
主从同步实践
主从同步的原理清楚了,那么就开始真正的实践一下主从同步。
1.环境清单
- 两台linux服务器,能相互ping通
- 在服务器上分别装有mysql,开启远程连接
准备的两台虚拟服务器分别为192.168.145.129,192.168.145.131,下文用129和131代替。其中131作为主库,129作为从库。
2.主库配置
1.修改msyql的my.cnf(默认路径/etc/my.cnf)添加如下:
log-bin=mysql-bin #[必须]启用二进制日志
server-id=1 #[必须]服务器唯一ID,默认是1,一般取IP最后一段
bind-address = 0.0.0.0 #这样表示允许所有网段连接,可根据实际情况指定网段
2.进入mysql终端,设置读取账号
-- 进入终端
mysql -uroot -p123djs;
-- 创建读取账号
-- 账号 backup 密码 backup123
CREATE USER 'backup'@'%' IDENTIFIED BY 'backup123';
-- 分配授权
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%';
-- 刷新权限表
flush privileges;
-- 退出mysql终端,重启mysql
service mysql restart;
3.使用原有读写账号查看master状态
show master status;
3.从库配置
1.修改msyql的my.cnf(默认路径/etc/my.cnf)添加如下:
#[可选]启用二进制日志,一般不启用
#log-bin=mysql-bin
#此ID需和master不一致
server-id=2
-- 退出mysql终端,重启mysql
service mysql restart;
2.登录mysql终端后,关联master的binlog
-- 进入终端
mysql -uroot -p123djs;
-- 其中log_file和log_pos要和之前master中的binglog文件名和日志位置一致。
change master to master_host='192.168.145.131',
master_user='backup',
master_password='backup123',
master_log_file='mysql-bin.000001',
master_log_pos=154;
3.启动从库,查看从库
-- 启动从库
start slave;
-- 查看从库
show slave status\G;
4.查看是否成功
需要Slave_IO_Running线程和Slave_SQL_Running同时为成功时才代表成功。
4.测试
主库上
-- 进入MySQL终端执行
create database test_slave;
从库上
-- 进入MySQL终端查看是否有test_slave
show databases;
至此,基本的mysql主从配置已经完成,实际应用时仍然要根据具体的场景,选择相应的主从方式,例如一主多从,主从级联等架构;同时,主从同步的优化也需要根据实际场景进行处理。
参考文章
1:Mysql主从基本原理,主要形式以及主从同步延迟原理 (读写分离)导致主库从库数据不一致问题的及解决方案