MySQL 复制
扩展方式:
- Scale Up
- Scale Out
MySQL的扩展:
- 复制: 每个节点都有相同的数据集:
- 向外扩展;
- 二进制日志;
- 单向;
复制的功能:
- 数据分布;
- 负载均衡读;
- 备份;
- 高可用和故障切换;
- MySQL升级测试;
主从复制
从节点:
- I/O Thread: 从Master请求二进制日志事件,并保存于中继日志;
- SQL Thread: 从中继日志中读取日志事件,在本地完成重放;
主节点:
- dump Thread: 为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events;
特点:
- 异步复制;
- 主从数据不一致比较常见;
复制架构:
- M/S, M/M, 环状复制;
- 一主多从: 从服务器还可以有从服务器;
- 一丛多多主?
二进制日志事件记录格式:
- STATEMENT
- ROW
- MIXED
演示模型:
主从, 主主,半同步复制,复制过滤器
主从复制实现
主节点:
- 启动二进制日志;
[mysqld]
log_bin=mysql-bin
- 为当前节点设置一个全局唯一的ID号;
[mysqld]
server_id=#
- 创建有复制权限的用户帐号;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ...
从节点:
- 启动中继日志;
[mysqld]
relay_log=relay-log
relay_log_index=relay-log.index
- 为当前节点设置一个全局唯一的ID号;
[mysqld]
server_id=#
- 使用有复制权限的用户帐号连接至主服务器;
CHANGE MASTER TO MASTER_HOST='host',MASTER_USER='repluser',MASTER_PASSORD='xxx',MASTER_LOG_FILE='mysql-bin.xxxx',MASTER_LOG_POS=#
- 启动复制线程;
START SLAVE
复制架构中应该注意的问题:
- 限制服务器为只读
- 在从服务器上设置read_only=ON;此限制对拥有super权限的用户均无效;
- 阻止所有用户: 手动登录到服务器
FLUSH TABLE WHITH READ LOCK
- 如何保证主从复制的事务安全?
- 在master节点启用参数:
sync_binlog=ON
- 如果使用InnoDB存储引擎:
innodb_flush_logs_at_trx_commit=ON
innodb_support_xa=ON
- 在slave节点:
skip_slave_start=ON
,然后检查无误后,手动启动slave; - master节点:
sync_master_info
- slave节点:
sync_relay_log
sync_relay_log_info
- 在master节点启用参数:
主主复制
特点:
- 数据不一致, 因此, 慎用;
- 自动增长id:
- 配置一个节点使用奇数id
auto_increment_offset=1
auto_increment_increment=2
- 另一个节点使用偶数id:
auto_increment_offset=2
auto_increment_increment=2
- 配置一个节点使用奇数id
配置步骤:
- 各节点使用一个唯一的sever_id;
- 都启动binary_log和relay_log;
- 创建拥有复制权限的帐号;
- 定义自动增长id字段的数值范围为奇偶;
- 均把对方指定为主节点,并启动复制线程;
半复制模式
master:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME = 'semisync_master.so';
mysql> SET GLOBAL VARIABLES rpl_semi_sync_master_enabled=1;
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql> SHOW GLOBAL STATUS LIKE '%semi%';
slave:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL VARIABLES rpl_semi_sync_slave_enabled=1;
复制过滤器
让从节点仅复制指定的数据库,或指定数据库的指定表;
有两种使用方式:
- 主服务器仅想二进制日志中记录与特定数据库(特定表)相关的事件;
问题: 时间还原无法实现: 不建议使用;
binlog_do_db= # 数据库白名单
binlog_ignore_db= # 数据库黑名单
- 从服务器SQL_THREAD在replay中继日志中的事件时:仅读取与特定数据库(特定表)相关的事件并应用于本地;
问题: 会造成网络及磁盘IO浪费;
replication_do_db=
replication_ignore_db=
replication_do_table=
replication_ignore_table=
replication_wild_do_table=
replication_wild_ignore_table=
基于SSL复制
前提: 支持SSL
SHOW GLOBAL VARIABLES LIKE '%ssl%';
- master配置证书和私钥,并创建一个要求必须使用ssl连接的复制账号;
- slave端使用CHANGE MASTER TO 命令时指明ssl相关选项;
总结: 跟复制功能相关的文件:
- master.info :用于保存slave连接至master时相关的信息
- relay-log.info :保存在当前slave节点上已复制的当前二进制日志和本地replay log日志的对应关系;
复制的监控和维护
- 清理日志:
PURGE
- 复制监控:
SHOW MASTER STATUS;
SHOW BINLOG STATUS;
SHOW BINARY LOGS;
SHOW SLAVE STATUS;
SHOW PROCESSLIST;
- 从服务器是否落后与主服务器: 'Seconds_Behind_Master:0'
- 如何确定主从节点数据是否一致, 使用percona-tools
- 数据不一致如何修复?重行复制;