使用HaProxy實現Thrift服務端的負載均衡
1.測試環境
作業系統:2臺windows(Linux原理相同)
Haproxy工具:實現tcp負載均衡,輪訓分配給2個Thrift Server提供服務
Thrift服務端:2個Thrift Server(提供一樣的服務,多個Server類似)
Thrift客戶端:沒有Haproxy時是TCP直接連線Thrift-Server;有了Haproxy以後,TCP連線Haproxy的監聽埠即可,由Haproxy來分配給Thrift-Server,客戶端不用知道有哪些Thrift-Server。
備註:
a.由於在生產中使用的 windows Server,比較坑,沒有keepalived工具,如果Haproxy部署的機器宕機了,會造成服務不可用,所以想了個比較簡單的替代方法:
在兩臺機器上,部署兩個一樣的Haproxy程式;
在客戶端連線Haproxy時,哪一個Haproxy程式能夠連線成功就連線哪個,並寫配置檔案,下次這一個Haproxy程式作為首次連線程式;(併發量不高,應該夠用了,但是Haproxy故障不能收到通知,還是用keepalived好,可以收到故障郵件通知)
2.windows下安裝Haproxy工具
官網下載:沒有翻牆的同學打不開
下載後直接解壓即可:
3.Haproxy配置檔案修改
對配置檔案的說明:###########全域性配置######### global daemon nbproc 1 pidfile /var/run/haproxy.pid ########預設配置############ defaults mode http #預設的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK retries 2 #兩次連線失敗就認為是伺服器不可用,也可以通過後面設定 option redispatch #當serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器 option abortonclose #當伺服器負載很高的時候,自動結束掉當前佇列處理比較久的連結 maxconn 4096 #預設的最大連線數 timeout connect 5000ms #連線超時 timeout client 30000ms #客戶端超時 timeout server 30000ms #伺服器超時 #timeout check 2000 #=心跳檢測超時 log 127.0.0.1 local0 err #[err warning info debug] ########統計頁面配置######## listen admin_stats bind 0.0.0.0:1080 #監聽埠 mode http #http的7層模式 option httplog #採用http日誌格式 #log 127.0.0.1 local0 err maxconn 10 stats refresh 30s #統計頁面自動重新整理時間 stats uri /stats #統計頁面url stats realm XingCloud\ Haproxy #統計頁面密碼框上提示文字 stats auth admin:admin #統計頁面使用者名稱和密碼設定 stats hide-version #隱藏統計頁面上HAProxy的版本資訊 ########testThrift配置################# listen ThriftServer bind 0.0.0.0:8888 balance roundrobin mode tcp option tcplog option tcp-check #maxconn 4086 log 127.0.0.1 local2 debug server ThriftServer1 127.0.0.1:9090 check server ThriftServer2 192.168.62.167:9090 check ########frontend配置##############
a.統計頁面配置:Haproxy提供了一個html頁面用來檢視監聽執行狀態及日誌,可輸入地址訪問:
b.testThrift配置:
bind 0.0.0.0:1080 #監聽埠———Thrift客戶端連線此IP和埠
server ThriftServer2 192.168.62.167:9090 check————Haproxy做負載均衡的Thrift服務端IP及埠
4.啟動Haproxy
haproxy.exe -f haproxy.cfg -d
5.啟動ThriftSerer
6.啟動Thrift客戶端
Thrift客戶端連線Haproxy監聽埠
public const string SERVERIP = "127.0.0.1"; public static int SERVERPORT = 8888; public static int TIMEOUT = 5000; public void startClient() { TTransport transport = null; try { transport = new TSocket(SERVERIP, SERVERPORT, TIMEOUT); //協議要和服務端一致 TProtocol protocol = new TBinaryProtocol(transport); MysqlService.Client client = new MysqlService.Client(protocol); transport.Open(); EquipNavTreeNode user = new EquipNavTreeNode(); user.Description = "liqb"; var listuser2 = client.getUser(1); Console.WriteLine("getUser success"); } catch (Exception e) { Console.WriteLine(e.StackTrace); } finally { if (null != transport) { //close transport.Close(); } } }
7.Thrift-Server輪詢
來自客戶端的請求被Haproxy轉給了2個Thrift服務端。(本例HaProxy用的roundrobin負載均衡演算法)
8.檢視Haproxy執行狀態