利用Haproxy實現http和TCP反向代理和負載均衡(入門和技術驗證)


系統訪問量上去遇到了性能瓶頸,解決方法一般都是從兩個方向入手Scale Up 和Scale Out。Scale Up適用於哪些錢多的系統,因為Scale Up其實就是直接升級硬件,CPU、內存、IO哪個不夠了就升級哪個,隨着計算能力的升級系統的容量自然就上來了。但是為什么Scale Up只適用於有錢人,很簡單因為硬件是越高級越貴啊,而且不只是線性的增長,因為有時候2倍的IO性能可能需要花費你10倍的錢呢,而且Scale Up還不利於利舊這一(“窮人”)原則,淘汰下來的硬件環境難道都拿來做開發測試環境?。在雲時代就先不詳細討論Scale Up的方法了,我們考慮一下Scale Out,Scale Out方案是入門門檻低,舊的環境都可以充分利用,因為Scale out就是橫向擴展,系統壓力上來了,你只需要拼機器(不是拼爹)。

基於Http的Scale Out的方案有挺多的,性能和口碑都不錯的Nginx,Windows上面 IIS微軟直接支持的Application Request Router都挺好,在BingoCC上面還可以直接的下單訂購http的彈性支持負載均衡。不過客戶的需求是無限的,這兩天客戶就希望我們能夠同時支持http和TCP的負載均衡,因為客戶有個消息推送服務是基於TCP協議開發的,如果要改造成http的比較麻煩。之前都是采用nginx的,不過nginx對TCP的支持模塊不是包含在原生的發布包里面的,所以暫時沒考慮。另外找到了haproxy,准備測試驗證一下需求是否滿足。

1.驗證環境的考慮

帶WEB網站+TCP的端口開放魔獸私服是一個不錯的驗證環境,因為私服需要有賬號注冊的網站,也有游戲客戶端登陸游戲的TCP鏈接。

WEB網站:開放8888端口的PHP注冊網站

驗證服務:3724端口

游戲服務:8085端口

2.搭建環境:

購買兩台Windows 的服務器

image

最后訂單下來后是購買了兩台服務器的參數


狀態:運行中   存儲:(無)

按需: 1.00元/小時

私有IP:172.167.1.238

公網IP:(無) 綁定


狀態:運行中   存儲:(無)

按需: 1.00元/小時

私有IP:172.167.1.239

公網IP:(無) 綁定

2.1 配置Wow測試服務器

我用來測試的Wow服務器是從網上下載回來的TrinityCore環境,可以一鍵把MySQL,和WEB還有游戲的世界服務器都搭建起來,下面的配置只是針對測試環境的要求對配置進行了一些更改。

一鍵安裝完之后系統就會自動啟動了Apache的Php環境,通過IE訪問http://localhost:8888 的話就可以看到游戲賬號的注冊頁面了。   

2.2配置MySQL

為了測試多台服務器公用一套用戶數據,需要將MySQL的賬號允許多台機器訪問,所以要執行一下下面的命令:

GRANT ALL PRIVILEGES ON *.* TO 'trinity'@'%' IDENTIFIED BY 'trinity' WITH GRANT OPTION;
FLUSH RIVILEGES;

2.3修改Wow的AuthServer和World Server配置

AuthServer.conf里面的配置
LoginDatabaseInfo = "127.0.0.1;3306;trinity;trinity;logon"

修改為:

LoginDatabaseInfo = "172.167.1.239;3306;trinity;trinity;logon"

worldserver.conf的配置修改為

LoginDatabaseInfo     = "172.167.1.239;3306;trinity;trinity;logon"
WorldDatabaseInfo     = "172.167.1.239;3306;trinity;trinity;world"
CharacterDatabaseInfo = "172.167.1.239;3306;trinity;trinity;chars"

2.4一台linux服務器連公網IP

     因為我們是通過這台linux里面的haproxy反向代理背后的兩台Windows服務器的,所以只需要一個公網IP就好了。

image

linux服務器的配置信息:


