Mycat高可用负载均衡的实现

一.整体系统架构图

二. 部署规划

三.思路讲解

(1)由下到上,MySQL我们做了主从复制,可以从服务器实时备份数据库,如果大家觉得不安全可以采用一主多从、多主多从方式;

(2)Mycat负责MySQL的读写分离,并且使用haproxy实现Mycat集群,既可以减少服务器压力,也可以保证在一台Mycat宕机后,haproxy转发请求到其他Mycat服务器上,同时实现负载均衡的作用;

(3)keepalived则实现haproxy的高可用,在haproxy上同时部署keepalived,keepalived负责vip的抢占,而vip优先级由keepalived.conf配置文件中priority参数决定,一般哪台主机上的keepalived服务先启动就会抢占到vip,只要先启动也能抢到(要注意避免 Keepalived的资源抢占问题)

四.安装部署

1.HAProxy_02(192.168.112.33)节点的部署

HAProxy第二个节点的部署参考Mycat集群部署(HAProxy+Mycat)

需将node 、 description这两个参数修改为自己所需要的描述

其余配置基本一致,部署完成后进行测试

登录统计页面查看如下

2.keepalived(192.168.112.32、192.168.112.33)部署

下载keepalived并解压安装,这里我直接将已经下载好的源码包放在服务器

# 源码包安装 keepalived 需 openssl 依赖
# 需先安装 openssl 这里为源码包安装,如果已经安装可忽略
# 在文件夹下解压缩
tar -zxvf openssl-1.1.0e.tar.gz
# 进入解压的目录
cd openssl-1.1.0e
# 设定Openssl 安装,( --prefix )参数为欲安装之目录,也就是安装后的档案会出现在该目录下:
./config
#./config --prefix=/usr/local/openssl
./config -t
# 执行编译并安装
make && make install
# 查看openssl版本openssl version出现以下提示
openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
# 执行以下命令
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
# 查看路径
which openssl
# 查看版本
openssl version
# 解压 keepalived 包
tar -zxf keepalived-1.2.18.tar.gz
# 切换至解压后的 keepalived 包中
cd keepalived-1.2.18/
# 设定 keepalived 安装
./configure --prefix=/usr/local/keepalived
# 执行编译并安装
make && make install
# 创建 keepalived 目录
mkdir /etc/keepalived
# 复制默认配置文件到 /etc/keepalived/ 
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# 复制 keepalived 服务脚本到默认的地址
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
ln -s /usr/local/keepalived/sbin/keepalived /sbin/
# 设置 keepalived 服务开机启动
chkconfig keepalived on

修改keepalived.conf配置文件

(1) keepalived_master节点配置文件(192.168.112.32)

! Configuration File for keepalived

global_defs {
   # 这里有keepalived自带的邮箱提醒服务,但是需要开启sendmail,可采用第三方监控
   ## 标识本节点的字条串,通常为 hostname
   router_id keepalived32
}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
## 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。
## 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少。
## 其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_haproxy {
        ## 检测 haproxy 状态的脚本路径
        script "/etc/keepalived/haproxy_check.sh"
        ## 检测时间间隔
        interval 2
        ## 如果条件成立,权重+2
        weight 2
}

## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都设置为 BACKUP,
    ## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备
    state BACKUP
    ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth3
    interface eno16780032
    ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,
    ## 相同的 VRID 为一个组,他将决定多播的 MAC 地址
    virtual_router_id 34
    ## 节点优先级,值范围 0-254, MASTER 要比 BACKUP 高
    priority 100
    ## 主设备(priority 值大的)配置一定要加上 nopreempt,否则非抢占也不起作用
    nopreempt
    ## 组播信息发送间隔,两个节点设置必须一样,默认 1s
    advert_int 1
    ## 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        ## 真实生产,按需求对应该过来
        auth_pass 1111
    }
    ## 将 track_script 块加入 instance 配置块
    track_script {
        ## 检查 HAProxy 服务是否存活
        chk_haproxy
    }
    ## 虚拟 IP 池, 两个节点设置必须一样
    virtual_ipaddress {
        ## 虚拟 ip,可以定义多个,每行一个
        192.168.112.34
    }
}

(2) keepalived_slave节点配置文件(192.168.112.33)

! Configuration File for keepalived

global_defs {
   router_id keepalived33
}

vrrp_script chk_haproxy {
        script "/etc/keepalived/haproxy_check.sh"
        interval 2
        weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eno16780032
    virtual_router_id 34
    priority 90

    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        192.168.112.34
    }
}

如果非抢占模式不生效, 在 Keepalived 的故障节点恢复后会再次导抢占 vip,从而因 vip 切换而闪断带来的风险。 按以上配置,配置了 Keepalived 非抢占模式, 配置及注意点如下:

(1) 主设备、 从设备中的 state 都设置为 BACKUP
(2) 主设备、从设备中都不要配置 mcast_src_ip (本机 IP 地址)
(3) 默认主设备(priority 值大的 Keepalived 节点) 配置一定要加上 nopreempt,否则非抢占不起作用
(4) 防火墙配置允许组播(主、备两台设备上都需要配置, keepalived 使用 224.0.0.18 作为 Master 和Backup 健康检查的通信 IP)

Centos7
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
Centos6
# iptables -I INPUT -i eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
(eth3 为主机的网卡设备名称,生产环境服务器可以用独立网卡来处理组播和心跳检测等)
# service iptables save
重启防火墙:
# service iptables restart

3.编写haproxy监控状态脚本

我们编写的脚本为/etc/keepalived/haproxy_check.sh (已在 keepalived.conf 中配置)
脚本要求:如果 haproxy 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalied将虚拟 ip 绑定到 BACKUP 机器上。

# 创建keepalived日志目录
mkdir -p /usr/local/keepalived/log
# 编写haproxy状态检测脚本
vim /etc/keepalived/haproxy_check.sh

haproxy_check.sh脚本内容如下:

#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
HAPS=`ps -C haproxy --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
if [ $HAPS -eq 0 ];then
echo $START_HAPROXY >> $LOG_FILE
$START_HAPROXY >> $LOG_FILE 2>&1
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
echo "start haproxy failed, killall keepalived" >> $LOG_FILE
killall keepalived
fi
fi

保存后,并对脚本赋权

chmod +x /etc/keepalived/haproxy_check.sh

五.测试

1.启动keepalived

# 启动 keepalived 服务
systemctl start keepalived

keepalived服务管理命令

# centos6
# 启动 keepalived 服务
# service keepalived start
# 停止 keepalived 服务
# service keepalived stop
# 查看 keepalived 服务
# service keepalived status
# 重启 keepalived 服务
# service keepalived restart
# centos7
# 启动 keepalived 服务
systemctl start keepalived
# 停止 keepalived 服务
systemctl stop keepalived
# 查看 keepalived 服务
systemctl status keepalived
# 重启 keepalived 服务
systemctl restart keepalived

2.高可用测试思路

(1)关闭192.168.112.32中的haproxy负载均衡,keepalived会将它重新启动

(2)关闭192.168.112.32中的 Keepalived,VIP(192.168.112.34)会被 192.168.112.33抢占

此时通过VIP(192.168.112.34)访问haproxy集群,访问到的也是192.168.112.33

(3)文章开头提到避免vip资源抢占问题,我们这里将192.168.112.32的keepalived服务重启

VIP(192.168.112.34)会保留在192.168.112.33上,也不会出现192.168.112.32抢占VIP

(4)模拟haproxy(192.168.112.33)负载故障

我们这里将haproxy配置文件备份或者删除并kill掉haproxy进程

haproxy_check.sh脚本中首先会去进行重启haproxy,无法重启则将keepalived杀掉

由上我们已经将haproxy杀掉,重启找不到haproxy配置文件,则无法重启,将keepalived杀掉

而192.168.112.32重新抢占VIP(192.168.112.34)

此时通过VIP访问haproxy,则访问的是192.168.112.32

3.通过 vip 访问数据库

测试思路与Mycat集群部署(HAProxy+Mycat)思路一致

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在第一篇文章中,我们介绍了如何使用Mycat实现高可用数据库集群,包括Mycat的安装和配置,以及MySQL主从复制的设置。在本文中,我们将继续介绍如何使用Mycat来提高数据库的可用性。 1. 使用Mycat实现读写分离 在上一篇文章中,我们已经将MySQL数据库设置成了主从复制,主库用于写操作,从库用于读操作。在Mycat中,我们可以使用读写分离来进一步提高数据库的性能和可用性。 首先,需要在Mycat的server.xml配置文件中添加读写分离的配置: ``` <system> <property name="balanceType">1</property> <property name="writeType">0</property> <property name="readType">1</property> </system> ``` 其中,balanceType表示负载均衡的方式,1表示使用轮询算法;writeType表示写操作的路由方式,0表示直接路由到主库;readType表示读操作的路由方式,1表示路由到从库。 然后,在Mycat的schema.xml配置文件中,需要为每个表指定读写分离的规则,例如: ``` <table name="user"> <rule> <columns>id</columns> <algorithm>modula(#id, 2)</algorithm> </rule> <childTable /> <rule> <columns>id</columns> <algorithm>modula(#id, 2)</algorithm> </rule> </table> ``` 其中,<columns>指定用于路由的列,<algorithm>指定路由算法。在上面的例子中,我们使用modula算法将id为奇数的记录路由到从库1,将id为偶数的记录路由到从库2。 2. 使用Mycat实现分库分表 当单个数据库无法满足应用程序的需求时,我们可以通过分库分表的方式来扩展数据库的容量和性能。在Mycat中,可以通过配置schema.xml文件来实现分库分表。 首先,需要在Mycat的server.xml文件中添加数据源的配置: ``` <dataHost name="ds0" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="host1" url="jdbc:mysql://host1:3306/test" user="root" password="123456"/> <readHost host="host2" url="jdbc:mysql://host2:3306/test" user="root" password="123456"/> <readHost host="host3" url="jdbc:mysql://host3:3306/test" user="root" password="123456"/> </dataHost> ``` 其中,name属性指定数据源的名称,maxCon和minCon指定连接池的大小,writeType和readType指定路由方式,dbType指定数据库类型,dbDriver指定数据库驱动,switchType指定连接池的切换方式,slaveThreshold指定从库的阈值,heartbeat指定心跳SQL。 然后,在schema.xml文件中,需要为每个表设置分库分表的规则,例如: ``` <table name="user" dataNode="dn1,dn2"> <rule> <columns>id</columns> <algorithm>modula(#id, 2)</algorithm> </rule> <childTable /> <rule> <columns>id</columns> <algorithm>modula(#id, 2)</algorithm> </rule> </table> <dataNode name="dn1" dataHost="ds0" database="test1" /> <dataNode name="dn2" dataHost="ds0" database="test2" /> ``` 其中,<dataNode>指定数据节点的配置,name属性指定节点名称,dataHost属性指定数据源名称,database属性指定数据库名称。在上面的例子中,我们使用modula算法将id为奇数的记录路由到dn1节点,将id为偶数的记录路由到dn2节点。 3. 总结 通过使用Mycat实现读写分离和分库分表,我们可以进一步提高数据库的可用性和性能。除此之外,Mycat还支持水平和垂直扩展、数据备份和恢复等功能,可以满足各种应用场景的需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值