MGR服务搭建


发布于 2016-01-26 / 32 阅读 / 0 评论 /
MGR全称MySQL Group Replication,是MySQL数据库高可用和高可靠性的一种解决方案。下面我们通过搭建MGR集群来探索MySQL的高可用以及读写分离特性。

MGR是MySQL服务器端的插件,允许我们创建弹性的、可扩展的、可容错的复制拓扑结构。

1.环境准备

搭建服务由4台服务器组成,服务器配置如下表所示:

编号

ip

操作系统

linux内核版本

cpu

内存

磁盘

Node0

10.10.10.100

Red Hat Enterprise Linux Servre release 7.8(Maipo)

Linux version 3.10.0-1127.el7.x86_64

4C 2.2GHz

8GB

50GB

Node1

10.10.10.101

Red Hat Enterprise Linux Servre release 7.8(Maipo)

Linux version 3.10.0-1127.el7.x86_64

4C 2.2GHz

8GB

50GB

Node2

10.10.10.102

Red Hat Enterprise Linux Servre release 7.8(Maipo)

Linux version 3.10.0-1127.el7.x86_64

4C 2.2GHz

8GB

50GB

Node3

10.10.10.103

Red Hat Enterprise Linux Servre release 7.8(Maipo)

Linux version 3.10.0-1127.el7.x86_64

4C 2.2GHz

8GB

50GB

系统通信框架如下图所示:

其中绿色表示读操作流量,红色表示写操作流量,棕色表示MGR间通信流量。

2.服务部署架构

集群服务使用的是MGR、Xinetd和HAProxy。MGR由三个节点的MySQL服务器组成,构成一主两从的复制组;三台服务器都配置读写探测守护进程,由Xinetd来实现,用于探测该节点的读写特性;而MGR服务端代理及读写流量的分离由HaProxy来实现。

MGR服务的部署说明如下表所示:

server.id

ip

MySQL版本

数据库端口

MGR通信端口

初试化角色

1

10.10.10.101

5.7.26

33060

33066

Master

2

10.10.10.102

5.7.26

33060

33066

Slave

3

10.10.10.103

5.7.26

33060

33066

Slave

Xinetd服务的部署说明如下表所示:

ip

Xinetd版本号

检测Write端口

检测Read端口

10.10.10.101

2.3.15

6446

6447

10.10.10.102

2.3.15

6446

6447

10.10.10.103

2.3.15

6446

6447

HAProxy服务部署在一台服务器中,主要是作为MGR集群服务的代理。部署说明如下表所示:

IP

HAProxy版本号

读写端口

只读端口

服务状态监控

10.10.10.100

1.5.18

33061

33062

http://10.10.10.100:33068/monitor?statistics

架构图可参考通信架构图。

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节点宕机。