網路遊戲伺服器與資料庫的關係?
對於大多數網遊,都有拍賣行系統,擺攤,用戶的信息(等級,裝備,金錢……),幫派,等等……
那真實的資料庫和這些區之間是怎麼樣的關係?比如華北一區對應一個資料庫,華北二區對應一個資料庫?還是其他的方式?
真實的資料庫和伺服器又是什麼樣的關係?比如華北一區在一個伺服器,或者N個伺服器供華北一區使用,平衡負載?
以前負責過網遊數據訪問層的部分。一般就是每個區服對應一個資料庫,比如合服就是在合併資料庫,有時候兩個區因為版本問題資料庫架構也可能會有細微不同。訪問方面一般實時數據都在內存里,通過緩存和日誌的方式每隔一段時間持久化一次,同時保證數據完整性。
而所謂伺服器就是一組程序,用來響應來自客戶端的消息。平衡負載可以簡單讓不同的程序負責處理不同的消息,比如一個負責戰鬥,一個負責聊天等,或者每個程序負責不同的地圖區域之類的,這個取決於架構師的設計。不過大部分的運算都只訪問內存中的數據,資料庫只負責保證數據持久和完整。
做過的遊戲比較小,MMO,大概一個區幾千人左右同時在線。更大型的遊戲設計上要有更強的可擴展性,等高手回答吧。遊戲公司一般有兩種庫保存玩家的不同信息。
- 玩家登錄賬號的資料信息、賬號內的餘額,一般保存在一個庫中。這個庫在該公司內是通用的,登錄官網可以登錄查詢充值,在每個遊戲登錄的時候都會訪問,在遊戲過程中的消費可以回饋到這個庫里。
- 每個遊戲的每個大區的每個服還會對應一個資料庫。在這個庫里,會保存玩家的角色信息(等級,裝備,金錢……),玩家的社交關係,拍賣行,任務等一切在遊戲里的數據。
一般來說是一台真實的資料庫伺服器對應一個遊戲某個區的某個服。有時候用了高配機,也可能一台機器上跑三個服的庫。總之,遊戲公司會根據資料庫的負載調整遊戲架構。
每個服的人數有限,遊戲數據也並不是實時寫入資料庫中,一般保存在緩存里,幾分鐘寫入一次庫。所以遊戲的資料庫訪問壓力並不大。負載大的地方大多在邏輯伺服器的數據處理上。一般是對邏輯伺服器去做負載均衡。
對於大多數網遊,都有拍賣行系統,擺攤,用戶的信息(等級,裝備,金錢……),幫派,等等……
那真實的資料庫和這些區之間是怎麼樣的關係?比如華北一區對應一個資料庫,華北二區對應一個資料庫?還是其他的方式?
真實的資料庫和伺服器又是什麼樣的關係?比如華北一區在一個伺服器,或者N個伺服器供華北一區使用,平衡負載?
回答:
1.傳統的MMO/MMORPG,包含現在的Web Game,確實如你所言,華北一區對應一個資料庫,華北二區對應一個資料庫;
2.一般一台資料庫主機上會部署多個資料庫,對應不同的遊戲大區或服;
3.往往更多的遊戲公司是,一台主機同時部署資料庫,也部署遊戲伺服器,往往只有地圖伺服器單獨部署;
4. 遊戲資料庫的負載不會很大,畢竟玩家數量有限,以及部署的數量也不會超多,只有老區的資料庫會逐漸部署更多在同一台主機上。不會考慮負載均衡的事情。
5.但是社交遊戲,就非常可怕,不是跟傳統的遊戲一樣。
不要把資料庫和遊戲邏輯混為一談。
所有的伺服器都在實現三種功能
(1)數據的通訊(網路IO,隊列,等等)
(2)數據的存儲(共享內存,內存,資料庫,文件等等)
(3)數據格式的換算和轉換(邏輯具體實現,比如戰鬥,擺攤,交易,副本等等)
資料庫只是數據存儲的一種。
至於你說的那些,很大一部分是(3)要實現的內容,並不是說,遊戲一定要有資料庫,最普通文件也可以實現,cache(NoSQL)也行,內存也算。它只是一個存儲介質。
理順關係,有助於你的設計。不要一開始就陷入細節,導致自己的迷失。
資料庫太慢,一般情況下資料庫以冷數據保存為主。
熱數據在緩存中處理,然後落地刷到資料庫。
分區和資料庫的關係涉及到你具體的邏輯業務。
比如,你單服用戶少無交互,那麼一個資料庫對應一個,或者乾脆不用都沒事。
或者,你需要跨服,那麼最好避免分庫,或者映射出共用庫。
或者,不依賴資料庫,自己架中間數據層。
資料庫比如合適mysql只用來做數據的持久化,在玩家登錄遊戲時可以將他的數據從資料庫裡面查詢出來放到服務端內存中,之後的數據修改全在內存,內存的數據每隔一段時間比如30s如果有同步任務會去同步一次,將多次操作的數據一次更新到資料庫。如果新產生的數據,在產生的同時往資料庫里增加,之後和其它數據一樣,在內存維護,定時同步。
妄圖用Web資料庫實現遊戲邏輯的方式來做網路遊戲含手游的方式是死路一條。
都被「上雲」潮流所忽悠傻的人才會去做炮灰。除非你就是只做棋牌類以下的遊戲,不怕死的尚可以做下小白鼠。
你講的是MMORPG,伺服器端C++一般會使用獨立的處理器來處理資料庫操作,一般都是讀/寫線程分離,效率很高,數據一致性可以保持很好。
至於說到MMORPG的負責均衡,那又是一個複雜的領域,涉及的要素更多,這裡先不一一展開了,以後有時間來再來編輯。
遊戲中的各個系統在應用中就是不同的介面而已,具體伺服器怎麼架構的就怎麼調用,對應關係其實也很簡單,說白了就是(伺服器對應用):一對多,多對多,多對一。一般情況下,資料庫都是要主從的,讀寫分離,也就是一個服的數據會存在多個伺服器而不需要分割,因為很少有一個服的數據大到需要分割。
根據規模的不同,架構也完全不一樣。
從小到大:
一台伺服器擔任web、memcached、db多個角色;
每個角色各一台;
多web伺服器,負載均衡,mysql主從,多memcached緩存伺服器;
WEB按DNS區域負載均衡,db數據分割,SSD硬碟緩存等;
每個或者每幾個服或頻道對應於一個提供數據服務的節點。其中存儲方式簡單的理解為kv記錄就可以,因為網遊是大型實時系統,所有數據放在cache中是最高效的。
就數據流向來說,其實到這裡就結束了。
不過機器永遠是不穩定的,機器掛了要恢復就要還原最後機器掛掉的瞬間。所以這裡就要關聯到題主提到的一些傳統資料庫。
至於具體如何同步,如何容災,這些對業務程序是透明的,怎麼實現都可以。每家公司甚至每個團隊都有各自的解決方案。這點就可以參考一些分散式cache如何做災備的,redis,memcached等。每個伺服器對應不同的資料庫,
主要應對高用戶帶來的高並發,
如果所有的伺服器使用同一個資料庫伺服器,
那麼這個資料庫伺服器需要很大的承載能力,
所以我認為是需要分開的,
你看很多伺服器之間的交易一般是需要錢的,因為這樣需要人工操作
個人見解資料庫首先是一個軟體進程,運行在某台物理機器上。一個資料庫進程中,可以管理N個數據空間(類似文件夾),這些個數據空間其實就是用來存儲各類數據(文件)的地方,至於應該怎麼存,這需要看你的業務所規劃的「邊界」在那裡?如果「拍賣行」、「擺攤」這些數據都在某一分區內,那麼自然就應該在同一個數據空間內。
一個遊戲伺服器,可以同時讀寫多個數據空間的數據,所以關係在你的業務中,或者說去跟策劃聊聊「業務邊界」應該更有幫助。
推薦閱讀: