lamp架构--mysql主从复制(级联复制、gtid模式复制、半同步复制)

1.mysql级联复制

使用三台虚拟机来做这个实验:
所谓级联复制是指采用A(B的master)->B(A的slave,C的master)->C(B的slave)方式复制
在此次实验中A对应server11,B对应server12,C对应server13

1.1 前期准备:mysql基础主从复制

具体内容见上篇博客

[root@server11 ~]# systemctl stop nginx
[root@server11 ~]# systemctl stop php-fpm
[root@server11 ~]# systemctl disable php-fpm
[root@server11 ~]# systemctl disable nginx
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service.

[root@server12 ~]# systemctl disable --now httpd
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@server12 ~]# /etc/init.d/mysqld start
Starting MySQL SUCCESS! 
[root@server12 ~]# mysql -p
mysql> show slave status\G;

[root@server13 ~]# systemctl disable --now httpd
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@server13 ~]# systemctl disable --now memcached
Removed symlink /etc/systemd/system/multi-user.target.wants/memcached.service.
[root@server13 ~]# ps ax

server12
在这里插入图片描述

[root@server11 ~]# mysql -pwestos
mysql> show databases;
mysql> use westos
Database changed
mysql> show tables;
mysql> create table user_tb (
    -> username varchar(25) not null,
    -> password varchar(25) not null);
Query OK, 0 rows affected (0.24 sec)

mysql> insert into user_tb values ('user1','1111');
Query OK, 1 row affected (0.08 sec)

mysql> insert into user_tb values ('user2','2222');
Query OK, 1 row affected (0.07 sec)

在这里插入图片描述

[root@server12 ~]# mysql -p
mysql> select * from westos.user_tb;

在这里插入图片描述

1.2 在server3上创建mysql用户并初始化、安装,编辑/etc/my.cnf文件,设置环境变量
## 复制server2上的mysql到server3的指定目录下
[root@server12 local]# scp -r mysql/ server13:/usr/local/
[root@server12 local]# scp /etc/my.cnf  server13:/etc/
[root@server12 local]# scp /etc/init.d/mysqld  server13:/etc/init.d/
[root@server13 ~]# cd /usr/local/mysql/data/
[root@server13 data]# rm -fr *  ##删除文件,重新初始化,编译安装
[root@server13 ~]# vim /etc/my.cnf
[root@server13 ~]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0
server-id=3

[client]
default-character-set=utf8
socket=/usr/local/mysql/data/mysql.sock

[mysql]
default-character-set=utf8
socket=/usr/local/mysql/data/mysql.sock

[root@server13 ~]# useradd -M -d /usr/local/mysql/ -s /sbin/nologin mysql
[root@server13 ~]# id mysql  #在集群内 节点id保持一致
uid=1001(mysql) gid=1001(mysql) groups=1001(mysql)
[root@server13 ~]# vim .bash_profile
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin  ##添加环境变量
[root@server13 ~]# source .bash_profile
[root@server13 ~]# mysqld --initialize --user=mysql
[root@server13 ~]# /etc/init.d/mysqld start
[root@server13 ~]# mysql_secure_installation   ##使用安装脚本安装
[root@server13 ~]# mysql -p

在这里插入图片描述

在这里插入图片描述

1.3 备份数据库中已有的文件并导入server3数据库中

由于进行主从复制之前必须要保证数据库中的文件同步,因此需要先把之前在server1和server2上做主从复制时创建的数据表导入到server3数据库中以达到初始数据同步的目的.

[root@server11 ~]# mysqldump -uroot -pwestos westos > dump.db  ##dump server11数据库中的数据
mysqldump: [Warning] Using a password on the command line interface can be insecure.##密码写入命令行中
[root@server11 ~]# scp dump.db server13:/root  ##将dump出的数据复制到server13中
[root@server13 ~]# cat dump.db  ##先删除后创建

##在server13上导入server11上的备份数据
[root@server13 ~]# mysqladmin create westos -pwestos   ##创建westos库
[root@server13 ~]# mysql -pwestos westos < dump.db 
[root@server13 ~]# mysql -p 
MySQL [(none)]> show databases;
MySQL [(none)]> select * from westos.user_tb;

在这里插入图片描述
cat dump.db ##先删除后创建
在这里插入图片描述

1.4 编辑server12 /etc/my.cnf重启
[root@server12 ~]# vim /etc/my.cnf
[root@server12 ~]# cat /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/data/mysql.sock
symbolic-links=0
server-id=2
log-slave-updates  ##从库回放主库的二进制日志后,会把所做的事情重新写入到自己的二进制日志中去,供自己的从库去复制回放
log-bin=mysql-bin  ##主库的二进制日志
validate_password=OFF ##最好别安装validate_password插件,不小心安装后使其等于OFF
[root@server12 ~]# /etc/init.d/mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL. SUCCESS! 

在这里插入图片描述

1.5 在server2上授权
[root@server12 ~]# mysql -pwestos
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
mysql> select * from westos.user_tb;
mysql> show master status;
mysql> show slave status\G;

[root@server13 ~]# mysql -h 192.168.0.12 -ureply -pwestos

server11
在这里插入图片描述
授权成功
在这里插入图片描述

1.6 6.server13开启slave,测试是否同步
[root@server13 ~]# mysql -p
MySQL [(none)]> change master to master_host='192.168.0.12', master_user='repl', master_password='westos', master_log_file='mysql-bin.000002', master_log_pos=438; ##从日志内的438开始
MySQL [(none)]> start slave;
MySQL [(none)]> show slave status\G;

