本發(fā)明涉及網(wǎng)絡通信,尤其涉及一種游戲服務端數(shù)據(jù)庫優(yōu)化方法及系統(tǒng)。
背景技術:
1、隨著智能手機的迅速普及,與網(wǎng)絡的快速發(fā)展,移動互聯(lián)網(wǎng)的相關業(yè)務已逐漸成為國內(nèi)各廠商關注的焦點。從整體行業(yè)來看,中國手機游戲行業(yè)處于快速發(fā)展期。近年來,在電信運營商和手機游戲開發(fā)商的聯(lián)合推動下,中國的手機游戲行業(yè),取得了較快的發(fā)展。隨著互動娛樂技術的發(fā)展,各種類型的互動游戲類應用得到了極大的發(fā)展,存在著多種游戲類型與游戲控制方式,游戲的形式也從電腦或游戲機向手機游戲方面過度。
2、隨著手機游戲市場蓬勃發(fā)展,業(yè)界常常使用關系型數(shù)據(jù)庫存儲玩家的數(shù)據(jù)。游戲服務端數(shù)據(jù)有以下特點:
3、變更頻率高。例如,玩家合成一個道具,點擊一次養(yǎng)成功能,放一個技能等行為,都可能直接導致多條記錄被修改,刪除或者新增。
4、安全要求高。不允許丟失,不允許不一致,數(shù)據(jù)錯誤導致的經(jīng)濟損失大。
5、容峰要求高。在開服時或者活動開啟的時段,會有大量的玩家短時間內(nèi)集中登錄游戲,造成大量讀壓力;某個活動結束或者結算時,可能有大量的數(shù)據(jù)更新造成寫壓力。
6、多表查詢需求極低。雖然也使用外鍵,但是主從數(shù)據(jù)往往一起加載(比如玩家登錄時),少量的多表查詢需求(比如排行榜)一般使用冗余字段解決,避免額外加載不在線玩家的數(shù)據(jù)。
7、現(xiàn)有技術中的業(yè)界技術方案,一般是使用代碼生成技術,生成專有的數(shù)據(jù)結構映射,在內(nèi)存中直接使用。當玩家登錄時,使用讀線程組從數(shù)據(jù)庫中讀取到內(nèi)存映射機構。當數(shù)據(jù)改變時,直接修改內(nèi)存數(shù)據(jù)。寫線程組定期將修改的數(shù)據(jù),以增量或者全量的寫回數(shù)據(jù)庫。當玩家登出時,從內(nèi)存中卸載,并將積累的寫操作執(zhí)行。
8、這種做法存在著如下缺陷:
9、數(shù)據(jù)一致性沒法保證。當一個數(shù)據(jù)被卸載,又立刻被要求讀取時,如果此時其上次的寫操作沒有執(zhí)行完畢,有可能取到舊數(shù)據(jù),需要在外圍邏輯中增加相應防護。如果將某個表的讀寫線程指定為同一個,則可以保證數(shù)據(jù)一致性,但是沒有合并的大量單記錄修改會嚴重降低性能;同時,單線程讀也會導致巨大的讀性能壓力。
10、容峰能力差。當活動結算時或者較多玩家短時間登出時,積累的寫壓力會被迫一起執(zhí)行,增大了系統(tǒng)的不穩(wěn)定性。
11、數(shù)據(jù)安全性低。因為是定期觸發(fā)的保存,因此在期間的修改可能因為服務器宕機而丟失,需要開發(fā)額外的組件來保護數(shù)據(jù)。
12、因此,現(xiàn)有技術中的數(shù)據(jù)方案雖然可行,但是通用化程度低,而且遺留了一些難以解決的問題。
技術實現(xiàn)思路
1、本發(fā)明提供一種游戲服務端數(shù)據(jù)庫優(yōu)化方法及系統(tǒng),解決現(xiàn)有技術中游戲服務端數(shù)據(jù)操作存在的問題,極大的發(fā)揮關系型數(shù)據(jù)庫性能,發(fā)揮關系型數(shù)據(jù)庫高吞吐量批量寫、高性能并發(fā)讀特性,保證數(shù)據(jù)一致性與數(shù)據(jù)安全性。
2、根據(jù)本發(fā)明的一個方面,提供一種游戲服務端數(shù)據(jù)庫優(yōu)化方法,包括:
3、在游戲服務器與數(shù)據(jù)庫之間增設數(shù)據(jù)庫代理;
4、對游戲服務器發(fā)起的數(shù)據(jù)讀寫操作,數(shù)據(jù)庫代理按數(shù)據(jù)表名哈希hash分配到某一個表服務上執(zhí)行;所述表服務包含若干個數(shù)據(jù)表的寫緩存,同時包含一個數(shù)據(jù)庫寫線程;每個表服務由一個單獨線程驅動;
5、任一個數(shù)據(jù)表的所有在途的修改操作,根據(jù)表的“主鍵->寫緩存記錄列表”組織;所述寫緩存記錄由唯一操作id、字段修改數(shù)據(jù)及寫入狀態(tài)組成;所述唯一操作id隨時間先后自增變大;所述寫入狀態(tài)標記此記錄是否已經(jīng)入庫;
6、數(shù)據(jù)庫寫線程接受對應的表服務定期發(fā)起的批量寫入請求,將數(shù)據(jù)寫入關系數(shù)據(jù)庫,并通知表服務線程寫入結果;
7、數(shù)據(jù)庫讀線程組為公共的線程組,接收所有表服務的調(diào)用,從數(shù)據(jù)庫讀取數(shù)據(jù),并返還給表服務線程。
8、所述數(shù)據(jù)庫代理還包括lsm容災數(shù)據(jù)庫作為容災組件進行數(shù)據(jù)讀寫備份;使用基于log-structured?merge-tree技術的kv數(shù)據(jù)庫,能夠極高性能的寫入數(shù)據(jù),防止丟失寫緩存記錄。
9、所述數(shù)據(jù)庫代理還包括sql?parser模塊,負責將外部請求sql語句轉換為內(nèi)部結構;當數(shù)據(jù)庫代理作為進程內(nèi)組件時,直接使用內(nèi)部結構進行請求。
10、當進行數(shù)據(jù)讀取操作時,流程如下:
11、為當前操作分配唯一操作id;
12、確定當前操作為按主鍵讀取數(shù)據(jù)時,進而確定當前寫緩存中是否存在所述主鍵對應的插入insert操作記錄;若存在,則合并寫緩存中位于所述insert操作之后的所有寫記錄,返回讀取結果;
13、確定當前操作為按條件讀取數(shù)據(jù)或當前寫緩存中不存在所述主鍵對應的插入insert操作記錄時,先從數(shù)據(jù)庫中執(zhí)行查詢;獲取結果之后,再根據(jù)唯一操作id,將其與寫緩存中的位于本讀操作之后的操作合并,按查詢條件二次過濾,獲得最新結果并返回。
14、當進行數(shù)據(jù)寫入操作時,流程如下:
15、為當前操作分配唯一操作id;
16、將寫操作增加到主鍵對應列表尾部,或合并列表中主鍵對應的未寫入操作進行合并寫入。
17、所述寫入操作為定時觸發(fā);具體操作流程如下:
18、遍歷寫緩存中的未寫入操作,生成批量更新數(shù)據(jù);
19、獲取當前數(shù)據(jù)表的寫鎖,根據(jù)寫鎖與批量更新數(shù)據(jù),對數(shù)據(jù)庫批量執(zhí)行寫操作;
20、寫操作執(zhí)行完成后,釋放寫鎖,刪除寫緩存中已經(jīng)完成的寫操作。
21、當數(shù)據(jù)庫代理中存在lsm容災數(shù)據(jù)庫作為容災組件進行數(shù)據(jù)讀寫備份時,每次寫操作進入數(shù)據(jù)表服務后,為當前操作分配唯一操作id保存到lsm容災數(shù)據(jù)庫中;
22、寫操作執(zhí)行完成后,從lsm容災數(shù)據(jù)庫中刪除已經(jīng)完成的寫操作。
23、當進行數(shù)據(jù)的多表查詢時,流程如下:
24、獲取來自服務端的非主鍵條件刪改或跨表查詢請求時,執(zhí)行所述請求中關聯(lián)的數(shù)據(jù)表的寫緩存;暫停關聯(lián)的數(shù)據(jù)表的表服務后,向數(shù)據(jù)庫執(zhí)行相應刪改或查詢操作;
25、操作完成后,回復關聯(lián)的數(shù)據(jù)表的表服務并返回操作結果。
26、根據(jù)本發(fā)明的另一個方面,提供了一種游戲服務端數(shù)據(jù)庫優(yōu)化系統(tǒng),包括設置于服務端與數(shù)據(jù)庫之間的數(shù)據(jù)庫代理,所述數(shù)據(jù)庫代理包括:
27、表服務分配單元,用于對游戲服務器發(fā)起的數(shù)據(jù)讀寫操作,數(shù)據(jù)庫代理按數(shù)據(jù)表名哈希hash分配到某一個表服務上執(zhí)行;所述表服務包含若干個數(shù)據(jù)表的寫緩存,同時包含一個數(shù)據(jù)庫寫線程;每個表服務由一個單獨線程驅動;
28、數(shù)據(jù)表操作單元,用于任一個數(shù)據(jù)表的所有在途的修改操作,根據(jù)表的“主鍵->寫緩存記錄列表”組織;所述寫緩存記錄由唯一操作id、字段修改數(shù)據(jù)及寫入狀態(tài)組成;所述唯一操作id隨時間先后自增變大;所述寫入狀態(tài)標記此記錄是否已經(jīng)入庫;
29、數(shù)據(jù)寫入單元,用于數(shù)據(jù)庫寫線程接受對應的表服務定期發(fā)起的批量寫入請求,將數(shù)據(jù)寫入關系數(shù)據(jù)庫,并通知表服務線程寫入結果;
30、數(shù)據(jù)讀取單元,用于數(shù)據(jù)庫讀線程組為公共的線程組,接收所有表服務的調(diào)用,從數(shù)據(jù)庫讀取數(shù)據(jù),并返還給表服務線程。
31、所述數(shù)據(jù)庫代理,還包括:
32、lsm容災數(shù)據(jù)庫,用于作為容災組件進行數(shù)據(jù)讀寫備份;使用基于log-structuredmerge-tree技術的kv數(shù)據(jù)庫,能夠極高性能的寫入數(shù)據(jù),防止丟失寫緩存記錄;
33、sql?parser模塊,用于負責將外部請求sql語句轉換為內(nèi)部結構;當數(shù)據(jù)庫代理作為進程內(nèi)組件時,直接使用內(nèi)部結構進行請求。
34、采用上述方案的有益效果是:
35、在游戲服務器與數(shù)據(jù)庫之間增設數(shù)據(jù)庫代理;對游戲服務器發(fā)起的數(shù)據(jù)讀寫操作,數(shù)據(jù)庫代理按數(shù)據(jù)表名哈希hash分配到某一個表服務上執(zhí)行;任一個數(shù)據(jù)表的所有在途的修改操作,根據(jù)表的“主鍵->寫緩存記錄列表”組織;數(shù)據(jù)庫寫線程接受對應的表服務定期發(fā)起的批量寫入請求,將數(shù)據(jù)寫入關系數(shù)據(jù)庫,并通知表服務線程寫入結果;數(shù)據(jù)庫讀線程組為公共的線程組,接收所有表服務的調(diào)用,從數(shù)據(jù)庫讀取數(shù)據(jù),并返還給表服務線程。
36、本發(fā)明方案中,根據(jù)手機游戲的實際情景需求,能夠極大的提高游戲數(shù)據(jù)庫的讀寫吞吐速度,完全發(fā)揮數(shù)據(jù)庫的并發(fā)讀性能,完全發(fā)揮數(shù)據(jù)庫的批量寫性能。針對行業(yè)場景,可將大部分寫操作自動合并,大大減輕了數(shù)據(jù)庫壓力。同時,具有極強的容災能力,保證單表級別的一致性,通用程度高,可以作為數(shù)據(jù)庫代理進程來使用。