本文內容源自騰訊游戲學院程序公開課_服務器第四節
一、數據存儲基礎
什么是數據存儲?
運行數據保存到硬盤上形成持久化數據。
data——>file(database)——>file system——>hard driver
數據變為文件,存入文件系統,文件系統通過OS這一層落到硬盤上面。
數據庫 - 關系型數據庫
數據庫表設計與范式
- 1NF,2NF,3NF
優點
- 減少數據冗余
- 保證數據完整性
- SQL語言提供了強大的查詢功能
問題
- 數據結構復雜情況下表結構難以維護
- 性能一般,容易產生性能瓶頸
- 可擴展性較差
數據庫 - NoSQL數據庫
NoSQL數據庫特點
- Key - Value結構
- 支持結構化查詢
優點
- 易於維護
- 性能較高
- 可擴展性好
問題
- 容易產生數據冗余
- 不支持SQL查詢
二、游戲服務器架構與數據存儲設計
游戲業務的特點
響應速度要求非常高
- 100ms以上的延遲玩家就會有感知
數據更新頻率高
- 玩家數據每時每刻都在變化
- 獲取經驗,獲取金錢,獲取成就
- update > read > insert > delete
解決方案
- 為了實現高速響應,玩家數據全部在內存中
- 在登錄時從DB加載進內存
- 游戲過程中的數據變更通過操作內存數據完成
游戲服務器架構介紹
分區分服服務器架構(天涯明月刀、夢幻西游)
Player 1——>Game Server 1——>Database 1
Player 2——>Game Server 2——>Database 1
Player 3——>Game Server 3——>Database 1
每個玩家可以選擇不同的服務器進行游戲,每個服務器后面的存儲都是相互獨立的,這樣每個服務器的存儲壓力也會變得比較小。
全區全服服務器架構(王者榮耀、皇室戰爭、吃雞)
Player 1——>Game Server Cluster——>Database
Player 2——>Game Server Cluster——>Database
Player 3——>Game Server Cluster——>Database
游戲服務器數據庫選型
分區分服存儲特點——>選擇 RDBM(關系型數據庫)
- 單服數據量較少
- 請求量少
- 無需動態在線擴容
全區全服存儲特點——>選擇 NoSQL
- 數據量大
- 請求量大
- 需要動態在線擴容
使用MySQL作為游戲數據庫
軟件工程思想:分離穩定和不穩定
穩定,使用MySQL表字段,例如:NAME、職業、角色的性別、等級;
不穩定,打包放入GAMEBLOB里面,再通過DR技術進行版本控制和管理,例如:道具、學會的技能;
混合式存儲設計
REDIS高速緩存,MySQL真實落地。
游戲服務器存盤策略設計
Player——>Game Server 1(Player Runtime Data)<——(load)DB
游戲存盤需求特點:update > read > insert > delete
定期自動存盤:3分鍾自動存盤
重要操作即時存盤:升級/下線/關服;獲得高價值道具
存儲緩沖隊列:削峰填谷
游戲服務器存儲容災介紹
熱備:主從熱備,自動切換
冷備:每日全量備份;關鍵操作前全量備份
注:此模型較簡單,真正設計時會比這個復雜的多。
運營日志存儲
什么是運營日志?
- 游戲中玩家重要行為的記錄
- 諸如登錄記錄,等級變更,財產變化流水,交易記錄等信息
運營日志的用途有哪些?
- 運營分析游戲中玩家的動態,做出運營決策的數據基礎
- 當發生異常時,追查玩家在游戲內的活動軌跡的重要依據
運營日志的存儲
- 數據量巨大,單服每日約5~10G(未壓縮)
- 永久存檔,涉及到游戲收入,需要永久存檔備查
- 需要便於分析統計
存儲流程:Game Server——>Database——>磁帶。