mysql 主从的异步复制

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

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

简介

  • 传统的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;

示例截图:
在这里插入图片描述

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

实验:线性主从异步复制

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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值