Keepalive+Haproxy+Mycat高可用环境搭建

本文参考https://www.cnblogs.com/hk315523748/p/6094656.html

一、软件版本

操作系统:CentOS-7-x86_64
JDK版本:1.8.0_221
HAProxy版本:HA-Proxy version 1.8.20 2019/04/25
MyCat版本:mycat-1.5.1-RELEASE-20161130213509
MySQL版本:Server version: 10.2.6-MariaDB-log MariaDB Server

二、部署环境规划

名称 ip 端口
mysql-master 192.168.100.70 3306
mysql-slave 192.168.100.71 3306
mycat-1 192.168.100.70 8066
mycat-2 192.168.100.71 8066
haproxy-1 192.168.100.70
haproxy-2 192.168.100.71
keepalived-1 192.168.100.70
keepalived-2 192.168.100.71

三、集群部署架构图如下

  Keepalive+Haproxy+Mycat高可用环境搭建 image.png

说明:HAProxy为主备模式,当主发生故障时会自动切换到备机。同时haproxy负责将请求分发到MyCat集群上的mycat节点,起到负载均衡的作用;HAProxy也能检测到MyCat是否存活,HAProxy只会将请求转发到存活的MyCat上。如果一台MyCat服务器宕机,HAPorxy转发请求时不会转发到宕机的MyCat上,所以MyCat依然可用。

四、mysql的安装及主从复制配置

详请参考《MariaDB(Mysql)一主一从配置》

五、Mycat的安装

详请参考《Mycat+MariaDB/Mysql实现读写分离》

六、搭建xinetd服务

在所有MyCat服务所在主机中增加状态检查服务脚本。此操作为HaProxy提供对MyCat服务状态检查的依据。本案例中使用xinetd实现,通过xinetd,HAProxy可以用httpchk来检测Mycat的存活状态。(xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器。经常用来管理多种轻量级Internet服务。xinetd提供类似于inetd+tcp_wrapper的功能,但是更加强大和安全。xinetd为linux系统的基础服务)
1、安装xinetd
yum install -y xinetd

2、在/etc/xinetd.conf文件末尾添加includedir /etc/xinetd.d内容.
安装完成后在/etc目录下会有一个名为xinetd.conf的文件,检查文件底部是否有includedir /etc/xinetd.d内容,若没有,则需要手动添加。

3、检查目录/etc/xinetd.d目录是否存在,不存在还需要创建该目录。

4、创建/etc/xinetd.d/mycat_status文件,其内容如下:

service mycat_status
{
        flags = REUSE
        ## 使用该标记的socket_type为stream,需要设置wait为no
        ## 封包处理方式,Stream为TCP数据包
        socket_type = stream
        ## 服务监听端口
        port = 48700
        ## 表示不需等待,即服务将以多线程的方式运行
        wait = no
        ## 执行此服务进程的用户
        user = root
        ## 需要启动的服务脚本
        server =/usr/local/bin/mycat_status
        ## 登录失败记录的内容
        log_on_failure += USERID
        ## 要启动服务,将此参数设置为no
        disable = no
}

注意:文件中的注释要单行,不可以行尾注释

5、添加 /usr/local/bin/mycat_status 服务脚本
vim /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 Internal Server Error\r" (else)

Mycat=`/usr/local/mycat/bin/mycat status | grep 'not running' | wc -l`

if [ "$Mycat" = "0" ]; then
    /bin/echo -e "HTTP/1.1 200 OK\r\n"
else
    /bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
fi

6、给新增脚本赋予可执行权限

chmod 755 /usr/local/bin/mycat_status

7、在 /etc/services 中加入 mycat_status 服务
vi /etc/services,在末尾加入以下内容
mycat_status 48700/tcp # mycat_status

8、启动xinetd服务:systemctl start xinetd.service

9、验证mycat_status服务是否成功启动
netstat -antup|grep 48700

[root@localhost xinetd.d]# netstat -antup|grep 48700
tcp6       0      0 :::48700                :::*                    LISTEN      3711/xinetd         
[root@localhost xinetd.d]# 

10、测试脚本是否有效
/usr/local/bin/mycat_status

[root@localhost xinetd.d]# /usr/local/bin/mycat_status
HTTP/1.1 200 OK
[root@localhost xinetd.d]#

