数据库复制 一主多从

数据库复制 一主多从

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.21server-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 的形式为 <source-uuid>:<transaction-id>

例如:

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';

 

创建表测试

 

posted @ 2020-08-09 18:06  浅唱I  阅读(448)  评论(0编辑  收藏  举报