MySQL / 数据库

MySQL MGR技术介绍与集群部署

温馨提示:本文最后更新于2021-03-15 08:08:25,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 3月15日 · 2021年 · 本文15338个字,预计阅读39分钟 19104次已读

一、MGR技术简单介绍

MGR是在MySQL 5.7.17版本中引进的,是MySQL官方于2016年12月推出的一个全新的高可用与高扩展的解决方案,MGR(MySQL Group Replication)可以很好的保证数据一致性原文链接:https://www.dqzboy.com又可以自动切换,具备故障检测功能、支持多节点写入。MGR分为单组和多组模式,之前我们都听说过MHA或者自己的项目中使用到了MHA技术,但是MHA在配置和搭建上面会比较繁琐,且容易出现脑裂的情况,而MySQL官方引进的MGR插件则完美的解决了这些问题,并且配置部署简单,容易上手,在5.7.28版本中也是相当稳定了,这绝对是一项可文章来源(Source):https://www.dqzboy.com以被各大公司看好的技术方案。

2、与传统复制有啥区别

2.1:MySQL复制演化历程

在MySQL5.5版本之前是支持异步复制的;在5.5.8版本中MySQL官方引进了半同步复制;5.6.10版本支持了GITDs多线程回放;5.7.9版本中官方又对半同步复制做了增强,支持XA事务、支持多源复制;在MySQL的5.7.17版本中MySQL官方引进了MGR技术,基于MGR单主/多主组同步复制。

2.2:传统主从复制实现方式

比如有一个一主一从的MySQL集群架构,从库会给主库发起一个读数据的请求后,主库会通过 dump线程把 binlog 日志文件推送给从库,从库的 I/O 线程把接收到数据更新到 relay log,之后从库的 SQL 线程把 relay log 应用为 binlog 日志,直到主库与从库的 binlog 日志文件完全数据一致,达到主从同步。

MySQL5.6之前我们都是基于日志文件名和位置实现主从复制,5.6.10版本中有了GTID,主从复制则可以通过事务的GTID信息来确保数据的一致性。

日志格式也会根据业务场景选择不同的格式,有基于每行数据变化记录的ROW格式,还有记录SQL上下文的statement格式,还有就是两者的混合模式mixed格式。

MySQL MGR技术介绍与集群部署-浅时光博客

2.3:MySQL的异步复制

我这里一有个一主两从的MySQL主从架构进行说明,当应用发来的事务请求在master节点上进行执行以后会写入到主库的binlog中,然后主库会把这些binlog推送给Slave和Slave2后,主库不需要等待从节点返回确认接收到的回应就直接进行了事务的提交了。

而这种主从复制方式会出现数据丢失的情况,为了解决这个问题,MySQL5.5.8版本中出现了半同步复制,接下来我们了解下半同步复制的实现逻辑。

MySQL MGR技术介绍与集群部署-浅时光博客

2.4:MySQL半同步复制

半同步与异步复制的区别在于,当一个事务过来的时候,在主库进行执行binlog,然后主库把binlog推送给从库,然后主库那边需要等待从库这边至少有一个从库给它进行应答,从库确认更新到relay log成功了之后,主库那边才会将这个事务进行提交。

半同步复制同一存在问题,第一个是MySQL无法进行自动切换,运维比较复杂,第二个就是slave的读压力大,会导致主从延迟增加;而MySQL5.7.17版本中的MGR技术就解决了这些问题,下面我们来看下MGR的工作逻辑。

MySQL MGR技术介绍与集群部署-浅时光博客

2.5:MySQL的MGR复制

MGR全称是MySQL Group Replication组复制;MGR集群则是一组MySQL服务,每一个节点都保存有一个完整的副本,MGR是属于MySQL自带的一个插件,下面我以一组MGR集群进行说明;

原文链接:https://www.dqzboy.com

当在DB1上有一个事务要进行执行,当这个事务在commit之前,会进入到MGR层,先通过MGR中的paxos协议把信息广播到其他节点,然后所有节点的paxos模块就会对信息进行一个投票,多数表决通过之后,达成一个共识的信息,达成共识的这个广播信息再进入各个节点的冲突检测模块进行冲突检测,这样就通过这个MGR层保证了数据在这个集群中的数据一致性。

