微博微信等超级APP都会使用的MySQL主从架构并没有你想像的那么难

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:57   1772   0

提到MySQL数据库优化,很多人脑海里会立即闪现出MySQL优化相关的词汇,例如:存储引擎、字段类型、范式、索引、缓存、表分区、SQL优化、主从复制等等。你可能会有这样的疑问,既然有这么多的优化方法可以选择,那什么时候才会考虑MySQL需要做主从复制了呢?MySQL主从复制又该如何实现?

首先需要说明的是,像微博、微信等超级APP后端的数据库架构是非常之复杂的,并非是简单的MySQL主从、读写分离,还会涉及到数据库集群、数据分片、跨机房同步等解决方案。但是,话又说回来,主从复制是MySQL实现其他复杂架构的基础和前提,我们可以从主从复制入手来学习MySQL架构,一步步由浅入深。

一般来说,在遇到以下几种情况时,就需要考虑调整MySQL架构,做主从复制、读写分离、分片等

1、对于复杂的业务系统,经常出现锁表,严重影响整个系统的正常使用。

2、为了解决单点故障,需要对数据库做备份。

3、随着业务量的增加,单机性能已经优化到极致,I/O已经达到瓶颈,但仍然无法满足需要。

到底什么是MySQL主从复制?它的原理是什么?有哪些应用场景?

主从复制是MySQL的重要功能之一。主从复制是指一个节点作为主数据库,另外一个或多个节点作为从数据库,主数据库中的数据自动复制到从数据库中。

那么,MySQL主从复制的具体实现原理是什么呢?我们来看下在这张图。

MySQL数据库有一个bin-log二进制文件,这里面记录的数据库执行的SQL语句。主从复制的原理就是把主数据库的bin-log日志文件中的SQL语句复制到从数据库,让其在从数据库的中继日志relay-log文件中再执行一次这些SQL语句即可。

从图中可以看到,从库有两个重要的线程来完成上述复制工作,I/O线程和SQL线程。

1)I/O线程会去请求主库的bin-log日志,并将得到的bin-log日志写入本地的中继日志relay-log文件中。

2)SQL线程会定时检查relay-log日志,如果发现有更改,会立即把更改的内容在本机上执行一遍。

MySQL主从复制主要有如下3个应用场景

1、数据备份:从库作为主库的备份,当主库出现故障时,可以手动或自动切换到从库提供服务。

2、负载均衡:读写分离,从库处理查询请求,分担主库同时负责读写的压力。

3、业务拆分:对业务进行拆分,各从库负责不同的业务查询,分担主库压力。

MySQL主从复制该如何实现?

MySQL的主从复制又分异步复制、全同步复制和半同步复制3种方式,默认采用的是异步复制。

1、异步复制:Master将事务binlog事件写入到binlog文件中,此时Master会通知Dump线程发送这些新的binlog,然后Master就会继续处理提交操作,而不会保证这些binlog传到任何一个Slave节点上。

2、全同步复制:当Master提交事务之后,所有的Slave节点必须收到、APPLY并且提交这些事务,Master才能继续做后续操作。

3、半同步复制:介于异步复制与全同步复制之间,Master只需要等待至少一个从库节点收到并且Flush binlog到Relay Log文件即可,Master不需要等待所有Slave的反馈。

下面我们以异步复制为例,来讲解MySQL主从复制的具体实现步骤。既然是做主从复制,那么至少需要两个MySQL数据库节点,假定主库Master节点的IP地址是192.168.1.101,从库Slave节点的IP地址是192.168.1.102

1、修改Master节点的配置文件my.cnf,增加如下内容。

[mysqld]
server_id=1
#开启binlog日志
log-bin=mysql-bin
#不需要同步数据库
binlog-ignore-db=mysql

2、修改Slave节点的配置文件my.cnf,增加如下内容。

[mysqld]
server_id=2

从上面两步可以看出,对于Master和Slave节点,都需要修改server_id参数,server_id用于唯一标识一个数据库实例,因此需要为每一个节点指定一个唯一的server_id。对于Master节点,还需要开启bin-log日志。

3、在Master节点创建用户,给Slave节点使用

create user 'repl'@'192.168.1.102' identified with mysql_native_password by 'Repl_123';
grant replication slave on *.* to 'repl'@'192.168.1.102';
flush privileges;

4、获取主节点binlog文件名和位置(position)

5、在Slave节点执行命令

change master to master_host='192.168.1.101', master_port=3306,
master_user='repl', 
master_password='Repl_123',
master_log_file='mysql-bin.000001',
master_log_pos=881;

说明:master_host、master_port表示主库的IP、端口,master_log_file和master_log_pos两个参数要跟步骤4中SHOW MASTER STATUS显示的结果一致,表示从主库的什么位置开始同步。

6、在Slave节点执行命令,开始主从复制

start slave;

7、在Slave节点查看主从复制状态

show slave status;

主要是看Slave节点的两个线程(I/O线程和SQL线程)是否成功开启,如果成功开启,它们的运行状态显示为YES。

 Slave_IO_Running:  YES
Slave_SQL_Running:  YES

好了,到这里,MySQL主从复制的配置实现就完成了。可以向主库创建表、插入数据,然后连接从库查询表、数据,确认主从复制是否成功。

最后,如果需要停止主从复制,只需要在从节点执行如下命令即可。

stop slave;

当然,到这里只是完成的MySQL的主从复制,能够实现数据备份,但要让从库真正分担主库压力,还需要借助第三方数据库中间件(如Mycat、MySQL Router、ShardingSphere等)进一步实现读写分离、高可用。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP