mysql的主从复制、半复制

实验环境:rhel6.5
master:server1 172.25.31.1
slave:server2 172.25.31.2
server3 172.25.31.3

主从复制

原理:MySQL 之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL 数据库一旦启用二进制日志后,其作为 master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为 slave 通过一个 I/O线程与主服务器保持通信,并监控 master 的二进制日志文件的变化,如果发现master 二进制日志文件发生变化,则会把变化复制到自己的中继日志中(relay_log),然后 slave 的一个 SQL 线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。

mysql 的安装及初始化配置:(master/slave)
[root@server1 ~]# lftp 172.25.31.250
在这里插入图片描述
lftp 172.25.31.250:/pub/mysql5.7> mget *
[root@server1 ~]# yum install
mysql-community-client-5.7.17-1.el6.x86_64.rpm
mysql-community-common-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm
mysql-community-libs-5.7.17-1.el6.x86_64.rpm
mysql-community-server-5.7.17-1.el6.x86_64.rpm -y
[root@server1 ~]# /etc/init.d/mysqld start
在这里插入图片描述
[root@server1 ~]# grep password /var/log/mysqld.log mysql开启时会生成在临时密码,可在日志中找到
在这里插入图片描述
[root@server1 ~]# mysql_secure_installation 安全初始化,并设置新的密码
[root@server1 ~]# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin
[root@server1 ~]# /etc/init.d/mysqld restart

创建数据库并授权
master
[root@server1 ~]# mysql -p
mysql> show databases;
在这里插入图片描述
mysql> show master status;
在这里插入图片描述
mysql> grant replication slave on . to benben@‘172.25.31.%’ identified by ‘Qwe123456.’;
mysql> show master status;
在这里插入图片描述
mysql> create database westos;
mysql> use westos
mysql> create table usertb (
-> username varchar(25) not null,
-> password varchar(25) not null);
mysql> desc usertb;
在这里插入图片描述
mysql> insert into usertb value (‘user1’,‘123’);
mysql> select * from usertb;
在这里插入图片描述

slave

[root@server2 ~]# mysql -p
mysql> change master to master_host='172.25.31.1',master_user='benben',master_password='Qwe123456.',master_log_file='mysql-bin.000001',master_log_pos=449;
mysql> start slave;
mysql> show slave status\G;

在这里插入图片描述
mysql> show databases;
在这里插入图片描述
mysql> use westos
mysql> select * from usertb;
在这里插入图片描述

半同步复制

在这里插入图片描述
异步复制即是master数据库把binlog日志发送给 slave数据库,当slave服务器发生故障了,那么肯定会导致主从数据库服务器的数据不一致。
为了解决上面的问题,MySQL5.5引入一种叫做半同步复制模式。开启这种模式,可以保证slave数据库接收完master数据库发送过来的binlog日志并写入自己的中继日志中,然后反馈给master数据库,告知已经复制完毕。
开启这种模式后,当出现超时,主数据库将会自动转为异步复制模式,直到至少有一台从服务器接受到主数据库的binlog,并且反馈给主数据库。这时主数据库才会切换回半同步复制模式
半同步复制模式的性能和并发比异步复制模式低,因为每次复制都要进行反馈,相比之下多了一个步骤。

导入模块
前提:
1、必须是MySQL5.5或者以上
2、MySQL必须有自动加载功能,即have_dynamic_loading变量为YES
master
[root@server1 ~]# mysql -p
mysql> INSTALL PLUGIN rpl_semi_sync_master
SONAME ‘semisync_master.so’;
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE ‘%semi%’;
在这里插入图片描述
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%’ SHOW VARIABLES检查系统变量的值,系统变量反映了半同步复制是如何配置的
在这里插入图片描述

Rpl_semi_sync_master_enabled=ON表示开启半同步复制
Rpl_semi_sync_master_timeout=10000默认10000毫秒,即10秒超时,将切换为异步复制
Rpl_semi_sync_master_wait_no_slave表示是否允许master每个事物都要等待slave接收确认,默认为ON
Rpl_semi_sync_master_trace_level=32表示用于开启半同步复制时的调试级别,默认32

mysql> SHOW STATUS LIKE ‘rpl_semi_sync%’; SHOW STATUS检查状态变量的值,状态变量能够监视半同步复制的操作
在这里插入图片描述

Rpl_semi_sync_master_status表示主服务器使用是异步还是半同步复制
Rpl_semi_sync_master_client表示从服务器有多少个配置成半同步复制
Rpl_semi_sync_master_yes_tx表示从服务器确认成功提交的数量
Rpl_semi_sync_master_no_tx表示从服务器确认失败提交的数量

slave
[root@server2 ~]# mysql -p
mysql> INSTALL PLUGIN rpl_semi_sync_slave
SONAME ‘semisync_slave.so’;
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
-> FROM INFORMATION_SCHEMA.PLUGINS
-> WHERE PLUGIN_NAME LIKE ‘%semi%’;
在这里插入图片描述
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> STOP SLAVE IO_THREAD;
mysql> START SLAVE IO_THREAD;
mysql> SHOW VARIABLES LIKE ‘rpl_semi_sync%’;
在这里插入图片描述
mysql> SHOW STATUS LIKE ‘Rpl_semi_sync%’;
在这里插入图片描述

测试
master机写入数据,并接受到slave机返回的ack值
master:
mysql> insert into usertb value (‘user11’,‘123’);
mysql> SHOW STATUS LIKE ‘Rpl%’;
在这里插入图片描述

slave
mysql> stop slave io_thread; 将slave机的io线程停掉

master
mysql> insert into usertb value (‘user12’,‘123’); master机写入数据,会默认等待10s,如果超时还未等到slave机的ack,将自动切换到异步复制
mysql> SHOW STATUS LIKE ‘Rpl%’; 查看master上的相关状态
在这里插入图片描述

Slave
slave机的io线程再次开启,复制将自动切换到半同步方式,
mysql> select * from usertb; 数据并未同步到slave
mysql> start slave io_thread; 开启io_thread再去查看数据库的变化
mysql> select * from usertb; 发现数据同步了
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值