数据库集群系列(四):MySQL 5.7结合GTID搭建双主模式-双Master模式集群【测试成功】
一、需求背景
俩台数据库服务器需要实时互相进行同步数据。
Master 1:192.168.1.137
Master 2:192.168.1.138
二、技术特点
优点:
- 负载均衡:通过将请求分摊到多个主节点上,可以实现负载均衡,提高数据库的性能和可用性。
- 高可用性:如果一个主节点发生故障,其他主节点可以接管其工作负载,确保数据库的持续可用性。
- 可扩展性:可以根据业务需求添加或删除主节点,从而实现数据库的弹性扩展。
- 读写分离:可以通过将读写操作分摊到不同的主节点上,实现读写分离,进一步提高数据库的性能。
缺点:
- 数据一致性:由于存在多个主节点,可能会导致数据不一致的情况。
- 复杂性:多主节点集群的配置和管理更为复杂,需要更专业的运维人员。
- 成本:多主节点集群的成本更高,需要更多的硬件和软件资源。
三、Master-1配置
1、修改my.cnf配置文件
[mysqld]server_id = 137log-bin=mysql-binport = 3306auto_increment_increment=2auto_increment_offset=1gtid_mode = onenforce-gtid-consistency=true
解释:
-
server_id = 137
: 为 MySQL 服务器设置一个唯一的标识符,通常在复制拓扑结构中使用。每个在复制设置中的服务器都应该有一个独特的server_id
以区分彼此,通常是IP地址后3位。 -
log-bin=mysql-bin
: 这个设置启用了二进制日志,mysql-bin
是二进制日志文件的基本名称。二进制日志用于复制和时间点恢复。 -
auto_increment_increment=2
: 在多主复制设置中,此设置确定连续的。
表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535,AUTO_INCREMENT 值之间的增量。在这种情况下,复制设置中的每个其他服务器将为自动增量列使用奇数或偶数值。 -
auto_increment_offset=1
: 在多主复制设置中,此设置为AUTO_INCREMENT
值提供了一个偏移量。它有助于避免不同服务器之间的自动增量值冲突。# 表示自增长字段从那个数开始,他的取值范围是1 .. 65535,另外一台服务器的offset为2,防止生成的主键冲突。 -
gtid_mode = on
: 启用全局事务标识符(GTID)模式。GTID 是用于标识事务的唯一标识符,使得更容易跟踪和管理复制。 -
enforce-gtid-consistency=true
: 当设置为 true 时,它强制执行 GTID 一致性,确保所有事务都使用 GTID 进行复制。这有助于在复制方案中维护数据一致性。
2、重启MySQL服务
3、建立主从关系(Master-2也修改配置重启后再执行)
mysql -uroot -p123456
flush logs;
reset master;
change master to
master_host='192.168.1.138',
master_port=3306,
master_user='sync',
master_password='Yl2023..',
master_auto_position = 1;
mysql> flush logs;Query OK, 0 rows affected (0.01 sec)mysql> reset master;Query OK, 0 rows affected (0.00 sec)mysql> change master to -> master_host='192.168.1.138', -> master_port=3306, -> master_user='sync', -> master_password='Yl2023..', -> master_auto_position = 1;Query OK, 0 rows affected, 2 warnings (0.01 sec)
4、开启同步复制并验证(Master-2也修改配置重启后再执行)
START SLAVE;
show slave status \G;
mysql> START SLAVE;Query OK, 0 rows affected (0.01 sec)mysql> show slave status \G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.138 Master_User: sync Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: DB-Master-relay-bin.000002 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

三、Master-2配置
1、修改my.cnf配置文件
server_id = 138log-bin=mysql-binauto_increment_increment=2# 生成主键从2开始auto_increment_offset=2gtid_mode = onenforce-gtid-consistency=true
2、重启MySQL服务
3、建立主从关系(Master-2也修改配置重启后再执行)
mysql> flush logs;Query OK, 0 rows affected (0.00 sec)mysql> reset master;Query OK, 0 rows affected (0.01 sec)mysql> change master to -> master_host='192.168.1.137', -> master_port=3306, -> master_user='sync', -> master_password='Yl2023..', -> master_auto_position = 1;ERROR 3081 (HY000): This operation cannot be performed with running replication threads; run STOP SLAVE FOR CHANNEL '' firstmysql> stop slave;Query OK, 0 rows affected (0.00 sec)mysql> change master to -> master_host='192.168.1.137', -> master_port=3306, -> master_user='sync', -> master_password='Yl2023..', -> master_auto_position = 1;Query OK, 0 rows affected, 2 warnings (0.00 sec)
备注:如果之前已开启了复制,则需要先stop再change master。
4、开启同步复制并验证(Master-2也修改配置重启后再执行)
mysql> START SLAVE;Query OK, 0 rows affected (0.00 sec)mysql> show slave status \G*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.137 Master_User: sync Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: DB-Node1-relay-bin.000002 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 154 Relay_Log_Space: 577 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 137 Master_UUID: 4442baa3-a073-11ee-bea9-000c29b1eab0 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 1 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec)
四、数据插入修改测试
1、在master2节点随机插入数据表及测试数据
-- 创建名为 test 的数据表CREATE TABLE test ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT, email VARCHAR(50));-- 插入随机数据INSERT INTO test (name, age, email)SELECT CONCAT('User', LPAD(FLOOR(RAND() * 1000), 3, '0')), FLOOR(RAND() * 50) + 20, CONCAT('user', FLOOR(RAND() * 1000), '@example.com')FROM INFORMATION_SCHEMA.COLUMNS LIMIT 10;


2、在master1里随机删除2-10条数据,随机进行修改,发现可以实时进行更新。
MySQL数据库双Master模式配置完成。