有两点需要说明,第一点DB1上这个发起的事务对集群中的DB1来说是一个本地事务,而对于集群中的DB2、DB3是一个远端事务;第二点当这个事务通过冲突检测(Certify)之后,DB1上发起的这个事务就会直接写入到了DB1节点上的binlog中了,而对于DB2、DB3在通过冲突检测之后,会先把事务的相关日志写入到relay log中,然后再把relay log中的日志应用到binlog,最终完成一个日志的回放,达到数据的同步。

MySQL MGR技术介绍与集群部署-浅时光博客

3、MGR单/多主模式

注意:在一个集群内是不允许单主和多主同时存在的

3.1:单主模式

3.1.1:指定单主
  • 单主模式顾名思义就是集群中只有一个主,可以通过以下参数来进行指定:
group_replication_single_primary_mode=on	#on为单主
3.1.2:单主特点
  • 自动探测准备状态
  • 自动切换:如果旧主挂了,会自动触发选主,然后选出新主
  • 数据一致性高,三个节点中down掉任何一个节点数据都是一致的
3.1.3:查看信息
  • 可以通过以下SQL语句查看到当前集群的一个组员信息
 SELECT MEMBER_HOST,MEMBER_ROLE FROM performance_schema.replication_group_members;

3.2:多主模式

3.2.1:开启多主
group_replication_single_primary_mode=off       #off为多主
3.2.2:多主特点
  • 所有节点都是主节点,且都可以读写;但是在写入负载很重的时候,会由于多个节点的数据写入冲突导致的大量事务回滚而产生比较大的TPS和延时的抖动,所以只适合写入非常少,主要是读负载的场景

4、MGR技术特性

4.1:分布式集群

  1. 大多数节点(paxos)
  2. 准数据同步,一致性
  3. share nothing模式

4.2:高可用

  1. 故障检测
  2. 自动切换,防止脑裂
  3. 数据保障,不会丢失数据

4.3:弹性扩展

  1. 增删节点
  2. 最多支持9个节点

4.4:多节点写入

  1. 冲突检测认证
  2. 单/多主模式

二、通过手动配置创建MGR集群


  • 集群节点数最好为奇数台,如3、5、7、9
  • 这里我将会部署一个3节点的MGR集群

1、集群环境准备

1.1、配置主机名

hostnamectl set-hostname mgr01
hostnamectl set-hostname mgr02
hostnamectl set-hostname mgr03

1.2、配置免密登入

  • 先配置主机名称解析
[root@mgr01 ~]# vi /etc/hosts
192.168.66.151 mgr01
192.168.66.152 mgr02
192.168.66.153 mgr03
  • mgr01实现ssh免密登入其他节点
[root@mgr01 ~]# ssh-keygen -t rsa
[root@mgr01 ~]# ssh-copy-id root@192.168.66.151
[root@mgr01 ~]# ssh-copy-id root@192.168.66.152
[root@mgr01 ~]# ssh-copy-id root@192.168.66.153
  • 传给各节点,实现通过主机名解析
[root@mgr01 ~]# for i in 192.168.66.{152,153}; do echo ">>> $i";scp /etc/hosts root@$i:/etc/; done
  • 配置mgr01节点通过主机名实现免密登入认证
[root@mgr01 ~]# ssh-copy-id root@mgr01
[root@mgr01 ~]# ssh-copy-id root@mgr02
[root@mgr01 ~]# ssh-copy-id root@mgr03
  • 所有节点关闭DNS反向查询,加快SSH连接速度
[root@mgr01 ~]# for i in 192.168.66.{151..153}; do echo ">>> $i";ssh root@$i "sed -ri 's/#UseDNS yes/UseDNS no/g' /etc/ssh/sshd_config && systemctl restart sshd"; done

1.3、关闭防护墙

  • 所有节点执行
[root@mgr01 ~]# for i in 192.168.66.{151..153}; do echo ">>> $i";ssh root@$i "systemctl stop firewalld && systemctl disable firewalld && systemctl status firewalld"; done

1.4、关闭SELinux

  • 所有节点执行
