MySQL高可用之组复制(MGR)

news/2024/12/5 2:36:08/

华子目录

  • `组复制`的特点
  • `组复制`的`工作原理`
  • 单主模式和多主模式
    • 单主
    • 多主
  • 实现`mysql`的`多主模式`的`组复制`
  • 测试

组复制的特点

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

组复制工作原理

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

  • 节点数量不能超过9台

单主模式和多主模式

单主

在这里插入图片描述

  • single-primary mode(单写或单主模式)
  • 单写模式group内只有一台节点可写可读其他节点只可以。当主服务器失败时,会自动选择主服务器

多主

在这里插入图片描述

  • multi-primary mode(多写或多主模式)
  • 组内所有机器都是primary节点,同时可以进行读写操作,并且数据最终一致的

mysql_27">实现mysql多主模式组复制

  • 为了避免出错,在所有节点从新生成数据库数据

  • node1

[root@mysql-node1 ~]# /etc/init.d/mysqld stop[root@mysql-node1 ~]# rm -rf /data/mysql/*
  • node2
[root@mysql-node2 ~]# /etc/init.d/mysql.server stop[root@mysql-node2 ~]# rm -rf /data/mysql/*
  • node3
[root@mysql-node3 ~]# /etc/init.d/mysqld stop[root@mysql-node3 ~]# rm -rf /data/mysql/*
  • 修改master上的配置文件内容
