lnmp 八之mysql主从复制模式

级联模式( A->B->C)

级联模式就是数据库B同步A,数据库C同步B,以此一级一级同步。

GTID模式的级联

1.以增加server2方式添加server3节点,可参考上一篇博客,密码仍然是123456

2.配置GTID模式
注意:在配置级联模式前,首先要关闭前面的半同步模式,然后保证三台主机的数据一致(不然做同步会不成功),然后再设置级联复制模式
SET GLOBAL rpl_semi_sync_master_enabled =0;
SET GLOBAL rpl_semi_sync_slave_enabled = 0;
(1)在server2上操作
vim /etc/my.cnf
log-slave-updates
/etc/init.d/mysqld restart

mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

(2)在server3上操作
vim /etc/my.cnf
server-id=3
log-bin=binlog
gtid_mode=ON
enforce-gtid-consistency=ON
/etc/init.d/mysqld restart

mysql -p
mysql> stop slave;

mysql> change master to 
       master_host='192.168.1.11',
       master_user='repl',
       master_password='123456',
       master_auto_position=1;

mysql> start slave;       
mysql> show slave status\G;
            ...
            Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

解决报错
在server2上执行:
mysql> ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

3.测试
在server1插入几个字段,然后分别在server2和server3上查看是否同步成功
mysql> INSERT INTO linux.test VALUES ('lll','yyy');
mysql> SELECT * FROM linux.test;

实验步骤

在这里插入图片描述
现在关闭server1和server2的半同步模式
在这里插入图片描述
在这里插入图片描述
编辑server2配置文件
在这里插入图片描述
在这里插入图片描述
授权
在这里插入图片描述
编辑server3配置文件
在这里插入图片描述
在这里插入图片描述
设置server3的mysql
在这里插入图片描述
报错
在这里插入图片描述

解决报错

在这里插入图片描述
成功解决
在这里插入图片描述
测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

半同步模式的级联

1.修改server1的配置文件
vim /etc/my.cnf
/etc/init.d/mysqld restart
show variables like 'rpl%';

2.server2此时既做master又做slave
开启slave半同步模式
SET GLOBAL rpl_semi_sync_slave_enabled=1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

开启master半同步模式
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled=1;
show status like 'Rpl%';

3.server3开启slave半同步模式
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled=1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;
show status like 'Rpl%';

4.测试
在server1上新建用户
INSERT INTO linux.test VALUES ('apple','red');
在三台机子中查看
SELECT * FROM linux.test;

停止server2的mysql
/etc/init.d/mysqld stop

再次在server1上新建用户
INSERT INTO linux.test VALUES ('lemon','yellow');
SELECT * FROM linux.test;

实验步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
server2开启slave半同步模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开启server3的slave半同步复制模式
在这里插入图片描述
开始测试:在server1上新建用户
在这里插入图片描述
server2和server3上同步成功
在这里插入图片描述
在这里插入图片描述
停掉server2的mysql
在这里插入图片描述
在server1上再次插入数据
在这里插入图片描述
发现server3没有同步
在这里插入图片描述

延时复制

生产环境中,如果开了延迟复制,不小心删除server1主机上的数据,如果没有延迟复制会立即同步删除,但是如果开了延迟复制,则可以停止slave, 想办法将数据导出,保护数据,尤其可以用在这种级联模式中,A和B 保持同步,C 开启延时复制。

1.在server3上配置mysql
mysql> stop slave;
mysql> change master to master_delay=30;   #表示延时30s
mysql> start slave;
mysql> show slave status\G;
这样在同步复制时,server3会延时30s再进行。

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

多元复制

当数据库很庞大时,可以仅仅复制某个库,比如server2复制redhat数据库,server3复制linux数据库。
具体的配置可以参照官网进行设置

并行复制(优化mysql主从复制的延迟问题)

原理请参考这两篇文章(1)并行复制原理及优化 (2)mysql并行复制

简介

  • 众所周知,MySQL的复制延迟是一直被诟病的问题之一,在MySQL 5.7版本已经支持真正的并行复制功能,官方称为为enhanced multi-threaded slave(简称MTS),复制延迟问题得到了极大的改进。总之,MySQL 5.7版本后,复制延迟问题永不存在。
  • 从MySQL 5.6.3版本开始就支持所谓的并行复制了,但是其并行只是基于schema的,也就是基于库的。如果用户的MySQL数据库实例中存在多个schema,对于从机复制的速度的确可以有比较大的帮助。但在一般的MySQL使用中,一库多表比较常见,所以MySQL 5.6的并行复制对真正用户来说属于雷声大雨点小,不太合适生产使用。
  • MySQL 5.6基于库的并行复制出来后,基本无人问津,在沉寂了一段时间之后,MySQL 5.7出来了,它的并行复制以一种全新的姿态出现在了DBA面前。MySQL 5.7才可称为真正的并行复制,这其中最为主要的原因就是slave服务器的回放与master是一致的,即master服务器上是怎么并行执行的,那么slave上就怎样进行并行回放。不再有库的并行复制限制,对于二进制日志格式也无特殊的要求(基于库的并行复制也没有要求)。

实验步骤

在slave(server2)上操作
1.修改配置文件
vim /etc/my.cnf
slave-parallel-type=LOGICAL_CLOCK   #打开基于组的并行方式(默认值是DATABASE,基于库的并行复制方式)
slave-parallel-workers=16           #并行回放线程数,官方给了16个比较合适
master_info_repository=TABLE        #将参数master_info_repostitory设置为TABLE,这样性能可以有50%~80%的提升
relay_log_info_repository=TABLE
relay_log_recovery=ON

2.重启mysqld
/etc/init.d/mysqld restart

3.查看表
use mysql;
show tables;
select * from slave_master_info;

4.查看进程
show processlist;

在这里插入图片描述
在这里插入图片描述
查看表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
显示进程
在这里插入图片描述
在这里插入图片描述

慢查询

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10S以上的语句。
默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

set global slow_query_log=ON;
show variables like "long%";
set long_query_time=5;
show status like 'slow%';

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

在这里插入图片描述

组复制之多主模式(全同步复制)

官方组复制手册-mysql5.7

简介

  • MySQL Group Replication(简称MGR)是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案。组复制是MySQL5.7版本出现的新特性,它提供了高可用、高扩展、高可靠的MySQL集群服务。
  • MySQL组复制分单主模式和多主模式
    (1)在单主模式下, 组复制具有自动选主功能,每次只有一个 server成员接受更新。
    (2) 在多主模式下, 所有的 server 成员都可以同时接受更新。
  • 组复制在数据库层面上做到了,只要集群中大多数主机可用,则服务可用,也就是说3台服务器的集群,允许其中1台宕机。‘

需要选出master进行写
在这里插入图片描述
所有主机都是master,都可以写。
在这里插入图片描述
容错情况
在这里插入图片描述

单主模式

官方参考文档

多主模式

配置server1

vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=1
log-bin=binlog
default_authentication_plugin=mysql_native_password

gtid_mode=ON
enforce-gtid-consistency=ON

master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW

plugin_load_add='group_replication.so'      #添加单主模式插件,也可以在数据库中安装
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.1.10:33061"
group_replication_group_seeds= "192.168.1.10:33061,192.168.1.11:33061,192.168.1.12:33061"
group_replication_bootstrap_group=off

group_replication_ip_whitelist="192.168.1.0/24,127.0.0.1/8"      #添加白名单,增加安全性
group_replication_single_primary_mode=OFF   #打开多主模式 
group_replication_enforce_update_everywhere_checks=ON

#rpl_semi_sync_master_enabled=1
!includedir /etc/my.cnf.d
1.实验前准备
将server1中的mysql服务停止,/data/mysql下的内容全部删除,然后准备重新初始化数据库
/etc/init.d/mysqld stop
cd /data
rm -fr *
mysqld --initialize --user=mysql
vim /etc/my.cnf
#rpl_semi_sync_master_enabled=1   需要注释这条语句 配置文件看上面

2.修改数据库密码
/etc/init.d/mysqld start
mysql -p
mysql> alter user root@localhost identified with mysql_native_password by '12345
6';

3.配置mysql
mysql> set sql_log_bin=0;        #关闭日志记录
mysql> create user rpl_user@'%' identified with mysql_native_password by '123456';                        #创建用户并授权
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='123456' for channel 'group_replication_recovery'; #配置复制的信道
mysql> show plugins;    #看到group_replication插件表示安装成功

