基于Centos7.x 搭建MySQL Galera Cluster高可用架构

一 说明

1.1 环境说明

主机名

物理 I P

操作系统版本

内核版本

MySQL 版本

Galera 版本

galera-cluster1

192.168.239.98

CentOS release 7.4

Linux  3.10.0

mysql-5.7.26

r elease 25.3.27

galera-cluster2

192.168.239.99

CentOS release 7.4

Linux  3.10.0

mysql-5.7.26

r elease 25.3.27

galera-cluster3

192.168.239.69

CentOS release 7.4

Linux  3.10.0

mysql-5.7.26

r elease 25.3.27

1.2 Galera支持版本

当前Galera官方支持如下稳定的MySQL版本和Galera版本:

MySQL versions 5.5.62, 5.6.44, 5.7.26

Galera replication library 3.27

Ref:

https://galeracluster.com/downloads/

注意:其中MySQL 5.5.62是MySQL5.5系列中最后一个版本

1.3 Galera支持库类型

当前Galera官方支持多种开源的关系型数据库,具体如下:

MySQL, MariaDB, or XtraDB

Ref:

https://galeracluster.com/library/documentation/install.html

二、修改系统基本操作配置

2.1 修改节点主机名

shell > hostnamectl --static set-hostname galera-cluster1
shell > su -
shell > hostnamectl --static set-hostname galera-cluster2
shell > su -
shell > hostnamectl --static set-hostname galera-cluster3
shell > su –

2.2 关闭防火墙

shell > systemctl stop firewalld
关闭操作系统自启动
shell > systemctl disable firewalld
检查关闭情况
shell > systemctl is-enabled firewalld

关闭selinux:

编辑/etc/selinux/config文件

shell > vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

SELINUX配置需要重启生效,若要在线生效,执行如下命令

shell > getenforce
shell > setenforce 0

2.3 配置本地yum源

shell > mount /dev/cdrom /mnt/
或者
shell > mount /dev/sr0 /mnt/
shell > df –h
shell > cd /etc/yum.repos.d
shell > mkdir bak
shell > mv *.repo bak/
shell > vi yum.repo
[base]
Name=base
Baseurl=file:///mnt
Enabled=1
Gpgcheck=0
shell > yum clean all
shell > yum makecache

2.4 卸载Galera Cluster的依赖包

检查postfix和mariadb依赖包是否存在

shell > rpm -qa|egrep "postfix|mariadb"
mariadb-libs-5.5.56-2.el7.x86_64
postfix-2.10.1-6.el7.x86_64

卸载postfix及mariadb,若卸载失败,可以加上--nodeps选项强制卸载

shell > rpm -e postfix-2.10.1-6.el7.x86_64
shell > rpm -e mariadb-libs-5.5.56-2.el7.x86_64
error: Failed dependencies:
...
shell > rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps

2.5 安装 Galera Cluster依赖包

正常情况下,安装如下依赖包即可。若在安装过程中,发现仍有包丢失,需将对应的依赖包打上。

shell > yum install -y perl-JSON socat boost-program-options socat rsync lsof

2.6 内核参数设置

编辑/etc/security/limits.conf 添加如下内容:

shell >vi /etc/security/limits.conf 
mysql  softnproc   2047 
mysql  hardnproc   16384
mysql  softnofile  1024
mysql  hardnofile  65536
mysql  softstack   10240

编辑/etc/pam.d/login 添加如下内容:

shell > vi /etc/pam.d/login 
session    required     pam_limits.so

编辑vi /etc/profile添加如下内容:

