Haproxy+Keepalived配置高可用的Mycat

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章