mysql的主从复制,gtid复制、半同步复制和组复制

一、数据库的简介

1.数据库的简介

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。
所谓“数据库”是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

2.数据库的分类

如今互联网公司最常用的是关系型数据库和非关系型数据库,关系型数据库是以二维表格的形式来存放数据,而非关系型数据库也被成为NoSQL数据库,NOSQL的本意是“Not Olnly SQL” 指的是非关系型数据库,而不是“No SQL”的意思,因此,NoSQL的产生并不是要彻底地否定非关系型数据库,而是作为传统关系型数据库的一个有效补充。NOSQL数据库在特定的场景下可以发挥出难以想象的高效率和高性能。

二、数据库的复制

1.复制的种类

一般可分为异步复制,半同步复制,组复制和全同步复制

2.主从复制的配置

一般主从复制默认使用的是异步复制
通常没说明指的都是异步,即主库执行完Commit后,在主库写入Binlog日志后即可成功返回客户端,无需等等Binlog日志传送给从库,一旦主库宕机,有可能会丢失日志。
实验环境:
server1(主):172.25.21.1
server2(从):172.25.21.2

本机使用的版本是mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar
tar xf mysql-5.7.24-1.el7.x86_64.rpm-bundle.tar	##解压这个安装包,可以看到它是tar格式不是gz的
ls		##可以看到安装包和许多附加模块
rm -fr
yum install *.rpm -y 		##安装mysql,安装的模块如下图所示(server1和server2上都要安装)

在这里插入图片描述

(1)server1(主)的配置:
vim /etc/my.cnf					##修改配置文件(主从复制时以2进制日志来同步数据的)

server-id=1						##id不能相同,不然可能会发生冲突
log-bin=mysql-bin

systemctl start mysqld			##开启服务,会生成一个默认密码,安全初始化会用到这个初始密码
cat /var/log/mysqld.log | grep password				##查看第一次启动服务时生成的初始密码
mysql_secure_installation		##安全初始化,本机使用密码为Yy+12345,为了防止混乱,本次实验的所有密码都使用这个
							##修改密码后第一个为no,其他全为yes

mysql -uroot -pYy+12345			##进入数据库测试
mysql> CREATE USER 'repl'@'172.25.21.%' IDENTIFIED BY 'Yy+12345';		##创建一个远程登陆的用户,这里是21网段
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.25.21.%';			##赋予权限让它当作一个master用户
mysql> flush privileges;		##刷新数据
mysql> show master status;		##查看主节点状态

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

(2)server2(从)的配置:
vim /etc/my.cnf					##修改配置文件
server-id=2						##因为只是个从节点,所以在最后只加入id就行

systemctl start mysqld			##开启服务,会生成一个默认密码,安全初始化会用到这个初始密码
cat /var/log/mysqld.log | grep password				##查看第一次启动服务时生成的初始密码
mysql_secure_installation		##安全初始化,本机使用密码为Yy+12345,为了防止混乱,本次实验的所有密码都使用这个
							##修改密码后第一个为no,其他全为yes
mysql -uroot -pYy+12345			##进入数据库测试						

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

测试:在server1上建立一个表并插入数据来测试:
mysql> create database westos;
mysql> use westos;
mysql> CREATE TABLE  linux (username varchar(50) not null,password varchar(50) not null);
mysql> insert into linux values('user1','123');
mysql> select * from linux;				##查看表中的数据

在server2上查看可以看到相同的数据

三、gtid复制(也属于主从复制)

1.简介

在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪些事务的GTID值,然后主库会有把所有没有在从库上执行的事务,发送到从库上进行执行,并且使用GTID的复制可以保证同一个事务只在指定的从库上执行一次,这样可以避免由于偏移量的问题造成数据不一致。

2.配制方法(在上个实验的基础上做)
(1)server1上的配置:
vim /etc/my.cnf			##修改配置文件
systemctl restart mysqld			##重启服务
cat /var/lib/mysql/auto.cnf			##查看mysql服务的uuid

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

(2)server2上的配置:
vim /etc/my.cnf					##修改配置文件
systemctl restart mysqld		##重启服务
[root@server2 ~]# mysql -uroot -pYy+12345			##进入数据库改变master
mysql> stop slave;				##先停止同步
mysql> change master to master_host='172.25.21.1',master_user='repl',master_password='Yy+12345',master_auto_position=1;
								##改变同步方式
