主从复制原理
MySQL主从复制是通过主库的二进制日志到从库上重放的方式实现的。
MySQL主从复制的工作方式
- 主服务器把变更修改写入二进制日志
- 从服务器读取主的二进制日志变更并写入relay_log中
- 在从服务器上重放relay_log中的日志
二进制日志格式的配置
1 | # 打开binlog功能 |
复制解决了什么问题:
- 实现在不同服务器上的数据分布
- 利用二进制日志增量分批进行,不需要太多的带宽,如果我们使用基于行格式的复制进行
- 大批量的更改时,会有一定的带宽压力。特别是在跨IDC环境下进行复制。
- 实现数据读取的负载均衡
- 需要其他组件配合完成,利用DNS轮询的方式把程序的读连接到不同的备份数据库使用LVS,haproxy这样的代理方式
- 增强了数据安全性
- 利用备库的备份来减少主库负载,复制并不能代替备份
- 实现数据库高可用和故障切换
- 实现数据库在线升级
配置MYSQL主从复制
基于日志点的复制配置步骤
在主DB服务器上建立复制账号
1 | create user `repl`@`ip段` indentified by 'password'; |
主库上的配置
1 | bin_log = mysql-bin # 用于打开二进制日志,注意用户是否有目录写权限的问题 |
基于GTID的复制配置步骤
在主DB服务器上建立复制账号1
2create user `repl`@`ip段` indentified by 'password';
grant replication slave on *.* to `relp`@`ip段`
主库上的配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24bin_log = mysql-bin # 用于打开二进制日志,注意用户是否有目录写权限的问题
server_id = 100 # 服务ID,必须是唯一
gtid_mode = ON # 启用gtid模式
enforce-gtid-consistency = ON # 强制gtid一致性
# 从服务器上的配置
bin_log = mysql-bin
server_id = 101
relay_log = mysql-relay-bin # 中介日志,必须固定,不然会以主机名命名
log_slave_update = on # 可选
read_only = on # 可以保证从数据不被修改,保证主从数据的一致
enforce-gtid-consistency = ON
master-info-repository = TABLE
relay-log-info-repository = TABLE
# 初始化从库数据
mysqldump --master-data=2 -single-transaction
# mysqldump在使用的时候会对表进行加锁,所以做热备需要注意
xtrabackup --slave-info
# 启动复制连路
change master to master_host='master_host_ip', master_user='repl', master_password='password', master_auto_position=1;
基于GTID的复制方式的优缺点
GTID的优点:1
21. 可以很方便的进行故障转移
2. 从库不会丢失主库上的任何修改
缺点:1
21. 故障处理比较复杂(必须通过插入空事务的方式)
2. 对执行的sql有一点的限制
选择:1
2
3
4
5考虑的因数:
1. 所使用的MySQL版本(5.6以上)
2. 复制架构及主从切换的方式
3. 所使用的高可用管理组件
4. 对应用的支持程度
MySQL复制性能优化
影响主从延时的因素
- 主库写入二进制日志的时间(控制事务大小,分割大事务)
- 二进制传输时间(控制日志量的大小)
- 从服务器只有一个SQL线程(可以使用5.6版本后的多线程复制)
1
2
3
4
5
6
7
8# mysql5.7中使用按照逻辑时钟的方式来分配sql线程
# 如何配置:
stop slave;
set global slave_parallel_type = 'logical_clock';
set global slave_parallel_workers = 4;
start slave;