简介
在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务。配置的时候需要注意:主键重复,server-id不能重复。
机器列表
机器ip | 机器名称 |
192.168.23.101 | k8smaster01 |
192.168.23.102 | k8smaster02 |
存量数据导出处理
导出数据
加锁,避免同步时数据发生改变:
mysql>use database_name;
mysql> flush tables with read lock; #关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。也就是将所有的脏页都要刷新到磁盘,然后对所有的表加上了读锁,于是这时候直接拷贝数据文件也就是安全的。为此库下的所有表施加读锁,退出会话后失效,所谓读锁,也就是只能读,不能写。
使用mysqldump工具导出数据:
mysqldump -uroot -pxxx -R database_name >database_name.sql # -R参数表示同时备份函数
root@k8smaster02:~# mysqldump -uroot -p123456 -R test >test.sql
./mysqldump -R -E -h10.10.114.80 -uprd -p -P6666 --databases prd -S /tmp/mysql.sock > prd20200310.sql
解锁数据库:
mysql>unlock tables;
配置文件
注:二都只有server_id不同和 auto-increment- offset不同
101(k8smaster01)配置
[root@k8smaster01 mysql]# more config/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
lower_case_table_names=1
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
##binlog
server-id=2 #指定master主机的id,不可为0,否则拒绝所有slave连接
log_bin=mysql-bin #指定bin-log文件前缀名称,开启binlog日志
auto_increment_offset=2 #设置自动增长的字段的偏移量,即初始值为2
auto_increment_increment=2 #每次增长2
#max_connections=600 #指定最大连接数
#wait_timeout=5 #等待超时
[root@k8smaster01 mysql]#
102(k8smaster02)配置
[root@k8smaster01 mysql]# more config/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
lower_case_table_names=1
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
##binlog
server-id=1
log_bin=mysql-bin
auto_increment_offset=1
auto_increment_increment=2
#max_connections=600 #指定最大连接数
#wait_timeout=5 #等待超时
[root@k8smaster02 mysql]#
部署前的准备
分别检查k8smaster01、k8smaster02两台Mysql服务器是否作为其他master的slave,并停止复制,以免受到影响。
mysql> show slave status\G
mysql> stop slave;
102(k8smaster02)同步101(k8smaster01)
102(k8smaster02)操作
mysql> create user 'repl'@'192.168.23.101' identified by '123456';
mysql> grant replication slave on *.* to 'repl'@'192.168.23.101';
mysql> flush privileges;
mysql> flush logs;
mysql> show master status;
101(k8smaster01)操作
mysql> change master to master_host='192.168.23.102',master_user='repl',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
101(k8smaster01) 同步102(k8smaster02)
101(k8smaster01)操作
mysql> create user 'repl'@'192.168.23.102' identified by '123456';
mysql> grant replication slave on *.* to 'repl'@'192.168.23.102';
mysql> flush privileges;
mysql> show master status;
102(k8smaster02)操作
mysql> change master to master_host='192.168.23.101',master_user='repl',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=788;
mysql> start slave;
mysql> show slave status\G
测试
创建数据库test,主主同步正常
mysql> CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
新增表t1,并且插入数据,数据同步正常
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> select * from t1;
mysql> INSERT INTO t1 VALUES (1, 'zhaiky');
问题
Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
解决方法:
主从同步重置处理
Slave: stop slave; #停止数据同步
Master: flush logs;
Master: show master status;
Slave: CHANGE MASTER TO MASTER_LOG_FILE=’log-bin.00000X’, MASTER_LOG_POS=XX;
Slave: start slave;
ERROR: No query specified
解决方法:将下面命令的分号(;)去除执行。
mysql> show master status\G;