[root@mysql-node1 ~]# vim /etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
symbolic-links=0
server-id=10   #配置server唯一标识号disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"  #禁用指定存储引擎
gtid_mode=ON  #启用全局事件标识
enforce_gtid_consistency=ON   #强制gtid一致
master_info_repository=TABLE  #复制事件数据到表中而不记录在数据目录中
relay_log_info_repository=TABLE
binlog_checksum=NONE   #禁止对二进制日志校验
log_slave_updates=ON   #打开数据库中继,当slave中sql线程读取日志后也会写入到自己的binlog中
log_bin=binlog  #开启binlog日志并重新指定log名称
binlog_format=ROW  #使用行日志格式
plugin_load_add='group_replication.so'  #加载组复制插件
transaction_write_set_extraction=XXHASH64  #把每个事件编码为加密散列
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"  #通知插件正式加入,或创建的组名,名称为uuid格式
group_replication_start_on_boot=off  #在server启动时不自动启动组复制
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  #放弃自己信息以master事件为主
  • 3台节点上配置hosts解析(这里ip解析域名一定要和主机名一致
[root@mysql-node1 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.10  mysql-node1
172.25.254.20  mysql-node2
172.25.254.30  mysql-node3
[root@mysql-node2 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.10  mysql-node1
172.25.254.20  mysql-node2
172.25.254.30  mysql-node3
[root@mysql-node3 ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.254.10  mysql-node1
172.25.254.20  mysql-node2
172.25.254.30  mysql-node3

在这里插入图片描述

  • master上进行初始化
[root@mysql-node1 ~]# mysqld --user=mysql --initialize
[root@mysql-node1 ~]# /etc/init.d/mysqld start[root@mysql-node1 ~]# mysql -uroot -p'7t84Qherg)&U'
mysql> alter user root@localhost identified by '123456';
  • 进行组复制配置
mysql> set sql_log_bin=0;mysql> create user huazi@'%' identified by '123456';mysql> grant replication slave on *.* to huazi@'%';mysql> flush privileges;mysql> set sql_log_bin=1;mysql> change master to master_user='huazi',master_password='123456' for channel 'group_replication_recovery';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;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | c0dd8ac3-b159-11ef-9d51-000c2928b963 | mysql-node1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
  • 此时做好了,但是这时,这个组是一个光杆司令,我们需要把别的主机加入到这个组
  • node2
#先将node1上的my.cnf文件拷贝过来
[root@mysql-node1 ~]# rsync /etc/my.cnf root@172.25.254.20:/etc/[root@mysql-node2 ~]# vim /etc/my.cnf

在这里插入图片描述

  • 初始化
[root@mysql-node2 ~]# mysqld --user=mysql --initialize
[root@mysql-node2 ~]# /etc/init.d/mysql.server start
[root@mysql-node2 ~]# mysql -uroot -p'Pd=RovxmK6Oj'mysql> alter user root@localhost identified by "123456";
  • 进行组复制配置
mysql> set sql_log_bin=0;mysql> create user huazi@'%' identified by "123456";mysql> grant replication slave on *.* to huazi@'%';mysql> flush privileges;mysql> set sql_log_bin=1;mysql> change master to master_user='huazi',master_password='123456' for channel 'group_replication_recovery';mysql> start group_replication;
  • 测试
#我们发现node2加入到了组里
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 79c39c85-b15d-11ef-b574-000c292fa568 | mysql-node2 |        3306 | ONLINE       |
| group_replication_applier | c0dd8ac3-b159-11ef-9d51-000c2928b963 | mysql-node1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
  • node3
#先将node1上的my.cnf文件拷贝过来
[root@mysql-node1 ~]# rsync /etc/my.cnf root@172.25.254.30:/etc/[root@mysql-node3 ~]# vim /etc/my.cnf

在这里插入图片描述

  • 初始化
[root@mysql-node3 ~]# mysqld --user mysql --initialize
  • 启动MySQL
[root@mysql-node3 ~]# /etc/init.d/mysqld start
[root@mysql-node3 ~]# mysql -uroot -p'&jTpm:rok9Pv'mysql> alter user root@localhost identified by '123456';
  • 进行组复制配置
mysql> set sql_log_bin=0;mysql> create user huazi@'%' identified by "123456";mysql> grant replication slave on *.* to huazi@'%';mysql> flush privileges;mysql> set sql_log_bin=1;mysql> change master to master_user='huazi',master_password='123456' for channel 'group_replication_recovery';mysql> start group_replication;
  • 测试
#我们发现,node3也加入到了组里
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 747e4cef-b15f-11ef-a867-000c290eaf9d | mysql-node3 |        3306 | ONLINE       |
| group_replication_applier | 79c39c85-b15d-11ef-b574-000c292fa568 | mysql-node2 |        3306 | ONLINE       |
| group_replication_applier | c0dd8ac3-b159-11ef-9d51-000c2928b963 | mysql-node1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

测试

#node1上创建一个库
mysql> create database huazi;#node2上查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| huazi              |  #发现了创建的库
| mysql              |
| performance_schema |
| sys                |
+--------------------+#node3上查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| huazi              | #发现了创建的库
| mysql              |
| performance_schema |
| sys                |
+--------------------+
#node3上创建一个表(在创建表时,必须存在主键,否则插入数据时会失败)
mysql> use huazi;
Database changed
mysql> create table userlist(-> name varchar(10) primary key,-> password varchar(20));#node2上查看
mysql> use huazi;Database changed
mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| userlist        |
+-----------------+#node1上查看
mysql> use huazi;Database changed
mysql> show tables;
+-----------------+
| Tables_in_huazi |
+-----------------+
| userlist        |
+-----------------+
  • 在创建表时,必须存在主键,否则插入数据时会失败
#node2上插入数据
mysql> insert into userlist values -> ("huazi","123456");#node3上查看
mysql> select * from userlist;
+-------+----------+
| name  | password |
+-------+----------+
| huazi | 123456   |
+-------+----------+#node1上查看
mysql> select * from userlist;
+-------+----------+
| name  | password |
+-------+----------+
| huazi | 123456   |
+-------+----------+
  • 总结:所有主机都是可读可写的
#当有一台主机挂了
mysql> quit
Bye
[root@mysql-node2 ~]# /etc/init.d/mysql.server stop#我们在node1上可以发现,挂了的主机自动从组中消除了
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 747e4cef-b15f-11ef-a867-000c290eaf9d | mysql-node3 |        3306 | ONLINE       |
| group_replication_applier | c0dd8ac3-b159-11ef-9d51-000c2928b963 | mysql-node1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
#当主机上线后
[root@mysql-node2 ~]# /etc/init.d/mysql.server start#也不会自动加进去,需要我们手动加入
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 747e4cef-b15f-11ef-a867-000c290eaf9d | mysql-node3 |        3306 | ONLINE       |
| group_replication_applier | c0dd8ac3-b159-11ef-9d51-000c2928b963 | mysql-node1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
  • 为什么需要手动加入

在这里插入图片描述

#进行手动加入
[root@mysql-node2 ~]# mysql -uroot -p
Enter password:#手动加入
mysql> start group_replication;#我们发现加入了
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 747e4cef-b15f-11ef-a867-000c290eaf9d | mysql-node3 |        3306 | ONLINE       |
| group_replication_applier | 79c39c85-b15d-11ef-b574-000c292fa568 | mysql-node2 |        3306 | ONLINE       |
| group_replication_applier | c0dd8ac3-b159-11ef-9d51-000c2928b963 | mysql-node1 |        3306 | ONLINE       |
+---------------------------+--------------------------------------+-------------+-------------+--------------+

http://www.ppmy.cn/news/1552443.html

相关文章

LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型 Matlab代码注释清晰。 程序设计 完整程序和数据获取方式:私信博主回复LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型(Matlab&#…

浅谈volatile

volatile有三个特性: (1)可见性 (2)不保证原子性 (3)禁止指令重排 下面我们一一介绍 (一)可见性 volatile的可见性是说共享变量只要修改,就可以被其他线…

uniapp中scrollview配合swiper实现一个简单的tab标签页

<template><view class"tab-container"><!-- Tab 标签滚动容器 --><scroll-view scroll-x"true" class"tab-scroll" scroll-with-animation"true"><view class"tab-list"><viewv-for"…

yagmail邮件发送库:如何用Python实现自动化邮件营销?

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

React Native学习笔记(一)

一、创建ReactNative项目 1.1、指令创建 React Native 有一个内置的命令行界面&#xff0c;你可以用它来生成一个新项目。您可以使用 Node.js 附带的 访问它&#xff0c;而无需全局安装任何内容。让我们创建一个名为“AwesomeProject”的新 React Native 项目 npx react-nati…

【linux】(26)shell脚本-变量、位置变量

定义和使用变量 定义变量 在 Shell 脚本中定义变量非常简单&#xff0c;直接赋值即可&#xff1a; #!/bin/bash name"Alice"注意&#xff0c;等号两边不能有空格。 使用变量 使用变量时需要在变量名前加上 $ 符号&#xff1a; #!/bin/bash name"Alice&quo…

llamaindex实战-ChatEngine-ReAct Agent模式

概述 ReAct 是一种基于Agent的聊天模式&#xff0c;构建在数据查询引擎之上。对于每次聊天交互&#xff0c;代理都会进入一个 ReAct 循环&#xff1a; 首先决定是否使用查询引擎工具并提出适当的输入 &#xff08;可选&#xff09;使用查询引擎工具并观察其输出 决定是否重复…

C. Raspberries

time limit per test 2 seconds memory limit per test 256 megabytes You are given an array of integers a1,a2,…,ana1,a2,…,an and a number kk (2≤k≤52≤k≤5). In one operation, you can do the following: Choose an index 1≤i≤n1≤i≤n,Set aiai1aiai1. F…