如何選擇合適的資料庫,讓遊戲更高效可用

2021-09-23 17:51:55 字數 3460 閱讀 9246

3月8日,2017遊戲行業全球同服和安全攻防技術沙龍在上海舉行,阿里雲資深技術專家丁奇帶來題為「apsaradb介紹—mysql」的演講。本文分五部分為大家介紹,首先從rds基本架構開始聊起,進而說到了如何保障平台資料庫的資料安全和高可用,接著談及了多種資料庫引擎快速適配遊戲邏輯服務,包括rds新特性:轉殖例項、恢復到任意時間點、連線保持等,最後著重分享了rds可診斷性設計並對雲資料庫目標做了總結。

rds基本架構

rds上買乙個例項基本可以看到一主一備的雙節點場景,但雙節點理論上不能保證不丟資料,

即使是非同步複製也容易丟資料,如果作為內部業務分級,日誌類丟一點沒關係,但實際上我們不知道使用者業務是什麼型別的,預設認為都不能丟,可能使用者會感覺新例項沒有老例項跑得快,使用者可以自主在控制台手動設定模式。

雙節點還是有很多的不完備,假設網路抖動時主庫掛掉,日誌就會傳不過去,b超過一秒沒有返回就會退化,如果不退化b系統不可維護,可用性降低,如果剛好在退化期間a掛掉,還是會丟資料,因此我們採用三節點方案。

三節點方案不用退化,a寫入時,b或c至少有乙個人響應收到日誌,如果a掛掉,在b和c選擇日誌收的多的切過去當作主庫,從而提高可用性。

可靠性&

可用性

切換策略

我們的切換策略即是主庫掛了就切,需要保證三點:

首先要正確,不要不該切時切;其次要及時,該切時候一定要切;最後是最小化,可切可不切時候不要切,切了如果沒有用也不要切。

我們內部演化出了三步:開始我們進行select探測,如果成功有返回就沒事,沒有返回即掛了,後面我們發現不對,當主庫可以讀不可以寫的時候,比如磁碟滿了,select都成功,但業務都寫不下去了;接著我們考慮更新探測,自己找系統表update,如果更新成功,說明業務可寫,更新超時或失敗就切換,但當業務壓力變大時,作業系統並不是直接罷工,還是盡力的提供服務,當磁碟iops達到100%時,不是突然變成零,也是有在服務的,可能會出現update語句過了但業務沒過;現在我們的策略是自動報告,mysql自己知道自己的狀況,如果某乙個io響應超過多少秒就說明這個庫不行了,mysql會告訴切換系統切掉主庫,mysql自己會記錄讀寫時間,這是乙個全域性資訊,不會誤報也不會漏報。

你會發現切換系統不再負責決策切換,它只負責查詢,讓資料庫本身來決定誰是主庫誰是備庫。

連線保持

遊戲也比較關心閃斷問題,除了網路抖動外,日常情況下會有非常多需要主動切換連線的操作,比如機器下線、磁碟遷移和軟體公升級等,都需要主動切換,但此過程連線會斷開,對使用者造成影響,這樣的動作很多,而雲使用者有上萬個,我們不知道誰有做重連誰沒做重連。

現在我們的做法是主動切換優化,使用者誤感知,中間的proxy可以做很多事情,切換時先將b公升級,連線從a切到b,但使用者連線的是proxy,所以不會感知,專案需要在使用者離峰期切換。

恢復到任意時間點

恢復到任意時間點,指定乙個時間點,起乙個臨時例項,把資料恢復到指定那一秒之前的資料狀態,具體邏輯如下:

第一步,取上乙個全量備份,恢復到臨時例項;

第二步,取上乙個備份之後的binlog,應用;

第三步,接上主庫,追日誌到指定時刻。

雪崩場景

