1、环境
系统:Ubuntu 16.04 serverMysql:8.0.17主master (server-1):192.168.50.5主master (server-2):192.168.50.6特点:两个库可写可读,一个库修改会写入另一个库
2、主主复制原理
主主复制是将两个主从复制有机合并起来就好了。
3、准备工作
启动服务器和mysql,使用ps -ef|grep mysql检查mysql是否启动
防火墙配置主服务器只允许特定 IP 访问数据库的端口,避免不必要的攻击
主库1防火墙配置(登录主库服务器192.168.50.5)
sudo iptables -L -n
sudo iptables -I INPUT -p tcp --dport 3306 -j DROP
sudo iptables -I INPUT -s 192.168.50.0/24 -p tcp --dport 3306 -j ACCEPT
sudo iptables -I INPUT -s 192.168.1.102 -p tcp --dport 3306 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 192.168.50.6 --dport 3306 -j ACCEPT
sudo iptables -L -n
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
主库2防火墙配置(登录从库服务器192.168.50.6)
sudo iptables -I INPUT -p tcp --dport 3306 -j DROP
sudo iptables -I INPUT -s 192.168.50.0/24 -p tcp --dport 3306 -j ACCEPT
sudo iptables -I INPUT -s 192.168.1.102 -p tcp --dport 3306 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 192.168.50.5 --dport 3306 -j ACCEPT
sudo iptables -L -n
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
检查主从是否可以相互ping通
4、主数据库master-1配置(192.168.50.5)
修改mysql配置增加以下配置,命令sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld
]
server-id
=5
bind-address
= 0.0.0.0
log-bin
=/var/log/mysql/mysql-bin.log
log_bin_index
=/var/log/mysql/master-bin.index
expire_logs_days
=10
max_binlog_size
=200M
binlog_do_db
=mybatis
binlog_ignore_db
=mysql
replicate-do-db
=mybatis
replicate_ignore_db
=mysql
auto_increment_increment
=2
auto_increment_offset
=1
重启mysql在/var/log/mysql/下会生成2个文件,重启命令service mysql restart
创建用于同步的用户账号,比如用户名repl,密码repl
mysql -uroot -p
$ CREATE USER
'repl'@
'192.168.50.6' IDENTIFIED WITH mysql_native_password BY
'repl';
$ GRANT REPLICATION SLAVE ON *.* TO
'repl'@
'192.168.50.6';
$ flush privileges
;
查看master-1状态,记录二进制文件名(mysql-bin.000001)和位置(1168),后面有用
mysql -uroot -p
SHOW MASTER STATUS
;
创建mybatis数据库和emploee表,用于测试
create database mybatis
;
use mybatis
;
CREATE TABLE `employee
` (
`id
` bigint(20) NOT NULL auto_increment COMMENT '编号',
`first_name
` varchar(32) COLLATE utf8_bin
NOT NULL DEFAULT '' COMMENT '姓',
`last_name
` varchar(32) COLLATE utf8_bin
NOT NULL DEFAULT '' COMMENT '名',
`age
` int COMMENT '年龄',
`mobile_phone
` varchar(20) COLLATE utf8_bin
DEFAULT '' COMMENT '联系电话',
`email
` varchar(30) COLLATE utf8_bin
DEFAULT '' COMMENT '邮箱',
`birthday
` DATE COMMENT '生日',
`create_date
` DATETIME COMMENT '创建日期',
`update_date
` DATETIME COMMENT '更新日期',
primary key(id
)
) ENGINE=INNODB DEFAULT CHARSET=utf8
COMMENT='员工信息表';
5、主数据库master-2配置(192.168.50.6)
修改mysql配置增加以下配置,命令sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld
]
server-id
=6
bind-address
= 0.0.0.0
log-bin
=/var/log/mysql/mysql-bin.log
log_bin_index
=/var/log/mysql/master-bin.index
expire_logs_days
=10
max_binlog_size
=200M
binlog_do_db
=mybatis
binlog_ignore_db
=mysql
replicate-do-db
=mybatis
replicate_ignore_db
=mysql
auto_increment_increment
=2
auto_increment_offset
=2
重启mysql在/var/log/mysql/下会生成2个文件,重启命令service mysql restart
创建用于同步的用户账号,比如用户名repl,密码repl
mysql -uroot -p
$ CREATE USER
'repl'@
'192.168.50.5' IDENTIFIED WITH mysql_native_password BY
'repl';
$ GRANT REPLICATION SLAVE ON *.* TO
'repl'@
'192.168.50.5';
$ flush privileges
;
查看master-2状态,记录二进制文件名(mysql-bin.000001)和位置(883),后面有用
mysql -uroot -p
SHOW MASTER STATUS
;
创建mybatis数据库和emploee表,用于测试
create database mybatis
;
use mybatis
;
CREATE TABLE `employee
` (
`id
` bigint(20) NOT NULL auto_increment COMMENT '编号',
`first_name
` varchar(32) COLLATE utf8_bin
NOT NULL DEFAULT '' COMMENT '姓',
`last_name
` varchar(32) COLLATE utf8_bin
NOT NULL DEFAULT '' COMMENT '名',
`age
` int COMMENT '年龄',
`mobile_phone
` varchar(20) COLLATE utf8_bin
DEFAULT '' COMMENT '联系电话',
`email
` varchar(30) COLLATE utf8_bin
DEFAULT '' COMMENT '邮箱',
`birthday
` DATE COMMENT '生日',
`create_date
` DATETIME COMMENT '创建日期',
`update_date
` DATETIME COMMENT '更新日期',
primary key(id
)
) ENGINE=INNODB DEFAULT CHARSET=utf8
COMMENT='员工信息表';
6、构建主主复制
登录master-1(192.168.50.5)
mysql -uroot -p
CHANGE MASTER TO MASTER_HOST
='192.168.50.6', MASTER_USER
='repl', MASTER_PASSWORD
='repl', MASTER_LOG_FILE
='mysql-bin.000001',MASTER_LOG_POS
=1896
;
start slave
;
show slave status\G
;
当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了
登录master-2(192.168.50.6)
mysql -uroot -p
CHANGE MASTER TO MASTER_HOST
='192.168.50.5', MASTER_USER
='repl', MASTER_PASSWORD
='repl', MASTER_LOG_FILE
='mysql-bin.000001',MASTER_LOG_POS
=1168
;
start slave
;
show slave status\G
;
当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了
7、测试主主复制
登录master-1(192.168.50.5)
mysql -uroot -p
use mybatis
;
INSERT INTO employee
(first_name, last_name, age, mobile_phone, email, birthday, create_date, update_date
)
VALUES
('主从',
'复制测试',26,
'13533965228',
'13533965228@139.com',SYSDATE
(), SYSDATE
(),SYSDATE
());
select * from employee limit 10
;
登录master-2(192.168.50.6)
mysql -uroot -p
use mybatis
;
select * from employee limit 10
;
INSERT INTO employee
(first_name, last_name, age, mobile_phone, email, birthday, create_date, update_date
)
VALUES
('master-2',
'复制测试',26,
'13533955228',
'13533955228@139.com',SYSDATE
(), SYSDATE
(),SYSDATE
());
两个主机数据结果一样,主主复制配置成功。
8、注意事项
主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave status\G信息中有错误提示(也可以查看日志,一般在/var/log/mysql/error.log),可根据错误提示进行更正。如果执行start slave;失败,可以尝试停止stop slave;或重置reset slave。