Mysql主从复制(二)一主一从配置

1、环境

  • 系统:Ubuntu 16.04 server
  • Mysql:8.0.17
  • 主master (server-1):192.168.50.5
  • 从slave (server-2):192.168.50.6
  • 特点:主库可写(会写入从库)可读,从库只能读

2、准备工作

启动服务器和mysql,使用ps -ef|grep mysql检查mysql是否启动

在这里插入图片描述
在这里插入图片描述

防火墙配置主服务器只允许特定 IP 访问数据库的端口,避免不必要的攻击
# 查看防火墙状态
ufw status

# 关闭防火墙
ufw disable

# 开启防火墙
ufw enable
主库防火墙配置(登录主库服务器192.168.50.5)
# iptables -A INPUT -p tcp -s slave_ip --dport 3306 -j ACCEPT
# 检查当前ip列表
sudo iptables -L -n
# 删除可能已经存在的配置,避免出现多条重复记录
# sudo iptables -D INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
# sudo iptables -D INPUT -p tcp --dport 3306 -j DROP
# sudo iptables -D INPUT -p udp --dport 3306 -j DROP 
# sudo iptables -D INPUT -p sctp --dport 3306 -j DROP
# 增加配置,只允许特定地址访问数据库端口
sudo iptables -I INPUT -p tcp --dport 3306 -j DROP #关闭所有3306端口外部访问
sudo iptables -I INPUT -s 192.168.50.0/24 -p tcp --dport 3306 -j ACCEPT #允许IP段访问3306
sudo iptables -I INPUT -s 192.168.1.102 -p tcp --dport 3306 -j ACCEPT #允许主机访问3306
sudo iptables -L -n
# 保存配置
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
# 配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6这两个文件下面,
# 最好确认一下实际保存的内容,尤其是安装了denyhosts等其他安全软件的情况下,
# 可能会记录了多余的规则,需要手工删除
从库防火墙配置(登录从库服务器192.168.50.6)
# iptables -A OUTPUT -p tcp -d master_ip --dport 3306 -j ACCEPT
# 删除可能已经存在的配置,避免出现多条重复记录
# $ sudo iptables -D OUTPUT -p tcp -d 192.168.50.5 --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
#配置被保存到/etc/iptables/rules.v4 /etc/iptables/rules.v6这两个文件下面,
#最好确认一下实际保存的内容,尤其是安装了denyhosts等其他安全软件的情况下,
#可能会记录了多余的规则,需要手工删除
检查主从是否可以相互ping通

在这里插入图片描述
在这里插入图片描述

3、主数据库master配置(192.168.50.5)

修改mysql配置增加以下配置,命令sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id=5                 #服务器唯一标识(可以使用IP地址最后一位)
bind-address = 0.0.0.0        #默认是127.0.0.1,此处我们设置为任意地址,放开远程访问,这么操作之前一定要确保防火墙配置正确,否则会产生安全风险
log-bin=/var/log/mysql/mysql-bin.log #开启binlog二进制日志
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        #忽略同步的数据库
重启mysql,service mysql restart
创建用于同步的用户账号,比如用户名repl,密码repl
# 创建用户
mysql -uroot -p -e "CREATE USER 'repl'@'192.168.50.%' IDENTIFIED BY 'repl';"
# 分配权限
mysql -uroot -p -e "GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.50.%';"
# 刷新权限
mysql -uroot -p -e "flush privileges;"
查看master状态,记录二进制文件名(mysql-bin.000001)和位置(155),后面有用
mysql -uroot -p -e "SHOW MASTER STATUS;"

在这里插入图片描述

创建mybatis数据库和emploee表,用于测试
create database mybatis;
use mybatis;
CREATE TABLE `employee` (
  `id` bigint(20) NOT NULL 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 '更新日期'
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='员工信息表';

4、从数据库slave配置(192.168.50.6)

修改mysql配置增加以下配置,命令sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id=6                  #服务器唯一标识(可以使用IP地址最后一位)
bind-address = 0.0.0.0       #默认是127.0.0.1,此处我们设置为任意地址,放开远程访问,这么操作之前一定要确保防火墙配置正确,否则会产生安全风险
replicate-do-db=mybatis      #同步的数据库
replicate_ignore_db=mysql 	 #忽略同步的数据库 
relay-log=/var/log/mysql/slave-relay-bin    #同步日志
relay-log-index=/var/log/mysql/slave-relay-bin.index #同步日志索引
expire_logs_days=10          #日志的缓存时间
max_binlog_size=200M         #日志的最大大小
重启mysql,service mysql restart
执行同步SQL语句

需要主服务器主机名,登陆凭据,二进制文件的名称和位置,master_host对应主服务器的IP地址,master_port对应主服务器的端口,master_log_file对应show master status显示的File列:mysql-bin.000001,master_log_pos对应Position列:155,否则有可能出现同步失败

mysql -uroot -p -e "CHANGE MASTER TO MASTER_HOST='192.168.50.5', MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=155;"
启动slave同步进程
mysql -uroot -p -e "start slave;"
查看slave状态
mysql -uroot -p -e "show slave status\G;"

在这里插入图片描述
当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了,如果Slave_IO_Running为connecting时可能是用来登录Slave从服务器,连接Master主服务器里面的密码或者用户名输入错误(查看slave的日志找原因一般在/var/log/mysql/error.log),如果是mysql8则会是密码加密错误,如下图
在这里插入图片描述
原因:mysql 8的密码插件为caching_sha2_password,客户端不支持
解决办法:修改密码加密插件为mysql_native_password,登录主库修改repl用户的密码使用mysql_native_password加密

mysql -uroot -p -e "ALTER USER 'repl'@'192.168.50.6' IDENTIFIED WITH mysql_native_password BY 'repl';"
mysql -uroot -p -e "flush privileges;"

再重启一下从库slave,再查看状态,可以看到Slave_IO_Running和Slave_SQL_Running都为YES了
在这里插入图片描述

5、测试

查看从库是否自动创建了数据库和表

登录主库往employee表插入一条数据

-- 插入
INSERT INTO employee VALUES(1, '主从','复制测试',26,'13533965228','[email protected]',SYSDATE(), SYSDATE(),SYSDATE());

-- 查询
select * from employee limit 10;

在这里插入图片描述
登录从库执行查询,从库有记录,证明主从复制生效
在这里插入图片描述

6、注意事项

由于主从复制是基于I/O的日志,所以会存在一定延时,如果对数据一致性要求非常高的话,简单的主从复制在实际环境中会存在问题。
开启了主从复制,slave库如果写入数据的话,可能导致数据回滚从而主从复制线程中断,可以通过以下方式解决
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;

停止slave的复制命令

mysql>stop slave;

重置slave

reset slave;

取消slave

# 在从服务器上执行
reset slave all;

# 在主服务器上执行
RESET MASTER;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章