一、需求背景
俩台数据库服务器需要实时互相进行同步数据。
Master 1:192.168.1.137
Master 2:192.168.1.138
二、技术特点
优点:
- 负载均衡:通过将请求分摊到多个主节点上,可以实现负载均衡,提高数据库的性能和可用性。
- 高可用性:如果一个主节点发生故障,其他主节点可以接管其工作负载,确保数据库的持续可用性。
- 可扩展性:可以根据业务需求添加或删除主节点,从而实现数据库的弹性扩展。
- 读写分离:可以通过将读写操作分摊到不同的主节点上,实现读写分离,进一步提高数据库的性能。
缺点:
- 数据一致性:由于存在多个主节点,可能会导致数据不一致的情况。
- 复杂性:多主节点集群的配置和管理更为复杂,需要更专业的运维人员。
- 成本:多主节点集群的成本更高,需要更多的硬件和软件资源。
三、Master-1配置
1、修改my.cnf配置文件
[mysqld]
server_id = 137
log-bin=mysql-bin
port = 3306
auto_increment_increment=2
auto_increment_offset=1
gtid_mode = on
enforce-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 = 138
log-bin=mysql-bin
auto_increment_increment=2
# 生成主键从2开始
auto_increment_offset=2
gtid_mode = on
enforce-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 '' first
mysql> 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: 0
Master_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模式配置完成。