###在server11数据库中添加新的内容
[root@server11 ~]# mysql -p
mysql> insert into user_tb values ('user3','3333');
mysql> insert into user_tb values ('user4','4444');

##看server13上是否同步
[root@server13 ~]# mysql -p
MySQL [(none)]> select * from westos.user_tb;
[root@server12 data]#  mysqlbinlog mysql-bin.000002 -v
[root@server12 data]# mysqlbinlog server12-relay-bin.000009 -vv

在这里插入图片描述
在这里插入图片描述
同步成功
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. gtid模式复制

Gtid采用了新的复制协议,旧协议是,首先从服务器上在一个特定的偏移量位置连接到主服务器上一个给定的二进制日志文件,然后主服务器再从给定的连接点开始发送所有的事件。
新协议有所不同,支持以全局统一事务ID (GTID)为基础的复制。当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务。GTID复制是以全部事务为基础,使得检查主从一致性变得非常简单。如果所有主库上提交的事务也同样提交到从库上,一致性就得到了保证。
相关原理参考链接:https://segmentfault.com/a/1190000014322393.

2.1 配置
[root@server11 ~]# vim /etc/my.cnf
[root@server11 ~]# cat /etc/my.cnf
gtid_mode=ON  ##添加内容
enforce-gtid-consistency=ON
[root@server11 ~]# /etc/init.d/mysqld restart
Shutting down MySQL............ SUCCESS! 
Starting MySQL.. SUCCESS! 
[root@server11 ~]# mysql -p
mysql> show master status;

[root@server12 data]# vim /etc/my.cnf
gtid_mode=ON  ##添加内容
enforce-gtid-consistency=ON
[root@server12 data]# /etc/init.d/mysqld restart
[root@server12 data]# mysql -pwestos
mysql> show slave status\G;
mysql> stop slave;
mysql> change master to master_host='192.168.0.11', master_user='repl', master_password='westos', MASTER_AUTO_POSITION = 1;
mysql> start slave;

[root@server13 ~]# vim /etc/my.cnf
gtid_mode=ON  ##添加内容
enforce-gtid-consistency=ON
[root@server13 ~]# /etc/init.d/mysqld restart
[root@server13 ~]# mysql -pwestos
MySQL [(none)]> stop slave;
MySQL [(none)]> change master to master_host='192.168.0.12', master_user='repl', master_password='westos',
MASTER_AUTO_POSITION = 1;
MySQL [(none)]> start slave;

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

2.2 测试
##server11上在mysql数据库中添加内容,server12和server13上自动同步
[root@server11 ~]# mysql -p
mysql> insert into user_tb values ('user5','5555');
mysql> insert into user_tb values ('user6','6666');

[root@server13 ~]# mysql -p
MySQL [(none)]> select * from westos.user_tb;
MySQL [(none)]> show slave status\G;

在这里插入图片描述

在这里插入图片描述

[root@server11 ~]# mysql -p
mysql> show master status\G;
*************************** 1. row ***************************
             File: mysql-bin.000002
         Position: 702
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 5c40a197-91c4-11eb-adc0-525400e8dae3:1-2 ##启用gtid后产生的信息
1 row in set (0.01 sec)

[root@server12 data]# mysqlbinlog mysql-bin.000003 -vv

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

3. 半同步复制

传统的复制模式属于异步复制,主库只管发送二进制日志,而不关心从库是否收到,这种复制方式虽然能够保证复制的速度很快,但无法保证主从数据的一致性,这在生产环境中是不可取的。而半同步方式是指当主库发送二进制日志到从库中时,从库收到数据并存储到relay-log之后会发送一个ack确认给master,这样就保证了主从数据的一致性.

3.1 配置
server1master上安装插件:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

每个副本上安装插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

[root@server11 ~]# mysql -p
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; ##设置最大超时时间,默认为10秒,我们可以不用更改
mysql> show variables like 'rpl%';

[root@server12 data]# mysql -pwestos
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
mysql> show status like 'rpl%';
mysql> STOP SLAVE IO_THREAD;  ##重启IO线程
mysql> START SLAVE IO_THREAD;
mysql> show status like 'rpl%';
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;

[root@server13 data]# mysql -pwestos
MySQL [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MySQL [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
MySQL [(none)]> STOP SLAVE IO_THREAD;
MySQL [(none)]> START SLAVE IO_THREAD;

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

[root@server11 ~]# mysql -p
mysql> insert into user_tb values ('user7','7777');
 
[root@server13 data]# mysql -pwestos
MySQL [(none)]> select * from westos.user_tb;

在这里插入图片描述

[root@server12 data]# mysql -pwestos
mysql> show status like 'rpl%';

在这里插入图片描述

3.2 测试

将server12上的IO线程停掉,在server11上插入数据,查看效果

server12
mysql> STOP SLAVE IO_THREAD;

server11
mysql> insert into user_tb values ('user8','8888');
mysql> select * from westos.user_tb

server12
mysql> select * from westos.user_tb;
mysql> START SLAVE IO_THREAD;
mysql> show status like 'rpl%';
mysql> select * from westos.user_tb;

server11 等待超过10s后成功
在这里插入图片描述
server12 没有插入新的数据
在这里插入图片描述
server12的I/O线程开启后又能同步server1上的数据,这就是半同步复制方式的优点:能够保证主从数据的一致性
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值