Haproxy+Keepalived配置高可用的Mycat

1.结构说明

    Mycat是分库分表的利器,官方的说明文档历史较久了,文档案例各模块的版本也比较旧,由于工作中涉及到该知识,我就整理了一下。
    数据规划:

系统IP192.168.1.2192.168.1.3192.168.1.252
keepalived角色主节点备节点虚拟IP
mycat业务端口806680668096
mycat管理端口906690668097
操作系统centos7centos7/
mycat版本1.61.6/
haproxy版本2.0.142.0.14/
keepalived版本2.0.202.0.20/

    架构图:
在这里插入图片描述
    keepalived与haproxy需要部署在同一台服务器上。当keepalived主节点192.168.1.2故障,流量走从节点192.168.1.3,主节点恢复后,抢占虚拟IP,流量重新回到主节点。keepalived通过check_haproxy.sh脚本监控本机haproxy,发现haproxy进程消失就进行重启。haproxy连接后端mycat,任一mycat故障不会影响业务。
    注意:haproxy为keepalived子进程,使用systemctl关闭keepalived会导致haproxy停止。

2.准备工作

    (1)将haproxy-2.0.14.tar.gz,keepalived-2.0.20.tar.gz,haproxy.cfg文件,keepalived.conf文件和scripts文件夹上传至服务器。
    scripts文件夹内共5个脚本,keepalived调用check_haproxy.sh检查和启动haproxy,其余4个负责将相关信息写入日志,脚本内容见附录。
    (2)通过修改/etc/sysctl.conf进行内核参数优化,重新加载配置:

# sysctl -p

    (3)通过修改/etc/security/limits.conf进行系统文件优化,重新登录使用ulimit -a进行检查。

*                soft    nofile         65536
*                hard    nofile         65536
*               soft     nproc        256200
*               hard     nproc        256200

    (4)新建文件夹,作为安装目录和日志目录。

# mkdir /usr/local/haproxy
# mkdir /usr/local/keepalived
# mkdir /var/log/haproxy
# mkdir /var/log/keepalived

3.安装步骤

3.1 haproxy安装步骤
# yum install -y pcre-devel bzip2-devel gcc gcc-c++ make
# useradd -M haproxy
# make TARGET=linux-glibc PREFIX=/usr/local/haproxy ARCH=x86_64
# make install PREFIX=/usr/local/haproxy
# cd /usr/local/haproxy
# cp /usr/local/src/haproxy.cfg .
# chown -R haproxy:haproxy *

    启动命令

# /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg
3.2 配置haproxy日志

    默认haproxy是不记录日志的,为了记录日志还需要配置syslog模块,在linux下是rsyslogd服务。
    1、确认已安装rsyslog服务:

yum -y install rsyslog

    2、新建日志文件/etc/rsyslog.d/haproxy.conf ,内容如下:

$ModLoad imudp 
$UDPServerRun 514 
 
local0.* /var/log/haproxy/haproxy.log

    3、编辑/etc/rsyslog.conf文件:
    (1)确认是否存在以下内容,如果没有手动添加:

# Include all config files in /etc/rsyslog.d/ 
$IncludeConfig /etc/rsyslog.d/*.conf 

    (2)在local7.* /var/log/boot.log 的下面加入以下内容(增加后的效果如下):

# Save boot messages also to boot.log 
local7.*                                      /var/log/boot.log 
local0.*                             /var/log/haproxy/haproxy.log

    (3)配置日志切割,新建/etc/logrotate.d/haproxy文件,内容如下:

/var/log/haproxy/*.log 
{
    daily
    rotate 40
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
3.3 keepalived安装

    1、修改系统配置文件/etc/sysctl.conf。net.ipv4.ip_nonlocal_bind=1表示启动haproxy的时候,允许忽视VIP的存在。net.ipv4.ip_forward=1表示haproxy代理服务器同时也要打开内核的转发功能。

# sysctl -p

    2、编译安装

# rpm -qe openssl-devel 确认已安装openssl-devel软件包
# ./configure --prefix=/usr/local/keepalived && make && make install

    3、创建文件夹,拷贝keepalived.conf文件和scripts文件夹至/etc/keepalived/,修改并确认配置文件。

# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# mkdir /etc/keepalived
# chmod 644 /etc/keepalived/keepalived.conf

    注意:
    (1)keepalived.conf中主备节点的定义,优先级和网卡名称;
    (2)virtual_router_id的默认值51需要检查,不能在同网段中重复出现;
    (3)/etc/keepalived/keepalived.conf日志不能 +x 权限,否则会报错。
    4、配置开机启动

# vim /lib/systemd/system/keepalived.service //注释掉KillMode=process,因为使用process不能关闭子进程,所以使用默认control-group模式。
# systemctl daemon-reload
# systemctl enable keepalived.service

    5、日志切割
    (1)编辑/usr/local/keepalived/etc/sysconfig/keepalived,把KEEPALIVED_OPTIONS="-D" 修改为KEEPALIVED_OPTIONS="-D -d -S 0"
    (2)在/etc/rsyslog.conf添加:

local0.*                        /var/log/keepalived/keepalived.log

    (3)在/etc/logrotate.d/haproxy中添加配置,进行日志切割:

/var/log/keepalived/*.log

    重启rsyslog,完成配置。

4.测试脚本

    配置完成,可使用测试脚本进行测试。内容如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("192.168.1.252", "root", "123456", "test_database_name", charset='utf8',port=8096 )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# 使用execute方法执行SQL语句
cursor.execute("SELECT COUNT(userid) FROM test_table_name")

# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()

print "Database count : %d " % data

# 关闭数据库连接
db.close()

5.调测

    登陆 http://192.168.1.252:48800/admin-status,输入设定的用户名密码,即可查询haproxy当前信息。
在这里插入图片描述

参考文献

[1]Mycat项目组.Mycat权威指南[EB/OL].http://www.mycat.org.cn/document/mycat-definitive-guide.pdf,2018-07-25.

附录

附各脚本配置文件

haproxy.cfg
global 
    log 127.0.0.1   local0 ##记日志的功能 
    maxconn 60000 
    chroot /usr/local/haproxy 
    user haproxy 
    group haproxy 
    daemon 

defaults 
    log    global 
    option    dontlognull 
    retries    3 
    option redispatch 
    maxconn    30000 
    timeout connect    5000 
    timeout client    50000 
    timeout server    50000 

listen  admin_status 
    bind 192.168.1.252:48800 ##VIP 
    stats uri /admin-status      ##统计页面 
    stats auth  admin:admin 
    mode    http 
    option  httplog 

listen    allmycat_service 
    bind 192.168.1.252:8096 ##转发到mycat的8066端口,即mycat的服务端口 
    mode tcp 
    option tcplog 
      option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www 
    balance    roundrobin 
      server    mycat_2 192.168.1.2:8066 maxconn 30000
      server    mycat_3 192.168.1.3:8066 maxconn 30000
    timeout server 20000 

listen    allmycat_admin 
    bind 192.168.1.252:8097 ##转发到mycat的9066端口,及mycat的管理控制台端口 
    mode tcp 
    option tcplog 
      option httpchk OPTIONS * HTTP/1.1\r\nHost:\ www 
    balance    roundrobin 
      server    mycat_2 192.168.1.2:9066 maxconn 30000
      server    mycat_3 192.168.1.3:9066 maxconn 30000
    timeout server 20000
keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_http_port { 
    script "/etc/keepalived/scripts/check_haproxy.sh" 
    interval 2 
    weight 2 
} 

vrrp_instance VI_1 { 
   state MASTER              #备节点上改为BACKUP 
   interface ens33            #对外提供服务的网络接口 
   virtual_router_id 51      #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组 
   priority 150              #数值愈大,优先级越高,备节点上改为120 
   advert_int 1              #同步通知间隔 
   authentication {          #包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,据说AH使用时有问题 
      auth_type PASS 
      auth_pass 1111 
   } 
 
   track_script { 
      chk_http_port            #调用脚本check_haproxy.sh检查haproxy是否存活 
   } 
 
   virtual_ipaddress {      #vip地址,这个ip 必须与我们在lvs 客户端设定的vip相一致 
      192.168.1.252 dev ens33 scope global 
   } 
   notify_master /etc/keepalived/scripts/haproxy_master.sh 
   notify_backup /etc/keepalived/scripts/haproxy_backup.sh 
   notify_fault /etc/keepalived/scripts/haproxy_fault.sh 
   notify_stop  /etc/keepalived/scripts/haproxy_stop.sh 
} 
check_haproxy.sh
#!/bin/bash 
STARTHAPROXY="/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg" 
STOPKEEPALIVED="/etc/init.d/keepalived stop" 
LOGFILE="/var/log/keepalived/keepalived-haproxy-state.log" 
A=`ps -C haproxy --no-header |wc -l` 
echo "[check_haproxy status]" >> $LOGFILE 
date >> $LOGFILE 

if [ $A -eq 0 ];then 
    echo $STARTHAPROXY >> $LOGFILE 
    $STARTHAPROXY >> $LOGFILE  2>&1 
    sleep 5 
fi 

if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then 
    exit 0 
else 
    exit 1 
fi
haproxy_bakcup.sh
#!/bin/bash 
STARTHAPROXY=`/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg` 
STOPHAPROXY=`ps -ef |grep sbin/haproxy| grep -v grep|awk '{print $2}'|xargs kill -s 9` 
LOGFILE="/var/log/keepalived/keepalived-haproxy-state.log" 
echo "[backup]" >> $LOGFILE 
date >> $LOGFILE 
echo "Being backup...." >> $LOGFILE 2>&1 
echo "stop haproxy...." >> $LOGFILE 2>&1 
$STOPHAPROXY >> $LOGFILE  2>&1 
echo "start haproxy...." >> $LOGFILE 2>&1 
$STARTHAPROXY >> $LOGFILE  2>&1 
echo "haproxy stared ..." >> $LOGFILE
haproxy_fault.sh
#!/bin/bash 
LOGFILE="/var/log/keepalived/keepalived-haproxy-state.log"
echo "[fault]" >> $LOGFILE 
date >> $LOGFILE
haproxy_master.sh
#!/bin/bash 
STARTHAPROXY=`/usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/haproxy.cfg` 
STOPHAPROXY=`ps -ef |grep sbin/haproxy| grep -v grep|awk '{print $2}'|xargs kill -s 9` 
LOGFILE="/var/log/keepalived/keepalived-haproxy-state.log" 
echo "[master]" >> $LOGFILE 
date >> $LOGFILE 
echo "Being master...." >> $LOGFILE 2>&1 
echo "stop haproxy...." >> $LOGFILE 2>&1 
$STOPHAPROXY >> $LOGFILE  2>&1 
echo "start haproxy...." >> $LOGFILE 2>&1 
$STARTHAPROXY >> $LOGFILE  2>&1 
echo "haproxy stared ..." >> $LOGFILE
haproxy_stop.sh
#!/bin/bash 
LOGFILE="/var/log/keepalived/keepalived-haproxy-state.log"
echo "[stop]" >> $LOGFILE 
date >> $LOGFILE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值