一 说明
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