[root@mgr01 ~]# for i in 192.168.66.{151..153}; do echo ">>> $i";ssh root@$i "sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"; done
[root@mgr01 ~]# for i in 192.168.66.{151..153}; do echo ">>> $i";ssh root@$i "setenforce 0 && getenforce"; done

1.5、安装依赖包

  • 所有节点执行
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo ">>> $i";ssh root@$i "yum -y install gcc gcc-c++ libaio make cmake zlib-devel openssl-devel pcre pcre-devel wget git curl lynx lftp mailx mutt rsync ntp net-tools vim lrzsz screen sysstat yum-plugin-security yum-utils createrepo bash-completion zip unzip bzip2 tree tmpwatch pinfo man-pages lshw pciutils gdisk system-storage-manager git chrony gdbm-devel sqlite-devel bind-utils";done

1.6、配置时间同步

  • mgr01节点去同步互联网时间,其他节点与mgr01节点进行时间同步
[root@mgr01 ~]# systemctl start ntpd
[root@mgr01 ~]# vim /etc/chrony.conf
allow 192.168.66.0/24
MySQL MGR技术介绍与集群部署-浅时光博客
#启动服务
[root@mgr01 ~]# systemctl start chronyd.service 
[root@mgr01 ~]# systemctl enable chronyd.service
[root@mgr01 ~]# systemctl status chronyd.service

#确定时间同步正常
[root@mgr01 ~]# timedatectl
MySQL MGR技术介绍与集群部署-浅时光博客
  • 注意:NTP synchronized的值为yes时,其他节点才能同步时间
  • 其他节点同样关闭ntpd服务,我们这里使用chronyd服务
[root@mgr01 ~]# for i in 192.168.66.{152,153};do echo ">>> $i";ssh root@$i "systemctl stop ntpd && systemctl disable ntpd && systemctl status ntpd";done
  • 登入各个节点服务器进行手动修改
~]# vim /etc/chrony.conf
server 192.168.66.151 iburst
MySQL MGR技术介绍与集群部署-浅时光博客
  • 各节点启动服务
[root@mgr01 ~]# for i in 192.168.66.{152,153};do echo ">>> $i";ssh root@$i "systemctl restart chronyd.service && systemctl enable chronyd.service && systemctl status chronyd.service";done
  • 检查时间同步状态(^*表示已经同步) ,在mgr01节点操作
[root@mgr01 ~]# for i in 192.168.66.{152,153};do echo ">>> $i";ssh root@$i "chronyc sources";done

1.7、关闭交换分区

