文章目录
1.结构说明
Mycat是分库分表的利器,官方的说明文档历史较久了,文档案例各模块的版本也比较旧,由于工作中涉及到该知识,我就整理了一下。
数据规划:
系统IP | 192.168.1.2 | 192.168.1.3 | 192.168.1.252 |
---|---|---|---|
keepalived角色 | 主节点 | 备节点 | 虚拟IP |
mycat业务端口 | 8066 | 8066 | 8096 |
mycat管理端口 | 9066 | 9066 | 8097 |
操作系统 | centos7 | centos7 | / |
mycat版本 | 1.6 | 1.6 | / |
haproxy版本 | 2.0.14 | 2.0.14 | / |
keepalived版本 | 2.0.20 | 2.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