haproxy + keepalived + mycat 高可用与负载均衡

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 的高可用架构完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值