if [ /$USER = "mysql" ]; then
    if [ /$SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
        ulimit -n 65536
    else
        ulimit -u 16384 -n 65536
    fi
    umask 022
fi

2.7 检查操作系统用户MySQL

MySQL用户检查,若存在,则删除。后续使用RPM包安装,会自动创建MySQL用户。

shell > id mysql
shell > userdel mysql

2.8 /etc/hosts写入

shell > vi /etc/hosts
192.168.239.98  galera-cluster1
192.168.239.99  galera-cluster2
192.168.239.69  galera-cluster3

2.9 时间和时区检查

检查操作系统时区和时间:

shell > date -R

2.10 内存和交换空间检查

检查内存和交换空间:

shell > free -m

交换空间最小要求:

If RAM between 2 GB and 8 GB then 2 times the size fo RAM. 

If RAM between 8 GB to 32 GB then 1.5 times the size of RAM. 

If RAM greater than 32 GB then 32 GB.

一般来说,在大内存的情况下,交换空间也尽可能的多配置一些,在100G以上内存的主机,建议交换空间配置不会小于64G

三 MySQL Galera Cluster安装部署

3.1 MySQL Galera Cluster介质下载

介质安装包下载地址:

https://galeracluster.com/downloads/

3.2 RPM安装MySQL Galera Cluster集群

本节需要在Galera集群中所有节点执行RPM安装

安装mysql-wsrep

shell> rpm -ivh mysql-wsrep-common-5.7-5.7.26-25.18.el7.x86_64.rpm
shell> rpm -ivh mysql-wsrep-libs-5.7-5.7.26-25.18.el7.x86_64.rpm
shell> rpm -ivh mysql-wsrep-libs-compat-5.7-5.7.26-25.18.el7.x86_64.rpm
shell> rpm -ivh mysql-wsrep-client-5.7-5.7.26-25.18.el7.x86_64.rpm
shell> rpm -ivh mysql-wsrep-devel-5.7-5.7.26-25.18.el7.x86_64.rpm
shell> rpm -ivh mysql-wsrep-server-5.7-5.7.26-25.18.el7.x86_64.rpm
shell> rpm -ivh mysql-wsrep-5.7-5.7.26-25.18.el7.x86_64.rpm
shell> rpm -ivh mysql-wsrep-test-5.7-5.7.26-25.18.el7.x86_64.rpm

注意RPM安装的顺序,mysql-wsrep-server、mysql-wsrep包要在最后执行,其他任意

安装Galera

shell> rpm -ivh galera-3-25.3.27-2.el7.x86_64.rpm

Ref:

https://galeracluster.com/library/documentation/install-mysql.html

3.3 创建MySQL初始化自定义路径

本节需要在Galera集群中所有节点执行自定义路径创建

MySQL数据库初始化之前,创建对应的自定义目录

shell> mkdir -p /var/lib/mysql/data
shell> mkdir -p /var/lib/mysql/redo
shell> mkdir -p /var/lib/mysql/undo
shell> mkdir -p /var/lib/mysql/log
shell> chown -R mysql:mysql /var/lib/mysql
shell> chmod -R 775 /var/lib/mysql

3.4 修改集群galera-cluster1节点my.cnf

备份/etc/my.cnf默认配置文件,并将datadir选项注释掉

shell> cp /etc/my.cnf /etc/my.cnf.bak
shell> sed -i "s/datadir=/var/lib/mysql/#datadir=/var/lib/mysql/g" /etc/my.cnf

修改galera-cluster1节点my.cnf,在my.cnf配置文件中的[mysqld]模块下添加以下选项

shell> vi /etc/my.cnf
#skip-grant-tables
#skip-name-resolve = 1
user = mysql
port = 3306
server-id = 98
basedir = /usr
datadir = /var/lib/mysql/data
socket = /tmp/mysql.sock
max_connections = 3000
character-set-server = utf8
wait_timeout = 10800
interactive_timeout = 10800
slow_query_log = on
slow_query_log_file = /var/lib/mysql/log/mysql-slow.log
long_query_time = 3
log_queries_not_using_indexes = on
general_log = on
general_log_file = /var/lib/mysql/log/mysql-general.log
binlog-format = ROW
default_storage_engine = INNODB
innodb_autoinc_lock_mode = 2
innodb_locks_unsafe_for_binlog = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16777216
innodb_log_file_size = 1073741824
innodb_log_files_in_group = 3
innodb_buffer_pool_size = 524288000
innodb_log_group_home_dir = /var/lib/mysql/redo
innodb_undo_directory = /var/lib/mysql/undo
innodb_undo_tablespaces = 2
innodb_flush_method = O_DIRECT
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_page_cleaners = 16
innodb_io_capacity = 300
query_cache_type = off
query_cache_size = 0
max_heap_table_size = 64M
tmp_table_size = 64M
max_allowed_packet = 16M
secure_file_priv = 
log_bin_trust_function_creators = 1
###Galera Cluster Wsrep Configure
wsrep_provider = /usr/lib64/galera-3/libgalera_smm.so
wsrep_provider_options = "gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128"
wsrep_cluster_name = "mysql_galera_cluster"
wsrep_cluster_address = gcomm://
#wsrep_cluster_address = "gcomm://192.168.239.98,192.168.239.99,192.168.239.69"
wsrep_node_name = galera-cluster1
wsrep_node_address = 192.168.239.98
wsrep_sst_method = rsync
#wsrep_slave_threads=1
#wsrep_sst_auth="root:Hzmc321#"
#wsrep_sst_donor='galera-cluster1,galera-cluster2,galera-cluster3'

注意:部署galera集群时,galera-cluster1节点第一次启动需将wsrep_cluster_address设置如下:

wsrep_cluster_address = gcomm://

并配合mysqld_bootstrap脚本,进行初始化及启动MySQL数据库

3.5 galera-cluster1初始化及启动MySQL

mysqld_bootstrap是一个SHELL脚本,Galera集群中第一个节点初始化时可以调用mysqld_bootstrap(推荐),该脚本中带了--wsrep-new-cluster选项;若没有调用mysqld_bootstrap,则在节点初始化时,需要显式指定--wsrep-new-cluster选项

shell> cat /usr/bin/mysqld_bootstrap
OLDVAL=$(systemctl show-environment | grep '^MYSQLD_OPTS=')
if [ -z "$OLDVAL" ]; then
    systemctl set-environment   MYSQLD_OPTS="--wsrep-new-cluster"
    systemctl start             mysqld
    systemctl unset-environment MYSQLD_OPTS
else
    systemctl set-environment   "$OLDVAL --wsrep-new-cluster"
    systemctl start             mysqld
    systemctl set-environment   "$OLDVAL"
fi

初始化及启动MySQL数据库

shell> mysqld_bootstrap

监控MySQL错误日志输出

shell> tail -f /var/log/mysqld.log

3.6 检查galera-cluster1节点MySQL服务 

检查MySQL服务

shell> netstat -anpt|grep mysqld
tcp   0  0 0.0.0.0:4567   0.0.0.0:*   LISTEN   2563/mysqld 
tcp6  0  0 :::3306        :::*       LISTEN   2563/mysqld

mysqld主进程有两个端口4567,3306

4567:galera集群的默认端口,用于集群各节点之间的通信和复制

3306:MySQL的默认端口,对外提供业务

3.7 galera-cluster1节点MySQL密码修改

修改MySQL系统账户(root@localhost)密码

shell> cat /var/log/mysqld.log|grep -w "A temporary password"
2019-08-14T06:25:24.596697Z 1 [Note] A temporary password is generated for root@localhost: kn,#CU-L:8RJ
shell> mysqladmin -uroot -p password 'Hzmc321#' -S /tmp/mysql.sock
mysqladmin: unable to change password; error: 'Your password does not satisfy the current policy requirements'
mysql> show plugins\G;
*************************** 46. row ***************************
   Name: validate_password
 Status: ACTIVE
   Type: VALIDATE PASSWORD
Library: validate_password.so
License: GPL
mysql> show global variables like 'validate_%'\G;
*************************** 1. row ***************************
Variable_name: validate_password_check_user_name
        Value: OFF
*************************** 2. row ***************************
Variable_name: validate_password_dictionary_file
        Value: 
*************************** 3. row ***************************
Variable_name: validate_password_length
        Value: 8
*************************** 4. row ***************************
Variable_name: validate_password_mixed_case_count
        Value: 1
*************************** 5. row ***************************
Variable_name: validate_password_number_count
        Value: 1
*************************** 6. row ***************************
Variable_name: validate_password_policy
        Value: MEDIUM
*************************** 7. row ***************************
Variable_name: validate_password_special_char_count
        Value: 1

注意:本文档中的环境是MySQL 5.7.26,即validate_password.so密码插件默认已经安装,再修改MySQL系统账户密码时,需要满足大小写字母、数字、特殊字符、长度不少于8个字节等的密码策略,否则会提示密码修改错误。

3.8 修改集群galera-cluster2节点my.cnf

备份/etc/my.cnf默认配置文件,并将datadir选项注释掉

shell> cp /etc/my.cnf /etc/my.cnf.bak
shell> sed -i "s/datadir=/var/lib/mysql/#datadir=/var/lib/mysql/g" /etc/my.cnf

修改galera-cluster2节点my.cnf,在my.cnf配置文件中的[mysqld]模块下添加以下选项

shell> vi /etc/my.cnf
#skip-grant-tables
#skip-name-resolve = 1
user = mysql
port = 3306
server-id = 99
basedir = /usr
datadir = /var/lib/mysql/data
socket = /var/lib/mysql/mysql.sock
max_connections = 3000
character-set-server = utf8
wait_timeout = 10800
interactive_timeout = 10800
slow_query_log = on
slow_query_log_file = /var/lib/mysql/log/mysql-slow.log
long_query_time = 3
log_queries_not_using_indexes = on
general_log = on
general_log_file = /var/lib/mysql/log/mysql-general.log
binlog-format = ROW
default_storage_engine = INNODB
innodb_autoinc_lock_mode = 2
innodb_locks_unsafe_for_binlog = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16777216
innodb_log_file_size = 1073741824
innodb_log_files_in_group = 3
innodb_buffer_pool_size = 524288000
innodb_log_group_home_dir = /var/lib/mysql/redo
innodb_undo_directory = /var/lib/mysql/undo
innodb_undo_tablespaces = 2
innodb_flush_method = O_DIRECT
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_page_cleaners = 16
innodb_io_capacity = 300
query_cache_type = off
query_cache_size = 0
max_heap_table_size = 64M
tmp_table_size = 64M
max_allowed_packet = 16M
secure_file_priv = 
log_bin_trust_function_creators = 1
###Galera Cluster Wsrep Configure
wsrep_provider = /usr/lib64/galera-3/libgalera_smm.so
wsrep_provider_options = "gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128"
wsrep_cluster_name = "mysql_galera_cluster"
wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.99
#wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.99,192.168.239.69
wsrep_node_name = galera-cluster2
wsrep_node_address = 192.168.239.99
wsrep_sst_method = rsync
#wsrep_slave_threads=1
#wsrep_sst_auth="root:Hzmc321#"
#wsrep_sst_donor='galera-cluster1,galera-cluster2,galera-cluster3'

注意:部署galera集群时,galera-cluster2节点第一次启动需将wsrep_cluster_address设置如下:

wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.99

其中192.168.239.98表示Donor节点,192.168.239.99表示Joiner节点

3.9 galera-cluster2节点启动MySQL

Galera集群中的其他(非第一个)节点启动MySQL服务,只需要将服务正常拉起即可

shell> systemctl start mysqld

监控MySQL错误日志输出

shell> tail -f /var/log/mysqld.log

3.10 检查galera-cluster2节点MySQL服务

检查MySQL服务

shell> netstat -anpt|grep mysqld
tcp   0  0 0.0.0.0:4567   0.0.0.0:*   LISTEN   2563/mysqld 
tcp6  0  0 :::3306        :::*       LISTEN   2563/mysqld

mysqld主进程有两个端口4567,3306

4567:galera集群的默认端口,用于集群各节点之间的通信和复制

3306:MySQL的默认端口,对外提供业务

3.11 修改集群galera-cluster3节点my.cnf

备份/etc/my.cnf默认配置文件,并将datadir选项注释掉

shell> cp /etc/my.cnf /etc/my.cnf.bak
shell> sed -i "s/datadir=/var/lib/mysql/#datadir=/var/lib/mysql/g" /etc/my.cnf

修改galera-cluster3节点my.cnf,在my.cnf配置文件中的[mysqld]模块下添加以下选项

shell> vi /etc/my.cnf
#skip-grant-tables
#skip-name-resolve = 1
user = mysql
port = 3309
server-id = 69
basedir = /usr
datadir = /var/lib/mysql/data
socket = /tmp/mysql.sock
max_connections = 3000
character-set-server = utf8
wait_timeout = 10800
interactive_timeout = 10800
slow_query_log = on
slow_query_log_file = /var/lib/mysql/log/mysql-slow.log
long_query_time = 3
log_queries_not_using_indexes = on
general_log = on
general_log_file = /var/lib/mysql/log/mysql-general.log
binlog-format = ROW
default_storage_engine = INNODB
innodb_autoinc_lock_mode = 2
innodb_locks_unsafe_for_binlog = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16777216
innodb_log_file_size = 1073741824
innodb_log_files_in_group = 3
innodb_buffer_pool_size = 524288000
innodb_log_group_home_dir = /var/lib/mysql/redo
innodb_undo_directory = /var/lib/mysql/undo
innodb_undo_tablespaces = 2
innodb_flush_method = O_DIRECT
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_page_cleaners = 16
innodb_io_capacity = 300
query_cache_type = off
query_cache_size = 0
max_heap_table_size = 64M
tmp_table_size = 64M
max_allowed_packet = 16M
secure_file_priv = 
log_bin_trust_function_creators = 1
###Galera Cluster Wsrep Configure
wsrep_provider = /usr/lib64/galera-3/libgalera_smm.so
wsrep_provider_options = "gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128"
wsrep_cluster_name = "mysql_galera_cluster"
wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.69
#wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.99,192.168.239.69
wsrep_node_name = galera-cluster3
wsrep_node_address = 192.168.239.69
wsrep_sst_method = rsync
#wsrep_slave_threads=1
#wsrep_sst_auth="root:Hzmc321#"
#wsrep_sst_donor='galera-cluster1,galera-cluster2,galera-cluster3'

注意:部署galera集群时,galera-cluster3节点第一次启动需将wsrep_cluster_address设置如下:

wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.69

其中192.168.239.98表示Donor节点,192.168.239.69表示Joiner节点

3.12 galera-cluster3节点启动MySQL

Galera集群中的其他(非第一个)节点启动MySQL服务,只需要将服务正常拉起即可

shell> systemctl start mysqld

监控MySQL错误日志输出

shell> tail -f /var/log/mysqld.log

3.13 检查galera-cluster3节点MySQL服务

检查MySQL服务

shell> netstat -anpt|grep mysqld
tcp   0  0 0.0.0.0:4567   0.0.0.0:*   LISTEN   2563/mysqld 
tcp6  0  0 :::3306        :::*       LISTEN   2563/mysqld

mysqld主进程有两个端口4567,3306

4567:galera集群的默认端口,用于集群各节点之间的通信和复制

3306:MySQL的默认端口,对外提供业务

3.14 重启galera-cluster1节点MySQL服务

修改galera-cluster1节点/etc/my.cnf配置文件,在[mysqld]模块下修改以下选项

shell> vi /etc/my.cnf
#wsrep_cluster_address = gcomm://
wsrep_cluster_address = "gcomm://192.168.239.98,192.168.239.99,192.168.239.69"

注意:在galera集群中,先将galera-cluster1节点MySQL服务关闭,再将wsrep_cluster_address设置如下:

#wsrep_cluster_address = gcomm://
wsrep_cluster_address = "gcomm://192.168.239.98,192.168.239.99,192.168.239.69"

修改完成之后,将MySQL服务拉起来

3.15 重启galera-cluster2节点MySQL服务

修改galera-cluster2节点/etc/my.cnf配置文件,在[mysqld]模块下修改以下选项

shell> vi /etc/my.cnf
#wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.99
wsrep_cluster_address = "gcomm://192.168.239.98,192.168.239.99,192.168.239.69"

注意:在galera集群中,先将galera-cluster2节点MySQL服务关闭,再将wsrep_cluster_address设置如下:

#wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.99
wsrep_cluster_address = "gcomm://192.168.239.98,192.168.239.99,192.168.239.69"

修改完成之后,将MySQL服务拉起来

3.16 重启galera-cluster3节点MySQL服务

修改galera-cluster3节点/etc/my.cnf配置文件,在[mysqld]模块下修改以下选项

shell> vi /etc/my.cnf
#wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.69
wsrep_cluster_address = "gcomm://192.168.239.98,192.168.239.99,192.168.239.69"

注意:在galera集群中,先将galera-cluster1节点MySQL服务关闭,再将wsrep_cluster_address设置如下:

#wsrep_cluster_address = gcomm://192.168.239.98,192.168.239.69
wsrep_cluster_address = "gcomm://192.168.239.98,192.168.239.99,192.168.239.69"

修改完成之后,将MySQL服务拉起来

四 MySQL Galera Cluster各指标检查

4.1 Galera Cluster集群完整性检查

mysql> show global status where variable_name in
('wsrep_cluster_state_uuid','wsrep_cluster_conf_id','wsrep_cluster_size','wsrep_cluster_status');

注意:正常情况下以下指标值,在所有节点应该都是一致的

wsrep_cluster_state_uuid:在集群所有节点中该值应该是相同的,若有不同值,说明该节点没有连入集群

wsrep_cluster_conf_id:在集群所有节点中该值应该是相同的,若有不同值,说明该节点被临时”分区”了,当节点之间网络连接恢复后,该值应该恢复成一致

wsrep_cluster_size:如果与集群中的节点数一致,说明所有节点已经连接

wsrep_cluster_status:集群状态,若不为”Primary”,说明出现”分区”或是”split-brain”状况

4.2 Galera Cluster节点状态检查

mysql> show global status where variable_name in
('wsrep_ready','wsrep_connected','wsrep_local_state_comment');

注意:正常情况下以下指标值,在所有节点应该都是一致的

wsrep_ready:该值为ON,则说明可以接受SQL负载;如果为OFF,则需要检查wsrep_connected

wsrep_connected:如果该值为OFF,且wsrep_ready的值也为OFF,则说明该节点没有连入集群

(可能是wsrep_cluster_address或wsrep_cluster_name等配置错误造成的,具体需要排查错误日志)

wsrep_local_state_comment:若wsrep_connected为ON,但wsrep_ready为OFF,则可以从该项查看原因

4.3 Galera Cluster集群健康检查

mysql> show global status where variable_name in
('wsrep_flow_control_paused','wsrep_cert_deps_distance','wsrep_flow_control_sent','wsrep_local_recv_queue_avg');

wsrep_flow_control_paused:表示复制停止了多长时间

(即因Slave延迟而慢的程度,取值范围为0~1,越靠近0越好,值为1表示复制完全停止(停止广播),可优化wsrep_slave_threads的值来改善)

wsrep_cert_deps_distance:表示有多少事务可以并行应用处理,wsrep_slave_threads设置的值不应该高出该值太多

wsrep_flow_control_sent:表示该节点已经停止复制了多少次

wsrep_local_recv_queue_avg:表示slave事务队列的平均长度,slave瓶颈的预兆

五 MySQL Galera Cluster同步验证

5.1 galera-cluster1操作数据(DDL/DML)

在galera-cluster1节点建库、建表并插入部分数据,通过创建myproc1()、myproc2()存储过程实现

create database hzmc;
use hzmc;
create table cons1(id bigint primary key AUTO_INCREMENT, c1 varchar(40) default 'aaa', id2 bigint unique , id3 bigint not null );
create table cons2(id bigint primary key AUTO_INCREMENT, c1 varchar(40) default 'aaa', id2 bigint unique , id3 bigint not null );
DELIMITER //
CREATE PROCEDURE myproc1()
begin
declare sqltext varchar(4000);
declare i bigint;
set i=1;
while i<=50 do
    insert into cons1 values(i, 'AAAA', i, i);
    set i = i+1 ;
  end while;
  commit;
end
//
DELIMITER ;
call myproc1();
DELIMITER //
CREATE PROCEDURE myproc2()
begin
declare sqltext varchar(4000);
declare i bigint;
set i=1;
while i<=30 do
    insert into cons2 select * from cons1 where id=i;
    set i = i+1 ;
  end while;
  commit;
end
//
DELIMITER ;
call myproc2();

galera-cluster1节点

mysql> show variables like 'hostname'\G;
*************************** 1. row ***************************
Variable_name: hostname
        Value: galera-cluster1
mysql> select count(*) from hzmc.cons1\G;
*************************** 1. row ***************************
count(*): 50
mysql> select count(*) from hzmc.cons2\G;
*************************** 1. row ***************************
count(*): 30

galera-cluster2节点

mysql> show variables like 'hostname'\G;
*************************** 1. row ***************************
Variable_name: hostname
        Value: galera-cluster2
mysql> select count(*) from hzmc.cons1\G;
*************************** 1. row ***************************
count(*): 50
mysql> select count(*) from hzmc.cons2\G;
*************************** 1. row ***************************
count(*): 30

galera-cluster3节点

mysql> show variables like 'hostname'\G;
*************************** 1. row ***************************
Variable_name: hostname
        Value: galera-cluster3
mysql> select count(*) from hzmc.cons1\G;
*************************** 1. row ***************************
count(*): 50
mysql> select count(*) from hzmc.cons2\G;
*************************** 1. row ***************************
count(*): 30

至此,galera-cluster1、galera-cluster2、galera-cluster3三个节点数据一致。

5.2 galera-cluster2操作数据(DDL/DML)

在galera-cluster2节点删除部分数据

mysql> use hzmc;
mysql> delete from cons1 where id >= 5;
mysql> delete from cons2 where id >= 5;

galera-cluster1节点

mysql> show variables like 'hostname';

mysql> select * from cons1;

mysql> select * from cons2;

galera-cluster2节点

mysql> show variables like 'hostname';

mysql> select * from cons1;

mysql> select * from cons2;

galera-cluster3节点

mysql> show variables like 'hostname';

mysql> select * from cons1;

mysql> select * from cons2;

至此,galera-cluster1、galera-cluster2、galera-cluster3三个节点数据一致。

5.3 galera-cluster3操作数据(DDL/DML)

在galera-cluster3节点修改cons1、cons2表名

mysql> use hzmc
mysql> alter table cons1 rename to cons1_bak;
mysql> alter table cons2 rename to cons2_bak;

galera-cluster1节点

mysql> show variables like 'hostname';

mysql> show tables;

galera-cluster2节点

mysql> show variables like 'hostname';

mysql> show tables;

galera-cluster3节点

mysql> show variables like 'hostname';

mysql> show tables;

至此,galera-cluster1、galera-cluster2、galera-cluster3三个节点数据一致。

总之,MySQL Galera Cluster集群架构是多主模式,任何节点都可以承担读写业务。可以在上层部署中间件,比如MySQL Router,来实现前端业务的分流。

六 应用节点安装配置MySQL Router

6.1 MySQ Router二进制安装包下载链接

下载地址:

https://downloads.mysql.com/archives/router/


6.2 二进制包方式安装配置MySQL Router

shell> cd /soft/
shell> tar zxvf mysql-router-8.0.12-linux-glibc2.12-x86-64bit.tar.gz
shell> mkdir -p /usr/local/mysql-router-8.0.12
shell> cd mysql-router-8.0.12-linux-glibc2.12-x86-64bit
shell> mv * /usr/local/mysql-router-8.0.12/
shell> cp 
/usr/local/mysql-router-8.0.12/share/doc/mysqlrouter/sample_mysqlrouter.conf /usr/local/mysql-router-8.0.12/mysqlrouter.conf
shell> vi /usr/local/mysql-router-8.0.12/mysqlrouter.conf
[DEFAULT]
logging_folder = /usr/local/mysql-router-8.0.12/log
plugin_folder = /usr/local/mysql-router-8.0.12/lib/mysqlrouter
config_folder = /usr/local/mysql-router-8.0.12/etc
runtime_folder = /usr/local/mysql-router-8.0.12/run
data_folder = /usr/local/mysql-router-8.0.12/data
thread_stack_size = 128
[logger]
level = DEBUG
[routing:basic_failover]
bind_port = 7001
bind_address = 192.168.238.97
destinations = 192.168.238.74:3306,192.168.238.75:3306
routing_strategy = first-available
max_connections = 1000
max_connect_errors = 100000
client_connect_timeout = 9
connect_timeout = 3
[routing:ro_route]
bind_port = 7002
bind_address = 192.168.238.97
destinations = 192.168.238.74:3306,192.168.238.75:3306
routing_strategy=round-robin
max_connections = 1000
max_connect_errors = 100000
client_connect_timeout = 9
connect_timeout = 3

6.3 启动MySQL Router服务

shell> chown -R mysql:mysql /usr/local/mysql-router-8.0.12
shell> chmod -R 775 /usr/local/mysql-router-8.0.12
shell> /usr/local/mysql-router-8.0.12/bin/mysqlrouter --config /usr/local/mysql-router-8.0.12/mysqlrouter.conf &

七 报错汇总与处理

7.1 Galera集群节点重启Failed

当Galera Cluster集群搭建完成之后,并将所有节点MySQL服务手动关闭。此时,在集群中任意节点,启动MySQL服务,均会命中以下报错

shell> tail -f /var/log/mysqld.log
2019-08-14T08:24:24.420271Z 0 [Warning] WSREP: last inactive check more than PT1.5S ago (PT3.50494S), skipping check
2019-08-14T08:24:53.935984Z 0 [Note] WSREP: view((empty))
2019-08-14T08:24:53.936220Z 0 [ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Connection timed out)
         at gcomm/src/pc.cpp:connect():158
2019-08-14T08:24:53.936243Z 0 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():209: Failed to open backend connection: -110 (Connection timed out)
2019-08-14T08:24:53.936345Z 0 [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1458: Failed to open channel 'mysql_galera_cluster' at 'gcomm://192.168.239.99,192.168.239.69,192.168.239.98': -110 (Connection timed out)
2019-08-14T08:24:53.936396Z 0 [ERROR] WSREP: gcs connect failed: Connection timed out
2019-08-14T08:24:53.936526Z 0 [ERROR] WSREP: wsrep::connect(gcomm://192.168.239.99,192.168.239.69,192.168.239.98) failed: 7
2019-08-14T08:24:53.936534Z 0 [ERROR] Aborting
2019-08-14T08:24:53.936538Z 0 [Note] Giving 0 client threads a chance to die gracefully
2019-08-14T08:24:53.936544Z 0 [Note] WSREP: Service disconnected.
2019-08-14T08:24:54.936684Z 0 [Note] WSREP: Some threads may fail to exit.
2019-08-14T08:24:54.936884Z 0 [Note] Binlog end
2019-08-14T08:24:54.940035Z 0 [Note] /usr/sbin/mysqld: Shutdown complete

解决方案:

shell> sed -i "/safe_to_bootstrap/s/0/1/" /var/lib/mysql/data/grastate.dat
shell> mysqld_bootstrap
shell> tail -f /var/log/mysqld.log

Ref:

https://stackoverflow.com/questions/37212127/mariadb-gcomm-backend-connection-failed-110

请使用浏览器的分享功能分享到微信等