MySQL 主从复制
线程
主要涉及三个线程:binlog 线程、I/O 线程和 SQL 线程。
- binlog 线程 :负责将主服务器上的数据更改写入二进制日志(Binary log)中。
- I/O 线程 :负责从主服务器上读取- 二进制日志,并写入从服务器的中继日志(Relay log)。
- SQL 线程 :负责读取中继日志,解析出主服务器已经执行的数据更改并在从服务器中重放(Replay)。
读写分离
主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。 读写分离能提高性能的原因在于:
- 主从服务器负责各自的读和写,极大程度缓解了锁的争用;
- 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
- 增加冗余,提高可用性。
读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。
1. master node
- 开启二进制日志 binlog
- 配置唯一的 server-id
- 获得 master 二进制文件名及位置
-
创建一个用于 slave 和 master 通信的用户账号
-
/etc/my.cnf
[mysqld] # 开启二进制日志 log-bin=mysql-bin # 设置server-id,建议使用ip最后3位 server-id=140
2. slave node
- 配置唯一的 server-id
- 使用 master 分配的用户账号读取 master 二进制日志
-
启动 slave 服务
-
/etc/my.cnf
#开启中继日志 relay-log=mysql-relay #设置server-id,建议使用ip最后3位 server-id=141
3.重启 mysql 服务
- systemctl restart mysqld.service
- docker restart ${container id}
4. 在主机上建立账户并授权 slave
GRANT REPLICATION SLAVE ON *.* TO 'mysql141'@'192.168.131.141' IDENTIFIED BY 'mysql141';
flush privileges;
--查询master的状态,输出File和Position
show master status\G
5. 告知从服务器二进制文件名与位置
CHANGE MASTER TO master_host = '192.168.131.140',
master_user = 'mysql141',
master_password = 'mysql141',
master_log_file = 'mysql-bin.000001',
master_log_pos = 120;
6. 查看从服务器状态
--开启复制
start slave;
--查看主从复制是否配置成功, 当看到Slave_IO_State:Waiting for master ot send event 、Slave_IO_Running: YES、Slave_SQL_Running: YES才表明状态正常。
SHOW SLAVE STATUS\G
读写分离中间件
- Maxsacl
- Mycat
- …