前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MGR单主模式部署

MGR单主模式部署

原创
作者头像
lee_yanyi
修改2021-05-08 18:21:42
5510
修改2021-05-08 18:21:42
举报
文章被收录于专栏:lee_yanyi

一、服务器设置

1.1环境准备

1.1.1服务器规划:

IP

主机名

数据库版本信息

server-id

192.168.136.11

mgr_node1

MySQL-8.0.24

101

192.168.136.12

mgr_node2

MySQL-8.0.24

102

192.168.136.13

mgr_node3

MySQL-8.0.24

103

1.1.2关闭防火墙

代码语言:javascript
复制
# 关闭防火墙 
systemctl  stop firewalld 
# 临时关闭
selinux setenforce 0 

本次搭建涉及端口号:3306 、33061

1.1.3配置主机名,修改hosts文件

修改主机名

代码语言:javascript
复制
 hostnamectl  set-hostname mgr_node1  
 hostnamectl  set-hostname mgr_node2  
 hostnamectl  set-hostname mgr_node3 

修改hosts文件

代码语言:javascript
复制
cat >> /etc/hosts <<EOF 
192.168.136.11 mgr_node1 
192.168.136.12 mgr_node2 
192.168.136.13 mgr_node3 
EOF 

时间同步

代码语言:javascript
复制
# 时间同步 
yum install ntpdate -y 
ntpdate time.windows.com 

1.2安装mysql

1.2.1下载

官网地址:https://dev.mysql.com/downloads/mysql/

代码语言:javascript
复制
链接:https://pan.baidu.com/s/10ctZd1sZurlmi6yhE0TX_Q  提取码:m9e7  
链接:https://pan.baidu.com/s/15xVbZ5tLXyf87s4AMCH4eA  提取码:vn8f  

1.2.2上传

解压安装

