文章目錄
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