返回顶部
首页 > 资讯 > 服务器 >docker环境搭建mgr集群的问题及原理
  • 171
分享到

docker环境搭建mgr集群的问题及原理

2024-04-02 19:04:59 171人浏览 安东尼
摘要

目录MGR概念为何选用MGRMGR原理单主模式多主模式环境准备Docker搭建MRG步骤1、拉取Mysql8镜像2、创建docker专用网络3、创建存储数据相关目录4、启动3个mys

MGR概念

MGR(Mysql Group Replication),是MySQL在2016年12月推出的一个全新的高可用与高扩展的解决方案

为何选用MGR

MySQL推出MGR之前,传统复制模式分为两种,

  • 异步复制;
  • 半同步复制

异步复制:

  • master执行事务,写入binlog日志,然后提交。
  • slave接收binlog日志事务并将事务先写入relay日志,然后重做事务。当master宕机时有可能会造成数据不一致情况。

半同步复制:

  • master执行事务,写入二进制日志,将binlog事务日志传送到slave,slave接收到binlog事务日志后,将其写到relay log,然后向master返回传送成功ACK;
  • master收到ACK后,再在存储引擎中提交事务。(两种提交方式,由参数rpl_semi_sync_master_wait_point决定)

总结以上要点,存在的弊端如下:

  • 写操作集中在MASTER服务器上;
  • 可能产生数据不一致的问题;
  • MASTER宕机后,需要人为选择新主并重新给其他的slave端执行change master。

MGR提供的功能

  • 同步复制;
  • 单主模式、多主模式;
  • 自动切换;
  • 弹性扩展

MGR限制

  • 仅支持innodb引擎;
  • 所有新增表必须显式创建主键;
  • 建议隔离级别为READ COMMITED,多主模式下,不支持SERIALIZABLE;
  • 多主模式下,不建议使用外键;
  • 需开启bin_log_fORMat=row、log_slave_updates=ON;
  • 需开启GTID;
  • 需安装引擎group_replication.so;
  • MGR最多支持9个节点

MGR原理

单主模式

单主模式下,只有一个节点可以读写,其他节点提供只读服务。单主模式下,当主节点宕掉,其他节点自动会根据服务器的server_uuid变量和group_replication_member_weight变量值,选择下一个slave作为主节点,group_replication_member_weight的值最高的成员被选为新的主节点,该参数默认为50,可以在节点上设置不同值;在group_replication_member_weight值相同的情况下,group根据数据字典中server_uuid排序,排序在最前的被选择为主节点。

多主模式

多主模式下,在组复制中通过Group Replication Protocol协议及Paxos协议,形成的整体高可用解决方案,同时增加了certify的概念,负责检查事务是否允许提交,是否与其它事务存在冲突,Group Replication是由多个节点共同组成一个数据库集群,每个节点都可以单独执行事务,但是read-write(RW)的操作只有在组内验证后才可以commit,Read-only (RO)事务是不需要验证可以立即执行,当一个事务在一个节点上提交之前,会在组内自动进行原子性的广播,告知其他节点变更了什么内容/执行了什么事务,然后为该事物建立一个全局的排序,最终,这意味着所有的服务器都以相同的顺序接收相同的事务集。因此,所有服务器都按照相同的顺序应用相同的变更集,因此它们在组中保持一致。 在多主模式下,该组的所有成员都设置为读写模式,在多主模式下,不支持SERIALIZABLE事务隔离级别,且不能完全支持级联外键约束。

环境准备

1、基于Centos7系统的虚拟机(或云服务器),内存建议4G以上;
2、提前安装好docker环境,并启动;

docker搭建MRG步骤

1、拉取mysql8镜像

docker pull mysql:8.0.20

2、创建docker专用网络

这里是为了后面固定各个容器的IP地址,避免IP地址发生变动带来的其他问题

docker network create --subnet=172.72.0.0/24 mysql-network

3、创建存储数据相关目录

mkdir -p /usr/local/mysql/lhrmgr15/conf.d
mkdir -p /usr/local/mysql/lhrmgr15/data
mkdir -p /usr/local/mysql/lhrmgr16/conf.d
mkdir -p /usr/local/mysql/lhrmgr16/data
mkdir -p /usr/local/mysql/lhrmgr17/conf.d
mkdir -p /usr/local/mysql/lhrmgr17/data

4、启动3个mysql容器

依次执行下面的docker命令即可,目录名称和容器的名称可以结合自身的情况更改

第一个容器:

docker run -d --name mysql8020mgr33065 \
-h lhrmgr15 -p 33065:3306 --net=mysql-network --ip 172.72.0.15 \
-v /usr/local/mysql/lhrmgr15/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr15/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWord=lhr \
-e TZ=Asia/Shanghai \
mysql:8.0.20

第二个容器:

docker run -d --name mysql8020mgr33066 \
-h lhrmgr16 -p 33066:3306 --net=mysql-network --ip 172.72.0.16 \
-v /usr/local/mysql/lhrmgr16/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr16/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=lhr \
-e TZ=Asia/Shanghai \
mysql:8.0.20

第三个容器:

