MGR安装
二、环境准备
主机名 IP地址 角色
node2.com 192.168.174.10 primary
node3.com 192.168.174.10 seconde
node3.com 192.168.174.10 seconde
操作系统:CentOS7
MySQL版本:mysql-5.7.33-linux-glibc2.12-x86_64
1、准备安装包
自从从MySQL官网下载。
下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads
2、解压安装包
tar -xvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
再移动并重命名。
mv mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz /usr/local/mysql
3、创建MySQL用户组合用户并修改权限
groupadd mysql
useradd -r -g mysql mysql
创建数据目录并赋予权限。
mkdir -p /data/mysql #创建目录
chown mysql:mysql -R /data/mysql #赋予权限
配置my.cnf
vi /etc/my.cnf
node2的配置文件内容如下
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
#服务器编号,Master=1
server_id=1
#开启binlog的GTID模式
gtid_mode=ON
#开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
#关闭binlog校验
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
#定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为 XXHASH64。
transaction_write_set_extraction=XXHASH64
#确定组复制恢复时是否应该应用 SSL,通常设置为“开”,但默认设置为“关”。
#loose‐group_replication_recovery_use_ssl=ON
#该服务器的实例所在复制组的名称,必须是有效的 UUID,所有节点必须相同。
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#确定服务器是否应该在服务器启动期间启动组复制。
loose-group_replication_start_on_boot=off
#大坑2:
#为复制组中其他的成员提供的网络地址,指定为“主机:端口”的格式化字符串。
#很多人想当然认为端口应该是3306,起始不然,MGR需要开启新端口24901同步交换
#所以这里不要写错,同时,前面我们配置了hosts文件做了主机名与IP的映射,这里直接写主机名即可
loose-group_replication_local_address= "192.168.174.10:24901"
#用于建立新成员到组的连接组成员列表。
#这个列表指定为由分隔号间隔的组成员网络地址列表,类似 host1:port1、host2:port2 的格式。
#同样采用n0~n2的主机名替代
loose-group_replication_group_seeds= "192.168.174.10:24901,192.168.174.11:24902,192.168.174.12:24903"
#配置此服务器为引导组,这个选项必须仅在一台服务器上设置,
#并且仅当第一次启动组或者重新启动整个组时。成功引导组启动后,将此选项设置为关闭。
loose-group_replication_bootstrap_group=off
4.2 node3的配置文件内容如下
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
#loose‐group_replication_recovery_use_ssl=ON
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "192.168.174.11:24902"
loose-group_replication_group_seeds= "192.168.174.10:24901,192.168.174.11:24902,192.168.174.12:24903"
loose-group_replication_bootstrap_group=off
4.3 node4的配置文件内容如下
[mysqld]
bind-address=0.0.0.0
port=3306
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
#character config
character_set_server=utf8mb4
symbolic-links=0
explicit_defaults_for_timestamp=true
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
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_recovery_use_ssl=ON
loose-group_replication_local_address= "192.168.174.12:24903"
loose-group_replication_group_seeds= "192.168.174.10:24901,192.168.174.11:24902,192.168.174.12:24903"
loose-group_replication_bootstrap_group=off
编辑好后,保存退出。
4、初始化数据库
进入MySQL的bin目录。
cd /usr/local/mysql/bin/
初始化。
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize-insecure
–initialize-insecure:无密码初始化MySQL
1111
5、启动MySQL服务
先将mysql.server放置到/etc/init.d/mysql中。
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
启动。
service mysql start
ps -ef|grep mysql
到这里说明MySQL已经安装成功了。
添加三台机器的DNS解析
# echo "192.168.174.10 node2.com" >> /etc/hosts
# echo "192.168.174.11 node3.com" >> /etc/hosts
# echo "192.168.174.12 node4.com" >> /etc/hosts
5、MGR配置
./mysql -u root -p #bin目录下
5.1配置mgr的第一个节点:
mgr中所有的结点都属于一个逻辑上的组、这个组就像是QQ群一样,是由群主建起来的,有了这个上组之后,其它的结点就可以加入到这个组中来了。onode2.com来建群,以下步骤在node2.com主机上的mysql中执行
5.1.1 创建用于复制的用户
mysql> set sql_log_bin=0;
mysql> create user mgruser@'%' identified by '123456';
mysql> grant replication slave,replication client on *.* to mgruser@'%';
mysql> create user mgruser@'127.0.0.1' identified by '123456';
mysql> grant replication slave,replication client on *.* to mgruser@'127.0.0.1';
mysql> create user mgruser@'localhost' identified by '123456';
mysql> grant replication slave,replication client on *.* to mgruser@'localhost';
mysql> set sql_log_bin=1;
5.1.2 配置复制所使用的用户
change master to master_user='mgruser', master_password='123456' for channel 'group_replication_recovery';
5.1.3 安装mysql group replication插件
mysql> install plugin group_replication soname 'group_replication.so';
5.1.4 建个群(官方点的说法就是初始化一个复制组)
mysql> set global group_replication_bootstrap_group=on;
mysql> start group_replication;
mysql> set global group_replication_bootstrap_group=off;
说明:
global group_replication_bootstrap_group=on:代表这个节点是主节点
5.2配置mgr的第二个节点:
第二个结点和第一个结点唯一的不同在于它不在要自己去建一个群了,它只要加入第一个结点建的群就可以了,以下步骤在node3.com主机上的mysql中执行
5.2.1 创建用于复制的用户
mysql> set sql_log_bin=0;
mysql> create user mgruser@'%' identified by '123456';
mysql> grant replication slave,replication client on *.* to mgruser@'%';
mysql> create user mgruser@'127.0.0.1' identified by '123456';
mysql> grant replication slave,replication client on *.* to mgruser@'127.0.0.1';
mysql> create user mgruser@'localhost' identified by '123456';
mysql> grant replication slave,replication client on *.* to mgruser@'localhost';
mysql> set sql_log_bin=1;
5.2.2 配置复制所要的用户
change master to master_user='mgruser', master_password='123456' for channel 'group_replication_recovery';
5.2.3 安装组复制插件
mysql> install plugin group_replication soname ‘group_replication.so’;
5.2.4 加入前面创建好的复制组
mysql> start group_replication;
5.3配置mgr的其它结点:
逻辑上第二个结点与第三、第四、第五…等等结点有着一样的逻辑角色,就也是说它们都不是群主,所以它们的配置方式和第二个结点是一样的,所以不在详细列举每一步的配置
搭建成功之后检查组成员
SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| group_replication_applier | 63eccc94-b98d-11ec-8fa8-000c29b0e8ef | 192.168.174.10 | 3306 | ONLINE |
| group_replication_applier | dad90b31-b98d-11ec-8cb1-000c29a0f241 | 192.168.174.11 | 3306 | ONLINE |
| group_replication_applier | efdf3ea4-ba0f-11ec-b35d-000c29c9683e | 192.168.174.12 | 3306 | ONLINE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
GRANT ALL ON *.* TO 'mgruser'@'%';
FLUSH PRIVILEGES; //刷新权限
6、修改密码(没有密码可以略过)
首先登陆MySQL,前面的那个是随机生成的。
./mysql -u root -p #bin目录下
在执行下面三步操作,然后重新登陆。
SET PASSWORD = PASSWORD('123456');
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
FLUSH PRIVILEGES;
7、远程连接(可以先略过)
这个时候如果使用远程连接,你会发现无法连接。
这里主要执行下面三个命令(先登陆数据库)。
use mysql #访问mysql库
update user set host = '%' where user = 'root'; #使root能再任何host访问
FLUSH PRIVILEGES; #刷新
mysql主从复制–重置操作reset master, reset slave
reset master
在master上执行
mysql > RESET MASTER
作用包括:
删除binlog索引文件中列出的所有binlog文件
清空binlog索引文件
创建一个新的binlog文件
清空系统变量gtid_purged和gtid_executed
在MySQL 5.7.5 及后续版本中, RESET MASTER还会会清空 mysql.gtid_executed 数据表。
reset slave
在slave上执行
mysql > RESET SLAVE
1
作用包括:
清除slave 复制时的master binlog的位置
清空master info, relay log info
删除所有的relay log文件,并创建一个新的relay log文件。
重置复制延迟(CHANGE MASTER TO 的 MASTER_DELAY参数指定的)为0。
另外,
RESET SLAVE 不会改变gtid_executed or gtid_purged.
RESET SLAVE 不会改变复制连接使用的参数,例如master host, master port, master user, or master password
如果要重置这些连接参数,需要使用命令
mysql > RESET SLAVE ALL
1
重置操作之后,就需要使用 CHANGE MASTER TO 重新指定复制连接参数。
mysql中MGR单主多主模式切换的示例分析
这篇文章将为大家详细讲解有关mysql中MGR单主多主模式切换的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
主库执行
CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci;
use test;
create table if not exists h2 (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
insert into test.h2 values(1,“wang”),(2,“guo”),(3,“yang”),(4,“he”);
select * from test.h2;
从库测试
delete from test.h2 where id>3;
ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement
1、单主切换到多主模式
1.1、停止组复制(在所有MGR节点上执行):
stop group_replication;
set global group_replication_single_primary_mode=OFF;
set global group_replication_enforce_update_everywhere_checks=ON;
1.2、随便某个mgr节点执行:10
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
1.3、然后在其它mgr节点执行:11 12
START GROUP_REPLICATION;
1.4、查看mgr组信息(任意MGR节点查看)
SELECT * FROM performance_schema.replication_group_members;
可以看到所有MGR节点状态都是online,角色都是PRIMARY,MGR多主模式搭建成功。
验证下MGR多主模式的节点数据同步:
在node2.com节点更新数据:
在node3.com节点更新数据
在node4.com节点更新数据
MGR多主模式下, 所有节点都可以进行读写操作.
2、切回单主模式
2.1、停止组复制(在所有MGR节点上执行):
stop group_replication;
set global group_replication_enforce_update_everywhere_checks=OFF;
set global group_replication_single_primary_mode=ON;
2.2、选择一个节点作为主节点,在主节点上执行(10):
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
2.3、在剩余节点,也就是从库节点上执行(11 12):
START GROUP_REPLICATION;
2.4、查看MGR组信息(任意MGR节点上都可查看):
SELECT * FROM performance_schema.replication_group_members;
切回单主模式,主具有读写权限,另外两个从节点只读不可写.
知识点扩充
MySQL Group Replication(MGR)是MySQL官方在5.7.17版本引进的一个数据库高可用与高扩展的解决方案,以插件形式提供,实现了分布式下数据的最终一致性,总结MGR特点如下:
高一致性:基于分布式paxos协议实现组复制,保证数据一致性;
高容错性:自动检测机制,只要不是大多数节点都宕机就可以继续工作,内置防脑裂保护机制;
高扩展性:节点的增加与移除会自动更新组成员信息,新节点加入后,自动从其他节点同步增量数据,直到与其他节点数据一致;
高灵活性:提供单主模式和多主模式,单主模式在主库宕机后能够自动选主,所有写入都在主节点进行,多主模式支持多节点写入。