配置:
主A:10.205.128.25 centos7
主B:10.205.128.195 centos7
双主设置奇偶自增id 【三主的话,就将步长设置为3,初始值分别为123】
1.为了解决同步时数据记录的冲突
主A写了一条数据 (5,‘blue’)
主B写一条数据(5,‘pink‘)
那么在同步时,就会出现主键一样,冲突,报错
2.区分是那个主机插入的数据

以上为个人见解,不一定正确…

修改mysql配置文件

主要是设置log-bin、auto-increment-increment自增id的步长
auto-increment-offset。
双主架构中

主机25的

auto-increment-offset=1,
auto-increment-increment=2,

主机195的

auto-increment-offset=2,

auto-increment-increment=2,

eg.

mysql双活 主键自增长_数据库

主机25配置:

vim /etc/my.cnf
[mysqld]
 server_id = 1. #必须区别主机195,两个不一样
 log-bin=mysql-bin
 binlog-ignore-db=mysql
 sync_binlog = 1
 binlog_format=mixed
 #relay-log=relay-log-bin
 #relay-log-index=slave-bin.index
 auto-increment-increment=2。 #自增id步长,与主机195一样
 auto-increment-offset=1 #自增id起始值,与主机195不一样
 log-slave-updates
 sync_binlog = 1
 expire_logs_days=7
 log_bin_trust_function_creators = 1
 validate_password_policy=0 #安全策略,也可以后面设置

主机195配置,修改或者添加

vim /etc/my.cnf
[mysqld]
#主数据库端ID号
 server_id = 2
 log-bin=mysql-bin
 binlog_format=mixed
 relay-log=relay-log-bin
 relay-log-index=slave-bin.index
 auto-increment-increment=2
 auto-increment-offset=2
 log-slave-updates
 validate_password_policy=0

修改完配置重启数据库

systemctl restart mysqld.service
不同版本命令可能不一样

进入数据库配置

主机25

#mysql -uroot -p1234567890
mysql -u用户 -p密码

mysql> grant replication slave on . to ‘repl’@‘10.205.128.195’ identified by ‘1234567890’;
mysql> flush privileges;
将数据库的所有权限授予10.205.128.195上的repl用户,后面是密码
然后刷新权限。

然后将库锁住。仅允许读,保证数据一致性,等到猪猪同步后再解锁,锁住后就不能往表里面写数据,重启mysql.service就自动解锁了。
mysql> flush tables with read lock;

mysql> show master status;

查看主机195 master

mysql双活 主键自增长_数据库_02


file是binlog文件

position是偏移量

mysql> unlock tables; (原先是因为执行了锁表 flush tables with read lock;)

mysql> stop slave;
 mysql> change master to master_host=‘10.205.128.195’,master_user=‘repl’,master_password=‘1234567890’,master_log_file=‘mysql-bin.000006’,master_log_pos=1658050;

这里master_log_file的值就是主机195 master status当中file的值,
master_log_pos 就是主机195当中position的值,这里仅作演示,具体自己修改

mysql> Start slave;

mysql> show slave status\G;

看到

Slave_IO_Running:yes

Slave_SQL_Running:yes

就证明主从配置好了,一个负责与主机的io通信,一个负责自己的slave mysql进程。

mysql双活 主键自增长_自增_03

在主机195上同样操作

注意修改bin-log file和position为A的master status里面的数据

验证

show databases;
use bilibili;

mysql双活 主键自增长_linux_04

创建表

在主机25上

mysql> create table aaaa( id int(6) primary key not null auto_increment, name char(16));
创建表aaaa,id为自增id
mysql> show tables;

在主机195上

show databases;
use bilibili;
mysql> show tables;

在这里可以看到在主A上创建的表aaaa,已经同步到B上了

mysql双活 主键自增长_自增_05

在主机25上插入数据

mysql> insert into aaaa values(null,‘pinkflower’);
Query OK, 1 row affected (0.01 sec)

在主机195插入数据

mysql> insert into aaaa values(null,‘yellowflower’);
Query OK, 1 row affected (0.01 sec)

在主机25

mysql> insert into aaaa values(null,‘blueflower’);

mysql双活 主键自增长_数据库_06

在主机25上再插入数据

mysql双活 主键自增长_数据库_07

在主机25上插入数据

mysql双活 主键自增长_自增_08

在主机195上插入

mysql双活 主键自增长_linux_09

在主机195上插入

mysql双活 主键自增长_linux_10

在主机25上插入

mysql双活 主键自增长_mysql双活 主键自增长_11

删除id=5那行,其他行并没有变,重启数据库服务还是没有变

mysql双活 主键自增长_数据库_12

报错

Slave_SQL_Running:no

有可能是因为密码策略问题

解决1.可以在一开始的/etc/my.cnf,mysql配置文件中设置

vim /etc/my.cnf
添加validate_password_policy=0

解决2.可以直接执行

stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave;
show slave status\G; \G分行显示

Slave_IO_Running:no

查看master_log_file设置对了吗

slave stop;
 CHANGE MASTER TO MASTER_LOG_FILE=‘mysql-bin.000026’, MASTER_LOG_POS=0;
 slave start;
 show slave status\G;