docker run -d --name mysql8020mgr33067 \
-h lhrmgr17 -p 33067:3306 --net=mysql-network --ip 172.72.0.17 \
-v /usr/local/mysql/lhrmgr17/conf.d:/etc/mysql/conf.d -v /usr/local/mysql/lhrmgr17/data:/var/lib/mysql/ \
-e MYSQL_ROOT_PASSWORD=lhr \
-e TZ=Asia/Shanghai \
mysql:8.0.20

4、查看已启动的容器

docker ps

5、修改配置参数

还记得使用docker搭建mysql的过程吗?当我们需要在docker容器开启binlog日志的时候,是怎么做的呢?没错,需要一个my.cnf文件,接下来,分别在上面的conf.d目录下,创建my.cnf文件,依次拷贝下面的内容到各自目录的my.cnf文件中;

第一个my.cnf

[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033065
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin = 
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
skip-name-resolve
auto-increment-increment=2
auto-increment-offset=1
gtid-mode=ON
enforce-gtid-consistency=on
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=lhrmgr15-relay-bin-ip15
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.15:33061"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
report_host=172.72.0.15
report_port=3306

第二个my.cnf

[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033066
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin = 
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=lhrmgr16-relay-bin-ip16
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.16:33062"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
report_host=172.72.0.16
report_port=3306

第三个my.cnf

[mysqld]
user=mysql
port=3306
character_set_server=utf8mb4
secure_file_priv=''
server-id = 802033067
default-time-zone = '+8:00'
log_timestamps = SYSTEM
log-bin = 
binlog_format=row
binlog_checksum=NONE
log-slave-updates=1
gtid-mode=ON
enforce-gtid-consistency=ON
skip_name_resolve
default_authentication_plugin=mysql_native_password
max_allowed_packet = 500M
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log=lhrmgr16-relay-bin-ip16
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "172.72.0.17:33063"
loose-group_replication_group_seeds= "172.72.0.15:33061,172.72.0.16:33062,172.72.0.17:33063"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist="172.72.0.15,172.72.0.16,172.72.0.17"
report_host=172.72.0.17
report_port=3306

6、重启3个容器

docker restart mysql8020mgr33065 mysql8020mgr33066 mysql8020mgr33067

7、分别登录到各个docker容器,查看下容器的信息

docker exec -it mysql8020mgr33065 /bin/bash
mysql -uroot -plhr
select @@hostname,@@server_id,@@server_uuid
docker exec -it mysql8020mgr33066 /bin/bash
mysql -uroot -plhr
select @@hostname,@@server_id,@@server_uuid
docker exec -it mysql8020mgr33067 /bin/bash
mysql -uroot -plhr
select @@hostname,@@server_id,@@server_uuid

以第一个容器为例,查询的信息如下:

以上的准备工作就基本完成了

安装MGR插件(3个容器内均执行)

INSTALL PLUGIN group_replication SONAME 'group_replication.so';

查看当前容器节点已经安装的插件,说明安装完成了

show plugins;

设置数据复制账号(3个容器内均执行)

通过开篇的原理讲解知道,单主模式下,各个节点的数据是强一致的,因此数据写入到某个节点的时候,必然存在不同节点之间数据的拷贝,因此需要创建一个用户复制的账号,在3个容器里面依次执行下面的命令

SET SQL_LOG_BIN=0;
CREATE USER repl@'%' IDENTIFIED BY 'lhr';
GRANT REPLICATION SLAVE ON *.* TO repl@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='lhr' FOR CHANNEL 'group_replication_recovery';

开启MGR单主模式

1、启动MGR,在主库(172.72.0.15)上执行

SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
-- 查看MGR组信息
SELECT * FROM performance_schema.replication_group_members;

2、其他两个节点加入MGR

在从库(172.72.0.16,172.72.0.17)上执行,执行完毕,可以查看MGR组信息,反映出各个节点的状态

START GROUP_REPLICATION;
-- 查看MGR组信息
SELECT * FROM performance_schema.replication_group_members;

可以看到,3个节点状态为online,且主节点为172.72.0.15,只有主节点可以进行数据写入,其他节点为只读,到这里MGR单主模式搭建成功;

到此这篇关于docker 搭建mgr集群的文章就介绍到这了,更多相关docker mgr集群内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: docker环境搭建mgr集群的问题及原理

本文链接: https://lsjlt.com/news/147944.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • docker环境搭建mgr集群的问题及原理
    目录MGR概念为何选用MGRMGR原理单主模式多主模式环境准备docker搭建MRG步骤1、拉取mysql8镜像2、创建docker专用网络3、创建存储数据相关目录4、启动3个mys...
    99+
    2024-04-02
  • 使用docker compose搭建consul集群环境的例子
    consul基本概念 server模式和client模式 server模式和client模式是consul节点的类型;client不是指的用户客户端。 server模式提供...
    99+
    2024-04-02
  • Docker Consul集群环境搭建的方法是什么
    本篇内容介绍了“Docker Consul集群环境搭建的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、Docker ...
    99+
    2023-06-22
  • 如何使用docker compose搭建consul集群环境
    这篇文章主要介绍如何使用docker compose搭建consul集群环境,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!consul基本概念server模式和client模式server模式和client模式是co...
    99+
    2023-06-15
  • 怎么在docker中搭建一个Hadoop集群环境
    这篇文章给大家介绍怎么在docker中搭建一个Hadoop集群环境,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。docker安装国际惯例更新下apt软件包的源 curl -fssl https://mirro...
    99+
    2023-06-07
  • 基于docker环境下如何搭建redis主从集群
    基于docker环境下如何搭建redis主从集群,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1   前言笔者给大家介绍基于docker环境下搭建Red...
    99+
    2023-06-04
  • redis集群的原理以及搭建配置
    理解并从头搭建redis集群部分开发人员工作当中只是在应用中使用redis,比如用来做数据结果的缓存。而且现在有很多不错的redis客户端工具(redisson),基本上可以不用关注redis命令就可以完成...
    99+
    2024-04-02
  • 怎么搭建Nginx和Tomcat的web集群环境
    本篇内容介绍了“怎么搭建Nginx和Tomcat的web集群环境”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一直以来对于web服务器对to...
    99+
    2023-06-04
  • DockerConsul概述以及集群环境搭建步骤(图文详解)
    目录一、Docker consul概述二、基于 nginx 与 consul 构建自动发现即高可用的 Docker 服务架构一、Docker consul概述 容器服务更新与发现:先...
    99+
    2024-04-02
  • Windows环境下搭建配置redis集群的教程
    Redis集群:Redis 集群是一个提供在多个Redis间节点间共享数据的程序集,集群节点共同构建了一个去中心化的网络,集群中的每个节点拥有平等的身份,节点各自保存各自的数据和集群状态。节点之间采用Gos...
    99+
    2024-04-02
  • VMware + Ubuntu18.04 搭建Hadoop集群环境的图文教程
    目录前言VMware克隆虚拟机(准备工作,克隆3台虚拟机,一台master,两台node)1.创建Hadoop用户(在master,node1,node2执行)2.更新apt下载源(...
    99+
    2024-04-02
  • centos环境下nginx高可用集群的搭建指南
    目录1.概述2.CentOS中nginx集群搭建2.1 集群架构图2.2 Keepalived2.3 集群搭建准备2.4 集群搭建2.4.1 安装keepalived2.4.2 配置...
    99+
    2024-04-02
  • 使用sealos快速搭建K8s集群环境的过程
    目录一、前言二、sealos三、准备环境sealos 安装虚拟机设置网络windows网络虚拟机的网络网卡配置其他配置RPM 源四、安装开始五、可能遇见的问题sealos run的时...
    99+
    2024-04-02
  • ZooKeeper在单机和集群环境下怎么安装搭建及使用
    这篇文章主要讲解了“ZooKeeper在单机和集群环境下怎么安装搭建及使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ZooKeeper在单机和集群环境下怎么安装搭建及使用”吧!1、下载首...
    99+
    2023-06-29
  • Python环境搭建遇到问题及解决方案记
    pip版本问题 环境使用Ubuntu16.04 , 安装pip3 $sudo apt-get install python3-pip   默认安装pip8.1.1,更新后是18.1 $pip3 install --upgrade ...
    99+
    2023-01-30
    解决方案 环境 Python
  • 关于maven环境的安装及maven集成idea环境的问题
    目录什么是maven,有什么用?1.下载2.安装3.修改maven仓库3.1修改本地仓库3.2 配置私服 4.idea配置maven什么是maven,有什...
    99+
    2024-04-02
  • 关于CentOS 8 搭建MongoDB4.4分片集群的问题
    目录一,简介1.分片2.为什么使用分片3.分片原理概述二,准备环境三,集群配置部署四,测试服务器分片功能一,简介 1.分片 在MongoDB里面存在另一种集群,就是分片技术,可以满...
    99+
    2024-04-02
  • hadoop-2.7.3编译和搭建集群环境的方法是什么
    这篇文章主要讲解了“hadoop-2.7.3编译和搭建集群环境的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“hadoop-2.7.3编译和搭建集群环境的方法是什么”吧!环境:Ce...
    99+
    2023-06-03
  • MAC 系统下,使用MxSrvs 搭建PHP集成环境教程以及常见问题
    一、下载PHP集成环境 个人试用了很多PHP集成环境,例如phpstudy,mamp,xmapp等等,很多都试过了,界面复杂看不明白,还很难配置。真是一把心酸一把泪。   强烈推MxSrvs,界面简洁。 MxSrvs 的官网下载地址为:Mx...
    99+
    2023-10-01
    php 开发语言
  • MySQL MGR搭建过程中常遇见的问题及解决办法
    MGR搭建过程中遇到的一些故障     实际中我一共部署了三套MGR环境,分别是单机多实例的MGR环境,多机同网段的MGR环境,多机不同网段的MGR环境,部署的过程大同小异,但是还是有一...
    99+
    2022-05-19
    MySQL MGR搭建 MySQL MGR搭建问题 MySQL MGR搭建问题解决
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作