1. 闲不住的人首页
  2. MySQL

MySQL基于binlog主从复制

1. 复制解决了哪些问题

  • 数据分布 (Data distribution ):每个节点有相同的的数据集
  • 负载平衡(load balancing):可由前端读写分离器(调度器)将读请求负载均衡至从节点
  • 备份(Backups):利用从节点实现数据备份
  • 高可用性和容错行(High availability and failover):任意单个节点宕机,都可以有其他节点提供服务

2. 主从复制过程

如下图所示:

MySQL主从复制过程
MySQL主从复制过程

主服务器上面的任何修改都会保存在二进制日志 Binary log 里面,从服务器上面启动一个 I/O thread(实际上就是一个主服务器的客户端进程),连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个 Realy log 里面。从服务器上面开启一个 SQL thread 定时检查 Realy log,如果发现有更改立即把更改的内容在本机上面执行一遍。

2.1 复制过程中涉及三个线程

Slave 节点:

  • I/O Thread:从 Master 请求二进制日志事件,并保存于中继日志中;
  • SQL Thread:从中继日志中读取日志事件,在本地完成重放;

Master 节点:

  • Dump Thread:为每个 Slave 的 I/O Thread 启动一个 dump 线程,用于向其发送 binary log events;
图片来自互联网
图片来自互联网

3. 基于 binlog 主从复制实战

  1. 准备两台服务器
  2. 安装 MySQL 并且运行状态正常
  3. 两台服务器配置时间同步
  4. 关闭 SELINUX
  5. 防火墙放行 3306 端口

3.1 前提条件

IP 地址角色
10.100.4.181MySQL Master
10.100.4.182MySQL Slave

3.2 配置 Master 节点

1、启动二进制日志;

[mysqld]
log-bin=master-bin

2、为当前节点设置一个全局唯一的 ID 号

[mysqld]
server-id=1

3、创建有复制权限的用户账号

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repluser'@'10.100.4.%' IDENTIFIED BY 'Repl@2019';

4、查看 Master 二进制日志文件及 POS 位置

查看MySQL Master状态
查看MySQL Master状态

3.3 配置 Slave 节点

1、开启中继日志

[myslqd]
relay_log=relay-log
relay_log_index=relay-log.index

2、为当前节点设置一个全局唯一的 ID 号

[mysqld]
server-id=3

3、使用有复制权限的用户账号连接至主服务器,并启动复制线程;

mysql> CHANGE MASTER TO MASTER_HOST='10.100.4.181',MASTER_USER='repluser',MASTER_PASSWORD='Repl@2019',MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=623;

mysql> start slave;

4、查看复制状态

Slave节点的复制状态信息
Slave节点的复制状态信息

4. 复制架构中应该注意的问题

1、限制从服务器为只读

在从服务器设置 read_only=ON,对拥有 SUPER 权限的用户无效

[mysqld]
read_only=ON

2、保证主从复制的事务安全

在 master 节点启用的参数:

[mysqld]
# 当事务提交时,将binlog内存缓冲区中记录的事件刷新到磁盘中
sync_binlog=ON

# InnoDB引擎需启用的参数
# 刷写日志,提交事务时,立即将内存中的事务相关的数据保存到事务日志文件中
innodb_flush_logs_at_trx_commit=ON 
# 分布式事务,分布式提交事务
innodb_suport_xa=ON

在 slave节点启用的参数:

[mysqld]
# 取消复制进程随数据库启动而启动,此项很可能会导致主从数据不一致
skip_slave_start=ON 

3、其他需要注意的参数,按需启用

# 主节点
# 是否立即将主服务器信息同步给从服务器
sync_master_info 

# slave节点
# 是否立即将中继日志从内存刷写到磁盘中
sync_relay_log
# 是否立即将此文件中保存的信息立即从内存刷写到磁盘中
sync_relay_log_info

以上复制环境是建立在全新的环境,但是往往在公司内部主节点中会有庞大的数据,这时要想实现主从复制,应该怎么做?欢迎各位在评论区留下宝贵的想法,我们一起找出最佳的实践方案。

原创文章,作者:恩志,如若转载,请注明出处:https://www.xbzdr.com/310.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:510749025@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code