利用HAProxy代理SQL Server的AlwaysOn輔助副本
公司最近數據庫升級到SQL Server2014 ,並部署了alwayson高可用集群
機房內有三套程序需要讀取數據庫
第一套:主程序,讀寫數據庫,連接主副本
第二套:報表程序,讀報表,連接輔助副本
第三套:歷史庫程序,讀歷史庫,連接輔助副本
軟件環境
機器環境
架構圖
為什麽需要使用HAProxy?
之前機房里面有2000個終端,這些終端是一個很小的嵌入式設備,第二套報表程序原來是使用直連數據庫IP(10.11.10.36)來連接數據庫
但這樣有一個弊端,當36這台輔助副本宕機,那么報表程序就癱瘓了,因為2000個終端要更改數據庫連接需要燒寫程序到終端里面非常耗費時間
可能要幾天時間
最后決定使用HAProxy做負載均衡和TCP連接重定向
使用HAProxy有幾個好處
1、前端不需要后端數據庫的實際IP,當需要升級后端數據庫,比如打補丁的時候特別方便
2、HAProxy能夠自動檢測后端數據庫服務,探測1433端口是否存活,如果1433端口出問題,能夠自動重定向連接到37這台輔助副本
3、減輕單台讀庫壓力,使用RR輪詢算法,請求均衡分發到36和37這兩台輔助副本,減輕36這台機器的壓力
HAProxy相關配置步驟
#yum安裝,版本是1.5.4
yum install -y haproxy.x86_64
#編輯rsyslog 文件,修改為-c 2 -r -x -m
vi /etc/sysconfig/rsyslog SYSLOGD_OPTIONS="-c 2 -m 0 -r -x"
#編輯rsyslog.conf 文件添加兩行local3.* 和local0.*
vi /etc/rsyslog.conf local7.* /var/log/boot.log local3.* /var/log/haproxy.log local0.* /var/log/haproxy.log
#重啟rsyslog服務
service rsyslog restart
# 編輯haproxy配置文件 下面以mssql從庫負載均衡為例
vi /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 6000 user haproxy group haproxy daemon #stats socket /var/lib/haproxy/stats stats socket /var/run/haproxy.sock mode 666 level admin stats timeout 2m defaults mode http log 127.0.0.1:514 local3 option dontlognull #option http-server-close #option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 6000 listen stats mode http bind *:2080 stats enable stats refresh 30s stats uri /haproxyadminstats stats realm HAProxy\ Statistics stats auth admin:admin stats admin if TRUE listen mssql :1433 mode tcp balance roundrobin server mssqldb1 10.11.10.36:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2 server mssqldb2 10.11.10.37:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2
#檢查配置文件是否有語法錯誤
haproxy -f /etc/haproxy/haproxy.cfg -c Configuration file is valid
#啟動haproxy
/etc/init.d/haproxy start
#檢查haproxy是否在監聽
netstat -lntp
注意:Centos機器只需要使用一個網口,不需要額外增加網口
#打開后台管理界面
http://10.11.30.47:2080/haproxyadminstats
HAProxy提供了一個后台管理界面
查看haproxy的日志
cat /var/log/haproxy.log
測試驗證
使用SSMS2016來連接HAProxy的IP
10.11.10.39
現在是連接到GZC-SQL03這台機
現在把 GZC-SQL03這台機的SQL服務停了
HAProxy已經探測到 GZC-SQL03這台機的SQL服務停了
再次點擊一下執行按鈕,可以發現已經重定向到 GZC-SQL02這台機
雖然經過HAProxy這一層,但是性能方面也不算太差
HAProxy的通信方式
通信方式類似於LVS的NAT模式
LVS的NAT模式(調度器將請求的目標ip即vip地址改為Real server的ip, 返回的數據包也經過調度器,調度器再把源地址修改為vip)
總結
線上環境使用HAProxy已經差不多1個月,到現在沒有出現過問題,比較穩定
對於HAProxy原理上的東西這里就不敘述了,網上有很多資料
參考文章:
http://www.cnblogs.com/dehai/p/4885021.html
如果是每個業務使用不同端口,可以使用下面的配置文件
比如報表使用1433端口,BI抽取數據使用2433端口
vi /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 6000 user haproxy group haproxy daemon #stats socket /var/lib/haproxy/stats stats socket /var/run/haproxy.sock mode 666 level admin stats timeout 2m defaults mode http log global option dontlognull option http-server-close option forwardfor except 127.0.0.0/8 option redispatch retries 3 timeout http-request 10s timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 6000 listen stats mode http bind *:2080 stats enable stats refresh 30s stats uri /haproxyadminstats stats realm HAProxy\ Statistics stats auth admin:admin stats admin if TRUE listen mssql :1433 mode tcp balance roundrobin server mssqldb1 10.11.10.36:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2 server mssqldb2 10.11.10.37:1433 weight 1 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2 listen mssql2 :2433 mode tcp balance leastconn server mssqldb3 10.11.10.37:1433 maxconn 6000 check port 1433 inter 2000 rise 2 fall 2
如有不對的地方,歡迎大家拍磚o(∩_∩)o
本文版權歸作者所有,未經作者同意不得轉載。