双主互备的操作与主从互备基本相同,只是重复了一次而已
双主互备的ID冲突处理:
Mysql双主自增长冲突处理
多主互备和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以设计到自增长重复问题
出现的问题(多主自增长ID重复)
1:首先我们通过A,B的test表结构
2:掉A,在B上对数据表test(存在自增长ID)执行插入操作,返回插入ID为1
3:后停掉B,在A上对数据表test(存在自增长ID)执行插入操作,返回的插入ID也是1
4:然后 我们同时启动A,B,就会出现主键ID重复
解决方法:
我们只要保证两台服务器上插入的自增长数据不同就可以了
如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了
在这里我们在A,B上加入参数,以实现奇偶插入
A:my.cnf上加入参数 auto_increment_offset = 1
auto_increment_increment = 2
这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了
B:my.cnf上加入参数 auto_increment_offset = 2
auto_increment_increment = 2
这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了
可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当 然,你还可以 使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID 重复。
1、配置文件修改
主服务器1修改(master)
修改mysql配置
找到主数据库的配置文件my.cnf(或者my.ini),开启二进制日志,和server-id vi my.cnf [mysqld]
log-bin=mysql-bin #记录二进制日志
server-id = 1
auto_increment_increment=2
expire_logs_days = 3 #binlog过期时间,超过三天未修改的清楚
binlog-do-db=kvdata #master需要记录日志的同步库,多个写多行
binlog-ignore-db=mysql #master不需要记录日志的同步库
replicate-ignore-db=mysql #复制时需要排除的数据库
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
实际操作设置:
33061端口的
主server-id 1 从server-id 101
33062端口的
主server-id 2 从server-id 102
33063端口的
主server-id 3 从server-id 103
33064端口的
主server-id 4 从server-id 104
主服务器2修改(master)
找到主数据库的配置文件my.cnf(或者my.ini),开启二进制日志,和server-id
vi my.cnf [mysqld]
log-bin=mysql-bin #记录二进制日志
server-id = 2
auto_increment_increment=2
expire_logs_days = 3 #binlog过期时间,超过三天未修改的清楚
binlog-do-db=kvdata #master需要记录日志的同步库,多个写多行
binlog-ignore-db=mysql #master不需要记录日志的同步库
replicate-ignore-db=mysql #复制时需要排除的数据库
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
2、启动mysql
修改mysql启动密码:
vi /lsl/cluster/mysql/33061/log/mysqld_safe.log
在该文件中找到数据库第一次启动时创建的密码
A temporary password is generated for root@localhost:xxxxxx
使用该密码登录数据库:
/opt/JMKVCloud/MessageSoft/Mysql/bin/mysql -uroot -P33061 -S /lsl/cluster/mysql/33061/mysql.sock -p
>alter user 'root'@'localhost' identified by 'jmuser';
>flush privileges;
>grant all privileges on *.* to 'root'@'%' identified by 'jmuser';
>flush privileges;
3、在两台服务器上各自创建主从同步账户和权限
以下操作,在两个mysql都执行
>create user jm@192.168.10.56 identified by 'jmuser';
>GRANT REPLICATION SLAVE ON *.* TO jm@192.168.10.56 identified by 'jmuser';
> flush privileges;
4、各自配置对方的同步信息
33061mysql
mysql> change master to master_host='192.168.10.56',master_port=33062, master_user='jm', master_password='jmuser',master_log_file='mysql-bin.000004',master_log_pos=852;
33062mysql
mysql> change master to master_host='192.168.10.56',master_port=33061, master_user='jm', master_password='jmuser',master_log_file='mysql-bin.000004',master_log_pos=899;
5、各自打开同步
以下操作,在两个mysql都执行
> start slave;
6、查看slave状态
以下操作,在两个mysql都执行
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.56 master的相关信息,出问题了,可以从这里查看分析
Master_User: jm
Master_Port: 33061
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 92397
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 91865
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes #此处两个yes,表示主从同步成功
Slave_SQL_Running: Yes
Replicate_Do_DB: kvdata
Replicate_Ignore_DB: mysql
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: 92397
Relay_Log_Space: 92076
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: 1
Master_UUID: 572d771a-0f6a-11ea-96c4-484d7ec7da58
Master_Info_File: /home/mysql/33061/data/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: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)