七、Haproxy的安装

1、Haproxy的简介
HAProxy各版本的官方文档:http://cbonte.github.io/haproxy-dconv/index.html
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
MyCat官方推荐使用HAProxy做MyCat的高可用负载均衡代理。
本文采用的haproxy-1.8.20版本

2、下载安装包并解压
tar -xzvf haproxy-1.8.20.tar.gz

3、安装预编译依赖包
yum install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

4、编译
cd到刚解压的目录并执行命令:
make TARGET=linux2628 ARCH=x86_64 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 PREFIX=/usr/local/haproxy

说明:TARGET是指定内核版本,高于2.6.28的建议设置为linux2628,Linux操作系统内核版本查看命令# uname -r, ARCH指定系统架构,openssl pcre zlib 这三个包需要安装不然不支持

5、创建安装目录 /usr/local/haproxy
mkdir /usr/local/haproxy

6、执行安装
cd到解压的目录并执行命令
make install PREFIX=/usr/local/haproxy

7、创建配置文件目录

[root@localhost haproxy]# mkdir -p /usr/local/haproxy/conf
[root@localhost haproxy]# mkdir -p /etc/haproxy/

8、从配置文件模版复制配置文件,并添加配置文件软连接

[root@localhost haproxy-1.8.20]# cp /home/ding/soft/haproxy-1.8.20/examples/option-http_proxy.cfg /usr/local/haproxy/conf/haproxy.cfg
[root@localhost haproxy-1.8.20]# ln -s /usr/local/haproxy/conf/haproxy.cfg /etc/haproxy/haproxy.cfg

9、拷贝错误页面,并添加目录软连接(HTTP模式选配)

cp -r /home/ding/soft/haproxy-1.8.20/examples/errorfiles /usr/local/haproxy/
ln -s /usr/local/haproxy/errorfiles /etc/haproxy/errorfiles

10、拷贝开机启动文件,并赋予可执行权限

cp /home/ding/soft/haproxy-1.8.20/examples/haproxy.init /etc/rc.d/init.d/haproxy
chmod +x /etc/rc.d/init.d/haproxy

11、添加haproxy命令脚本软连接

ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin

12、设置HAProxy开机启动(可选)

chkconfig --add haproxy
chkconfig haproxy on

13、根据以上HAProxy配置文件要求做以下配置
添加haproxy用户组和用户,创建chroot运行的路径

[root@localhost haproxy]# groupadd haproxy
[root@localhost haproxy]# useradd -g haproxy haproxy
[root@localhost haproxy]# mkdir /usr/share/haproxy

14、开启rsyslog的haproxy日志记录功能
默认情况下 haproxy是不记录日志的,如果需要记录日志,还需要配置系统的syslog,在linux系统中是rsyslog服务。syslog服务器可以用作一个网络中的日志监控中心,rsyslog是一个开源工具,被广泛用于Linux系统以通过TCP/UDP协议转发或接收日志消息。安装配置rsyslog服务:

yum install rsyslog 

修改配置文件:

vi /etc/rsyslog.conf
把$ModLoad imudp和$UDPServerRun 514前面的 # 去掉
$ModLoad imudp  # 是模块名,支持UDP协议
$UDPServerRun 514 #允许514端口接收使用UDP和TCP协议转发过来的日志,而rsyslog在默认情况下,正是在514端口监听UDP

在/etc/rsyslog.d/目录下创建 haproxy的日志配置文件haproxy.log。

[root@localhost rsyslog.d]# touch /etc/rsyslog.d/haproxy.log
[root@localhost rsyslog.d]# vim /etc/rsyslog.d/haproxy.log

文件内容如下:

local0.* /var/log/haproxy.log
&~

说明:如果不加上面的的"&~"配置则除了在/var/log/haproxy.log中写入日志外,也会写入/var/log/message文件中。
配置保存后重启rsyslog服务:systemctl status rsyslog.service

八、HAProxy配置MyCat负载均衡集群

HAProxy支持TCP(第四层)和HTTP(第七层)应用的代理,本节课程我们使用HAProxy来做MyCat的负载均衡代理使用的是TCP模式。在4层模式下HAProxy仅在客户端和服务器之间转发双向流量。HAProxy配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障,HAProxy会自动将该服务器摘除,故障恢复后会自动将该服务器加入进来。

1、修改haproxy-1及haproxy-2的配置文件
vim /usr/local/haproxy/conf/haproxy.cfg
haproxy-1的内容如下:

global
  # 定义全局的syslog服务器,最多可以定义2个
  # local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别
  log 127.0.0.1 local0  debug ##记日志的功能
  #log 127.0.0.1 local1 info
  maxconn 4096 # 设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的
  chroot /usr/share/haproxy  # 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行,chroot() 操作,可以提升 haproxy 的安全级别
  user haproxy 
  group haproxy 
  daemon # 设置haproxy后台守护进程形式运行
  nbproc 1 ## 指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认为止启动1个进程,一般只在单进程仅能打开少数文件描述符的场中中才使用多进程模式
  node edu-haproxy-01  ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时
  description edu-haproxy-01 ## 当前实例的描述信息

defaults
  log global # 继承global中log的定义
  option dontlognull 
  retries 3
  option redispatch 
  maxconn 2000  # 前端的最大并发连接数(默认为2000)
  timeout connect 5000
  timeout client 50000
  timeout server 50000
  #contimeout 5000
  #clitimeout 50000
  #srvtimeout 50000

listen admin_status 
  bind :48800 ##VIP 
  stats uri /admin-status ##统计页面
  stats auth admin:admin  # 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
  mode http
  option httplog

listen allmycat_service 
  bind :33066  ##转发到 mycat 的 8066 端口,即 mycat 的服务端口
  mode tcp 
  option tcplog
  option tcpka ## 是否允许向server和client发送keepalive
  option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www 
  balance roundrobin
  server mycat_70 192.168.100.70:8066 check port 48700 inter 5s rise 2 fall 3
  server mycat_71 192.168.100.71:8066 check port 48700 inter 5s rise 2 fall 3
  #srvtimeout 20000
  timeout server 20000

haproxy-2的内容如下:

global
  # 定义全局的syslog服务器,最多可以定义2个
  # local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别
  log 127.0.0.1 local0 ##记日志的功能
  #log 127.0.0.1 local1 info
  maxconn 4096 # 设定每个haproxy进程所接受的最大并发连接数,其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的
  chroot /usr/share/haproxy  # 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行,chroot() 操作,可以提升 haproxy 的安全级别
  user haproxy 
  group haproxy 
  daemon # 设置haproxy后台守护进程形式运行
  nbproc 1 ## 指定启动的haproxy进程个数,只能用于守护进程模式的haproxy;默认为止启动1个进程,一般只在单进程仅能打开少数文件描述符的场中中才使用多进程模式
  node edu-haproxy-01  ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时
  description edu-haproxy-01 ## 当前实例的描述信息

defaults
  log global # 继承global中log的定义
  option dontlognull 
  retries 3
  option redispatch 
  maxconn 2000  # 前端的最大并发连接数(默认为2000)
  timeout connect 5000
  timeout client 50000
  timeout server 50000

listen admin_status 
  # VIP
  bind :48800
  stats uri /admin-status ##统计页面
  stats auth admin:admin  # 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
  mode http
  option httplog

listen allmycat_service 
  bind :33066  ##转发到 mycat 的 8066 端口,即 mycat 的服务端口
  mode tcp 
  option tcplog
  option tcpka ## 是否允许向server和client发送keepalive
  option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www 
  balance roundrobin
  server mycat_50 192.168.100.70:8066 check port 48700 inter 5s rise 2 fall 3
  server mycat_51 192.168.100.71:8066 check port 48700 inter 5s rise 2 fall 3
  #srvtimeout 20000
  timeout server 20000

具体参数说明可参考官方配置文档 /usr/local/haproxy/doc/haproxy/configuration.txt或GitHub连接:http://cbonte.github.io/haproxy-dconv/configuration-1.5.html

2、为HAProxy添加Linux系统用户

[root@localhost conf]# groupadd haproxy
[root@localhost conf]# useradd -g haproxy haproxy
[root@localhost conf]# mkdir /usr/share/haproxy

3、创建chroot运行的路径

[root@localhost conf]# mkdir /usr/share/haproxy

4、配置系统内核IP包转发规则
修改文件/etc/sysctl.conf,修改内容为:net.ipv4.ip_forward = 1,然后执行sysctl -p使其生效

5、重启haproxy:systemctl restart haproxy

九、查看HAProxy提供的WEB统计应用

http://192.168.100.70:48800/admin-status
http://192.168.100.71:48800/admin-status
用户名和密码都是admin,参考/usr/local/haproxy/conf/haproxy.cfg配置文件。
注意:安装完一个HAProxy之后,可以通过mysql命令控制台直接测试访问HAProxy。命令为:mysql -uroot -p123456 -h192.168.100.70 -P33066

十、安装Keepalived

1、简介

官网: http://www.keepalived.org/
Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Haproxy 可以实现 web 前端服务的高可用。Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议, VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生。 MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址, VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。

2、上传keepalived-1.4.5.tar.gz到Linux服务器

3、安装依赖
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel libnfnetlink-devel

4、解压并安装

tar -xzvf keepalived-1.4.5.tar.gz
cd keepalived-1.4.5
./configure --prefix=/usr/local/keepalived
make && make install

5、将Keepalived安装成Linux系统服务
因为没有使用 keepalived 的默认路径安装(默认是/usr/local) ,安装完成之后,需要做一些工作复制默认配置文件到默认路径。

mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

复制 keepalived 服务脚本到默认的地址

cp /usr/local/keepalived/sbin/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

6、修改Keepalived配置文件

  • 修改haproxy1服务器中的配置文件/etc/keepalived/keepalived.conf,内容如下:
! Configuration File for keepalived
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP
    router_id haproxy1 ## 标识本节点的字符串,通常为 hostname,需要修改/etc/hosts
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
## 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。
## 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少。
## 其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径
    interval 2 ## 检测时间间隔
    weight 2 ## 如果条件成立,权重+2
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {
    state BACKUP ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都设置为 BACKUP,
    ## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备
    interface eth0 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth0
    virtual_router_id 35 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,
    ## 相同的 VRID 为一个组,他将决定多播的 MAC 地址
    priority 120 ## 节点优先级,值范围 0-254, MASTER 要比 BACKUP 高
    nopreempt ## 主设备(priority 值大的)配置一定要加上 nopreempt,否则非抢占也不起作用
    advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s
    ## 设置验证信息,两个节点必须一致
    authentication {
        auth_type PASS
        auth_pass 1111 ## 真实生产,按需求对应该过来
    }
    ## 将 track_script 块加入 instance 配置块
    track_script {
        chk_haproxy ## 检查 HAProxy 服务是否存活
    }
    ## 虚拟 IP 池, 两个节点设置必须一样
    virtual_ipaddress {
        192.168.100.78 ## 虚拟 ip,可以定义多个,每行一个
    }
}
  • 修改haproxy2服务器中的配置文件/etc/keepalived/keepalived.conf,内容如下:
! Configuration File for keepalived
global_defs {
    router_id haproxy2
}
vrrp_script chk_haproxy {
    script "/etc/keepalived/haproxy_check.sh"
    interval 2
    weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 35
    priority 110
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_haproxy
    }
    virtual_ipaddress {
        192.168.100.78
    }
}

特别注意: 如果非抢占模式不生效, 在 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)

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

mkdir -p /usr/local/keepalived/log
vi /etc/keepalived/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

8、启动Keepalived

systemctl start keepalived
常用命令:
停止: systemctl stop keepalived
启动: systemctl start keepalived
重启: systemctl restart keepalived
查看状态: systemctl status keepalived

十一、测试

1、关闭VIP所在节点中的HAProxy
关闭后,Keepalived会自动启动HAProxy。
关闭Keepalived命令 : service haproxy stop
查看vip命令: ip add
查看进程命令: ps -ef | grep haproxy

2关闭VIP所在节点中的Keepalived
关闭后,VIP192.168.100.70会被另外一个主机抢占(192.168.199.102)
关闭Keepalived命令 : service keepalived stop
查看192.168.100.71中的VIP: ip add

查看192.168.100.10中的VIP : ip add



作者:丁庆华
链接:https://www.jianshu.com/p/e5188784faec
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上一篇:mysql进阶学习三之mycat读写分离和分库分表


下一篇:MyCat