MGR是MySQL服务器端的插件,允许我们创建弹性的、可扩展的、可容错的复制拓扑结构。
1.环境准备
搭建服务由4台服务器组成,服务器配置如下表所示:
系统通信框架如下图所示:
其中绿色表示读操作流量,红色表示写操作流量,棕色表示MGR间通信流量。
2.服务部署架构
集群服务使用的是MGR、Xinetd和HAProxy。MGR由三个节点的MySQL服务器组成,构成一主两从的复制组;三台服务器都配置读写探测守护进程,由Xinetd来实现,用于探测该节点的读写特性;而MGR服务端代理及读写流量的分离由HaProxy来实现。
MGR服务的部署说明如下表所示:
Xinetd服务的部署说明如下表所示:
HAProxy服务部署在一台服务器中,主要是作为MGR集群服务的代理。部署说明如下表所示:
架构图可参考通信架构图。
3.服务搭建过程
整个服务的搭建分为三个过程:
(1)搭建MGR集群服务
(2)部署xinetd服务
(3)部署HAProxy服务
3.1.搭建MGR集群
分为以下8个步骤。
第一步:下载mysql 5.7.26版本的安装包,并解压到/usr/local/mysql目录下。把/usr/local/mysql/bin附加到环境变量PATH中。
第二步:为每个节点添加如下配置文件
[mysqld]
port=33060
basedir=/usr/local/mysql
datadir=/appdata/data/mysql
socket=/usr/local/mysql/mysql.sock
pid_file=/usr/local/mysql/
log-error=//usr/local/mysql/logs/mysql-error.log
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
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name=“通过uuidgen命令生成”
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address=“10.10.10.101:33066”
loose-group_replication_group_seeds=“10.10.10.101:33066,10.10.10.102:33066, 10.10.10.103:33066”
loose-group_replication_bootstrap_group=OFF
loose-group_replication_ip_whitelist=“10.10.10.101,10.10.10.102,10.10.10.103”
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=2M
innodb_log_file_size=50M
innodb_buffer_pool_size=1024M
innodb_thread_concurrency=4
max_connections=1000
back_log=200
wait_timeout=60
interactive_timeout=7200
skip_name_resolve=ON
其中,loose-group_replication_group_name需要设置生成的UUID,可通过“uuidgen -r”命令来生成,server_id、loose-group_replication_local_address这两个参数需要根据服务器信息来设置,不同的节点此两个参数的配置值不同。
第三步:新增用户mysql,并更改应用目录的属主,执行如下命令。
useradd -m mysqluser;
chown -R mysqluser.mysqluser /usr/local/mysql /appdata/data/mysql;
第四步:分别初始化数据库,执行如下命令。
mysqld - -initialize - -user=mysqluser;
初始化过程结束后会生成root密码并输出,输出日志例如“[Note] A temporary password is generated for root@localhost: {临时密码}”,之后可以通过临时密码登录数据库。
第五步:分别启动数据库,并对数据库进行初始化。执行如下命令。
su - mysqluser -c “mysqld_safe --defaults-file=/etc/mysql/my.cnf &”;
mysql -S /usr/local/mysql/mysql.sock -u root -p;
ALTER USER USER() IDENTIFIED BY ‘rootpassword’;
SET SQL_LOG_BIN=0;
CREATE USER mgrrepl@‘%’ IDENTIFIED BY ‘mgrpassword’;
GRANT REPLICATION SLAVE ON . TO mgrrepl@‘%’;
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=0;
INSTALL PLUGIN group_replication SONAME ‘group_replication.so’;
CHANGE MASTER TO MASTER_USER=‘mgrrepl’, MASTER_PASSWORD=‘mgrpassword’ FOR CHANNEL ‘group_replication_recovery’;
mysqld是MySQL服务器启动的脚本,所以第一行可一替换为“mysqld - -defaults-file=/etc/mysql/my.cnf - -user=mysqluser”。但这里,我们使用mysql_safe,因为根据官方文档,这是MySQL服务器的启动脚本,官方建议在类Unix系统中,使用mysql_safe来启动MySQL服务器。
注意,第一次登陆数据库时,一定要先修改root密码。
第六步:随意选一个节点执行以下命令,构建MGR复制组的Master节点。
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
在执行“START GROUP_REPLICATION”命令时,可能时间会有点长。但如果时间过长,则查看错误日志文件//usr/local/mysql/logs/mysql-error.log,找出错误原因,并修复。
第七步:在剩余节点执行以下命令,构建MGR复制组的Slave节点。
START GROUP_REPLICATION;
第八步:搭建完成后,查看MGR状态。
// 查看MGR集群中所有节点的信息。
select * from performance_schema.replication_group_members;
// 查看当前节点的状态。
select * from performance_schema.member_state;
// 查看当前MGR的主节点的MEMBER_ID。
show status like group_replication_primary_member';
至此,MGR搭建完成。
3.2.部署xinetd服务
xinetd全称extended internet daemon,是一种网络守护进程服务程序。下面我们就配置两个守护进程来检查MGR节点的读写特性。
首先确认是否安装xinetd服务(yum list xinetd),如果没有安装,则需要手动安装(yum install xinetd)。然后配置检测write服务和检测read服务。
然后,在MGR主节点执行addition_to_sys.sql(引用自https://github.com/lefred/mysql_gr_routing_check中的addition_to_sys.sql脚本)脚本,此脚本生成的视图在维护着MGR节点的可读写特性。
守护进程执行的脚本如mgr_operation_check.sh(引用自https://github.com/lefred/mysql_gr_routing_check中的mysql_gr_routing_check.sh)所示,此脚本置于/usr/local/bin/目录下。注意修改次脚本中的MYSQL_USERNAME、MYSQL_PASSWORD、MYSQL_HOST、MYSQL_PORT这四个参数。
配置/etc/xinetd.d/mgr_operation_check_write检测可读写节点,如下所示:
service mgr_operation_check_write
{
disable = no
flags = REUSE
socket_type = stream
port = 6446
wait = no
user = mysql
server = /usr/local/bin/mgr_operation_check.sh
server_args = 100 write
log_on_failure += USERID
only_from = localhost 10.10.10.0/24
per_source = UNLIMITED
}
配置/etc/xinetd.d/mgr_operation_check_read检测只读节点,如下所示:
service mgr_operation_check_read
{
disable = no
flags = REUSE
socket_type = stream
port = 6447
wait = no
user = mysql
server = /usr/local/bin/mgr_operation_check.sh
server_args = 100 read
log_on_failure += USERID
only_from = localhost 10.10.10.0/24
per_source = UNLIMITED
}
部署完成后,重启xinetd服务。命令为“systemctl restart xinetd.service”。
之后,可查看6446和6447端口是否处于监听状态,命令为“netstat -ntlp”。
如果处于监听状态,则进行下一步的端口检测,通过“telnet localhost 6447”检查mgr_operation_check_write服务是否正常,通过“telnet localhost 6446”检查mgr_operation_check_read服务是否正常。
3.3.部署HAProxy服务
这是部署的最后一步。HAProxy在这里主要用于实现服务的代理、应用层自动宕切和读写分离,如果是多主的MGR集群,则还有一项功能——负载均衡。
HAProxy如果未安装,需要手动安装(yum install haproxy)。默认配置文件为/etc/haproxy/haproxy.cfg。我们可设置自己的配置文件,在启动时指定(haproxy -f /path/haproxy.conf)。
配置文件内容如下所示:
global
#log 127.0.0.1 local0 info
#chroot /usr/openv/apps/haproxy
#user haproxy
#group haproxy
daemon
maxconn 20000
nbproc 1
defaults
log global
mode http
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 300s
timeout server 300s
timeout http-keep-alive 10s
timeout check 10s
maxconn 20000
listen statistics
bing 0.0.0.0:33068
mode http
stats enable
stats auth admin:123$Public
stats auth guest:public
stats uri /monitor?statistics
stats hide-version
stats refresh 30s
stats admin if TRUE
stats realm Admin\ Statistics
frontend mgr-front-write
bind *:33061
mode tcp
default_backend mgr-back-write
backend mgr-back-write
mode tcp
balance leastconn
option httpchk
server mgr_node_1 10.10.10.101:33060 check addr 10.10.10.101 port 6446 inter 1000 rise 1 fall 2 on-marked-down shutdown-sessions
server mgr_node_2 10.10.10.102:33060 check addr 10.10.10.102 port 6446 inter 1000 rise 1 fall 2 on-marked-down shutdown-sessions backup
server mgr_node_3 10.10.10.103:33060 check addr 10.10.10.103 port 6446 inter 1000 rise 1 fall 2 on-marked-down shutdown-sessions backup
frontend mgr-front-read
bind *:33062
mode tcp
default_backend mgr-back-read
backend mgr-back-read
mode tcp
balance leastconn
option httpchk
server mgr_node_1 10.10.10.101:33060 check addr 10.10.10.101 port 6447 inter 1000 rise 1 fall 2 on-marked-down shutdown-sessions
server mgr_node_2 10.10.10.101:33060 check addr 10.10.10.102 port 6447 inter 1000 rise 1 fall 2 on-marked-down shutdown-sessions
server mgr_node_3 10.10.10.101:33060 check addr 10.10.10.103 port 6447 inter 1000 rise 1 fall 2 on-marked-down shutdown-sessions
配置文件中配置了读写分离,并对haproxy的监控指标进行了统计展示,页面地址为“http://10.10.10.100:33068/monitor?statistics”,可使用admin和guest进行登陆。
4.结束语
至此,单主模式的MGR集群搭建完毕。
可通过10.10.10.100的33061端口读写数据库,也可通过10.10.10.100的33062端口读数据库。三个MGR节点可至多可允许1个MGR节点宕机。