数据库复制 一主多从
1.mysql数据库复制概念 主从 服务器解释 从服务器数量 网络故障对服务器影响
数据库复制是 MySQL 的提供的一项功能,允许数据库实例将数据库数据的变更从一个实例复制到另一个实例
MySQL复制概述
MySQL中的复制功能将数据变更从一个主服务器Master复制到一个或多个从属服务器(Slave)
主服务器(Master)将更改写入二进制日志(binlog),
从属服务器(Slave)请求复制主服务器的二进制文件(binlog)并应用(apply)其内容日志文件的格式影响从属服务器应用更改的方式
MySQL支持基于语句的(statment)基于行的(row)和混合格式的(mixed)日志格式
在复制过程中主服务器使用基于行(row)的日志格式可以大幅降低主服务器和从属服务器数据不一致的情况发生
从属服务器数量
一个主服务器可以具有 从属服务器数量 理论上没有限制(4,294,967,295)
每个额外的从库(Slave)都会占用主库(Master)较少资源,在生产环境 配置从库时应该仔细斟酌每个从库的必要性
给定环境中主服务器的最佳从属服务器数量取决于许多因素:模式大小g t、写入次数、主服务器和从属服务器的相对性能以及 CPU 和内存可用性等因素。
一般准则是将每个主服务器的从属服务器数量限制为不超过 30
网络故障对主从复制的影响
MySQL中的复制功能在网络故障时暂停工作,在网络故障恢复后复制工作将继续进行
每个从属服务器跟踪其已经处理了多少日志并在网络连接恢复时自动继续处理,此行为是自动的,不需要特殊配置
1.主库和从库的关系 数据库复制拓扑结构
Master和Slave是一对多的关系(MySQL5.5,5.6版本)
一个Master主服务器可以对应多个Slave从属服务器,一个Slave从属服务器只能有一个Master主服务器
一个Master主服务器可以将日志传送给多个Slave从属服务器
一个Slave从属服务器可以作为另一个Slave从属服务器的Master主服务器,因而可以根据业务需要搭建出较复杂的复制拓扑结构
从MySQL5.7开始,MySQL支持多源复制(multi-source),一个slave从属服务器可以有多个master主服务器
复杂数据库复制拓扑结构
2.常见的数据库复制的用途
1.读写分离
Master主服务器主要用来DML操作,尽量减少SELECT查询操作。
消耗资源的查询任务尽量在Slave从服务器上执行;
Master主服务器集中处理生产应用程序(DML增删改),
占用资源(CPU,时间和IO)的各类BI报表统计(DML查询)使用Slave从属服务器
2.服务器冗余,故障切换(fail over)
使用数据库复制,可以在Master主服务器由于硬件或软件故障或因维护而脱机时,
将故障转移到Slave从属服务器,即Slave升级为Master
3.数据备份
数据库复制是物理与逻辑数据备份之外的一种数据备份形式,
但并不意味着Master主服务器的数据不再需要做物理或逻辑备份
软硬件升级
在主数据库硬件或系统升级期间使用Slave从属服务器代替生产主服务器;
Slave从属服务器运行的版本必须比Master主服务器新;在升级过程中发出的查询必须受升级过程中使用的所有版本的支持
3.数据库复制配置
主从服务器 为每个服务器配置唯一值的server-id;
数据库复制拓扑结构中的每个服务器必须具有唯一的 server-id;
server-id是一个无符号的 32 位整数,值从 0(默认) 1到 4,294,967,295
不要把server-id 设置为 0,如果server-id=0无论是该服务器是从属服务器还是主服务器,都会拒绝使用其他服务器进行复制
通常习惯把server-id设置为本服务器IP的最后一段数字,
如:服务器IP为192.168.2.21,server-id可以设置为21
Master主服务器
1.开启binlog
2.启动tcp/ip网络(默认启用),数据库复制需要使用tcp/ip,不能使用unix套接字
3.备份主库数据库(完整一致性备份),如果需要(不使用GTID),记录备份时的日志坐标(mysqldump --master-data=2) 即binlog 0123456等
4.创建具有REPLICATION SLAVE权限的用户 (单独使用)
从库复制时需要用此用户连接主库,当然不创建该用户使用root用户也可以
Slave从服务器
1.还原主库备份
2.使用change master to语句设置主库IP,复制用户,复制用户密码,端口号,起始复制的日志位置坐标(如果不使用GTID)
3.start slave; 开始复制
4.show slave status\G; 监控复制状态
实验1 配置 一个主库20.100和一个从库20.11
1.规划与准备 三台机器关闭fhq selinux 可设置主机名称 ip
IP |
主机名 |
角色 |
操作系统(最小安装) |
MySQL |
192.168.20.10 |
X1 |
主库 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
X2 |
存库(中举库) |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
X3 |
存库 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
三台机器都关闭selinux
禁用selinux禁用防火墙
vi /etc/selinux/config 设置disabled
systemctl disable firewalld
systemctl stop firewalld
设置静态IP和主机名
vim /etc/hosts或者 更改nmtui
systemctl reboot重启
2.安装MySQL服务 主库 和 从库 解压安装包 关闭密码验证 设置简单密码
主库虚拟机:192.168.20.10 从库虚拟机:192.168.20.11从库2 的192.168.20.20
解压安装包 挂载光盘
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar上传
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar解压
rm mysql-community-server-minimal-5.7.28-1.el7.x86_64.rpm删除普通文件
yum install mysql-community-{client,common,libs,server}-*.rpm安装mysql rpm
systemctl start mysqld启动mysql
vi /etc/my.cnf关闭密码验证插件
validate-password=0
systemctl restart mysqld重启mysqld服务
cat /var/log/mysqld.log|grep password找临时密码
mysql -uroot -p连接mysql
set password='123';设置简单密码
mysql -uroot -p重新登录测试新密码
3.主库20.10 创建binlogs目录 开启binlog 修改字符集 server id和 binlogs位置
主库上执行
创建binlog存放目录
mkdir /binlogs创建binlogs目录
chown mysql:mysql /binlogs更改属组
chmod 750 /binlogs增加权限
ll -d /binlogs查看
修改my.cnf 设置字符集 server id 和binlogs目录位置
vi /etc/my.cnf
character-set-server=utf8
explicit_defaults_for_timestamp
server-id=10主机IP的后面位数,防止混乱
log-bin=/binlogs/mysql-bin
重启mysqld
systemctl restart mysqld
ll /binlogs
登录mysql,查看binlog
mysql -uroot -p
show binary logs;
4.主库 创建 复制用户repl 设置权限
create user 'repl'@'192.168.20.%' identified by 'repl';
grant replication slave on *.* to 'repl'@'192.168.20.%';
show grants for 'repl'@'192.168.20.%';
5.主库 备份所有数据库 事件 等 保持一致性
mysqldump -uroot -p --all-databases --triggers --routines --events --master-data=2 --flush-logs >/root/all-master-db.sql备份所有数据库 事件等等 保持一致性
cat /root/all-master-db.sql | grep -i "^-- change master to"注意154从日志开始的地方
6.从库读取主库备份内容 scp将主库备份文件 发送到从库
从库上执行:
scp 192.168.20.100:~/all-master-db.sql /root
mysql -uroot -p
source /root/all-master-db.sql
7.设置 从库server-id,重启从库
从库上执行:
vi /etc/my.cnf加入id 本机后两位的ip
server-id=11
systemctl restart mysqld重启服务
8.从库20.11执行change master to语句 读取主库20.100binlogs 日志
从库上执行:
mysql -uroot -p
mysql> help change master to;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;
9.从库启动复制 start slave;,查看复制状态 查看日志
mysql> start slave;
mysql> show slave status\G
查看中继日志(relay_log_file)
cd /var/lib/mysql
ll *relay-bin*
cat master.info
cat relay-log.info 放到备库上的日志信息
show variables like '%master%';
10.把从库的master.info和relay-log.info中的信息放到表中,需要修改/etc/my.cnf 重启从库
vim /etc/my.cnf修改配置文件 增加这两行
relay_log_info_repository=table
master_info_repository=table
systemctl restart mysqld重启服务
完成后 进入 mysql库 放到表里
mysql> select * from slave_master_info\G;
mysql> select * from slave_relay_log_info\G;
11.测试 主从复制 主库20.100建立数据库 从库 20.11查看
主库上操作:
mysql> create database world;
上传world.sql到主库/root
mysql> use world;
mysql> source /root/world.sql
从库上操作:
mysql> show databases;
mysql> use world;
mysql> show tables;
select count(*) from city;
12.change master to语句 解读
1.设置或改变从库 连接主库 的相关参数
2.读取 主库binlog文件和 从库中继日志 为目的
3.如果主库密码变更 则设置单独连接密码
CHANGE MASTER TO MASTER_PASSWORD='newpwd';单独设置主库连接密码
4.选项MASTER_HOST, MASTER_USER, MASTER_PASSWORD,MASTER_PORT提供从库连接主库的信息
5.一个设置从库连接主库准备复制的例子:
CHANGE MASTER TO
MASTER_HOST='master2.example.com',域名
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4之名日志坐标循环复制
MASTER_HOST 和 MASTER_PORT 值指定主服务器的主机名和 TCP 端口号;
MASTER_USER 和 MASTER_PASSWORD 值指定具有 REPLICATION SLAVE 特权的主服务器上帐户的帐户详细信息;
MASTER_LOG_FILE 和 MASTER_LOG_POS 值包含从属服务器开始进行复制的二进制日志位置的日志坐标;
SHOW MASTER STATUS 从主服务器获取文件和位置
MASTER_AUTO_POSITION = 1连接选项
MASTER_LOG_FILE和MASTER_LOG_POS从库将使用GTID-based复制协议从主库复制,无需指定
实验2 配置 一个主库20.100和两个从库20.11和20.20
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.2.21 |
host21 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.22 |
host22 |
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.23 |
host23 |
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.安装MySQL服务从库 关闭密码验证 设置简单密码 读取发送主库的备份
虚拟机:192.168.20.20:
解压安装包 挂载光盘
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar上传
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar解压
rm mysql-community-server-minimal-5.7.28-1.el7.x86_64.rpm删除普通文件
yum install mysql-community-{client,common,libs,server}-*.rpm安装mysql rpm
systemctl start mysqld启动mysql
vi /etc/my.cnf关闭密码验证插件
validate-password=0
systemctl restart mysqld重启mysqld服务
cat /var/log/mysqld.log|grep password找临时密码
mysql -uroot -p连接mysql
set password='123';设置简单密码
mysql -uroot -p重新登录测试新密码
读取主库的备份 从库上执行:
scp 192.168.20.100:~/all-master-db.sql /root
mysql -uroot -p
source /root/all-master-db.sql
2.设置从库server-id,重启从库
从库上执行:
vi /etc/my.cnf
加入id 为本机的ip后两位防止混乱
server-id=20
systemctl restart mysqld
3.从库执行change master to语句 读取 主库20.100的binlogs 日志
从库上执行:
mysql -uroot -p
mysql> help change master to;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;
4.从库 启动复制 start slave;,查看复制状态
mysql> start slave;
mysql> show slave status\G 20.100为主库的IP
5.测试 主从复制 主库创建数据库 从库查看
主库上20.100操作:
create database kwz;
从库(192.168.20.11)上操作:
show databases;
从库(192.168.20.20)上操作:
mysql> show databases;
主从日志解读全局事务标识符 启用GTID模式 复制数据库的优势
1.使用 日志坐标 进行 故障转移 日志 最新的服务器做主库 解读
1.在主服务器变为不可用时进行故障转移(fail-over),选择某个slave从属服务器作为主服务器;
2.主库不可用时,所有从属服务器都不是最新状态(宕机的主服务器有些日志还没有复制到从服务器),有可能会造成数据丢失,取决于主库binlog日志是否损毁;
3.如果业务要求主库停机时间不能太长,可以从已有的从数据库中挑选一台作为主库(选择Exec_Master_Log_Pos坐标最大的作为新主库),其他从库使用change master to命令指向新的主库;
4.如果新选的主库没有启用binlog,必须先启用;my.cnf还要设置log-slave-updates,将复制的事件记录到新从库的binlog中;
5.如果复制为多主循环拓扑复制,查找最新从属服务器和确定正确日志坐标会非常困难,因为每个从属服务器使用与其他从属服务器不同的顺序应用操作;
6.要避免此困难,需一开始就 启用全局事务标识符 (Global Transaction Identifier, GTID)
2.全局事务标识符
全局事务标识符 (Global Transaction Identifier, GTID) 可以唯一地标识数据库复制过程中主库binlog文件中的每个事务
1.单个GTID 的形式为
例如:
86dfda90-ba4f-11e8-81d8-000c29746892:41
2.GTID集包含一系列GTID,
形式为:
86dfda90-ba4f-11e8-81d8-000c29746892:1-41
3.每个mysql服务器安装初始化以后会生成 uuid存放位置 数据库目录中的 auto.cnf文件中
或者到 user中查看???
也可以通过下面语句访问:
mysql>select @@server_uuid;
4.客户端在master主服务器上执行事务时, MySQL服务器将创建新的GTID 以记录事务及其唯一的GTID事务号;
5.slave从服务器从master主服务器读取并应用该事务时,该事务保持其原始 GTID。
即 复制到slave从服务器的事务的服务器 UUID 是主服务器的 UUID,而不是从属服务器的;
6.复制链中的 每个后续slave从服务器都将 记录该事务及其原始 GTID。
因此,复制拓扑中的每个slave从服务器可以确定第一个执行事务的master主服务器
3.启用gtid模式
使用以下选项启用 GTID 模式:
默认为关闭状态
主备服务端 都要开启gtid
vi /etc/my.cnf增加下面两行
gtid-mode=ON binlog中每个事务一起记录唯一的 GTID
enforce-gtid-consistency 禁止无法以事务安全方式记录的事件
4.启用GTID模式复制数据库的优势
传统的复制方式基于master主库产生的变更事件,需要获取到binlog文件及其产生事件的位置坐标才能使slave从库与master主库同步数据
GTID模式复制数据库相对较新,slave从库不需要知道master主库具体的binlog文件和变更事件的位置坐标,因而简化了复制工作相关的配置信息
使用GTID模式,只要事务在master主库提交而且在slave备库应用(重做)了相关日志事件并且提交,就可以确保主库与备库的一致性
如果启用GTID模式,之前没有包含GTID的数据库备份不能使用,需要重新备份数据库
实验3:启用gtid模式配置 主库和2个从库
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.20.100 |
|
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
|
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
|
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.所有主库 从库启用GTID模式 重启服务 关闭数据复制
vi /etc/my.cnf 添加下面这两行
gtid-mode=ON
enforce-gtid-consistency
systemctl restart mysqld重启10.11.20 三台主机的mysql数据库服务
mysql> stop slave;从库11.20关闭数据库复制 停止
mysql> reset slave all;从库11.20重置复制参数 清空
show slave status\G同步参数都没有了 从库之间关系都没有了
2.从库11.20 设置GTID复制参数 change master to 语句 为 主库20.100
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
start slave;
show slave status\G
3.测试 主 从复制 复制库结构
主库操作:
mysql> create database kkk;
mysql> use kkk;
mysql> create table t like world.city;复制库结构
从库操作:
mysql> show databases;
mysql> use kkk;
mysql> desc kkk;
实验4:配置主库->中继库->从库 (100->11->20)
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.20.10 |
|
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
|
中继库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
|
从库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.MySQL复制线程 binlogs
MySQL 在master主服务器 和 slave从服务器 上创建线程来执行复制工作
1.slave从服务器 成功连接到master主服务器 时, master主服务器启动称为 Binlog 转储线程的复制主服务器线程
2.如果slave从属服务器配置为使用自动定位协议 (CHANGE MASTER TO MASTER_AUTO_POSITION),则该线程显示为“Binlog Dump GTID”
3.在slave从服务器已连接时,此线程会在二进制日志内的事件到达时将其发送到从属服务器
4.每个slave从服务器启动两个线程,分别称为slave从服务器 I/O 线程和SQL 线程
I/O线程从主库的binlog中读取日志事件,存储到从库中继日志中(Relay log)
SQL线程读取中继日志中的新的日志事件并应用执行
2.复制数据库 命令stop reset slave all reset master log-slave-updates
stop slave
停止从库复制线程
建议关闭从库之前先使用stop slave命令,尤其是binlog格式为row-based,复制的表对象属于非事务引擎时
reset slave
使从库忘记主库binlog文件的复制位置 重置文件位置
清空主库信息
清空中继日志信息库
删除所有中继日志,重新设置一个新的中继日志文件
reset slave all
reset slave不会改变gtid_executed和gtid_purged变量值,使从库复制线程停止
先使用stop slave命令 在使用reset slave
reset slave 不会改变复制连接参数,
如:master host, master port, master user, or master password;
这些参数还保留在内存中,这意味着start slave之前不需要再用change master to命令来指定连接参数
但是如果用reset slave all参数,连接参数会置空
reset master注意注意 破坏清空主从数据库的关系 清空binlogs 日志 小心
删除所有binlog index文件中列出的binlog文件,清空binlog index文件,创建一个新的binlog文件
清空gtid_purged系统变量和gtid_executed系统变量的值
gtid_executed
gtid_purged
清空mysql.gtid_executed表的数据
--log-slave-updates (选项)
一般情况,从库可以不用打开binlog
log-slave-updates的作用是从主库收到的变更事件,slave从库在应用日志时所产生的变更记录到本地的binlog中
如果要建立链状中继复制如:
A->B->C,要在中继从库B上启用binlog,还要设置log-slave-updates
3.开启11.20主机的binlog日志 /etc.my.cnf 增加binlogs存储位置
11.20两个从主机分别执行
创建binlog存放目录
mkdir /binlogs
chown mysql:mysql /binlogs
chmod 750 /binlogs
ll -d /binlogs
修改my.cnf
vi /etc/my.cnf
log-bin=/binlogs/mysql-bin
log-slave-updates
重启MySQL
systemctl restart mysqld
ll /binlogs
查看是否开启binlogs
show variables like '%slave%';
查看当前使用的日志 从
4.把主机11设置为主库即为中继库 20为从库
mysql> stop slave;11主机 停止复制
mysql> reset slave all;重置主库配置信息
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;变更主库配置信息 即 11为主库 20为存库
mysql> start slave;启动复制并查看复制状态
mysql> show slave status\G
5.测试主从复制
主库操作20.100
mysql> create database abc;
mysql> use abc;
mysql> create table t1 (id int, name char(10));
mysql> insert into t1 values(1,’a’),(2,’b’),(3,’c’);
mysql> select * from t1;
中继从库操作20.11
mysql> select * from abc.t1;
从库操作20.20
mysql> select * from abc.t1;
实验5:配置多主循环复制100->11->20->100
规划
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.20.100 |
host21 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
host22 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
host23 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.修改 /etc/my.cnf 主机 20.20从库 增加 log-slave-updates
vi /etc/my.cnf 主机20.20 添加
log-slave-updates
2.从库主机11.20 停止复制 所有主机 重置清空 binlogs
mysql> stop slave; 从库11.20停止复制
主机100.11.20
mysql> reset master;所有主机重置 binlog
2.增加各主库之间关系 复制change master to 形成循环 启动复制 查看
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
100 11 .20 100 为 11的 主库 11为20的主库 20为100的主库 形成循环
mysql> start slave;所有主机100.11.20 启动复制
mysql> show slave status\G查看
3.测试多主复制
20主机执行
mysql> create database www;
mysql> show databases;
100主机查看
mysql> show databases;
11主机查看
mysql> show databases;
GTID 如何跳过 事务冲突:
1、主要跳过事务,从库不做这个命令 代替原来的set global sql_slave_skip_counter = 1。
2、由于在这个GTID必须是连续的,正常情况同一个服务器产生的GTID是不会存在空缺的。所以不能简单的skip掉一个事务,只能通过注入空事物的方法替换掉一个实际操作事务。
注入空事物的方法:
stop slave;
set gtid_next='xxxxxxx:N';
begin;commit;
set gtid_next=automatic;
start slave;
实验6:还原 一主 多从 复制结构
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.2.21 |
host21 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.22 |
host22 |
从库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.23 |
host23 |
从库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.主机100 取消设置为从库
100主机操作
mysql> stop slave;
mysql> reset slave all;
2.设置主机20.20 和20.11 为主机100的从库
20.11从机操作
mysql> show slave hosts;
mysql> stop slave;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
20.20从机操作
mysql> show slave hosts;
mysql> stop slave;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
100主机操作
mysql> show slave hosts;
3.异步复制 特点 问题
MySQL属于异步复制,其特点是:
master主服务器不关注从属服务器何时应用日志,master主服务器继续运行 而不等待slave从服务器
请求binlog日志并应用其内容,slave从服务器通常滞后于master主服务器
如果master主服务器在提交事务之前等待所有从属服务器应用其更改,则复制称为是同步复制
潜在的问题:
在master主服务器向客户端应用程序报告commit成功时,slave从服务器尚未应用事务;
如果在master主服务器提交事务之后而该事务复制到任何slave从服务器之前,master主服务器出现故障并且数据丢失,则该事务将丢失
这种情况下,即使应用程序已经向用户报告commit成功也是如此
4.半同步复制 特点 问题
传统MySQL复制支持半同步复制,其特点为:
1.Master主库和至少一个slave从库上 安装插件
2.客户端向master主服务器提交事务时,master主库先不提交,等待至少一个slave从库提交成功的信号,然后master主库再提交
3.只有在master主库和至少一个slave从库都提交成功时,才向客户端应用程序报告commit成功
4.如果slave从库发生响应超时则切换到异步复制
5.可以通过设置rpl_semi_sync_master_timeout变量来设置超时时间,单位毫秒,默认值10000(10秒)
6.半同步复制在一定程度上可以确保主库和从库数据的一致性
7.是否采用需要在性能和数据完整性之间进行权衡,因为半同步复制时事务速度比使用异步复制时慢
8.启用半同步复制的主库和从库,在地理位置上不能距离太远,要考虑网络响应的延时因素
实验7:配置半同步复制
1.启动插件 主库100
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> show plugins;
mysql> set global rpl_semi_sync_master_enabled=1;启动插件
mysql> show status like 'rpl_semi_sync_master_status';
show variables like '%semi%';
2.启动插件 从库20
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> show plugins;
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> stop slave;
mysql> start slave;
mysql> show status like 'rpl_semi_sync_slave_status';
创建表测试
1.mysql数据库复制概念 主从 服务器解释 从服务器数量 网络故障对服务器影响
数据库复制是 MySQL 的提供的一项功能,允许数据库实例将数据库数据的变更从一个实例复制到另一个实例
MySQL复制概述
MySQL中的复制功能将数据变更从一个主服务器Master复制到一个或多个从属服务器(Slave)
主服务器(Master)将更改写入二进制日志(binlog),
从属服务器(Slave)请求复制主服务器的二进制文件(binlog)并应用(apply)其内容日志文件的格式影响从属服务器应用更改的方式
MySQL支持基于语句的(statment)基于行的(row)和混合格式的(mixed)日志格式
在复制过程中主服务器使用基于行(row)的日志格式可以大幅降低主服务器和从属服务器数据不一致的情况发生
从属服务器数量
一个主服务器可以具有 从属服务器数量 理论上没有限制(4,294,967,295)
每个额外的从库(Slave)都会占用主库(Master)较少资源,在生产环境 配置从库时应该仔细斟酌每个从库的必要性
给定环境中主服务器的最佳从属服务器数量取决于许多因素:模式大小g t、写入次数、主服务器和从属服务器的相对性能以及 CPU 和内存可用性等因素。
一般准则是将每个主服务器的从属服务器数量限制为不超过 30
网络故障对主从复制的影响
MySQL中的复制功能在网络故障时暂停工作,在网络故障恢复后复制工作将继续进行
每个从属服务器跟踪其已经处理了多少日志并在网络连接恢复时自动继续处理,此行为是自动的,不需要特殊配置
1.主库和从库的关系 数据库复制拓扑结构
Master和Slave是一对多的关系(MySQL5.5,5.6版本)
一个Master主服务器可以对应多个Slave从属服务器,一个Slave从属服务器只能有一个Master主服务器
一个Master主服务器可以将日志传送给多个Slave从属服务器
一个Slave从属服务器可以作为另一个Slave从属服务器的Master主服务器,因而可以根据业务需要搭建出较复杂的复制拓扑结构
从MySQL5.7开始,MySQL支持多源复制(multi-source),一个slave从属服务器可以有多个master主服务器
复杂数据库复制拓扑结构
2.常见的数据库复制的用途
1.读写分离
Master主服务器主要用来DML操作,尽量减少SELECT查询操作。
消耗资源的查询任务尽量在Slave从服务器上执行;
Master主服务器集中处理生产应用程序(DML增删改),
占用资源(CPU,时间和IO)的各类BI报表统计(DML查询)使用Slave从属服务器
2.服务器冗余,故障切换(fail over)
使用数据库复制,可以在Master主服务器由于硬件或软件故障或因维护而脱机时,
将故障转移到Slave从属服务器,即Slave升级为Master
3.数据备份
数据库复制是物理与逻辑数据备份之外的一种数据备份形式,
但并不意味着Master主服务器的数据不再需要做物理或逻辑备份
软硬件升级
在主数据库硬件或系统升级期间使用Slave从属服务器代替生产主服务器;
Slave从属服务器运行的版本必须比Master主服务器新;在升级过程中发出的查询必须受升级过程中使用的所有版本的支持
3.数据库复制配置
主从服务器 为每个服务器配置唯一值的server-id;
数据库复制拓扑结构中的每个服务器必须具有唯一的 server-id;
server-id是一个无符号的 32 位整数,值从 0(默认) 1到 4,294,967,295
不要把server-id 设置为 0,如果server-id=0无论是该服务器是从属服务器还是主服务器,都会拒绝使用其他服务器进行复制
通常习惯把server-id设置为本服务器IP的最后一段数字,
如:服务器IP为192.168.2.21,server-id可以设置为21
Master主服务器
1.开启binlog
2.启动tcp/ip网络(默认启用),数据库复制需要使用tcp/ip,不能使用unix套接字
3.备份主库数据库(完整一致性备份),如果需要(不使用GTID),记录备份时的日志坐标(mysqldump --master-data=2) 即binlog 0123456等
4.创建具有REPLICATION SLAVE权限的用户 (单独使用)
从库复制时需要用此用户连接主库,当然不创建该用户使用root用户也可以
Slave从服务器
1.还原主库备份
2.使用change master to语句设置主库IP,复制用户,复制用户密码,端口号,起始复制的日志位置坐标(如果不使用GTID)
3.start slave; 开始复制
4.show slave status\G; 监控复制状态
实验1 配置 一个主库20.100和一个从库20.11
1.规划与准备 三台机器关闭fhq selinux 可设置主机名称 ip
IP |
主机名 |
角色 |
操作系统(最小安装) |
MySQL |
192.168.20.10 |
X1 |
主库 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
X2 |
存库(中举库) |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
X3 |
存库 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
三台机器都关闭selinux
禁用selinux禁用防火墙
vi /etc/selinux/config 设置disabled
systemctl disable firewalld
systemctl stop firewalld
设置静态IP和主机名
vim /etc/hosts或者 更改nmtui
systemctl reboot重启
2.安装MySQL服务 主库 和 从库 解压安装包 关闭密码验证 设置简单密码
主库虚拟机:192.168.20.10 从库虚拟机:192.168.20.11从库2 的192.168.20.20
解压安装包 挂载光盘
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar上传
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar解压
rm mysql-community-server-minimal-5.7.28-1.el7.x86_64.rpm删除普通文件
yum install mysql-community-{client,common,libs,server}-*.rpm安装mysql rpm
systemctl start mysqld启动mysql
vi /etc/my.cnf关闭密码验证插件
validate-password=0
systemctl restart mysqld重启mysqld服务
cat /var/log/mysqld.log|grep password找临时密码
mysql -uroot -p连接mysql
set password='123';设置简单密码
mysql -uroot -p重新登录测试新密码
3.主库20.10 创建binlogs目录 开启binlog 修改字符集 server id和 binlogs位置
主库上执行
创建binlog存放目录
mkdir /binlogs创建binlogs目录
chown mysql:mysql /binlogs更改属组
chmod 750 /binlogs增加权限
ll -d /binlogs查看
修改my.cnf 设置字符集 server id 和binlogs目录位置
vi /etc/my.cnf
character-set-server=utf8
explicit_defaults_for_timestamp
server-id=10主机IP的后面位数,防止混乱
log-bin=/binlogs/mysql-bin
重启mysqld
systemctl restart mysqld
ll /binlogs
登录mysql,查看binlog
mysql -uroot -p
show binary logs;
4.主库 创建 复制用户repl 设置权限
create user 'repl'@'192.168.20.%' identified by 'repl';
grant replication slave on *.* to 'repl'@'192.168.20.%';
show grants for 'repl'@'192.168.20.%';
5.主库 备份所有数据库 事件 等 保持一致性
mysqldump -uroot -p --all-databases --triggers --routines --events --master-data=2 --flush-logs >/root/all-master-db.sql备份所有数据库 事件等等 保持一致性
cat /root/all-master-db.sql | grep -i "^-- change master to"注意154从日志开始的地方
6.从库读取主库备份内容 scp将主库备份文件 发送到从库
从库上执行:
scp 192.168.20.100:~/all-master-db.sql /root
mysql -uroot -p
source /root/all-master-db.sql
7.设置 从库server-id,重启从库
从库上执行:
vi /etc/my.cnf加入id 本机后两位的ip
server-id=11
systemctl restart mysqld重启服务
8.从库20.11执行change master to语句 读取主库20.100binlogs 日志
从库上执行:
mysql -uroot -p
mysql> help change master to;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;
9.从库启动复制 start slave;,查看复制状态 查看日志
mysql> start slave;
mysql> show slave status\G
查看中继日志(relay_log_file)
cd /var/lib/mysql
ll *relay-bin*
cat master.info
cat relay-log.info 放到备库上的日志信息
show variables like '%master%';
10.把从库的master.info和relay-log.info中的信息放到表中,需要修改/etc/my.cnf 重启从库
vim /etc/my.cnf修改配置文件 增加这两行
relay_log_info_repository=table
master_info_repository=table
systemctl restart mysqld重启服务
完成后 进入 mysql库 放到表里
mysql> select * from slave_master_info\G;
mysql> select * from slave_relay_log_info\G;
11.测试 主从复制 主库20.100建立数据库 从库 20.11查看
主库上操作:
mysql> create database world;
上传world.sql到主库/root
mysql> use world;
mysql> source /root/world.sql
从库上操作:
mysql> show databases;
mysql> use world;
mysql> show tables;
select count(*) from city;
12.change master to语句 解读
1.设置或改变从库 连接主库 的相关参数
2.读取 主库binlog文件和 从库中继日志 为目的
3.如果主库密码变更 则设置单独连接密码
CHANGE MASTER TO MASTER_PASSWORD='newpwd';单独设置主库连接密码
4.选项MASTER_HOST, MASTER_USER, MASTER_PASSWORD,MASTER_PORT提供从库连接主库的信息
5.一个设置从库连接主库准备复制的例子:
CHANGE MASTER TO
MASTER_HOST='master2.example.com',域名
MASTER_USER='replication',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_LOG_FILE='master2-bin.001',
MASTER_LOG_POS=4之名日志坐标循环复制
MASTER_HOST 和 MASTER_PORT 值指定主服务器的主机名和 TCP 端口号;
MASTER_USER 和 MASTER_PASSWORD 值指定具有 REPLICATION SLAVE 特权的主服务器上帐户的帐户详细信息;
MASTER_LOG_FILE 和 MASTER_LOG_POS 值包含从属服务器开始进行复制的二进制日志位置的日志坐标;
SHOW MASTER STATUS 从主服务器获取文件和位置
MASTER_AUTO_POSITION = 1连接选项
MASTER_LOG_FILE和MASTER_LOG_POS从库将使用GTID-based复制协议从主库复制,无需指定
实验2 配置 一个主库20.100和两个从库20.11和20.20
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.2.21 |
host21 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.22 |
host22 |
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.23 |
host23 |
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.安装MySQL服务从库 关闭密码验证 设置简单密码 读取发送主库的备份
虚拟机:192.168.20.20:
解压安装包 挂载光盘
mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar上传
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar解压
rm mysql-community-server-minimal-5.7.28-1.el7.x86_64.rpm删除普通文件
yum install mysql-community-{client,common,libs,server}-*.rpm安装mysql rpm
systemctl start mysqld启动mysql
vi /etc/my.cnf关闭密码验证插件
validate-password=0
systemctl restart mysqld重启mysqld服务
cat /var/log/mysqld.log|grep password找临时密码
mysql -uroot -p连接mysql
set password='123';设置简单密码
mysql -uroot -p重新登录测试新密码
读取主库的备份 从库上执行:
scp 192.168.20.100:~/all-master-db.sql /root
mysql -uroot -p
source /root/all-master-db.sql
2.设置从库server-id,重启从库
从库上执行:
vi /etc/my.cnf
加入id 为本机的ip后两位防止混乱
server-id=20
systemctl restart mysqld
3.从库执行change master to语句 读取 主库20.100的binlogs 日志
从库上执行:
mysql -uroot -p
mysql> help change master to;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;
4.从库 启动复制 start slave;,查看复制状态
mysql> start slave;
mysql> show slave status\G20.100为主库的IP
5.测试 主从复制 主库创建数据库 从库查看
主库上20.100操作:
create database kwz;
从库(192.168.20.11)上操作:
show databases;
从库(192.168.20.20)上操作:
mysql> show databases;
主从日志解读全局事务标识符 启用GTID模式 复制数据库的优势
1.使用 日志坐标 进行 故障转移 日志 最新的服务器做主库 解读
1.在主服务器变为不可用时进行故障转移(fail-over),选择某个slave从属服务器作为主服务器;
2.主库不可用时,所有从属服务器都不是最新状态(宕机的主服务器有些日志还没有复制到从服务器),有可能会造成数据丢失,取决于主库binlog日志是否损毁;
3.如果业务要求主库停机时间不能太长,可以从已有的从数据库中挑选一台作为主库(选择Exec_Master_Log_Pos坐标最大的作为新主库),其他从库使用change master to命令指向新的主库;
4.如果新选的主库没有启用binlog,必须先启用;my.cnf还要设置log-slave-updates,将复制的事件记录到新从库的binlog中;
5.如果复制为多主循环拓扑复制,查找最新从属服务器和确定正确日志坐标会非常困难,因为每个从属服务器使用与其他从属服务器不同的顺序应用操作;
6.要避免此困难,需一开始就 启用全局事务标识符 (Global Transaction Identifier, GTID)
2.全局事务标识符
全局事务标识符 (Global Transaction Identifier, GTID) 可以唯一地标识数据库复制过程中主库binlog文件中的每个事务
1.单个GTID 的形式为
例如:
86dfda90-ba4f-11e8-81d8-000c29746892:41
2.GTID集包含一系列GTID,
形式为:
86dfda90-ba4f-11e8-81d8-000c29746892:1-41
3.每个mysql服务器安装初始化以后会生成 uuid存放位置 数据库目录中的 auto.cnf文件中
或者到 user中查看???
也可以通过下面语句访问:
mysql>select @@server_uuid;
4.客户端在master主服务器上执行事务时, MySQL服务器将创建新的GTID 以记录事务及其唯一的GTID事务号;
5.slave从服务器从master主服务器读取并应用该事务时,该事务保持其原始 GTID。
即 复制到slave从服务器的事务的服务器 UUID 是主服务器的 UUID,而不是从属服务器的;
6.复制链中的 每个后续slave从服务器都将 记录该事务及其原始 GTID。
因此,复制拓扑中的每个slave从服务器可以确定第一个执行事务的master主服务器
3.启用gtid模式
使用以下选项启用 GTID 模式:
默认为关闭状态
主备服务端 都要开启gtid
vi /etc/my.cnf增加下面两行
gtid-mode=ON binlog中每个事务一起记录唯一的 GTID
enforce-gtid-consistency 禁止无法以事务安全方式记录的事件
4.启用GTID模式复制数据库的优势
传统的复制方式基于master主库产生的变更事件,需要获取到binlog文件及其产生事件的位置坐标才能使slave从库与master主库同步数据
GTID模式复制数据库相对较新,slave从库不需要知道master主库具体的binlog文件和变更事件的位置坐标,因而简化了复制工作相关的配置信息
使用GTID模式,只要事务在master主库提交而且在slave备库应用(重做)了相关日志事件并且提交,就可以确保主库与备库的一致性
如果启用GTID模式,之前没有包含GTID的数据库备份不能使用,需要重新备份数据库
实验3:启用gtid模式配置 主库和2个从库
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.20.100 |
|
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
|
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
|
从库 |
未启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.所有主库 从库启用GTID模式 重启服务 关闭数据复制
vi /etc/my.cnf 添加下面这两行
gtid-mode=ON
enforce-gtid-consistency
systemctl restart mysqld重启10.11.20 三台主机的mysql数据库服务
mysql> stop slave;从库11.20关闭数据库复制 停止
mysql> reset slave all;从库11.20重置复制参数 清空
show slave status\G同步参数都没有了 从库之间关系都没有了
2.从库11.20 设置GTID复制参数 change master to 语句 为 主库20.100
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
start slave;
show slave status\G
3.测试 主 从复制 复制库结构
主库操作:
mysql> create database kkk;
mysql> use kkk;
mysql> create table t like world.city;复制库结构
从库操作:
mysql> show databases;
mysql> use kkk;
mysql> desc kkk;
实验4:配置主库->中继库->从库 (100->11->20)
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.20.10 |
|
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
|
中继库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
|
从库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.MySQL复制线程 binlogs
MySQL 在master主服务器 和 slave从服务器 上创建线程来执行复制工作
1.slave从服务器 成功连接到master主服务器 时, master主服务器启动称为 Binlog 转储线程的复制主服务器线程
2.如果slave从属服务器配置为使用自动定位协议 (CHANGE MASTER TO MASTER_AUTO_POSITION),则该线程显示为“Binlog Dump GTID”
3.在slave从服务器已连接时,此线程会在二进制日志内的事件到达时将其发送到从属服务器
4.每个slave从服务器启动两个线程,分别称为slave从服务器 I/O 线程和SQL 线程
I/O线程从主库的binlog中读取日志事件,存储到从库中继日志中(Relay log)
SQL线程读取中继日志中的新的日志事件并应用执行
2.复制数据库 命令stop reset slave all reset master log-slave-updates
stop slave
停止从库复制线程
建议关闭从库之前先使用stop slave命令,尤其是binlog格式为row-based,复制的表对象属于非事务引擎时
reset slave
使从库忘记主库binlog文件的复制位置 重置文件位置
清空主库信息
清空中继日志信息库
删除所有中继日志,重新设置一个新的中继日志文件
reset slave all
reset slave不会改变gtid_executed和gtid_purged变量值,使从库复制线程停止
先使用stop slave命令 在使用reset slave
reset slave 不会改变复制连接参数,
如:master host, master port, master user, or master password;
这些参数还保留在内存中,这意味着start slave之前不需要再用change master to命令来指定连接参数
但是如果用reset slave all参数,连接参数会置空
reset master注意注意 破坏清空主从数据库的关系 清空binlogs 日志 小心
删除所有binlog index文件中列出的binlog文件,清空binlog index文件,创建一个新的binlog文件
清空gtid_purged系统变量和gtid_executed系统变量的值
gtid_executed
gtid_purged
清空mysql.gtid_executed表的数据
--log-slave-updates (选项)
一般情况,从库可以不用打开binlog
log-slave-updates的作用是从主库收到的变更事件,slave从库在应用日志时所产生的变更记录到本地的binlog中
如果要建立链状中继复制如:
A->B->C,要在中继从库B上启用binlog,还要设置log-slave-updates
3.开启11.20主机的binlog日志 /etc.my.cnf 增加binlogs存储位置
11.20两个从主机分别执行
创建binlog存放目录
mkdir /binlogs
chown mysql:mysql /binlogs
chmod 750 /binlogs
ll -d /binlogs
修改my.cnf
vi /etc/my.cnf
log-bin=/binlogs/mysql-bin
log-slave-updates
重启MySQL
systemctl restart mysqld
ll /binlogs
查看是否开启binlogs
show variables like '%slave%';
查看当前使用的日志 从
4.把主机11设置为主库即为中继库 20为从库
mysql> stop slave;11主机 停止复制
mysql> reset slave all;重置主库配置信息
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;变更主库配置信息 即 11为主库 20为存库
mysql> start slave;启动复制并查看复制状态
mysql> show slave status\G
5.测试主从复制
主库操作20.100
mysql> create database abc;
mysql> use abc;
mysql> create table t1 (id int, name char(10));
mysql> insert into t1 values(1,’a’),(2,’b’),(3,’c’);
mysql> select * from t1;
中继从库操作20.11
mysql> select * from abc.t1;
从库操作20.20
mysql> select * from abc.t1;
实验5:配置多主循环复制100->11->20->100
规划
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.20.100 |
host21 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.11 |
host22 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.20.20 |
host23 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.修改 /etc/my.cnf 主机 20.20从库 增加 log-slave-updates
vi /etc/my.cnf 主机20.20 添加
log-slave-updates
2.从库主机11.20 停止复制 所有主机 重置清空 binlogs
mysql> stop slave; 从库11.20停止复制
主机100.11.20
mysql> reset master;所有主机重置 binlog
2.增加各主库之间关系 复制change master to 形成循环 启动复制 查看
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
100 11 .20 100 为 11的 主库 11为20的主库 20为100的主库 形成循环
mysql> start slave;所有主机100.11.20 启动复制
mysql> show slave status\G查看
3.测试多主复制
20主机执行
mysql> create database www;
mysql> show databases;
100主机查看
mysql> show databases;
11主机查看
mysql> show databases;
GTID 如何跳过 事务冲突:
1、主要跳过事务,从库不做这个命令 代替原来的set global sql_slave_skip_counter = 1。
2、由于在这个GTID必须是连续的,正常情况同一个服务器产生的GTID是不会存在空缺的。所以不能简单的skip掉一个事务,只能通过注入空事物的方法替换掉一个实际操作事务。
注入空事物的方法:
stop slave;
set gtid_next='xxxxxxx:N';
begin;commit;
set gtid_next=automatic;
start slave;
实验6:还原 一主 多从 复制结构
IP |
主机名 |
角色 |
BINLOG |
操作系统 (最小安装) |
MySQL |
192.168.2.21 |
host21 |
主库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.22 |
host22 |
从库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
192.168.2.23 |
host23 |
从库 |
启用 |
Centos 7 |
MySQL 5.7.2x rpm包安装版 |
1.主机100 取消设置为从库
100主机操作
mysql> stop slave;
mysql> reset slave all;
2.设置主机20.20 和20.11 为主机100的从库
20.11从机操作
mysql> show slave hosts;
mysql> stop slave;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
20.20从机操作
mysql> show slave hosts;
mysql> stop slave;
change master to master_host='192.168.20.100',master_user='repl',master_password='repl',master_port=3306,master_auto_position=1;
mysql> start slave;
mysql> show slave status\G
100主机操作
mysql> show slave hosts;
3.异步复制 特点 问题
MySQL属于异步复制,其特点是:
master主服务器不关注从属服务器何时应用日志,master主服务器继续运行 而不等待slave从服务器
请求binlog日志并应用其内容,slave从服务器通常滞后于master主服务器
如果master主服务器在提交事务之前等待所有从属服务器应用其更改,则复制称为是同步复制
潜在的问题:
在master主服务器向客户端应用程序报告commit成功时,slave从服务器尚未应用事务;
如果在master主服务器提交事务之后而该事务复制到任何slave从服务器之前,master主服务器出现故障并且数据丢失,则该事务将丢失
这种情况下,即使应用程序已经向用户报告commit成功也是如此
4.半同步复制 特点 问题
传统MySQL复制支持半同步复制,其特点为:
1.Master主库和至少一个slave从库上 安装插件
2.客户端向master主服务器提交事务时,master主库先不提交,等待至少一个slave从库提交成功的信号,然后master主库再提交
3.只有在master主库和至少一个slave从库都提交成功时,才向客户端应用程序报告commit成功
4.如果slave从库发生响应超时则切换到异步复制
5.可以通过设置rpl_semi_sync_master_timeout变量来设置超时时间,单位毫秒,默认值10000(10秒)
6.半同步复制在一定程度上可以确保主库和从库数据的一致性
7.是否采用需要在性能和数据完整性之间进行权衡,因为半同步复制时事务速度比使用异步复制时慢
8.启用半同步复制的主库和从库,在地理位置上不能距离太远,要考虑网络响应的延时因素
实验7:配置半同步复制
1.启动插件 主库100
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> show plugins;
mysql> set global rpl_semi_sync_master_enabled=1;启动插件
mysql> show status like 'rpl_semi_sync_master_status';
show variables like '%semi%';
2.启动插件 从库20
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> show plugins;
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> stop slave;
mysql> start slave;
mysql> show status like 'rpl_semi_sync_slave_status';
创建表测试