[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo ">>> $i";ssh root@$i "swapoff -a && free -h|grep Swap";done
MySQL MGR技术介绍与集群部署-浅时光博客
  • 永久关闭
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo ">>> $i";ssh root@$i "sed -ri 's@/dev/mapper/centos-swap@#/dev/mapper/centos-swap@g' /etc/fstab && grep /dev/mapper/centos-swap /etc/fstab";done
MySQL MGR技术介绍与集群部署-浅时光博客

1.8、重启服务器

[root@mgr01 ~]# for i in 192.168.66.{152,153};do echo $i;ssh root@$i "sync && reboot";done
  • 最后重启mgr01节点
[root@mgr01 ~]# sync && reboot

2、安装MySQL

2.1:下载软件包

2.2:安装MySQL

  • 卸载掉系统默认的mariadb
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i " rpm -qa|grep mariadb|xargs rpm -e --nodeps";done
  • 将下载好的rpm包文件上传至服务器的/opt/soft目录下,然后进行安装
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "mkdir -p /opt/soft && cd /opt/soft";done
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "rpm -ivh /opt/soft/mysql-community-*";done

2.3:启动mysql

[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "systemctl start mysqld.service && systemctl enable mysqld.service";done
  • 检查各节点MySQL启动状态
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "systemctl status mysqld.service|grep Active:";done
  • 查看各个节点root默认初始密码
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "cat /var/log/mysqld.log|grep 'A temporary password'";done

2.4:修改root密码

  • 通过上面查看到的密码登入各个节点MySQL,然后修改root密码为dqz123456
  • 修改密码策略
mysql> set global validate_password.policy=0;
mysql> set global validate_password.length=1;
  • 修改root密码
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'dqz123456';

3、MGR单主模式

3.1:备份所有节点配置文件

[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "cp /etc/my.cnf /etc/my.cnf_bak";done

3.2:修改MGR01节点配置

[root@mgr01 ~]# vim /etc/my.cnf 
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#解决低版本的客户端连接8版本连接不上问题,更改默认认证插件
default_authentication_plugin=mysql_native_password

#复制框架
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
 
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
  
#组复制设置
#server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
transaction_write_set_extraction=XXHASH64
#告知插件加入或创建组命名,UUID
loose-group_replication_group_name="76f7e607-2448-49a9-af60-b3caec8b1f60"
#server启动时不自启组复制,为了避免每次启动自动引导具有相同名称的第二个组,所以设置为OFF。
loose-group_replication_start_on_boot=off
#告诉插件使用IP地址,端口33061用于接收组中其他成员转入连接
loose-group_replication_local_address="192.168.66.151:33061"
#启动组server,种子server,加入组应该连接这些的ip和端口;其他server要加入组得由组成员同意
loose-group_replication_group_seeds="192.168.66.151:33061,192.168.66.152:33061,192.168.66.153:33061"
loose-group_replication_bootstrap_group=off
report_host=192.168.66.151
report_port=3306

3.3:集群其他节点修改配置

  • 将MGR01节点的配置文件拷贝至集群内的其他节点服务器下,注意要修改的参数如下:
    • server_id
    • loose-group_replication_local_address
    • report_host
[root@mgr01 ~]# for i in 192.168.66.{152,153};do echo $i;rsync -av /etc/my.cnf root@$i:/etc/my.cnf;done
  • 登入另外2个节点修改配置后重启数据库

3.4:重启集群各节点数据库

[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "systemctl restart mysqld";done

#检查集群各节点数据库启动状态
[root@mgr01 ~]# for i in 192.168.66.{151..153};do echo $i;ssh root@$i "systemctl status mysqld.service|grep Active:";done

3.5:集群各节点创建同步账号

原文链接:https://www.dqzboy.com
  • 三个节点都需要执行
~]# mysql -uroot -p
mysql> set global validate_password.policy=0;
mysql> set global validate_password.length=1;

#创建同步账号并授权
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'dqz123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

#指定恢复渠道channel
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='dqz123456' FOR CHANNEL 'group_replication_recovery';

3.6:集群各节点安装MGR插件

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';
  • 检查插件是否正确安装
mysql> show plugins;
MySQL MGR技术介绍与集群部署-浅时光博客

3.7:启动MGR单主模式

(1)启动MGR,在主库(192.168.66.151)节点上执行

[root@mgr01 ~]# mysql -uroot -p
  • 设置group_replication_bootstrap_groupON是为了标示以后加入集群的服务器以这台服务器为基准,之后加入的节点就不需要设置
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

(2)查看MGR组信息

mysql> SELECT * FROM performance_schema.replication_group_members;
MySQL MGR技术介绍与集群部署-浅时光博客

(3)集群内其他节点加入MGR集群,在从库(192.168.66.152、192.168.66.153)上执行

[root@mgr02 ~]# mysql -uroot -p
  • 这里不再需要开启group_replication_bootstrap_group,由于复制组已经被创建了,只需要将第二个节点添加进去即可
mysql> start group_replication;

(4)再次查看MGR组信息 (在三个MGR节点上都可以查看)

mysql> SELECT * FROM performance_schema.replication_group_members;
MySQL MGR技术介绍与集群部署-浅时光博客
  • 如果新加入的MGR节点状态为RECOVERING,则需要登入到对应主机机器查看MySQL日志,需要重新启动MGR
mysql> STOP GROUP_REPLICATION;
mysql> START GROUP_REPLICATION;

3.8:测试集群之间数据同步

  • 在主节点创建一个dqzboy的库,然后库里创建一张dqzboy的表,并插入几条数据,最后在节点2节点3的数据库中查看数据是否同步过去
[root@mgr01 ~]# mysql -uroot -p
Enter password: 

mysql> CREATE DATABASE dqzboy CHARACTER SET utf8 COLLATE utf8_general_ci;  
Query OK, 1 row affected, 2 warnings (0.33 sec)

mysql> use dqzboy;
Database changed

mysql> create table if not exists dqzboy (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> insert into dqzboy.dqzboy values(1,"ding"),(2,"zhang"),(3,"wang"),(4,"pei");
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from dqzboy.dqzboy;
+----+-------+
| id | name  |
+----+-------+
|  1 | ding  |
|  2 | zhang |
|  3 | wang  |
|  4 | pei   |
+----+-------+
4 rows in set (0.00 sec)


#登入其他节点数据库查看数据
[root@mgr02 ~]# mysql -uroot -p
Enter password:
mysql> select * from dqzboy.dqzboy;
+----+-------+
| id | name  |
+----+-------+
|  1 | ding  |
|  2 | zhang |
|  3 | wang  |
|  4 | pei   |
+----+-------+
4 rows in set (0.00 sec)

#上面可以看到节点2上已经同步到了主节点上的数据
  • 然后尝试在两个从库上更新数据, 发现更新失败! 因为这是MGR单主模式, 从库只能进行读操作, 不能进行写操作!
mysql> insert into dqzboy.dqzboy values(5,"beijing"),(6,"shanghai"),(7,"guangdong");

ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

4、MGR多主模式

  • 从上面的单主模式,切换到多主模式,切换之后需要重启MGR组复制,所有节点进行关闭组复制,然后修改单主模式为多主模式

4.1:关闭组复制

  • 以下操作所有节点都需要执行
mysql> stop group_replication;

#设置group_replication_single_primary_mode=OFF
mysql> set global group_replication_single_primary_mode=OFF;

mysql> set global group_replication_enforce_update_everywhere_checks=ON;

4.2:切换为多主

  • 以下操作在集群中任意节点执行,我这里在mgr01节点执行
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

4.3:节点启动MGR

  • 启动另外的两个节点mgr02和mgr03
mysql> START GROUP_REPLICATION;

4.4:查看MGR信息

  • 集群内任意节点执行即可
mysql> SELECT * FROM performance_schema.replication_group_members;
MySQL MGR技术介绍与集群部署-浅时光博客

4.5:多主写测试

  • 上面单主时,在mgr02无法执行的那条SQL,现在再次在mgr02数据库中执行,你会发现可以执行成功了,所以多主模式下,是全部节点都可以进行读写操作
mysql> insert into dqzboy.dqzboy values(5,"beijing"),(6,"shanghai"),(7,"guangdong");

Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

三、通过MySQL Shell去创建MGR

  • 此种方案我个人推荐,目前我们线上MGR集群也是通过MySQL Shell去创建的

1、修改配置

  • 按照上面的方式去部署MySQL,然后按照下面的方式去创建MGR集群
  • 注意:只需按照上面的方式去部署好MySQL,并将MySQL服务启动起来即可
  • 我们需要配置MySQL开启Binlog日志serverIDGtids,这样才可以使用mysql shell去创建MGR集群
[root@mgr01 ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#解决低版本的客户端连接8版本连接不上问题,更改默认认证插件
default_authentication_plugin=mysql_native_password
#复制框架 
server_id=1	#注意每台MySQL节点此ID必须保证不重复
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
 
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE

#将配置文件传给另外集群节点,然后登入节点服务器进行修改server_id
[root@mgr01 ~]# for i in 192.168.66.{152,153};do echo $i;rsync -av /etc/my.cnf root@$i:/etc/my.cnf;done

#修改好配置之后,重启所有节点MySQL实例
[root@mgr01 ~]# for i in ${MGR_CLUSTER_NAME[@]};do echo $i;ssh root@$i "systemctl restart mysqld.service";done

2、创建用户

  • 这里我们登入到数据库各节点去创建MGR集群复制所要用到的用户
mysql> create user 'mgradmin'@'%' identified by 'Dqz@admin123';
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `mgradmin`@`%` WITH GRANT OPTION;                                                                                                                    
mysql> GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `mgradmin`@`%` WITH GRANT OPTION ;

mysql> GRANT PROXY ON ''@'' TO `mgradmin`@`%`  WITH GRANT OPTION;

3、部署MGR

3.1:下载脚本

MySQL MGR技术介绍与集群部署-浅时光博客
MySQL MGR技术介绍与集群部署-浅时光博客

3.2:执行安装

  • 将下载的文件上传至服务器,并进行解压,然后运行进行安装MGR
  • 注意:MySQL-shell脚本需要在MGR三节点都需要安装,每个节点都需要创建MGR,然后最后通过主节点将另外的2个MGR节点加入到集群
rpm -ivh mysql-shell-8.0.21-1.el7.x86_64.rpm

#执行下面的命令确保mysqlsh命令可以正常使用
mysqlsh --version

3.3:创建MGR

[root@mgr01 ~]# mysqlsh
MySQL  JS > dba.checkInstanceConfiguration('mgradmin@192.168.66.151:3306')
Please provide the password for 'mgradmin@192.168.66.151:3306': 输入mgradmin用户密码
Save password for 'mgradmin@192.168.66.151:3306'? [Y]es/[N]o/Ne[v]er (default No): y
MySQL MGR技术介绍与集群部署-浅时光博客
  • 另外的2节点重复上面的操作创建MGR,在MGR01节点上执行即可;确保连接数据库的账号MGR01节点可以连接上去
[root@mgr01 ~]# mysqlsh
MySQL  JS > dba.checkInstanceConfiguration('mgradmin@192.168.66.152:3306')
Please provide the password for 'mgradmin@192.168.66.151:3306': 输入mgradmin用户密码
Save password for 'mgradmin@192.168.66.151:3306'? [Y]es/[N]o/Ne[v]er (default No): y

[root@mgr01 ~]# mysqlsh
MySQL  JS > dba.checkInstanceConfiguration('mgradmin@192.168.66.153:3306')
Please provide the password for 'mgradmin@192.168.66.151:3306': 输入mgradmin用户密码
Save password for 'mgradmin@192.168.66.151:3306'? [Y]es/[N]o/Ne[v]er (default No): y

3.4:检查配置

  • 执行下面的语句检查MGR配置,在MGR节点1执行即可
MySQL  JS > dba.configureInstance('mgradmin@192.168.66.151:3306')
MySQL  JS > dba.configureInstance('mgradmin@192.168.66.152:3306')
MySQL  JS > dba.configureInstance('mgradmin@192.168.66.153:3306')
MySQL MGR技术介绍与集群部署-浅时光博客

3.5:创建集群

  • 连接到主实例
MySQL  JS > \connect mgradmin@192.168.66.151:3306
Creating a session to 'mgradmin@192.168.66.151:3306'
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 27
Server version: 8.0.21 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
 MySQL  192.168.66.151:3306 ssl  JS >
  • 创建集群
MySQL  192.168.66.151:3306 ssl  JS > dba.createCluster('mgrCluster')
# 注:mgrCluster为定义的集群名称

MySQL  192.168.66.151:3306 ssl  JS > var cluster = dba.getCluster()
MySQL MGR技术介绍与集群部署-浅时光博客
  • 添加节点
MySQL  192.168.66.151:3306 ssl  JS > cluster.addInstance('mgradmin@192.168.66.152:3306')
Please select a recovery method [C]lone/[A]bort (default Abort): C

MySQL  192.168.66.151:3306 ssl  JS > cluster.addInstance('mgradmin@192.168.66.153:3306')
Please select a recovery method [C]lone/[A]bort (default Abort): C
MySQL MGR技术介绍与集群部署-浅时光博客
MySQL MGR技术介绍与集群部署-浅时光博客

3.6:检查集群

MySQL  192.168.66.151:3306 ssl  JS > cluster.status()
MySQL MGR技术介绍与集群部署-浅时光博客



本文作者:浅时光
原文链接:https://www.dqzboy.com/5098.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息

3 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. Ming中国2021-4-20 · 20:35

    主备角色切换怎么通知应用,应用是通过vip还是dns来访问DB的?

    • 浅时光
      浅时光上海2021-4-20 · 20:36

      前面加个中间件,mysqlrouter

  2. 流年天津2021-3-15 · 21:53

    大佬好强,文章写的很详细,受益匪浅

本站已稳定运行: | 耗时 0.569 秒 | 查询 40 次 | 内存 16.37 MB