mysql> start slave;				##开启同步
mysql> show slave status\G;		##查看gtid是否开启
mysql> select * from mysql.gtid_executed;			##查看gtid上的uuid是否为server1的
注意:应该在server1上插入一条数据再查看server2是否开启

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

四、半同步复制的配置

1.简介

半同步复制时,为了保证主库上的每一个binlog事务都能够被可靠的复制到从库上,主库在每次事物成功提交时,并不及时反馈给前段应用用户,而是等待其中一个从库也接收到binlog事务并成功写入中继日志后,主库才返回commit操作成功给客户端。半同步复制保证了事务成功提交后,至少有两份日志记录,一份在主库的binlog,另一份在至少一个从库的中继日志relaylog上,从而更近一步保证了数据的完整性
而且在两个数据库配置完成后,它们都是master,只要在一次同步失败后,默认等待10秒钟没有等到第二个库来同步,就会把未响应的库变位从库,从半同步变位异步复制

2.半同步服务的配置
(1)server1的配置:
mysql -uroot -pYy+12345
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%';								##查看服务的信息

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

(2)server2的设置:
mysql -uroot -pYy+12345
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;												##重启IO线程    
mysql> show slave status\G;													##查看线程状态是否为yes
(3)测试:关闭server2的slave,在server1上再次插入数据查看同步时间
mysql> stop slave;

在这里插入图片描述

五、组同步

1.简介

组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用,也就是说3台服务器的集群,允许其中1台宕机。当一个节点出现问题时,自动把它踢出集群,不影响其他节点的工作

2.配置方法

需要三台主机来创建一个集群,都是master,但是只有server1是发起者

(1)server1的配置:

cat /var/lib/mysql/auto.cnf			##配置文件中的uuid不能和这个文件中的相同
vim /etc/my.cnf				##修改配置文件
systemctl restart mysqld
mysql -uroot -pYy+12345
mysql> SET SQL_LOG_BIN=0;			##停止复制开始操作,不然会导致数据不同步
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yy+12345';		##创建一个用户来组同步使用
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;			##开启同步复制
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yy+12345' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';		##安装模块
mysql> SET GLOBAL group_replication_bootstrap_group=ON;					##发起者才开启
mysql> START GROUP_REPLICATION;											##开启组服务
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;				##开启组服务后关闭
mysql> SELECT * FROM performance_schema.replication_group_members;		##查看节点状态

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

(2)server2的配置和server3的配置基本相同:
vim /etc/my.cnf				##修改配置文件
systemctl restart mysqld
mysql -uroot -pYy+12345		##进入mysql设置
mysql> SET SQL_LOG_BIN=0;			##停止复制开始操作,不然会导致数据不同步
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'Yy+12345';		##创建一个用户来组同步使用
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;			##开启同步复制
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yy+12345' FOR CHANNEL 'group_replication_recovery';
mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';		##安装模块
set global group_replication_allow_local_disjoint_gtids_join=on; 	##因为在server1上已经建立了一张表
mysql> START GROUP_REPLICATION;											##开启组服务
mysql> SELECT * FROM performance_schema.replication_group_members;		##查看节点状态

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

3.当组节点查询状态时不是ONLINE时,解决办法

recoveryring的3种可能:
(1)uuid的问题
(2)数据不同步的问题
(3)主机解析有问题
但是一般都是数据不同步的问题,所以我们来解决一下数据不同步的问题
(1)首先将server1的mysql数据备份

mysqldump --all-databases --single-transaction --routines --events --host=127.0.0.1 
--port=3306 --user=root --password=Yy+12345 > dadump.db			##备份所有数据
scp ./dadump.db server2:/root/									##将备份发送给server2

(2)在server2上恢复数据

mysql -uroot -pYy+12345
reset master;		##清空远程日志再导入备份
stop slave			##	关闭复制

mysql -pYy+12345 < dbdump.db		##将备份数据导入
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='Yy+12345' FOR CHANNEL 'group_replication_recovery';
start slave;					##打开复制
START GROUP_REPLICATION;		##开启服务后,查询ok
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值