mysql 主从的异步复制(基础二进制日志)
官网:https://dev.mysql.com/doc/refman/5.7/en/replication-howto.html
文章目录
- 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;
示例截图:
实验:线性主从异步复制
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;