所谓「双主复制」,其实就是“互做主从复制”。即每台master主机,既是master角色,又是slave角色。这样,任何一方所做的变更,都会通过主从复制到另一台主机的数据库中,以实现数据的一致性。这就是「双主复制」。
数据库复制有两种方式:
* 基于GTID的复制 * 基于二进制日志位置的复制
本文讨论的后者「基于二进制日志位置的复制」,但是「基于GTID的复制」可能是更好的选择。
属性 | 参数 |
---|---|
操作系统: | CentOS Linux release 7.4.1708 (Core) |
软件版本: | MySQL 5.6.45 |
网络信息: | master-01: 10.10.50.115 |
master-02: 10.10.50.116 |
参考 MySQL 5.6 (CentOS 7) 笔记,详细过程跳过。
#!/bin/sh ################################################################################ # (0)创建必要的目录: ################################################################################ mkdir -pv /var/log/mysql/ chown mysql.mysql /var/log/mysql/ ################################################################################ # (1)修改/etc/mysql/my.cnf文件: # !!!发行版不同,配置位置也不相同,请不要照搬!请不要照搬!请不要照搬! ################################################################################ mv /etc/mysql/my.cnf /etc/mysql/my.cnf.backup cat <<MYCNF >> /etc/mysql/my.cnf [mysqld] server_id = 1 auto-increment-offset = 1 auto-increment-increment = 2 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index expire_logs_days = 10 max_binlog_size = 100M log_slave_updates = 1 # 依据情况修改: # bind-address = x.x.x.x MYCNF ################################################################################ # (2)重新启动服务: ################################################################################ systemctl restart mysqld.service
#!/bin/sh ################################################################################ # (0)创建必要的目录: ################################################################################ mkdir -pv /var/log/mysql/ chown mysql.mysql /var/log/mysql/ ################################################################################ # (1)修改/etc/mysql/my.cnf文件: # !!!发行版不同,配置位置也不相同,请不要照搬!请不要照搬!请不要照搬! ################################################################################ mv /etc/mysql/my.cnf /etc/mysql/my.cnf.backup cat <<MYCNF >> /etc/mysql/my.cnf [mysqld] # 指定server_id参数,两库必须不同 server_id = 2 # 指定当前数据库的ID起始值,从2开始,与auto-increment-increment配合,防止两个主库的自增ID冲突 # 该库的自增ID都是偶数,另一库的自增ID都是奇数 auto-increment-offset = 2 auto-increment-increment = 2 # 二进制日志文件,及索引文件 # 索引文件中包含的是所有二进制日志文件的列表 log_bin = /var/log/mysql/mysql-bin.log log_bin_index = /var/log/mysql/mysql-bin.log.index # 二进制日志过期时间 expire_logs_days = 10 # 二进制日志的最大大小 max_binlog_size = 100M # 使从库将其SQL线程执行的update写入其自己的二进制日志。 # https://dba.stackexchange.com/questions/169071/do-log-slave-updates-in-mysql-5-7-fail-the-replication-in-linux?noredirect=1&lq=1 log_slave_updates = 1 # 中继日志文件,及索引文件 # 索引文件中包含的是所有中继日志文件的列表 relay_log = /var/log/mysql/mysql-relay-bin relay_log_index = /var/log/mysql/mysql-relay-bin.index # 依据情况修改: # bind-address = x.x.x.x MYCNF ################################################################################ # (2)重新启动服务: ################################################################################ systemctl restart mysqld.service
分别在master-01与master-02上创建用于复制的用户。创建用户之后,不要忘记验证用户是否可以正常登录。
GRANT REPLICATION SLAVE ON *.* TO ‘replication‘@‘%‘ IDENTIFIED BY ‘BU3CGK6x‘;
GRANT REPLICATION SLAVE ON *.* TO ‘replication‘@‘%‘ IDENTIFIED BY ‘BU3CGK6x‘;
分别在master-01与master-02上启用复制:
-- SQL -- STOP SLAVE; CHANGE MASTER TO master_host=‘10.10.50.116‘, master_port=3306, master_user=‘replication‘, master_password=‘BU3CGK6x‘, master_log_file=‘mysql-bin.000001‘, master_log_pos=0; START SLAVE;
-- SQL -- STOP SLAVE; CHANGE MASTER TO master_host=‘10.10.50.115‘, master_port=3306, master_user=‘replication‘, master_password=‘BU3CGK6x‘, master_log_file=‘mysql-bin.000001‘, master_log_pos=0; START SLAVE;
1)使用数字的地方,请勿使用引号。比如 master_port=‘3306‘ 将出现语法错误
这里没有详述验证过程。由于比较简单,所以这里只概述了验证复制是否生效的思路:
在master-01上创建库及表,然后在master-02上查看。 在master-02上创建库及表,然后在master-01上查看。
如果没有问题,就是没有问题。如果没有同步,可以在数据库上执行SHOW SLAVE STATUS \G语句,来查看同步状态和同步错误信息(如果有)。
使用SHOW MASTER STATUS \G语句查看自己的状态;使用SHOW SLAVE STATUS \G语句来查看自己作为从库的状态;
「MySQL」- 搭建主从复制(基于 GTID 复制)
「MySQL」- 搭建主从复制(基于位置复制)
「MySQL」- 双主复制(基于GTID复制)
Configure Master-Master MySQL Database Replication
MariaDB/Relay Log
Do Log_Slave_Updates in MySQL 5.7 fail the replication in Linux?
「MySQL」- 双主复制(基于位置的复制) @20210312
原文:https://www.cnblogs.com/k4nz/p/14525643.html