Mycat 系统高可用的方案图:haproxy + keepalived + mycat 高可用与负载均衡
Describe:此文档中,使用的 Mycat 读写分离 + MySQL 一主一从的架构,与双主双从架构不同的点只是 Mycat 和 MySQL 的配置,其它都是一样的。
·
MySQL 主从架构搭建
可以选择一主一从,也可以选择双主双从架构,具体的搭建步骤我这里就省略了,下面是一些信息。
1、为了更好的实现测试效果,可将 binlog_format 设置为 statement,以实现主从同步数据不一致的问题。具体关于 binlog_format 的三种格式区别如下:
Statement
每一条会修改数据的 SQL 都会记录在 binlog 中。
优点:不需要记录每一行的变化,减少了 binlog 日志量,节约了 IO,提高性能。
缺点:由于记录的只是执行语句,因此对一些系统函数不能准确复制或是不能复制,存在安全隐患,会导致主从不一致。如下示例:
insert into test111 values (2,@@hostname);
Row
不记录 SQL 语句上下文相关信息,仅保存哪条记录被修改。
优点:Row 的日志会非常清楚的记录下每一行数据修改的细节。而且不会出现某些特定情况下的存储过程或函数,以及 trigger 的调用和触发无法被正确复制的问题。
缺点:所有的执行语句都将以每行记录的修改来记录,会产生大量的日志内容。
Mixed
是以上两种的混合使用。一般情况下会使用 Statement 记录格式;当 SQL 语句中包含会导致主从数据不一致的函数时,则采用 Row 记录格式保存。
·
2、双主双从关系信息图如下:
如上图所示:
- 10.0.30.20 为 10.0.30.21 和 10.0.30.22 的 master
- 10.0.30.22 为 10.0.30.23 的 master
这时,10.0.30.22 就需要设置 log-slave-updates
,即在作为 slave 的时候,有写入操作也要更新二进制日志文件。
·
3、注意点
注意一: Linux 下部署安装 MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf 下配置 lower_case_table_names=1
使 Linux 环境下 MySQL 忽略表名大小写,否则使用 MyCAT 的时候会提示找不到表的错误。
注意二: 在测试过程中,MySQL 设置了指定服务端字符集的排序规则(collation-server
),结果或导致 Mycat 报错。
·
Mycat 读写分离
具体的安装步骤就不提现了,需要的可参考文章:Mycat 系列之读写分离(一主一从)。
下面是双主双从的 schema.xml 配置信息:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
<schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="wpf-test" database="mycat_testdb"/>
<dataHost name="wpf-test" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="wpf-test-M1" url="10.0.30.20:3306" user="mycat_user" password="111111">
<readHost host="wpf-test-S1" url="10.0.30.21:3306" user="mycat_user" password="111111" />
</writeHost>
<writeHost host="wpf-test-M2" url="10.0.30.22:3306" user="mycat_user" password="111111">
<readHost host="wpf-test-S2" url="10.0.30.23:3306" user="mycat_user" password="111111" />
</writeHost>
</dataHost>
</mycat:schema>
·
安装 keepalived
官方表示:keepalived 官网只提供源码包;在大多数 Linux 发行版都提供 keepalived 软件包,并且在维护和报告有关它的问题方面做得很好。
Github 地址:https://github.com/acassen/keepalived
官网:https://keepalived.org
注意: 在使用 Github 上的源码包和官网的源码包编译安装时,所依赖的软件包是有区别的。至于依赖哪些包都可以从源码包中的 INSTALL 文档中查看。
PS: 这里使用官网的源码包进行安装。建议选择 2.0.10 及以上的版本。
·
1 安装依赖包
yum -y install gcc openssl-devel libnl3-devel \
ipset-devel iptables-devel libnfnetlink-devel \
net-snmp-devel glib2-devel
·
2 下载&解压源码包
tar -xvf keepalived-2.0.11.tar.gz
·
3 编译
cd keepalived-2.0.11
./configure --prefix=/usr/local/keepalived \
--with-init=systemd \
--with-systemdsystemunitdir=/usr/lib/systemd/system
·
4 编译安装
make && make install
·
5 修改配置文件
PS: 两个 vip,一个供连接 mycat 使用,一个供 haproxy 状态页面使用。
# master 节点
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Mycat_HAProxy
}
vrrp_script chk_haproxy_port {
script /usr/local/keepalived/script/check_haproxy.sh
interval 3
timeout 5
#注意权重和优先级的大小(master节点的priority减去weight必须小于slave节点的priority)
weight -10
rise 2
fall 2
init_fail
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51 #同组中所有节点的虚拟路由 ID 需要相同
priority 100 #注意权重和优先级的大小(master节点的priority减去weight必须小于slave节点的priority)
advert_int 1
authentication { #同组中所有节点的认证方式需要相同
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.30.30/24 dev eth0 label eth0:0
172.168.30.30/24 dev eth1 label eth1:0
}
track_script {
chk_haproxy_port
}
notify_master /usr/local/keepalived/script/to_master.sh
notify_backup /usr/local/keepalived/script/to_backup.sh
notify_stop /usr/local/keepalived/script/to_stop.sh
notify_fault /usr/local/keepalived/script/to_fault.sh
}
·
# slave 节点
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id Mycat_HAProxy
}
vrrp_script chk_haproxy_port {
script /usr/local/keepalived/script/check_haproxy.sh
interval 3
timeout 5
#这里slave的weight配置为10,是因为haproxy侦听地址配置的是vip,当不存在vip时,haproxy启动会失败 \
#+ 如果slave的weight也配置为-10,那么,它的priority会一直为(95-10),在这种情况下 \
#+ 当master节点的haproxy故障时,它的priority会变为(100-10),仍然大于slave的priority,vip不会发生切换,即不会实现高可用性。 \
#+ 即使slave的weight配置为10,还是存在一个问题:当master节点的haproxy故障,vip切换到slave后,slave的haproxy也故障的情况下,vip不会再切换回master。\
#+ 不过,这种情况比较极端,并且一般都会为keepalived、haproxy配置监控,当出现故障时能及时排查修复 \
#+ 还会将两台keepalived+haproxy部署在不同的机架或者机房来提高冗余性。
weight 10
rise 2
fall 2
init_fail
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51 #同组中所有节点的虚拟路由 ID 需要相同
priority 95
advert_int 1
authentication { #同组中所有节点的认证方式需要相同
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.30.30/24 dev eth0 label eth0:0
172.168.30.30/24 dev eth1 label eth1:0
}
track_script {
chk_haproxy_port
}
notify_master /usr/local/keepalived/script/to_master.sh
notify_backup /usr/local/keepalived/script/to_backup.sh
notify_stop /usr/local/keepalived/script/to_stop.sh
notify_fault /usr/local/keepalived/script/to_fault.sh
}
·
6 编写所需要的脚本(master 和 slave 一样)
mkdir -p /usr/local/keepalived/script/
cd /usr/local/keepalived/script/
6.1 check_haproxy.sh 脚本
cat << "EOF" > check_haproxy.sh
#!/bin/bash
#Script name : check_haproxy.sh
#Author : panbuhei
#Describe : keepalived 每 3(interval) 秒执行一次此脚本,然后检测此脚本的状态码 \
#+ 当脚本的状态码连续两次(fall)为 0,并且 weight 配置的值大于 0,则优先级相应的增加 \
#+ 当脚本的状态码连续两次(fall)为非 0,并且 weight 配置的值小于 0,则优先级相应的减少
#
#注意:不管优先级(priority)是增加,还是减小权重(weight),都只是一次,而不是无限次。
LOGFILE="/usr/local/keepalived/log/keepalived-haproxy-state.log"
HAPROXY_NUM=`ps -C haproxy --no-header | wc -l`
[ -d /usr/local/keepalived/log ] || mkdir -p /usr/local/keepalived/log
echo "[check_haproxy status]" >> $LOGFILE
date >> $LOGFILE
echo "[check_haproxy status]" >> $LOGFILE
if [ $HAPROXY_NUM -eq 0 ];then
echo "haproxy is not running" >> $LOGFILE
exit 1
else
echo "haproxy is running" >> $LOGFILE
exit 0
fi
EOF
6.2 to_master.sh
cat << "EOF" > to_master.sh
#!/bin/bash
#Script name : to_master.sh
#Author : panbuhei
#Describe : 状态切换为 MASTER 时,执行此脚本启动 haproxy。
#+ 由于 haproxy 的侦听地址是 vip,所以只有获取到 vip,才能启动成功。
LOGFILE="/usr/local/keepalived/log/keepalived-haproxy-state.log"
[ -d /usr/local/keepalived/log ] || mkdir -p /usr/local/keepalived/log
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >> $LOGFILE
echo "restart haproxy...." >> $LOGFILE
systemctl restart haproxy >> $LOGFILE 2>&1
EOF
6.3 to_backup.sh
cat << "EOF" > to_backup.sh
#!/bin/bash
#Script name : to_backup.sh
#Author : panbuhei
#Describe : 状态切换为 BACKUP 时,执行此脚本关闭 haproxy。
LOGFILE="/usr/local/keepalived/log/keepalived-haproxy-state.log"
[ -d /usr/local/keepalived/log ] || mkdir -p /usr/local/keepalived/log
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being backup...." >> $LOGFILE
echo "stop haproxy...." >> $LOGFILE
systemctl stop haproxy >> $LOGFILE 2>&1
EOF
6.4 to_stop.sh
cat << "EOF" > to_stop.sh
#!/bin/bash
#Script name : to_stop.sh
#Author : panbuhei
LOGFILE="/usr/local/keepalived/log/keepalived-haproxy-state.log"
[ -d /usr/local/keepalived/log ] || mkdir -p /usr/local/keepalived/log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
EOF
6.5 to_fault.sh
cat << "EOF" > to_fault.sh
#!/bin/bash
#Script name : to_fault.sh
#Author : panbuhei
LOGFILE="/usr/local/keepalived/log/keepalived-haproxy-state.log"
[ -d /usr/local/keepalived/log ] || mkdir -p /usr/local/keepalived/log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE
EOF
chmod +x /usr/local/keepalived/script/*
·
7 创建依赖目录并创建软连接
mkdir /usr/local/keepalived/temp/
mkdir /etc/keepalived/
ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
ln -s /usr/local/keepalived/sbin/keepalived /usr/bin/keepalived
PS: keepalived -t
可以检查配置文件的语法,默认检查 /etc/keepalived/keepalived.conf,所以,我这里配置了一个软连接。
·
8 修改启动文件 keepalived.service
vim /usr/local/keepalived/etc/sysconfig/keepalived
# KEEPALIVED_OPTIONS变量是启动时所指定的参数
KEEPALIVED_OPTIONS="-f /usr/local/keepalived/etc/keepalived/keepalived.conf -p /usr/local/keepalived/temp/keepalived.pid -D"
vim /usr/lib/systemd/system/keepalived.service
#主要修改PIDFile的路径
[Unit]
Description=LVS and VRRP High Availability Monitor
After= network-online.target syslog.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/keepalived/temp/keepalived.pid
KillMode=process
EnvironmentFile=-/usr/local/keepalived/etc/sysconfig/keepalived
ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
·
9 启动&自启 keepalived
PS: 先只启动 master 节点的 keepalived,等 master 节点的 haproxy 也启动之后,再启动 slave 节点的 keepalived 和 haproxy。因为,同时启动 master 和 slave 的 keepalived 时,由于都还没有启动 haproxy,master 的优先级(priority)为 100-10,slave的优先级(priority)为 95+10,则 slave 获得 vip。
这样会导致与规划的情况不相符,具体原因可以看最后面的<<测试 Mycat 的高可用架构>>
章节。
·
systemctl daemon-reload
systemctl start keepalived && systemctl enable keepalived
·
10 查看 keepalived 是否启动成功
·
安装 haproxy
官网:https://www.haproxy.org/
下载地址:https://www.haproxy.org/download/1.7/src/
根据源码包中 README 文件中的信息,进行安装。
·
1 安装依赖包
yum -y install gcc gcc-c++
·
2 创建 haproxy 组和用户
#指定GID和UID,方便集群管理
groupadd -g 4000 haproxy
useradd -u 4000 -g 4000 -s /sbin/nologin haproxy
·
3 安装依赖库
·
yum 安装
yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel
·
源码安装
3.1、PCRE 库
官网:http://pcre.org/,下载源码包进行编译安装。
PCRE 是一个 perl 库,包括 perl 兼容的正则表达式库。供 Nginx 的 core 和 rewrite 模块使用。PCRE 从 8.20 版本开始,PCRE 库中提供了JIT。可使用 --enable-jit 参数构建。
当使用 --with-pcre=DIR 构建 PCRE 库时,可通过 --with-pcre-jit 配置参数启用 JIT 支持。PCRE JIT 可以显着加快正则表达式的处理速度。
tar -zxf pcre-8.38.tar.gz
cd pcre-8.38
./configure --prefix=/usr/local/pcre-8.38 --enable-jit
make && make install
3.2、ZLIB 库
官网:https://www.zlib.net/,下载源码包进行编译安装。
支持头压缩。供 Nginx 的 gzip 模块使用。
tar -zxf zlib-1.2.11.tar.gz
cd zlib-1.2.11
./configure --prefix=/usr/local/zlib-1.2.11
make && make install
3.3、OpenSSL
官网:https://www.openssl.org/,下载源码包进行编译安装。
支持 HTTPS 协议。供 Nginx 的 ssl 模块使用。
tar -zxf openssl-1.0.1h.tar.gz
cd openssl-1.0.1h
./config --prefix=/usr/local/openssl-1.0.1h
make -j 4
make install
·
4 查看内核版本
uname -r
3.10.0-1160.el7.x86_64
#README 中表示:2.6.28、3.x 及更高的版本可指定 linux2628。
·
5 编译安装 haproxy
tar -xvf haproxy-1.7.5.tar.gz
cd haproxy-1.7.5
#源码安装 pcre、zlib、openssl 库时的编译:指定库对应的安装路径
make -j 4 ARCH=x86_64 \
TARGET=linux2628 \
USE_PCRE=1 PCRE_INC=/usr/local/pcre-8.38/include/ PCRE_LIB=/usr/local/pcre-8.38/lib \
USE_OPENSSL=1 SSL_INC=/usr/local/openssl-1.0.1h/include/ SSL_LIB=/usr/local/openssl-1.0.1h/lib \
USE_ZLIB=1 ZLIB_INC=/usr/local/zlib-1.2.11/include/ ZLIB_LIB=/usr/local/zlib-1.2.11/lib
#yum 安装 pcre、zlib、openssl 库时的编译
make -j 4 ARCH=x86_64 \
TARGET=linux2628 \
USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1
#编译安装,使用变量 PREFIX 指定安装路径
make install PREFIX=/usr/local/haproxy
·
6 配置启动文件
cp -p haproxy-systemd-wrapper /usr/local/haproxy/sbin/
cp -p contrib/systemd/haproxy.service.in /usr/lib/systemd/system/haproxy.service
sed -i 's#CONFIG=/etc/haproxy/haproxy.cfg#CONFIG=/usr/local/haproxy/etc/haproxy.cfg#g' /usr/lib/systemd/system/haproxy.service
sed -i 's#PIDFILE=/run/haproxy.pid#PIDFILE=/usr/local/haproxy/temp/haproxy.pid#g' /usr/lib/systemd/system/haproxy.service
sed -i 's#@SBINDIR@#/usr/local/haproxy/sbin#g' /usr/lib/systemd/system/haproxy.service
systemctl daemon-reload
·
7 创建依赖路径
cd /usr/local/haproxy/
mkdir ./{etc,temp,log}
mkdir /var/lib/haproxy
·
8 编写配置文件(两个节点一样)
vim /usr/local/haproxy/etc/haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2 info
chroot /var/lib/haproxy
pidfile /usr/local/haproxy/temp/haproxy.pid
maxconn 40960
user haproxy
group haproxy
daemon
nbproc 2
cpu-map 1 0
cpu-map 2 1
stats socket /usr/local/haproxy/temp/haproxy.sock1 level admin mode 600 process 1
stats socket /usr/local/haproxy/temp/haproxy.sock2 level admin mode 600 process 2
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
log global
option dontlognull
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 120s
timeout check 10s
#errorfile 503 /usr/local/haproxy/errorfiles/503.http
#---------------------------------------------------------------------
# mycat service
# use custom HTTP listening port 48700 check
#---------------------------------------------------------------------
listen MycatService
mode tcp
bind 10.0.30.30:18066 #vip eth0:0
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_21 10.0.30.21:8066 check port 48700 inter 5s rise 2 fall 3
server mycat_22 10.0.30.22:8066 check port 48700 inter 5s rise 2 fall 3
#---------------------------------------------------------------------
# mycat admin
# use custom HTTP listening port 48700 check
#---------------------------------------------------------------------
listen MycatAdmin
mode tcp
bind 10.0.30.30:19066 #vip eth0:0
option tcplog
option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www
balance roundrobin
server mycat_21 10.0.30.21:9066 check port 48700 inter 5s rise 2 fall 3
server mycat_22 10.0.30.22:9066 check port 48700 inter 5s rise 2 fall 3
#---------------------------------------------------------------------
# HAProxy status page
#---------------------------------------------------------------------
listen HAProxyPage
bind-process 1
bind 172.168.30.30:18888 #vip eth1:0
stats enable
stats hide-version
stats refresh 30s
stats uri /haproxy-status
stats auth admin:123456
stats realm "haproxy status page of wpftest"
mode http
option httplog
·
9 配置记录 haproxy 日志的功能
yum -y install rsyslog
#在 rsyslog 中添加 haproxy.log
vim /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local2.* /usr/local/haproxy/log/haproxy.log
#开启 rsyslog 的远程日志功能
vim /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -r -m 0"
#-c 2 使用兼容模式,默认是 -c 5。
#-r 开启远程日志
#-m 0 标记时间戳。单位是分钟,为0时,表示禁用该功能
#重启 rsyslog
systemctl restart rsyslog
·
10 启动&自启 haproxy
PS: 先启动 master 节点的 haproxy,再启动 slave 节点的 keepalived 和 haproxy。
启动 master 节点的 haproxy 之前要确保 keepalived 已经启动,并且获取到了 vip,因为 haproxy 侦听的地址为 vip。
chown -R haproxy:haproxy /usr/local/haproxy
chown -R haproxy:haproxy /var/lib/haproxy
systemctl start haproxy && systemctl enable haproxy
如果启动 haproxy 时,终端出现以下输出:
Message from syslogd@localhost at Jul 13 18:27:11 ...
haproxy[19809]: proxy MycatService has no server available!
Message from syslogd@localhost at Jul 13 18:27:11 ...
haproxy[19810]: proxy MycatService has no server available!
Message from syslogd@localhost at Jul 13 18:27:14 ...
haproxy[19810]: proxy MycatAdmin has no server available!
Message from syslogd@localhost at Jul 13 18:27:14 ...
haproxy[19809]: proxy MycatAdmin has no server available!
则,需要修改 rsyslog.conf (记得重启 rsyslog)
vim /etc/rsyslog.conf
#注释以下配置
# Everybody gets emergency messages
#*.emerg :omusrmsg:*
·
11 查看 haproxy 是否启动成功
·
配置监听 mycat 是否存活
PS: haproxy 中配置的监听mycat端口为 48700,默认不存在,所以需要在 Mycat_21 和 Mycat_22 上都需要添加检测端口 48700 的脚本,为此需要用到 xinetd(linux 系统的基础服务)。
·
1 安装 xinetd
yum -y install xinetd
·
2 检查 xinetd 配置文件的扩展目录
vim /etc/xinetd.conf
#查看是否包含如下配置
includedir /etc/xinetd.d
·
3 增加 mycat_status
cd /etc/xinetd.d/
vim mycat_status
service mycat_status
{
flags = REUSE
socket_type = stream
port = 48700
wait = no
user = root
server = /usr/local/bin/mycat_status
log_type = FILE /var/log/mycat_status.log
log_on_failure += USERID
disable = no
}
·
4 编写 mycat_status 脚本
cat << "EOF" > /usr/local/bin/mycat_status
#!/bin/bash
#/usr/local/bin/mycat_status.sh
# This script checks if a mycat server is healthy running on localhost. It will
# return:
# "HTTP/1.x 200 OK\r" (if mycat is running smoothly)
# "HTTP/1.x 503 Service Unavailable\r" (else)
MYCAT_STATUS=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`
if [ $MYCAT_STATUS -eq 0 ];then
echo -e "HTTP/1.1 200 OK\r\n"
else
echo -e "HTTP/1.1 503 Service Unavailable\r\n"
fi
EOF
chmod +x /usr/local/bin/mycat_status
·
5 在 /etc/services 中加入 mycat_status 服务
vim /etc/services
#添加 mycat_status 服务
mycat_status 48700/tcp # mycat_status
·
6 重启 xinetd
systemctl restart xinetd
·
7 查看 mycat_status 服务是否启动成功
·
测试 Mycat 的高可用架构
·
1 通过 vip 连接 Mycat 查看数据
[root@wpf-test-20 ~]#mysql -h10.0.30.30 -umycat -p123456 -P18066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------+
| DATABASE |
+--------------+
| mycat_testdb |
+--------------+
1 row in set (0.01 sec)
MySQL [(none)]> use mycat_testdb;
Database changed
MySQL [mycat_testdb]> select * from test111;
+------+-------------+
| id | name |
+------+-------------+
| 1 | test |
| 2 | wpf-test-22 |
+------+-------------+
2 rows in set (0.00 sec)
·
2 关闭 master 节点的 Mycat,再次查看
cd /usr/local/mycat
./bin/mycat stop
[root@wpf-test-20 ~]#mysql -h10.0.30.30 -umycat -p123456 -P18066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> use mycat_testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [mycat_testdb]> select * from test111;
+------+-------------+
| id | name |
+------+-------------+
| 1 | test |
| 2 | wpf-test-22 |
+------+-------------+
2 rows in set (0.01 sec)
发现,仍然可以连接并且查看数据。
·
3 关闭 master 节点的 haproxy,再次查看
3.1 开启 master 节点的 mycat,关闭 haproxy
cd /usr/local/mycat
./bin/mycat stop
systemctl stop haproxy
3.2 查看 vip 是否切换
·
3.3 使用 vip 连接 mycat,进行查看
[root@wpf-test-20 ~]#mysql -h10.0.30.30 -umycat -p123456 -P18066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> use mycat_testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [mycat_testdb]> select * from test111;
+------+-------------+
| id | name |
+------+-------------+
| 1 | test |
| 2 | wpf-test-22 |
+------+-------------+
2 rows in set (0.00 sec)
发现,仍然可以连接并且查看数据。
·
4 手动修改master节点的优先级,关闭slave节点的haproxy
4.1 修改master节点的优先级(记得重启keepalived)
vim /usr/local/keepalived/etc/keepalived/keepalived.conf
......
priority 110
......
PS: 每次故障修复之后,优先级(priority) +10 即可,权重(weight)不用修改。
例如:
初始priority和weight的信息
master节点:priority=100,weight=-10
slave节点:priority=95,weight=10
第一次故障:当master节点的haproxy故障时,它的priority变为90;而slave的priority为95,vip切换。
·
第一次修复后priority和weight的信息
master节点:priority=110,weight=-10
slave节点:priority=95,weight=10
·
第二次故障:当slave节点的haproxy故障时,它的priority变为95;而master的priority为100,vip切换。
PS: 为什么此时master的priority为100?是因为,当slave节点的haproxy故障之前,master节点的haproxy一直是未启动状态,priority就需要减去10(110-10),所以为100。
·
第二次修复后priority和weight的信息
master节点:priority=110,weight=-10
slave节点:priority=105,weight=10
·
第三次故障:当master节点的haproxy再次故障时,它的priority变为100;而slave的priority为105,vip切换。
.....
·
4.2 关闭slave节点的haproxy
systemctl stop haproxy
·
4.3 查看 vip 是否切换
截图省略…
·
4.4 使用 vip 连接 mycat,进行查看
[root@wpf-test-20 ~]#mysql -h10.0.30.30 -umycat -p123456 -P18066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> use mycat_testdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [mycat_testdb]> select * from test111;
+------+-------------+
| id | name |
+------+-------------+
| 1 | test |
| 2 | wpf-test-22 |
+------+-------------+
2 rows in set (0.00 sec)
发现,仍然可以连接并且查看数据。
·
至于 keepalived 和系统的故障,就不做测试了;肯定会触发vip的切换。
至此,Mycat 的高可用架构完成。