天天看點

Haproxy+Keepalived配置高可用的Mycat

文章目錄

      • 1.結構說明
      • 2.準備工作
      • 3.安裝步驟
        • 3.1 haproxy安裝步驟
        • 3.2 配置haproxy日志
        • 3.3 keepalived安裝
      • 4.測試腳本
      • 5.調測
      • 參考文獻
      • 附錄
        • haproxy.cfg
        • keepalived.conf
        • check_haproxy.sh
        • haproxy_bakcup.sh
        • haproxy_fault.sh
        • haproxy_master.sh
        • haproxy_stop.sh

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 /

    架構圖:

Haproxy+Keepalived配置高可用的Mycat

    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目前資訊。

Haproxy+Keepalived配置高可用的Mycat

參考文獻

[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
           

繼續閱讀