如果失敗要斷開重連,但有時可能不是失敗而是變慢了,比如預計一秒返回,但一秒沒返回你可能就會斷開,如果資料庫斷開會有很多重試邏輯,瞬間超時導致重試,業務會重試,然後客戶會重試,但資料庫裡的連線還在跑,接下來又會發起一波連線,可能原來50個連線在跑,突然發生大的操作將資料庫拖慢後,就會變成100個連線在跑,都超時就會都重連,越來越多進而掛掉,這時候業務kill都來不及,只能重啟。在rds中,我們提供select max_statement_time=1000的原始碼方案,表示語句最多執行1000ms,到了1000ms就會內部自殺,時間與業務端超時設成相同即可。效能&

成本日誌業務

業務發展起來後,日誌佔的成本比業務資料還要大,那麼,日誌的特性包括:資料量很大、寫入量大和查詢少。tokudb十倍壓縮和寫資料速度不衰減可滿足日誌的特性。

在tokudb上加petadata效果更好,petadata是rds自己開發的中介軟體,可以支援分庫分表和分布式事務,連線透明,客戶端只需要連線petadata即可,要擴容時只需把機器加進去,後台自己會做靜默遷移,應用沒有感知。功能&

形態

可診斷性

審計日誌

可診斷性可以衡量乙個雲服務的成熟度。審計只是其中一部分,我們做全鏈路監控,包括磁碟、記憶體、資料庫、網絡卡以及各種鏈路等,當即不是上游也不是下游,而是mysql內部出問題時就需要dba出場了,審計日誌是做可診斷性最重要的工具,記錄所有的使用者資料操作才有審計效果,看上去很像general_log,開啟後效能下降90%,而rds審計日誌效能只下降2%,記錄了源ip、使用者名稱、執行緒id、掃瞄行數、latency、執行時間(us)、返回行數、更新行數、錯誤號和消耗記憶體,並不是所有的不是慢sql語句都沒有問題,如果記得所有資料,乙個普通語句返回兩行,掃瞄5000行,說明索引沒有建好,即使語句短時間返回,也應該被處理。

診斷報告

我們推出診斷報告,在測試後我們會出某個時間段的資料庫狀態,有哪些潛在問題,潛在的死鎖原因需要解決,告訴你哪些事務時不必要的,哪些事務已經回滾了。小結

雲資料庫的目標是讓mysql像orcale一樣,允許dba去逃避簡單的工作,讓他們有精力變成資料架構師。

丁奇:阿里雲關聯式資料庫服務核心開發和運維團隊負責人,活躍的mysql社群貢獻者。開源分支alisql和《資料庫核心月報》負責人。在雲資料庫系統開發、運維、架構優化上有豐富的經驗。現致力於推動通過自動化專家系統的建設和推廣,以提公升雲資料庫使用者的業務穩定性。

選擇合適的資料庫

這部分在nosql精粹這本書的混合持久化到選擇合適的資料庫,即第13章到第15章描述的非常好。推薦大家閱讀下。使用鍵值對資料庫來儲存購物車和會話資料,使用文件資料庫來儲存已完成的訂單 使用庫存及產品 來儲存關係型資料庫,關係型資料庫在事務處理上面的優勢是其他資料庫不可比擬的 使用它圖資料庫來儲存客戶...

Oracle資料庫中如何選擇合適的索引型別

索引就好象一本字典的目錄。憑藉字典的目錄,我們可以非常迅速的找到我們所需要的條目。資料庫也是如此。憑藉oracle資料庫的索引,相關語句可以迅速的定位記錄的位置,而不必去定位整個表。雖然說,在表中是否建立索引,不會影響到oracle資料庫的使用,也不會影響資料庫語句的使用。這就好像即使字典沒有目錄的...

Oracle資料庫中如何選擇合適的索引型別

索引就好象一本字典的目錄。憑藉字典的目錄,我們可以非常迅速的找到我們所需要的條目。資料庫也是如此。憑藉oracle資料庫的索引,相關語句可以迅速的定位記錄的位置,而不必去定位整個表。雖然說,在表中是否建立索引,不會影響到oracle資料庫的使用,也不會影響資料庫語句的使用。這就好像即使字典沒有目錄的...