系統訪問量上去遇到了性能瓶頸,解決方法一般都是從兩個方向入手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 的服務器
最后訂單下來后是購買了兩台服務器的參數
![]()
狀態:運行中 存儲:(無)
按需: 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就好了。
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 5server 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:3724server 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:8085server 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端口就可以訪問了,反向代理成功
驗證游戲服務器
啟動Wow.exe,輸入剛才注冊的賬號密碼,登陸成功。
讓另外一個同事也登陸該服務器,結果也登陸成功了,不過可惜的是因為TrinityCore是不支持Scale Out的,haproxy把我的同事的游戲賬號分配到另外一個WoW世界服務器去了,雖然他能夠加我的賬號為好友,但是我們同時在世界里喊話是無法收到的。可見haproxy是可以幫你把TCP請求均衡到了不同的服務器上的。
4.測試結果
haproxy能夠輕松通過配置完成WEB和TCP的反向代理完成負載均衡的任務。可惜的是Wow服務器不支持服務器間的數據同步(可能由於游戲本身的對數據的實時性要求比較高吧),否則我們可以通過雲主機的橫向擴展創建個萬人在線服務器玩玩了。
5.技巧
由於你沒有為后端的兩台Windows服務器購買外網IP,所以沒法通過RDP鏈接到這服務器上,你是沒法安裝Wow服務器的你可以
- 購買個按需的IP綁定到服務器上面,用完之后釋放,這樣的話你能夠在一小時內搞定,你只需要花1塊錢。
- 利用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