mysql 主从的异步复制(基础二进制日志)

官网:https://dev.mysql.com/doc/refman/5.7/en/replication-howto.html


文章目录

  • mysql 主从的异步复制(基础二进制日志)
  • 简介
  • 实验:一主一从的复制
  • 实验:线性主从异步复制


简介

  • 传统的MySQL复制提供了一种简单的主次复制方法。有一个主要的(来源),并且有一个或多个次要的(副本)。主数据库执行事务,将其提交,然后稍后(因此异步)将它们发送到第二数据库,以重新执行(在基于语句的复制中)或应用(在基于行的复制中)。它是不共享资源的系统,默认情况下,所有服务器均具有数据的完整副本。
  • mysql 裸设备 异步io mysql 异步写入_mysql

  • I/O 线程 的作用:复制master 二进制日志文件( sql 语句),决定数据一致性。
  • SQL 线程 的作用: 重做,回放二进制文件,通俗点就是将master 执行过的sql 语句在本地执行一遍。
  • 异步复制 缺点:master 多线程并发,slave 单线程回放。会有所延迟(前提是一定的流量时)。master dump 线程只管发送,至于slave 端复制成功与否不关心。(比如slave down了,网络故障等,master 不关心)

实验:一主一从的复制

server1 (master) -> server2 (slave)

主机

IP

server1 (master)

172.25.9.1

server2 (slave)

172.25.9.2

  • server-id=1
    指定服务器ID。在MySQL 5.7中,server_id如果启用了二进制日志记录,则 必须指定,否则将不允许服务器启动。如果服务器ID设置为0,则会进行二进制日志记录,但是服务器ID为0的源将拒绝来自副本的任何连接,而服务器ID为0的副本将拒绝与源的连接。
  • log-bin=mysql-bin
    二进制日志文件的名称。
  • master 端配置
# 创建用户
useradd -M -d /usr/local/mysql/data/ -s /sbin/nologin mysql
# 编辑配置文件
vim /etc/my.cnf
……
log-bin=mysql-bin
server-id=1
……
# 启动
/etc/init.d/mysql start
mysql -pwestos
# 新建远程用于登陆的用户,并授权。
grant replication slave on *.* to repl@'%' identified by 'westos';
show master status;
  • slave 端配置:
# 基于已有的MySQL 服务器,扩展一个新的MySQL服务器。相关文件复制到server2.
# server1 :

scp -r /usr/local/mysql/ server2:/usr/local/
scp /etc/my.cnf server2:/etc/
scp /etc/init.d/mysqld server2:/etc/init.d/

# server2 :
rm -fr /usr/loacl/mysql/data/*
# 添加变量
vim .bash_profile
source .bash_profile
# 创建用户
useradd -M -d /usr/local/mysql/data/ -s /sbin/nologin mysql
# 重新初始化数据目录
mysqld --initialize --user=mysql
# 安全初始化
mysql_secure_installation
# 配置文件
vim /etc/my.cnf
……
 server-id = 2
……
# 启动
/etc/init.d/mysql start
# 配置
mysql> CHANGE MASTER TO
    ->     MASTER_HOST='172.25.9.1',
    ->     MASTER_USER='repl',
    ->     MASTER_PASSWORD='westos',
    ->     MASTER_LOG_FILE='mysql-bin.000001',
    ->     MASTER_LOG_POS=437;
# 启动 slave
start slave;
# 查看slave状态,I/O 线程和 SQL 线程的状态是为 yes 则配置成功,开始复制
show slave status\G;

示例截图:

mysql 裸设备 异步io mysql 异步写入_数据库_02

mysql 裸设备 异步io mysql 异步写入_数据库_03

mysql 裸设备 异步io mysql 异步写入_数据库_04

mysql 裸设备 异步io mysql 异步写入_mysql_05


mysql 裸设备 异步io mysql 异步写入_数据库_06

实验:线性主从异步复制

server 1 (master ) -> server2 (master) -> server 3 (slave)

主机

IP

server 1 ( master )

172.25.9.1

server 2 ( master,slave )

172.25.9.2

server 3 ( slave )

172.25.9.3

  • log-slave-updates
    副本接收到的所有事务(甚至来自多个源)都写入二进制日志中。
  • master 端配置:
# 配置server2 master

vim /etc/my.cnf
server-id=2
log-slave-updates
log-bin=mysql-bin

mysql -pwestos
# 新建远程用于登陆的用户,并授权。
grant replication slave on *.* to repl@'%' identified by 'westos';
show master status;
  • slave 端配置:
# 基于已有的MySQL 服务器,扩展一个新的MySQL服务器。相关文件复制到server3.
# server2:

scp -r /usr/local/mysql/ server3:/usr/local/
scp /etc/my.cnf server3:/etc/
scp /etc/init.d/mysqld server3:/etc/init.d/

# server3:
rm -fr /usr/loacl/mysql/data/*
# 添加变量
vim .bash_profile
source .bash_profile
# 创建用户
useradd -M -d /usr/local/mysql/data/ -s /sbin/nologin mysql
# 重新初始化数据目录
mysqld --initialize --user=mysql
# 安全初始化
mysql_secure_installation
# 配置文件
vim /etc/my.cnf
……
 server-id = 3
……
# 启动
/etc/init.d/mysql start

# 如果master 有数据,可以使用以下操作进行数据同步。(数据持续写入的话,要先锁表,设置成功后解表,保持数据一致性。)
# server1 :
# 锁表
FLUSH TABLES WITH READ LOCK;
# 打包数据库。
mysqldump -uroot -pwestos westos > westos.db
# 解表(当复制配置成功并开始复制后执行,否则解锁后,master 继续数据写入,与 slave 导入的数据并不一致了)
UNLOCK TABLES;

# sever3:
# 手动创建数据库
mysqladmin create westos -p westos
# 表的数据导入,数据库。
mysql -pwestos westos < dump.db

# server3:
# 配置 slave
change master to 
master_host='172.25.9.2', 
master_user='repl', 
master_password='westos', 
master_log_file='mysql-bin.000002', 
master_log_pos=443;

# 启动并查看I/O 线程与 SQL 线程状态为 yes 则配置成功,开始复制了
start slave;
show slave status\G;