狀態:運行中   存儲:(無)

包天: 10.00元/天

私有IP:172.167.1.237

公網IP:電信獨享2M 113.108.230.97

2.5haproxy的配置

用putty鏈接到Cent OS的服務器:

cd /tmp

wget http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz

tar zxvf haproxy-1.4.22.tar.gz

cd haproxy-1.4.22.tar.gz

make install

cd examples

mkdir /etc/haproxy

cp haproxy.cfg /etc/haproxy/

cd /ect/haproxy

vim haproxy.cfg

然后根據需要把配置分別改為下面這些部分

http的配置

listen  appli1-rewrite 0.0.0.0:80
        option httplog
        cookie  SERVERID rewrite
        balance roundrobin
        server  app1_1 172.167.1.238:8888 cookie app1inst1 check inter 2000 rise 2 fall 5

        server  app1_1 172.167.1.239:8888 cookie app1inst1 check inter 2000 rise 2 fall 5

TCP的配置方法,TCP因為涉及到驗證端口和游戲端口所以有兩部分配置

驗證端口配置

listen wowauth 0.0.0.0:3724
        mode tcp
        option tcplog
        tcp-request inspect-delay 5s
        server appwow 172.167.1.238:3724

        server appwow2 172.167.1.239:3724

游戲端口配置

listen  Wow 0.0.0.0:8085
        mode tcp
        option tcplog
        tcp-request inspect-delay 5s
        option tcpka
        server appwow 172.167.1.238:8085

        server appwow2 172.167.1.239:8085

2.6啟動haproxy

haproxy –f haproxy.cfg –p hap.pid

注意:-p參數,因為只有這樣你下次更新配置是才能通過haproxy –f haproxy.cfg –p hap.pid –sf $(cathap.pid)命令行實現,否者你要手動Kill

3.驗證

驗證WEB

訪問http://113.108.230.97 這個地址我們可以看到了游戲賬號的注冊界面,在windows服務器上配置的是8888端口,通過haproxy后我們通過80端口就可以訪問了,反向代理成功

image

驗證游戲服務器

啟動Wow.exe,輸入剛才注冊的賬號密碼,登陸成功。

image

讓另外一個同事也登陸該服務器,結果也登陸成功了,不過可惜的是因為TrinityCore是不支持Scale Out的,haproxy把我的同事的游戲賬號分配到另外一個WoW世界服務器去了,雖然他能夠加我的賬號為好友,但是我們同時在世界里喊話是無法收到的。可見haproxy是可以幫你把TCP請求均衡到了不同的服務器上的。

4.測試結果

haproxy能夠輕松通過配置完成WEB和TCP的反向代理完成負載均衡的任務。可惜的是Wow服務器不支持服務器間的數據同步(可能由於游戲本身的對數據的實時性要求比較高吧),否則我們可以通過雲主機的橫向擴展創建個萬人在線服務器玩玩了。

5.技巧

由於你沒有為后端的兩台Windows服務器購買外網IP,所以沒法通過RDP鏈接到這服務器上,你是沒法安裝Wow服務器的你可以

  1. 購買個按需的IP綁定到服務器上面,用完之后釋放,這樣的話你能夠在一小時內搞定,你只需要花1塊錢。
  2. 利用Haproxy,做遠程桌面端口的反向代理,這樣你就可以通過一個IP鏈接兩台windows服務器了

Windows的遠程桌面RDP配置

listen  RemoteDesktop 0.0.0.0:3389
        mode tcp
        option tcplog
        tcp-request inspect-delay 5s
        tcp-request content accept if RDP_COOKIE
        persist rdp-cookie
        balance rdp-cookie
        option tcpka
        server appRD 172.167.1.238:3389

 

listen  RemoteDesktop 0.0.0.0:5000
        mode tcp
        option tcplog
        tcp-request inspect-delay 5s
        tcp-request content accept if RDP_COOKIE
        persist rdp-cookie
        balance rdp-cookie
        option tcpka
        server appRD 172.167.1.239:3389


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM