MYSQL主从复制(一主多从)
环境准备
mysql 版本8.0.23
服务器架构:
Master(主) ip: 192.168.252.100 主机名称 node01 server_id:1
Slave(从) ip : 192.168.252.101 主机名称 node02 server_id: 2
Slave(从) ip : 192.168.252.102 主机名称 node03 server_id:3
其他准备:
每台服务器配置一下 hosts
# vim /etc/hosts
192.168.133.130 node01
192.168.133.128 node02
192.168.133.129 node03
# 可做可不做
系统时间同步:
yum install chrony
配置时间同步源 :# vi /etc/chrony.conf
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.rhel.pool.ntp.org iburst
server 1.rhel.pool.ntp.org iburst
# systemctl start chronyd.service #启动
# chronyc sources -v #同步时间源
关闭selinux
vi /etc/selinux/config
SELINUX=enforce
修改成:
SELINUX=disabled
关闭firewalld防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
数据库配置文件
Master:
配置文件在 /etc/mysql/my.cnf
server_id =1 // 用于给服务器编号,注意主备编号不要重复 log_bin = /var/log/mysql-bin.log // binlog 文件路径 sync_binlog = 1 // 开启binlog同步,在每次提交事务前会将二进制日志同步到磁盘。 binlog_format = ROW // binlog的日志格式,我们这种基于行的复制。 binlog_do_db = test // 需要记录binlog的DB,有多个的话设置多行。 binlog_ignore_db = mysql // 忽略的DB。 default_authentication_plugin = mysql_native_password // 配置客户端连接的认证方式配置,非必须,当发生备库无法连接主库时可能需要配置。
配置好后,重启服务。
systemctl restart mysql
Slave: 两台从服务器 :192.168.133.128 和 192.168.133.129 的配置文件,添加server_id=2 或者 3 并分别重启服务。
配置文件在 /etc/mysql/my.cnf
log_bin = mysql-bin
server-id= 2
relay_log = /var/lib/mysql/mysql-realay-bin
log_slave_updates=1
read_only=1
配置好后,重启服务。
systemctl restart mysql
主从数据库测试是都已经可以远程访问
# 主数据库服务器测试从数据库 mysql -uroot -p -h192.168.133.128 -P3306 mysql -uroot -p -h192.168.133.129 -P3306 # 从数据库服务器测试主数据库 mysql -uroot -p -h192.168.133.130 -P3306
主数据库创建用户slave并授权
# 登录
mysql -uroot -p # 创建用户 create user ‘slave’@‘%’ identified with mysql_native_password by ‘password’; # 授权 grant replication slave on *.* to 'slave'@'%'; # 刷新权限 flush privileges;
从数据库验证salve用户是否可用
mysql -uslave -p -h192.168.133.129 -P3306
主数据库查询服务ID及Master状态
# 查询server_id是否可配置文件中一致 show variables like ‘server_id’; # 若不一致,可临时设置ID(重启失效) set global srever_id =1; # 查询master 状态,并记录File 和Position 的值 show master status;
从数据库设置与主库的连接
# 查询server_id 是都可配置文件中一致
show variables like 'server_id';
# 若不一致,可设置临时ID(重启失效)
set gloabl server_id = 2;
# 设置主数据库参数
change master to master_host = '192.168.133.130', master_port=3306, master_user='slave',
master_password='password', master_log_file='mysql-bin.000001',master_log_pos=0;
mysql> CHANGE MASTER TO -> MASTER_HOST='192.168.0.109', // 主数据库的ip -> MASTER_USER='repl', // 之前在主机设置的用于复制的专用账号 -> MASTER_PASSWORD='123456', // 和密码 -> MASTER_LOG_FILE='mysql-bin.000001', // 需要通过查看主库状态的binlog文件一致。 -> MASTER_LOG_POS=0; // 复制位置默认为0,表示从头开始跟踪事件。这种配置可能不是最好的, 比如数据库本来就很大,可以先手动同步一把。 Query OK, 0 rows affected, 2 warnings (0.30 sec)
启动slave
START SLAVE; # 开始同步
SHOW SLAVE STATUS\G;
# 若出现错误,则停止同步,重置
stop slave;
reset slave;
如果出现
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
就说明配置成功。到这里我们主备配置就成功了。但我们还可以进一步验证一下,
遇到的问题
Access denied for user 'root'@'192.168.1.148' (using password: YES) ERROR 1410 (42000): You are not allowed to create a user with GRANT Access denied for user 'txj'@'192.168.133.128' (using password: YES) Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
总之,遇到的问题太多,根本没法弄,然后我重新设置了一遍。
复制的基本过程
1. 在从节点上执行 start slave 命令开启主从复制开关,开始进行主从复制。从节点上的I/O进程连接主节点,并请求从指定日志文件的指定位置之后的日志内容。
2. 主节点接受到来自从节点的I/O请求后,通过负责复制的I/O进程(log dump Thread)根据请求信息读取指定日志指定位置之后的日志信息,返回给从节点。返回信息中除了日志所包含的信息之外,还包含本次返回的信息的Binlog file 以及 Binlog position (Binlog 下一个数据读取位置)
3. 从节点的I/O进程接受到主节点发送过来的日志内容,日志文件及位置点后,将接受到的日志内容更新到本机的relay log 文件的最末端,并将读取到的BInlog文件名和位置保存到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master:我需要从那个位置开始往后的日志内容,请发送给我。
4. Slave 的SQL 线程检测到relay log 中新增加了内容后,会将relay log 的内容解析成能够再执行SQL语句,然后在本数据库汇总照解析出来的顺序执行。并把Binlog存储到本地的relay log中,然后去执行relay log的更新内容。
MySQL 基于Binlog主从复制的模式介绍
MySQL主从复制默认是 异步的模式。MySQL增删改操作会全部记录在binlog中,当slave 节点连接master 时,会主动从master 处获取最新的Binlog文件。并把Binlog存储到本地的relay log中,然后去执行 relay log 的更新内容。
异步模式(async-mode)
这种模式下,主节点不会主动推送数据到从节点,主库在执行客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接受并处理。这样就会有一个问题,主节点如果崩溃掉了,此时主节点上已经提交的事务可能没有传到从节点上,如果此时,强行将从提升为主,可能导致新主节点上的数据不完整。
半同步模式(semi-sync)
介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库收到写到 relay log 中才返回成功信息给客户端(只能保证主库的Binlog至少传输到了一个从节点上),否则需要等待知道超时间然后切换成异步模式再提交。
相对于异步复制,半同步复制提高了数据的安全性,一定程度的保证了数据能成功备份到从库,同时它也造成了一定程度的延迟,但是比全同步模式延迟要低,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。
半同步模式不是 mysql 内置的,从MYSQL 5.5 开始集成,需要master 和 slave 安装插件开启半同步模式。
全同步模式
只当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。因为需要等待所有从库执行完钙食物才能返回成功信息,所以全同步复制的性能必然会受到严重的影响。