mysql> show grants for repl@'172.16.1.%';
+-------------------------------------------------------+
| Grants for [email protected].% |
+-------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.1.%' |
+-------------------------------------------------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_db |
| test_db2 |
+--------------------+
6 rows in set (0.00 sec)
可以发现从库立刻进行了复制。
7. 查看主从库上的线程
show processlist;
主库
mysql> mysql> show processlist;
+----+------+-------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| 7 | repl | 172.16.1.52:53338 | NULL | Binlog Dump | 555 | Master has sent all binlog to slave; waiting for more updates | NULL |
| 8 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-------------------+------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
从库
mysql> show processlist;
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
| 2 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 3 | system user | | NULL | Connect | 584 | Waiting for master to send event | NULL |
| 4 | system user | | NULL | Connect | 135 | Slave has read all relay log; waiting for more updates | NULL |
+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
MySQL主从复制
MySQL的主从复制是逻辑复制模式,从库将主库的binlog记录复制到本机并执行,以此保持数据一致性。
主从服务器架构的设计,可以大大加强MySQL数据库架构的健壮性。例如,当主服务器出现问题时,我们可以人工切换或设置成自动切换到从服务器继续提供服务,此时从服务器的数据和宕机时的主数据库几乎是一致的。
一、常见主从复制模式
只支持MySQL5.7以后的版本;将多个库的数据备份到单个库中存储。
两个数据库服务器互相做对方的主从;任何一方的数据有更改,另一方都会将其复制到自己的数据库中。
适用于从库数量较多的场景;正常情况下,如果多个从库链接主库对主库服务器的压力比较大,因此引出多级复制的概念,最高级的自然是主库,然后以树状图的模式分出多级从库进行复制。
二、主从复制原理
主从复制依靠三个线程实现。
主库:log dump - 用于给从库I/O线程传输binlog数据
从库:I/O线程和SQL线程
1. 主库log dump线程
主节点会为每个从节点创建一个log dump线程,其作用是读取和发送binlog内容,在读取binlog日志时,该线程会对binlog加锁,当完成读取发送给从节点之前,会释放锁。
2. 从库 I/O线程和SQL线程
I/O线程
当从库节点执行start slave命令后,从节点会创建一个I/O线程来链接主库节点,请求主库更新的binlog,在接收到主库发来的binlog记录后,将其保存在本地的delay log中。
SQL线程
SQl线程负责读取delay log的记录,并将其解析为SQL语句,最终执行这些SQL语句来确实地写入数据。
3. 什么是Delay log
Delay log一般翻译成中继日志,可以简单的理解为主从复制中暂存binlog记录的缓存区;因为中继日志的存在,在主库存在频繁的写入操作时,主节点不必等待从节点执行完上一条SQL记录后才能进行传输。
4. 主从复制流程
slave start
开启主从复制。从节点的I/O线程链接主节点,并请求从指定日志文件的指定位置(或者从最开启的日志)之后的日志内容。master-info
文件中,后面从节点将根据这个文件内的信息向主节点发起新的请求。relay-log.info
文件中记录执行delay log的文件名和最新pos。三、配置MySQL主从复制
1. 环境准备
主库
配置:
从库
配置:
2. 为从节点创建链接主库的账号
在master机器上操作:
查看用户:
查看用户权限:
3. 备份主库的现有数据并发送到从库上
这步是为了让主从库的起始数据一致。
4. slave机器导入数据
5. 开启主从复制
为slave机器指定要读取的master机器信息:
参数:
然后开启主从复制
通过一条命令查看主从复制状态
其中,
Slave_IO_Running
和Slave_SQL_Running
两个选项代表着从库的I/O线程和SQL线程,这两个的值是yes,说明目前已经成功的建立了链接。6. 测试主从复制效果
在主库中新建一个数据库 test_db2
在从库中查看
可以发现从库立刻进行了复制。
7. 查看主从库上的线程
主库
从库
主从复制之过滤复制
当主库上存在多个database,但从库只需要同步一部分的话就需要用到MySQL的复制过滤功能。
比如一个主库承载多个业务数据库,需要将不同业务数据库复制到不同的从库进行查询以做到业务隔离的场景。
通过过滤复制可以灵活的指定哪些库和表需要复制,哪些库不需要同步。
通常在从服务器上配置过滤复制,可以减轻主库的负载。
如何配置过滤复制
修改slave实例配置,使用如下参数:
通过修改配置文件
热配置
检查从库状态
可以发现在Replicate_Do_DB字段中指定了要复制的数据库。
基于GTID的主从复制
GTID复制原理流程
借助GTID,在发生主备切换的情况下,MySQL的其它从库可以自动在新主库上找到正确的复制位置,这大大简化了复杂集群的维护,也减少了人为设置复制位置发生误操作的风险。
另外,基于GTID的复制可以忽略已经执行过的事务,减少了数据发生不一致的风险。
配置GTID主从复制
注意:如果要使用基于GTID的主从复制,则服务器集群中的所有主机都要开启GTID,不能混用。
修改配置文件
master配置文件:
slave配置文件
开启基于GTID的主从复制:
在slave上:
查看复制是否一致
master状态:
slave状态:
可以看到目前接收到的和已经执行了的GTID事务记录,并且主从库的gtid是一致的,因此我们可以判定两者的数据是同步的。
由于在配置文件中关闭了自动提交,因此部分操作(比如向表中插入数据)必须要使用显示事务提交的方式才可以让gtid记录正常增长;
Read Next
使用Terraform在Ubuntu中部署KVM虚拟机
使用Terraform部署KVM虚拟机的详细流程
MySQL/Redis相关面试题
数据库运维(MySQL和Redis)的面试题总结
事件源模式和传统数据库方法在数据管理上的优劣分析
对事件源模式和传统数据库方法在应用程序性能影响、性能、扩展性和可靠性的分析;以及云原生环境下数据管理的最佳实践
关于Metrics_server在自托管环境下无法使用的问题
修复kubernetes的metrics server在自托管环境下因缺少CA证书而无法运行的问题。