架构图
双写同步 replication 集群
创建同步账号
- 使用
root
账号进行创建CREATE USER ‘backup’@’%’ IDENTIFIED BY “Root666.”; GRANT super,reload,replication slave ON . TO ‘backup’@’%’; flush privileges;
双主都开启 binlog 和 relaylog
[mysqld]
## 其他配置
# 集群中 server_id 要求不一致
server_id = 100
# 开启 binlog 日志,并且设置 binlog 日志名称
log_bin = mysql_bin
# 中继日志。作为 replication 的从库时,会读取主库的 binlog 写入到 relay_log 中
relay_log=relay_bin
# 表示 slave 将复制事件写进自己的 binlog
log_slave_updates
##主从复制的 格式 mixed,statement,row ,默认格式是 statement
binlog_format=row
##############################################################################################
## gtid,可选
##############################################################################################
gtid_mdoe=on
## gtid_mode 的前置条件
enforce_gtid_consistency
# log-slave-updates=on # 上面设置过了
master_info_repository=TABLE
relay_log_info_repository=TABLE
##############################################################################################
## 其他可选配置
##############################################################################################
##复制过滤: 指明需要备份的数据库,注意一条指令只能配置一个database
# binlog-do-db=test
##复制过滤: 知名不需要备份的数据库 不输出 mysql 库 一般不同步)注意一条指令只能配置一个database
# binlog-ignore-db=mysql
## 为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave 端复制中断。
## 如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062,1032
配置主从同步
- 在从库上执行 sql 语句
STOP SLAVE; CHANGE MASTER TO master_host=’
‘, master_port = ‘ ‘, master_user=’ ‘, master_password=’ ‘; START SLAVE;
查看主从同步状态
SHOW SLAVE STATUS; # 下方字段为 YES 表示成功
再另一台从库中也执行上述步骤,成为双向同步架构
主从同步状态异常
SHOW SLAVE STATUS;
查看 error_log,
cat /var/log/mysqld.log
[ERROR] Slave I/O for channel '': Fatal error:
The slave I/O thread stops because master and slave have equal MySQL server UUIDs;
these UUIDs must be different for replication to work. Error_code: 1593
sql 中查看
show variables like '%server_uuid%';
发现 UUID 的确一样- 因为两个虚拟机我是直接 copy 的,造成 UUID 一样
- 解决
找到
auto.cnf
,修改 server_uuidfind / -name auto.cnf vim /var/lib/mysql/auto.cnf
重启 mysql
systemctl restart mysqld;
然后再 sql 中再次执行
STOP SLAVE; START SLAVE;
其他配置
- 可以指定 3 个参数, 用于复制线程重连主库
- master-retry-count
- 需要在 Change Master 搭建主备复制时指定
- master-connect-retry
- 需要在 Change Master 搭建主备复制时指定
- slave-net-timeout
- 是一个全局变量,可以在 MySQL 运行时在线设置
- master-retry-count
- todo 重试策略
配置 HaProxy 和 Keepalived
- 和之前的类似
- 该 replication 集群对外暴露一个虚拟 IP