配置:
主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.
主机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
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进程。
在主机195上同样操作
注意修改bin-log file和position为A的master status里面的数据
验证
show databases;
use bilibili;
创建表
在主机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上了
在主机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’);
在主机25上再插入数据
在主机25上插入数据
在主机195上插入
在主机195上插入
在主机25上插入
删除id=5那行,其他行并没有变,重启数据库服务还是没有变
报错
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;