项目背景: 生产环境,与外网物理隔离;且只能提供两台服务器做高可用。PXC的官网是建议组建集群时至少3台主机,实践后,发现添加一个仲裁节点(其实就是在一台第三方机器上安装一个garb服务)也可以正常使用。
机器准备
pxc-node0(192.168.0.153) 、pxc-node1(192.168.0.154),
两台兼做负载均衡(haproxy)及HA(keepalived)机器
VIP: 192.168.0.160
另找一台网络中的第三方机器,做仲裁节点:192.168.0.155
一台与PXC-node相同OS版本的外网机器,用来用载相关的依赖包
安装PXC-node0
- 到外网机器上下载所需依赖包
$ mkdir /home/rpm
$ yum install --downloadonly --downloaddir=/home/rpm openssl socat \
procps-ng chkconfig procps-ng coreutils shadow-utils \
grep libaio libev libcurl perl-DBD-MySQL perl-Digest-MD5 \
libgcc libstdc++ libgcrypt libgpg-error zlib glibc openssl-libs
$ tar czf pxc-rpm.tar /home/rpm/
$ wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
$ curl -O https://www.percona.com/downloads/Percona-XtraDB-Cluster-57/Percona-XtraDB-Cluster-5.7.14-26.17/binary/tarball/Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101.tar.gz
2.安装pxc-node0
以下在pxc-node0上操作:先将上述压缩包上传
# 安装依赖包
$ mkdir pxc-setup
$ tar zxvf pxc-rpm.tar -C pxc-setup/
$ cd pxc-setup/home/rpm/
$ mkdir update
$ mv libcurl-7.29.0-57.el7_8.1.x86_64.rpm curl-7.29.0-57.el7_8.1.x86_64.rpm ./update/
$ rpm -ivh *.rpm # 如果安装失败就一个一个装!
$ rpm -Uvh update/*.rpm
# 安装percona xtrbackup
$ tar zxvf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz -C /usr/local/
# 安装PXC
$ tar zxvf Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101.tar.gz -C /usr/local/
$ mv /usr/local/Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101/ /usr/local/pxc_mysql
groupadd mysql
useradd -M -g mysql -s /sbin/nologin/ -d /usr/local/mysql mysql
mkdir -p /usr/local/pxc_mysql/{data,logs,tmp}
mkdir -p /usr/local/pxc_mysql/logs/binlog
chown -R mysql:mysql /usr/local/pxc_mysql/{data,logs,tmp}
$ echo "export PATH=/usr/local/percona-xtrabackup-2.4.4-Linux-x86_64/bin:/usr/local/pxc_mysql/bin:$PATH" >> /etc/profile
- 配置PXC-node0
以下在pxc-node0上操作
$ cd /usr/local/pxc_mysql
$ cp ./support-files/my-default.cnf my.cnf
$ vi my.cnf # 添加如下:
wsrep_provider=/usr/local/pxc_mysql/lib/libgalera_smm.so
wsrep_cluster_name=pxc-mytest #集群名称,所有节点必须一致
wsrep_cluster_address=gcomm://192.168.0.153,192.168.0.154,192.168.0.155 #指定在集群中的各节点的ip
wsrep_node_name=pxc_node0 #指定本节点在集群中唯一标识的节点名
wsrep_node_address=192.168.0.153 #本节点地址
wsrep_sst_method=xtrabackup-v2 #SST方式,默认是xtrabackup-v2,也是5.7唯一支持的方式
wsrep_sst_auth=pxc:213456 #SST时用到的用户名密码
wsrep_provider=/usr/local/pxc_mysql/lib/libgalera_smm.so
pxc_strict_mode=ENFORCING #开启严格模式,也是默认行为
binlog_format=ROW #binlog格式
default_storage_engine=InnoDB #默认存储引擎
innodb_autoinc_lock_mode=2 #自增锁模式
skip-name-resolve
event_scheduler=1
max_connections=1500
# 初始化第一个节点:
$ bin/mysqld --defaults-file=/usr/local/pxc_mysql/my.cnf --initialize --user=mysql \
--basedir=/usr/local/pxc_mysql --datadir=/usr/local/pxc_mysql/data
A temporary password is generated for root@localhost: ulCUnyVe%9o# # 记下这个临时密码
$ chown mysql:mysql /usr/share/mysql/english/errmsg.sys
# 启动第一个节点:
$ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf \
--wsrep-new-cluster --user=mysql &
$ mysql -uroot -p #使用上面的临时密码
mysql> ALTER USER "root"@"localhost" IDENTIFIED BY "123456"; # 修改root密码
mysql> CREATE USER "pxc"@"localhost" IDENTIFIED BY "213456"; #为SST创建一个用户并赋权限
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO "pxc"@"localhost" IDENTIFIED BY "213456";
mysql> FLUSH PRIVILEGES;
配置PXC健康检查
即安装配置xinetd服务
$ yum install xinetd -y
$ echo 'mysqlchk 9200/tcp # mysqlchk' >> /etc/services
$ systemctl enable xinetd && systemctl start xinetd
$ chkconfig --level 2345 xinetd on
$ cp /usr/local/pxc_mysql/bin/clustercheck /usr/bin/
$ cp /usr/local/pxc_mysql/bin/clustercheck /etc/xinetd.d/
$ cp /usr/local/pxc_mysql/bin/mysql /usr/bin/
$ mysql -uroot -p
mysql> GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!'; # 创建健康检查用户
Query OK, 0 rows affected, 1 warning (0.54 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.08 sec)
$ vi /etc/xinetd.d/mysqlchk # 输入以下内容
# default: on
# description: mysqlchk
service mysqlchk
{
# this is a config for xinetd, place it in /etc/xinetd.d/
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
# recommended to put the IPs that need
# to connect exclusively (security purposes)
per_source = UNLIMITED
}
$ curl -I 192.168.0.153:9200 # 健康检查(或使用clustercheck命令)
HTTP/1.1 200 OK
Content-Type: text/plain
Connection: close
Content-Length: 40
安装PXC-node1
同样的方法在DC-PXC01上安装pxc与健康检查,但要作一些改动:
# 修改机器名与IP,不详叙
.......
# 修改/usr/local/pxc_mysql/my.cnf中的wsrep_node_name、wsrep_node_address两项
# 重新初始化PXC
$ pkill mysqld
$ rm -rf /usr/local/pxc_mysql/data/*
$ bin/mysqld --defaults-file=/usr/local/pxc_mysql/my.cnf --initialize --user=mysql \
--basedir=/usr/local/pxc_mysql --datadir=/usr/local/pxc_mysql/data
# 启动的命令参数和第一个节点不一样
$ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
# 此时再登录myql,会发现其密码已经被同步为123456了
$ mysql -uroot -p123456
mysql> show status like 'wsrep_cluster_%';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_cluster_conf_id | 2 |
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | 51e34fd0-e83a-11ea-b1d9-8e93ca22d0f6 |
| wsrep_cluster_status | Primary |
+--------------------------+--------------------------------------+
4 rows in set (0.00 sec)
# 从上面可以看到2个节点都起来了!
到这里,这个2节点的PXC群集就启动起来了
安装配置haproxy(负载均衡)
haproxy提供PXC集群的负载均衡
以下操作在DC-PXC00/01上进行
# 复制到内网机器上安装
$ rpm -ivh haproxy-1.5.18-9.el7.x86_64.rpm
$ mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg-bak
$ vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
chroot /usr/share/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode http
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
frontend pxc-front
bind *:3307
mode tcp
default_backend pxc-back
frontend stats-front
bind *:80
mode http
default_backend stats-back
frontend pxc-onenode-front
bind *:3316
mode tcp
default_backend pxc-onenode-back
backend pxc-back
mode tcp
balance leastconn
option httpchk
server pxc_node0 192.168.0.153:3306 check port 9200 inter 12000 rise 3 fall 3
server pxc_node1 192.168.0.154:3306 check port 9200 inter 12000 rise 3 fall 3
backend stats-back
mode http
balance roundrobin
stats uri /haproxy/stats
backend pxc-onenode-back
mode tcp
balance leastconn
option httpchk
server pxc_node0 192.168.0.153:3306 check port 9200 inter 12000 rise 3 fall 3
server pxc_node1 192.168.0.154:3306 check port 9200 inter 12000 rise 3 fall 3 backup
# 说明:在此配置中,定义了三个前端-后端对。统计信息对用于HAProxy统计信息页面,其他用于Percona XtraDB集群。 MySQL将监听端口3316和3307。如果连接到端口3316,则将连接到pxc-onenode,并且一次只能使用一个节点(以避免由于乐观锁定而回滚)。如果该节点离线,您将开始使用另一个节点。但是,如果您连接到端口3307,则还将使用所有三个节点进行读写。在这种情况下,将使用Minimumconn负载平衡方法代替轮询,这意味着您始终以建立的最少连接数连接到后端。可以使用指向/haproxy/stats的浏览器在客户端节点上访问统计信息页面
$ systemctl enable haproxy && service haproxy restart
# 访问http://192.168.0.160/haproxy/stats页面,查看pxc高可用集群状态
安装及配置keepalived(高可用)
以下操作在DC-PXC00/01上进行
$ yum install keepalived-1.3.5-6.el7.x86_64
$ mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf-bak
$ vi /etc/keepalived/keepalived.conf
global_defs {
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/etc/keepalived/chk_haproxy.sh" # check the haproxy process
interval 2 # every 2 seconds
weight 2 # add 2 points if OK
}
vrrp_instance VI_1 {
interface ens32 # 网卡接口名,要根据实际修改
state BACKUP # 两台机都设为BACKUP,非抢占式
virtual_router_id 110
priority 100 # node1上为90
nopreempt
virtual_ipaddress {
192.168.0.160 # virtual ip address
}
track_script {
chk_haproxy
}
}
# 检测脚本
$ cat /etc/keepalived/chk_haproxy.sh
#!/bin/bash
stat=`ps -C haproxy --no-header |wc -l`
if [ $stat -eq 0 ];then
/usr/bin/systemctl start haproxy
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
/usr/bin/systemctl stop keepalived
fi
fi
$ chmod +x /etc/keepalived/chk_haproxy.sh
$ systemctl enable keepalived && service keepalived restart
添加PXC双节点仲裁器
为防止2个节点出现“脑裂”的问题,现在为它添加一个仲裁节点(Galera Arbitrator)。因为资源所限,我们将其放在第三方机器上。以下操作在这台第三方机器上进行:
$ rpm -ivh Percona-XtraDB-Cluster-garbd-57-5.7.31-31.45.3.el7.x86_64.rpm
$ vi /etc/sysconfig/garb # 在末尾添加
GALERA_NODES="192.168.0.153:4567, 192.168.0.155:4567, 192.168.0.155:4567"
GALERA_GROUP="pxc-mytest"
LOG_FILE="/tmp/garbd.log"
# 还要删除“# REMOVE THIS AFTER CONFIGURATION”这一行,保存退出
$ systemctl enable garb && service garb start && service garb status
# 可以通过garb日志查看服务详情
$ tail -f /tmp/garbd.log
ps:garb配置文件修改后,一定要删除“ REMOVE THIS AFTER CONFIGURATION”这一行,才能生效。
MysqlPXC集群服务启动的说明
在/usr/local/pxc_mysql/data目录下,有一个grastate.dat 文件,它记录了本机数据库的集群信息。其中有一个“seqno”字段,当它为“-1”时表示集群正常,为其它数值时表示集群的检查点。
初始启动
当集群初建时,可以任选一台机器作主,创建集群,另外一台加入这个集群:
# 启动第一个节点:
$ cd /usr/local/pxc_mysql
$ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf \
--wsrep-new-cluster --user=mysql &
# 启动第二个节点,启动的命令参数和第一个节点不一样
$ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
异常情况下的启动
当某节点上的mysql服务宕机/节点重启时,此时分两种情况:
- 另外节点上的mysql服务正常,则那个节点(不管之前是主是从)肯定会成为主节点,那么故障节点必须 要以从机的身份加入群集
$ cd /usr/local/pxc_mysql
$ bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
- 当另外那个节点上的mysql服务以及仲裁节点上的garb服务(比如:机房断电)也宕机时,此时集群已经不存在了,这时先要分析grastate.dat 文件来确定哪个节点上的数据比较新,一般来说,grastate.dat 文件的时间越新,seqno越大,则它的数据越新,这时,就要以这个节点作主创建集群,另外的节点以从机身份加入(通常会引发lst,即增量备份操作,数据量较大时会造成集群性能下降)
- 仲裁节点上的garb服务不能先于两个pxc节点上的服务启动
pxc自动启动设置
为简化pxc启动,下面配置一下脚本自动启动方式
配置免密登录
# 在node0上
$ ssh-keygen # (连按几次回车)生成登录秘钥
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.154
$ ssh root@192.168.0.154 # 尝试一下免密登录
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.155
$ ssh root@192.168.0.155 # 尝试一下免密登录
# 在node1上
$ ssh-keygen # (连按几次回车)生成登录秘钥
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.153
$ ssh root@192.168.0.153 # 尝试一下免密登录
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.155
$ ssh root@192.168.0.155 # 尝试一下免密登录
编写服务脚本
# 在node0上
# 先配置一下软连接
$ ln -s /usr/local/percona-xtrabackup-2.4.4-Linux-x86_64/bin/xtrabackup /usr/bin/xtrabackup
$ ln -s /usr/local/percona-xtrabackup-2.4.4-Linux-x86_64/bin/xbstream /usr/bin/xbstream
$ cd /usr/local/pxc_mysql/
$ vi pxc.sh
#!/bin/bash
#chkconfig: 2345 38 46
. /etc/init.d/functions
if [ $# -ne 1 ];then
echo "usage: $0 {start|stop|status}"
exit 1
fi
case "$1" in
start)
# 检查自己的mysql是否已启动
if [ `ps -C mysqld --no-header |wc -l` -gt 0 ];then
echo "pxc服务已在运行中......"
exit 1
fi
echo "pxc服务启动中......"
# 检查对方的mysql是否已启动
if [ `ssh 192.168.0.154 ps -C mysqld --no-header |wc -l` -eq 0 ] && [ `ssh 192.168.106.123 ps -C garbd --no-header |wc -l` -eq 0 ];then
# 对方与123上面的仲裁器均未启动,本机拉起群集(还应该有一个判断哪台机的grastate.dat文件更新的问题,暂时skip)
cd /usr/local/pxc_mysql
bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --wsrep-new-cluster --user=mysql &
time=`date "+%F %H:%M:%S"`
msg="$time ------本机以主机身份拉起群集!------\n"
else
# 对方或123上面的仲裁器有一个或均已启动,本机以从机身份加入群集
cd /usr/local/pxc_mysql
bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
time=`date "+%F %H:%M:%S"`
msg="$time ------本机以从机身份加入群集!------\n"
fi
# 检查本机是否启动并写入日志
sleep 10
if [ `ps -C mysqld --no-header |wc -l` -gt 0 ];then
echo -e $msg >>/tmp/pxc.log
action "pxc服务已启动" /bin/true
exit 0
else
echo -e "本机启动pxc失败,请检查!" >>/tmp/pxc.log
action " 启动pxc服务失败,请检查! " /bin/false
exit 1
fi
;;
stop)
if [ `ps -C mysqld --no-header |wc -l` -gt 0 ];then
echo "正在停止pxc服务,请稍等......"
pkill mysqld
else
action "pxc服务未启动!" /bin/false
exit 1
fi
sleep 10
if [ `ps -C mysqld --no-header |wc -l` -eq 0 ];then
action "pxc服务已关闭!" /bin/true
exit 0
else
action "本机关闭pxc失败,请检查!" /bin/false
exit 1
fi
;;
status)
if [ `ps -C mysqld --no-header |wc -l` -gt 0 ]; then
action "pxc服务正在运行中!"
exit 0
else
action "pxc服务已关闭!"
exit 1
fi
;;
*)
echo "usage: $0 {start|stop|status}"
exit 1
esac
$ chmod +x pxc.sh
# 再到node1上重复上面几个步骤。注意要将脚本文件中的IP地址改为:192.168.0.153
# 脚本的用法说明:脚本有3个参数:start/stop/status,分别是启动/停止/查看pxc服务状态
$ ./pxc.sh start
pxc服务已在运行中......
$ ./pxc.sh stop
正在停止pxc服务,请稍等......
pxc服务已关闭! [ 确定 ]
$ ./pxc.sh status
pxc服务已关闭! [ 确定 ]
把脚本添加到自启动
$ cp pxc.sh /etc/rc.d/init.d/pxc
$ cd /etc/rc.d/init.d
$ chkconfig --add pxc
$ chkconfig pxc on
接下来,可以尝试重启机器,看pxc服务是否自动启动
网友评论