当前位置: 首页 > article >正文

mysql高可用之组复制 (MGR)

MySQL Group Replication( 简称 MGR ) MySQL 官方于 2016 12 月推出的一个全新的高可用与高扩展的解决方案。
组复制是 MySQL 5.7.17 版本出现的新特性,它提供了高可用、高扩展、高可靠的 MySQL 集群服务。
MySQL 组复制分单主模式和多主模式,传统的 mysql 复制技术仅解决了数据同步的问题,MGR 对属于同一组的服务器自动进行协调。对于要提交的事务,组成员必须就全局事务序列中给定事务
的顺序达成一致。
提交或回滚事务由每个服务器单独完成,但所有服务器都必须做出相同的决定。
如果存在网络分区,导致成员无法达成事先定义的分割策略,则在解决此问题之前系统不会继续进行, 这是一种内置的自动裂脑保护机制。
MGR 由组通信系统 ( Group Communication System GCS ) 协议支持。
该系统提供故障检测机制、组成员服务以及安全且有序的消息传递。

1.组复制流程

首先我们将多个节点共同组成一个复制组,在执行读写( RW )事务的时候,需要通过一致性协议层(Consensus 层)的同意,也就是读写事务想要进行提交,必须要经过组里 大多数人 (对应 Node 节点)的同意,大多数指的是同意的节点数量需要大于 (N/2+1 ),这样才可以进行提交,而不是原发起 方一个说了算。而针对只读(RO )事务则不需要经过组内同意,直接提交即可。
注:节点数量不能超过9

2.组复制单主和多主模式

single-primary mode( 单写或单主模式 )
单写模式 group 内只有一台节点可写可读,其他节点只可以读。当主服务器失败时,会自动选择新的主服务器。
multi-primary mode( 多写或多主模式 )
组内的所有机器都是 primary 节点,同时可以进行读写操作,并且数据是最终一致的。

3.实现mysql组复制

 注意:为了避免出错,在所有节点中从新生成数据库数据

编辑主配置文件
[root@mysql1 ~]# rm -fr /data/mysql/*
[root@mysql-node10 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0

#配置server唯一标识号
server-id=1 

#禁用指定存储引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" 

#启用全局事件标识
gtid_mode=ON 

#强制gtid一致
enforce_gtid_consistency=ON 

#复制事件数据到表中而不记录在数据目录中
master_info_repository=TABLE

relay_log_info_repository=TABLE

 #禁止对二进制日志校验
binlog_checksum=NONE 

#打开数据库中继
log_slave_updates=ON 


#当slave中sql线程读取日志后也会写入到自己的binlog中

#重新指定log名称
log_bin=binlog 

#使用行日志格式
binlog_format=ROW 

 #加载组复制插件
plugin_load_add='group_replication.so'

#把每个事件编码为加密散列
transaction_write_set_extraction=XXHASH64 

#通知插件正式加入或创建的组名,名称为uuid格式
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" 


#在server启动时不自动启动组复制
group_replication_start_on_boot=off 

#指定插件接受其他成员的信息端口
group_replication_local_address="172.25.254.10:33061" 

#本地地址允许访问成员表
group_replication_group_seeds="172.25.254.10:33061,172.25.254.20:33061,
172.25.254.30:33061" 

group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"     #主机白名单
group_replication_bootstrap_group=off                             #不随系统自启而
启动
group_replication_single_primary_mode=OFF                         #使用多主模式
group_replication_enforce_update_everywhere_checks=ON             #组同步中有任何改变检测更新
group_replication_allow_local_disjoint_gtids_join=1               #放弃自己信息以事件为主

初始化mysql:

[root@mysql1 ~]# mysqld --user=mysql --initialize
[root@mysql1 ~]# /etc/init.d/mysqld start
[root@mysql1 ~]# mysql -uroot -p初始化后生成的密码 -e "alter user

配置mysql:

#禁用二进制日志记录,以避免在创建用户时记录日志
mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)


mysql> CREATE USER xixi@'%' IDENTIFIED BY '123123;
Query OK, 0 rows affected (0.00 sec)

#授予 shuyan 用户复制从属权限,允许其从任何主机连接
mysql> GRANT REPLICATION SLAVE ON *.* TO xixi@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

#重新启用二进制日志记录
mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)


#设置复制源(Master)的用户名和密码,用于 Group Replication 的恢复过程
mysql> CHANGE MASTER TO MASTER_USER='xixi', MASTER_PASSWORD='123123' FOR CHANNEL
'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

#允许当前实例作为集群的第一个成员启动 Group Replication
mysql> set global group_replication_bootstrap_group=on;

#启动 Group Replicatio
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (2.19 sec)

#禁止当前实例作为集群的第一个成员启动 Group Replication
mysql> set global group_replication_bootstrap_group=off;

#查看服务状态
mysql> SELECT * FROM performance_schema.replication_group_members;

注:为了减少配置时间,之间讲配置好的文件复制到myq2和mysql3中

[root@mysql1]# scp /etc/my.cnf  root@172.25.254.20:/etc/my.cnf
[root@mysql1]# scp /etc/my.cnf  root@172.25.254.30:/etc/my.cnf

修改参数:

修改:server-id=2/3

修改:group_replication_local_address="172.25.254.20/30:33061"

修改完成后,重新初始话mysql:

[root@mysql2/3 ~]# mysqld --user=mysql --initialize
[root@mysql2/3 ~]# /etc/init.d/mysqld start
[root@mysql2/3 ~]# mysql -uroot -p初始化后生成的密码 

配置sql2/3:

[root@mysql2/3 ~]# mysql -uroot -p123123

mysql> SET SQL_LOG_BIN=0;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER xixi@'%' IDENTIFIED BY '123123';
Query OK, 0 rows affected (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO xixi@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

mysql> SET SQL_LOG_BIN=1;
Query OK, 0 rows affected (0.00 sec)

mysql> CHANGE MASTER TO MASTER_USER='xixi', MASTER_PASSWORD='123123' FOR CHANNEL
'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.00 sec)

mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (2.19 sec)

#检测组的状态
mysql> SELECT * FROM performance_schema.replication_group_members;

 测试: 在各组写入数据,都能进行互相同步

4.mysql-routermysql路由)

MySQL Router
1.是一个对应用程序透明的 InnoDB Cluster 连接路由服务,提供负载均衡、应用连接故障转移和客户端路由。
2.利用路由器的连接路由特性,用户可以编写应用程序来连接到路由器,并令路由器使用相应的路由策略来处理连接,使其连接到正确的MySQL 数据库服务器。

 设计目的:

  • MySQL Router 是专门为 MySQL 数据库设计的官方工具,主要用来处理 MySQL 数据库的负载均衡、读写分离等任务。
  • 它内置了对 MySQL 协议的理解和支持,因此在处理 MySQL 相关任务时更加高效和可靠。
Mysql route 的部署方式;
我们需要在所有的数据库主机之外再开一台主机 mysql-router
#安装mysql-router
[root@mysql-router ~]# rpm -ivh mysql-router-community-8.4.0-1.el7.x86_64.rpm
配置mysql-router
[root@mysql-router ~]# vim /etc/mysqlrouter/mysqlrouter.conf

[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.254.10:3306,172.25.254.20:3306,172.25.254.30:3306
routing_strategy = round-robin #轮询

[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.254.30:3306,172.25.254.20:3306,172.25.254.10:3306
routing_strategy = first-available  #第一个链接的就会一直链接
查看调度效果

[root@mysql 1 & 2 & 3 ~]# watch -1 lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 9879 mysql 22u IPv6 56697 0t0 TCP *:mysql (LISTEN)
[root@mysql-router ~]# mysql -ulee -plee -h 172.25.254.40 -P 7001
注:mysql router 并不能限制数据库的读写,访问分流

http://www.kler.cn/a/288602.html

相关文章:

  • python怎么设置环境变量
  • 【PHP】ThinkPHP基础
  • arcgis做buffer
  • Spring-Webflux + Reactor + Netty 初体验
  • 随时随地编码:香橙派Zero3上安装Code Server远程开发指南
  • 【自用】0-1背包问题与完全背包问题的Java实现
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • 【战略游戏】
  • Docker笔记-启动容器时,时间与宿主机保持一致
  • 如何找到适合的IT外包服务商
  • 【JAVA】两轮充电桩设计模式实践分享
  • mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题
  • 深入Redis:细谈持久化
  • 浅析前端数据埋点监控:用户行为与性能分析的桥梁
  • ES6基础----Generator的使用
  • 【RabbitMQ之一:windows环境下安装RabbitMQ】
  • 数分基础(05)中心极限定理、假设检验与AB测试简介
  • 多线程并发性
  • 二叉树展开为列表(LeetCode)
  • 改进YOLO的群养猪行为识别算法研究及部署(小程序-网站平台-pyqt)
  • 【通俗理解】最优控制之旅——强化学习中的策略优化
  • 物业|基于SprinBoot+vue的物业管理系统(源码+数据库+文档)
  • 深入理解 CSS Flex 布局
  • Golang 字面量的表示
  • 【HarmonyOS 4.0】应用级变量的状态管理
  • 每天一个数据分析题(五百一十二)- 数据标准化