作者介绍
高强, DBAplus社群联合发起人,开源技术专家。擅长MySQL、PostgreSQL等产品的实施、运维和故障处理。曾参与多个省级政府单位项目的实施和运维工作,具有丰富的运维经验。
关于MySQL主从复制
复制技术顾名思义,就是通过数据库的复制技术以一份数据为主,复制成另一份存放,数据来源的那一份做为主库,存放复制数据的的称为从库。MySQL的复制方案有很多,比如主从复制、半同步复制、多主还有主主复制等。基本都是是通过把主库的操作写入二进制日志,将二进制日志传送到从库并且重演日志中记录的操作跟进主库状态以便达到在从库数据同步的效果。
其中, 主从复制可以变换、扩展出很多的组合方法,比如多源复制(多台master将数据发送到1台数据库)、1主多从或者还有从服务器再延伸出从服务器。
下面列举一些数据库主从复制架构:
注:主库为Master(1,2,..,N),从库为Slave(1,2,...,N)。
主从复制有如下一些优势:
分担负载: 对业务进行读写分离,减轻主库I/O负载,将部分压力分担到从库上,缩短客户查询响应时间。
增加健壮性: 在主库出现问题时,可通过多种方案将从库设置为主库,替换主库支撑业务,缩短停机窗口。
有利备份: 在从库上备份,即不影响主库的事务,也不影响主库性能和磁盘空间。
查询分析: 从库可以作为统计、报表等数据分析工作所使用的的OLAP库。
异地备份: 将从库放置在异地可作为异地数据同步备份所用。
从MySQL的5.7版本开始支持多源主从复制技术(Multi-Source Replication),就是将多个数据库(Master)的数据集中发送到1台从库(Slave)上,该技术也具有刚才上文提到的主从复制的优势,除了这些,它的独特性还在于:
汇聚数据: 尤其是在分库分表的一些场景中,数据集中统计分析操作可以在1台从库服务器上实现。
节省成本: 数据集中存放可避免服务器等软硬件资源浪费,5.7之前1主1从或者1主多从的方案需要为每个主机都安置一台备机;5.7推出多源复制之后,可以将多个从库进行合并,至于是合并存放在高端还是低端服务器上,取决于分析、统计等业务在整体业务中的优先级、繁忙程度等因素。
集中备份: 方便在一台服务器备份所有已收到的数据库数据。
异地灾备: 将从库放在距离远的地方,可用于异地备份项目。
基本的1主1从复制实现过程
下面咱们先循序渐进简单了解一下基本的1主1从(1 master,1 slave)复制的实现过程:
图中Master为主库的主机名,Slave为从库主机名。同步的数据库名为Music。从库接收主库(binlog dump线程)发过来的Binary Log,通过从库的I/O线程(I/O thread)将日志写入从库的Relay Log中,然后通过SQL线程(SQL thread)将日志的内容应用到从库中。
在从库上通过命令可以看到2个必备进程(I/O thread和SQL thread)在待命状态,线程状态如下:
线程的功能主要通过state字段确认:
I/O线程:
Waiting for master to send event
SQL(Coordinator)线程:
Slave has read all relay log; waiting for more updates
开启并发后还会有以下线程:
Worker线程:
Waiting for an event from Coordinator
多源复制的实现与1主1从的类似,都是发送二进制日志再重演,但是在SQL线程(SQL thread)上有略微区别,会为每个主库实例提供一套SQL和IO线程:
配置多源复制的操作方法
多源复制的配置比较简单:
stop slave;
SET GLOBAL master_info_repository = 'TABLE';
SET GLOBAL relay_log_info_repository = 'TABLE';
change master to master_host='192.168.5.160',master_user='slave1',master_password='gaoqiang' for channel 'master1';
change master to master_host='192.168.5.163',master_user='slave1',master_password='gaoqiang' for channel 'master2';