代码语言:javascript
复制
#解压 
tar -xvf mysql-8.0.24-1.el7.x86_64.rpm-bundle.tar 
#yum包安装 
rpm -ivh mysql-community-* --nodeps --force 
---------------------------------------------------- 
#二进制安装 (本文采用)
scp mysql-8.0.24-el7-x86_64.tar.gz 192.168.136.12:~ 
groupadd mysql 
useradd -r -g mysql mysql 
mkdir -pv  /data/{data,log,temp} 
chown -R mysql:mysql /data 
mkdir /usr/local/mysql 
tar -zxvf mysql-8.0.24-el7-x86_64.tar.gz  
mv mysql-8.0.24-el7-x86_64/* /usr/local/mysql/ 
cd /usr/local/mysql/bin 
ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql 
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql  

1.2.3创建mysql初始化目录

代码语言:javascript
复制
# 创建存放数据库初始化信息的目录 
mkdir -pv  /data/{data,log,temp} 
# 修改数据目录属主属组 
chown -R mysql:mysql /data 
# 初始化数据库,设置默认密码为空 
./mysqld --initialize-insecure --datadir=/data/data --user=mysql 
# 修改数据目录属主属组 
chown -R mysql:mysql /data 

查看目录

代码语言:javascript
复制
tree /data/ -L 1 
[root@mgr_node1 ~]# tree /data/ -L 1 
/data/ 
├── data    # 存放MySQL数据信息 
├── log     # 存放MySQL产生的错误日志,二进制日志信息 
└── temp    # 存放MySQL的一些临时文件,比如pid,sock文件

1.3生成MGR组名node1上执行

1.3.1修改node1上的my.cnf配置文件

代码语言:javascript
复制
vim /etc/my.cnf 

内容如下:

代码语言:javascript
复制
[mysqld]
user=mysql
port=3306
datadir=/data/data
log-error=/data/log/err.log
pid-file=/data/temp/mysqld.pid
socket=/data/temp/mysql.sock
symbolic-links=0
#忘记密码时使用
#skip-grant-tables
#设置协议认证方式(重点啊)
default_authentication_plugin=mysql_native_password
​
[client]
socket=/data/temp/mysql.sock

1.3.2启动数据库

代码语言:javascript
复制
cd /usr/local/mysql/bin/  
./mysqld --initialize-insecure --datadir=/data/data --user=mysql  
./mysqld  --defaults-file=/etc/my.cnf --daemonize  
#修改root密码,执行命令之后输入您要设置的root密码 
mysql -u root -p 
mysql>set password for root@localhost ='tj123456'; 
#开放远程连接 
mysql>use mysql; 
mysql>update user set user.Host='%' where user.User='root'; 
mysql> flush privileges; 
#确保navicat可以连接 
mysql>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'tj123456'; 
mysql> flush privileges;   

1.3.3生成UUID,作为MGR组名

代码语言:javascript
复制
# 执行后输入密码(cnemc.cn)tj123456
[root@localhost repo.mysql.com]# mysql -uroot -p -e "SELECT UUID()" 
Enter password: 
+--------------------------------------+ 
| UUID()                               | 
+--------------------------------------+ 
| 7fdbce46-aa47-11eb-9363-0050568f03a0 |
+--------------------------------------+  

组名为:7fdbce46-aa47-11eb-9363-0050568f03a0

d6dc0864-ae46-11eb-ab0e-0050568f03a0

1.3.4修改my.cnf配置文件

代码语言:javascript
复制
vim /etc/my.cnf 

修改内容如下:

代码语言:javascript
复制
[mysqld]
user=mysql
port=3306
datadir=/data/data
log-error=/data/log/err.log
pid-file=/data/temp/mysqld.pid
socket=/data/temp/mysql.sock
symbolic-links=0
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
​
server_id=101
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=/data/log/binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
​
#忘记密码时使用
#skip-grant-tables
#设置协议认证方式(重点啊)
default_authentication_plugin=mysql_native_password
​
plugin_load_add='group_replication.so'
​
loose-group_replication_group_name="d6dc0864-ae46-11eb-ab0e-0050568f03a0"
#配置 group_replication_start_on_boot 变量以off,指示插件在服务器启动时不自动启动操作。这在设置组复制时非常重要,因为它可以确保您可以在手动启动插件之前配置服务器。一旦配置了成员,就可以设置on以便在服务器启动时自动启动组复制
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "mgr_node1:33061"
loose-group_replication_group_seeds= "mgr_node1:33061,mgr_node2:33061,mgr_node3:33061"
loose-group_replication_bootstrap_group=off
​
[client]
socket=/data/temp/mysql.sock

注:

server_id:不能与其他MySQL实例重复

loose-group_replication_group_name:通过SELECT UUID()生成一个UUID作为组名

loose-group_replication_local_address:当前节点用于内部通讯的ip:port

loose-group_replication_group_seeds:组内成员通讯的ip:port

基本参数

描述

user

启动进程的user

port

数据库使用的端口

datadir

数据库的数据目录位置

log-error

数据库的错误日志位置

pid-file

数据库的pid文件位置

socket

数据库的sock文件位置

symbolic-links

禁用符号链接以防止出现各种安全风险

MGR要求的相关参数

描述

server_id

不同实例必须保证此server_id不同,如果启用了二进制日志记录,则必须指定该选项,否则不允许服务器启动

gtid_mode

使用全局事务标识符(GTID)来标识事务。将此选项设置为–gtid-mode=ON 要求 enforce-gtid-consistency设置为ON

enforce_gtid_consistency

ON:不允许任何事务违反GTID一致性 OFF:允许事务违反GTID一致性。WARN:允许所有事务违反GTID一致性,但在这种情况下会生成警告

master_info_repository

设置从站将主状态和连接信息记录到 FILE(master.info)还是TABLE (mysql.slave_master_info)中

relay_log_info_repository

设置从站在中继日志中的位置是写入FILE (relay-log.info)还是 写入TABLE (mysql.slave_relay_log_info)中

binlog_checksum

启用后,此变量会使主服务器为二进制日志中的每个事件写入校验和,当binlog_checksum禁用(值 NONE)时,服务器通过编写和检查每个事件的事件长度(而不是校验和)来验证它是否只将完整事件写入二进制日志

log_slave_updates

设置从主服务器接受的更新是否写入二进制日志中

log_bin

设置二进制日志的位置

binlog_format

二进制日志格式,有行模式,语句模式,混合模式,使用MGR必须使用行模式

组复制相关参数

描述

transaction_write_set_extraction

定义用于生成标识与事务关联的写入的哈希的算法,哈希值将用于分布式冲突检测和处理

loose-group_replication_group_name

通知插件它正在加入或创建的组,需要使用SELECT UUID()生成一个UUID

loose-group_replication_start_on_boot

指示插件在服务器启动时不自动引导组操作

loose-group_replication_local_address

诉插件使用哪个ip:port与组中的其他成员进行内部通信。这里的ip与端口不能与MySQL提供的ip:port 相同,如果使用相同ip则port必须不相同

loose-group_replication_group_seeds

设置组成员的主机名和端口

loose-group_replication_bootstrap_group

插件是否引导组,此选项只能在任何时候在一个服务器实例上使用,通常是第一次引导组时(或者在整个组关闭并重新备份的情况下)。如果多次引导组,例如当多个服务器实例设置了此选项时,则可以创建一个人工分裂脑情景,其中存在两个具有相同名称的不同组。

loose-group_replication_single_primary_mode

单主模式设置为ON,多主模式设置为OFF

loose-group_replication_enforce_update_everywhere_checks

在所有节点启用多主数据更新的严格一致性检查

1.3.5重启node1数据库

代码语言:javascript
复制
# 关闭数据库,执行后输入root密码 
./mysqladmin  -uroot -p shutdown 
# 启动数据库 
./mysqld  --defaults-file=/etc/my.cnf --daemonize 

1.4启动MGR节点

1.4.1登陆数据库

代码语言:javascript
复制
# 登陆数据库 
mysql -uroot -ptj123456 

1.4.2创建用户

代码语言:javascript
复制
# 创建MGR内部消息互通的用户
SET SQL_LOG_BIN=0; 
CREATE USER mgr_user@'%' IDENTIFIED WITH mysql_native_password BY 'mgr@123'; 
GRANT BACKUP_ADMIN ON *.* TO mgr_user@'%'; GRANT REPLICATION SLAVE ON *.* TO mgr_user@'%'; 
FLUSH PRIVILEGES; 
SET SQL_LOG_BIN=1; 

1.4.3安装插件

代码语言:javascript
复制
# 安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 
# 检查是否成功安装 
SHOW PLUGINS ; 

1.4.4配置组

代码语言:javascript
复制
#构建 group replication 集群
CHANGE REPLICATION SOURCE TO SOURCE_USER='mgr_user', SOURCE_PASSWORD='mgr@123' FOR CHANNEL 'group_replication_recovery'; 
# 使用当前数据库节点引导组,一个组内只有一个节点能引导 
# 不允许组内多次引导,这将导致产生两个相同名称的不同组 
SET GLOBAL group_replication_bootstrap_group=ON; 
START GROUP_REPLICATION USER='mgr_user', PASSWORD='mgr@123'; 
SET GLOBAL group_replication_bootstrap_group=OFF; 

1.4.5检查是否成功

代码语言:javascript
复制
SELECT * FROM performance_schema.replication_group_members\G 
​
SELECT * FROM performance_schema.replication_group_members; 

1.4.6添加测试数据

代码语言:javascript
复制
CREATE DATABASE test; 
USE test; 
CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL); 
INSERT INTO t1 VALUES (1, 'Luis'); 

检查表t1和二进制日志的内容

代码语言:javascript
复制
SELECT * FROM t1; 
+----+------+ | c1 | c2   | +----+------+ |  1 | Luis | +----+------+  SHOW BINLOG EVENTS; +---------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------+ | Log_name      | Pos  | Event_type     | Server_id | End_log_pos | Info                                                                             | +---------------+------+----------------+-----------+-------------+----------------------------------------------------------------------------------+ | binlog.000001 |    4 | Format_desc    |       101 |         125 | Server ver: 8.0.24, Binlog ver: 4                                                | | binlog.000001 |  125 | Previous_gtids |       101 |         152 |  

1.5让其余节点加入组

1.5.1复制node1 的my.cnf文件

代码语言:javascript
复制
scp /etc/my.cnf 192.168.136.12:/etc/my.cnf 
scp /etc/my.cnf 192.168.136.13:/etc/my.cnf 

1.5.2修改配置文件

server_id修改为前期部署规划的值

loose-group_replication_local_address修改为该节点用于内部通讯的ip地址

1.5.3启动数据库

代码语言:javascript
复制
# 初始化数据库,设置默认密码为空 
cd /usr/local/mysql/bin/ 
./mysqld --initialize-insecure --datadir=/data/data --user=mysql 
./mysqld  --defaults-file=/etc/my.cnf --daemonize 
#设置密码 
mysql -u root -p 
mysql>set password for root@localhost ='tj123456'; 
#开放远程连接 
mysql>use mysql; 
mysql>update user set user.Host='%' where user.User='root'; 
mysql> flush privileges; 
#确保navicat可以连接 
mysql>ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'tj123456'; 
mysql>flush privileges; 

1.5.4创建用户

代码语言:javascript
复制
#创建MGR内部消息互通的用户
mgr_user SET SQL_LOG_BIN=0; 
CREATE USER mgr_user@'%' IDENTIFIED WITH mysql_native_password BY 'mgr@123'; 
GRANT REPLICATION SLAVE ON *.* TO mgr_user@'%'; 
GRANT BACKUP_ADMIN ON *.* TO mgr_user@'%'; 
FLUSH PRIVILEGES; 
SET SQL_LOG_BIN=1; 

1.5.5安装插件加入组

代码语言:javascript
复制
# 安装MGR插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so'; 
# 加入组复制 
reset master; 
CHANGE REPLICATION SOURCE TO SOURCE_USER='mgr_user', SOURCE_PASSWORD='mgr@123' FOR CHANNEL 'group_replication_recovery'; 
START GROUP_REPLICATION USER='mgr_user', PASSWORD='mgr@123'; 

1.5.6检查是否成功

代码语言:javascript
复制
SELECT * FROM performance_schema.replication_group_members; 

一旦node2为 ONLINE,则它开始处理与该组的交易。验证node2是否确实已与服务器node1同步,如下所示。

代码语言:javascript
复制
mysql> SHOW DATABASES LIKE 'test'; 
+-----------------+ | Database (test) | +-----------------+ | test            | +-----------------+  
mysql> SELECT * FROM test.t1; 
+----+------+ | c1 | c2   | +----+------+ |  1 | Luis | +----+------+  
mysql> SHOW BINLOG EVENTS; 

1.5.7配置重启后自动加入组

一旦配置了成员,就可以设置on以便在服务器启动时自动启动组复制

修改/etc/my.cnf

原:loose-group_replication_start_on_boot=off

改:loose-group_replication_start_on_boot=on

重启数据库

1.6参考文档

https://dev.mysql.com/doc/refman/8.0/en/group-replication.html

https://cloud.tencent.com/developer/article/1684118

1.7配置systemctl管理

#现将原来模式启动的mysql关闭,然后再用systemd管理

代码语言:javascript
复制
pkill mysql 

编写mysql服务

代码语言:javascript
复制
vim /etc/systemd/system/mysqld.service 

内容如下

代码语言:javascript
复制
[Unit] 
Description=MySQL Server 
Documentation=man:mysqld(8) 
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html 
After=network.target 
After=syslog.target 
[Install] 
WantedBy=multi-user.target 
[Service] 
User=mysql 
Group=mysql 
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf 
LimitNOFILE = 5000 
systemctl  start mysqld 

添加环境变量

代码语言:javascript
复制
echo 'export PATH=/usr/local/mysql/bin:$PATH' >> /etc/profile 
​
source /etc/profile 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档