mysql> select * from performance_schema.replication_group_members;  #查看初始节点
mysql> set global group_replication_bootstrap_group=ON;      #开启引导节点(集群内有一个节点做即可,这里server1做)
mysql> start group_replication;            #打开组复制
mysql> set global group_replication_bootstrap_group=OFF;      #关闭引导节点

修改配置文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置mysql
在这里插入图片描述
在这里插入图片描述
设置引导节点
在这里插入图片描述
在这里插入图片描述

配置server2和server3

与server1类似

vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock

symbolic-links=0

server-id=2/3       #改为2或3
log-bin=binlog
default_authentication_plugin=mysql_native_password

gtid_mode=ON
enforce-gtid-consistency=ON

master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
binlog_format=ROW

plugin_load_add='group_replication.so'      #添加单主模式插件,也可以在数据库中安装
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.1.11/12:33061"         #改为server2或server3的地址
group_replication_group_seeds= "192.168.1.10:33061,192.168.1.11:33061,192.168.1.12:33061"
group_replication_bootstrap_group=off

group_replication_ip_whitelist="192.168.1.0/24,127.0.0.1/8"      #添加白名单,增加安全性
group_replication_single_primary_mode=OFF   #打开多主模式 
group_replication_enforce_update_everywhere_checks=ON

#rpl_semi_sync_master_enabled=1
!includedir /etc/my.cnf.d
在server2上执行
1.初始化、修改配置文件
/etc/init.d/mysqld stop
cd /data
rm -fr *
mysqld --initialize --user=mysql
vim /etc/my.cnf
/etc/init.d/mysqld start

2.修改密码
mysql -p
mysql> alter user root@localhost identified with mysql_native_password by '123456';

3.配置mysql
mysql> set sql_log_bin=0;        #关闭日志记录
mysql> create user rpl_user@'%' identified with mysql_native_password by '123456';                        #创建用户并授权
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='123456' for channel 'group_replication_recovery'; #配置复制的信道

mysql> RESET MASTER;			

开启组复制(不再需要引导,引导在server1上已经做了)
mysql> start group_replication;            #打开组复制

4.在server1上查看节点
mysql> select * from performance_schema.replication_group_members;

5.以同样方式配置server3

6.在server1查看节点
mysql> select * from performance_schema.replication_group_members;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在server3上查看节点
在这里插入图片描述
配置server3
在这里插入图片描述
在server1上查看:配置成功
在这里插入图片描述

测试

1.在server1上执行
mysql> CREATE DATABASE test;
mysql> use test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY,c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1,'hello');
mysql> SELECT * FROM t1;

2.在server2和server3上查看是否同步成功
SELECT * FROM test.t1;

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

mysql路由器(读写分离)

简介

MySQL 路由器是 InnoDB 集群的一部分,是轻量级中间件,可在应用程序和后端 MySQL 服务器之间提供透明路由。它可用于各种用例,例如通过有效地将数据库流量路由到适当的后端 MySQL 服务器来提供高可用性和可伸缩性。
MySQL router是MySQL-proxy的替代方案,现在MySQL-proxy的下载已经不支持,MYSQL官方也建议下载MySQL-router。MySQL-router主要是用来对读操作进行负载均衡,读写操作进行高可用。
在这里插入图片描述

部署

官方下载地址
使用虚拟机server4做mysql路由器

1.在server4上下载rpm包并安装
rpm -ivh mysql-router-community-8.0.27-1.el7.x86_64.rpm

2.修改server4配置文件(设置读写分离)
vim /etc/mysqlrouter/mysqlrouter.conf 
[routing:ro]            #进行只读时候选择7001端口
bind_address = 0.0.0.0
bind_port = 7001
destinations = 192.168.1.10:3306,192.168.1.11:3306,192.168.1.12:3306
routing_strategy = round-robin    #采用负载均衡的模式
	
[routing:rw]    		#进行读写的时候采用7002端口
bind_address = 0.0.0.0
bind_port = 7002
destinations = 192.168.1.10:3306,192.168.1.11:3306,192.168.1.12:3306
routing_strategy = first-available   #第一可用模式,1不可用了才往2里面写

3.重启服务
systemctl start mysqlrouter.service

4.查看端口
netstat -antlp          #查看7001,7002 端口

5.使用客户端测试

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值