巧用RDS全家桶搭建億級新聞源倉庫
我們的業務,有一個實時新聞源庫,初始大概有3000萬資料,現在大概有上億條資料了,我們在起初的處理方式比較簡單粗暴,直接購買了3臺8核16G的SSD版本的ECS,組成了一主雙從的機組,從庫只讀。
業務是單庫,但是具體的內容是分表的,比如:
article_content_01一直到article_content_200或更多,業務系統會在滿足要求後實時建立新的表,每張表的資料量大概在100萬左右。
我們在2013/2014年開始遇到各種各樣的問題,也算是一些經驗教訓吧:
1.使用ECS組建的資料庫叢集,可用性不是特別特別的高,主要受限於IO、網路同步速率。甚至遇到過從庫意外關機,然後影響業務了。
2.我們把所有的讀取SQL放到了從庫進行,但是問題來了,我們的開發語言是php,所以它沒有辦法像JAVA那樣做一個連線池來處理請求,一開始我們使用一個隨機演算法來分配每次讀請求所使用的從庫,導致當我們的併發很大的時候,從庫的連線分配策略會出現不平均的問題,從而導致某個從庫滿載。雖然最後通Haproxy完成了從庫的負載均衡,但是也帶來了額外的運維負擔。這個談不上是坑,算是一個經驗教訓,想當然的以為隨機演算法可以替代負載均衡了。
3.風控的問題 ,有的時候一些不應該發生的低階錯誤就是這麼堂而皇之的出現了,比如,測試庫只有3000萬資料,而正式庫有3億資料,有些邏輯程式碼在測試庫的響應正常並不代表在正式庫也是正常的。如果你不能敏感並及時的去處理慢查詢,那業務基本也就涼了。
4.監控的問題不提了,直到最後都沒找到一個稱心如意的MYSQL監控解決方案。
5.審計的問題,我們永遠處於有日誌,而沒辦法審計的狀態,有事沒事假裝看看罷了。
6.備份就討厭了,需要手動這先不說。備份時機、鎖表、備份後的歸檔處理、定時清理老備份、備份檔案的校驗,這些都是事兒啊,對運維人員來說,都是很低階但是不得不做的工作。
7.有的時候,你的Web伺服器抗住了流量,但是不幸的是你的資料庫沒能堅持下去,這種突發的流量往往沒辦法預測,或者出現後需要最短時間內修復,我們出現過大概3次,每次大概2小時時間去擴容,會影響一部分我們使用者的體驗,表現為卡頓、頁面報錯等。
8.硬成本和運維成本問題,3臺高配ECS+1個全職運維人員的成本,一年下來少說也要幾十萬。
問題應該有很多,但是隻能想到這些,先記下來吧。其實有很多問題不是MYSQL的問題,屬於架構層面或者開發層面的問題,但是我們談一個具體技術細節的時候不能只談它本身,沒有場景和實踐,那是耍流氓啊。
然後我們從15年開始,實在是不行了,這種方式已經讓所有人都接近崩潰,所以我們考慮切換到RDS上去,當時只是先切換了幾個不重要的業務庫,試試看效果。然後一發不可收拾,總結一句話,這產品除了價格,簡直完美。
首先RDS for Mysql解決了我之前提到的幾個問題:
1.託管式的服務,動態彈性的升級,不需要關心運維的問題。
2.可以動態的新增只讀庫,方便。
3.控制檯對慢查詢很敏感(雖然這個是近2年才有的功能),而且可以做報警。
4.阿里雲現在這一版的控制檯看監控還算是比較舒服,也能看的全。
5.日誌審計這一塊,通過最新版本的阿里雲DMS已經可以比較簡單的完成了,它還有個收費版,沒用過,沒有發言權,但是現在這個免費的版本也挺不錯的。
6.備份不提,阿里雲RDS的備份已經做得很好了。
以上的問題,除了突發流量暴庫的問題不能通過RDS直接解決,其他都能很好的解決了。而且相對於3個ECS的成本,單獨購買RDS的費用也還在可以接受的範圍內。
下面說一下,我們如何解決突發流量的問題,阿里雲有個比較好的產品叫DRDS,但是這個產品屬於好用,但知名度不高的一個狀態,可能是小客戶用到的概率不高吧。
DRDS扮演了一個類似負載均衡器的角色,當然了,比普通的負載均衡更高階一些。它不僅僅是Haproxy這種基於網路點的負載均衡,還可以針對SQL進行負載均衡,這一點在處理超大表檢索的時候特別好用。而且它的後端是一個個的RDS,對於低成本突破連線數限制有非常大的幫助,同時彈性增減擴容,只需要購買按量RDS就可以了。
在高併發的場景下,資料庫遇到的問題主要在於連線數限制、IO限制、鎖、併發讀寫等問題,這些問題通過RDS/DRDS幾乎都可以很好地去進行處理,有些高階應用需要做一點點開發上的讓步。
阿里雲的RDS例項其實也經過變遷的,起初是隻限制記憶體和連線數,後來才出現“CPU核數”這個概念,所以也導致了我這種老使用者一度很難適應,畢竟老版本2400M記憶體的RDS就預設8核了,而現在購買一個8核的RDS價格還是比較高的。我有個骨灰級的例項,可以截圖給大家看下,現在買不到啦:
有一段時間,時不時也會收到簡訊提示,RDS發生主備切換云云,起初是比較緊張的,擔心阿里雲的技術不硬從而影響我的業務,後來切換過多次之後,發現真的沒出過問題,從此也就安心了,小顧慮罷了。
最後一部分說一下,我們如何解決全文檢索的問題,因為有分表的原因,所以很難通過程式去完成全文檢索,而且因為量大Like語句基本不可能使用。在這種情況下,我們開始嘗試使用第三方的工具去完成,比如Sphinx 。但是我們很快又遇到了問題:
1.成本問題,因為Sphinx 不寫磁碟,一切讀取到後都存在記憶體,所以幾億資料對記憶體的要求就高了,買ECS的時候就要買高記憶體的配置。
2.Sphinx一次性讀取資料到記憶體這個過程,可能對業務產生一定效能影響,但是不嚴重。
3.Sphinx 的運維問題及配置問題。
然後我們偶然的發掘了阿里雲的OpenSearch產品,支援RDS一鍵同步並且視覺化的建立表、索引很舒心,還提供了SDK和各種好用的函式。唯一的問題在於,價格感人,特別是資料量大且每天併發檢索高的使用者來說,這個成本很可觀。但是優點也很明顯:
1.除了一開始的建立,幾乎不需要你運維。
2.所有資料都打平到一層,檢索速度極快。
3.支援分表結構,支援多個實體表,支援主外來鍵關聯,萬物皆可查詢。
4.對資料來源幾乎沒有任何影響,即便你源庫掛了,檢索服務依舊可用。
就先寫到這裡了,都是些經驗教訓,談不上太高深的技巧,主要還是要結合場景去做一個適合自己業務的架構。現在我們關係型資料庫用RDS for
Mysql,NoSQL資料庫使用RDS for
MongoDB,一路走來也都挺好的,雖然某個階段它有這樣那樣的問題,但是一個持續迭代的產品必然會有更高的生命力和穩定性。
原文來自:qipangzi.com
相關文章
- 搭建vue全家桶Vue
- 如何搭建一個REACT全家桶框架React框架
- vue全家桶Vue
- SwnoRabbit全家桶
- vue全家桶 仿小紅書開源專案Vue
- 從零開始搭建React全家桶環境React
- Spring全家桶--單資料來源的配置Spring
- vue全家桶 ---建立一個新的vue專案Vue
- 如何使用docker搭建一個全家桶開發環境Docker開發環境
- 使用 React 全家桶搭建一個後臺管理系統React
- Flutter 圖片全家桶Flutter
- React全家桶專案React
- 多項式全家桶
- DP全家桶(長期)
- Docker倉庫之Harbor企業級映象倉庫的搭建與使用Docker
- Spring全家桶一覽Spring
- react全家桶都有什麼React
- Vue全家桶學習(二)Vue
- 當詐騙平臺Steam管家升級為“全家桶”平臺
- Vue3全家桶升級指南一composition APIVueAPI
- 用Vue全家桶純手工搓了一個開源版「抖音」Vue
- yum倉庫搭建
- ⚡ vue3 全家桶體驗Vue
- VUE全家桶之vuex的使用Vue
- SnowRabbit全家桶-Laravel多模組Laravel
- react全家桶快餐進食指南React
- vue全家桶上手小專案Vue
- 搜尋全家桶(未完待續)
- RHEL6搭建網路yum源軟體倉庫
- Vue2.x全家桶WebAppVueWebAPP
- Handler全家桶之 —— Handler 原始碼解析原始碼
- Vue 3.0 全家桶搶先體驗Vue
- vue全家桶 ---vue-router路由篇Vue路由
- Java之定時任務全家桶Java
- SwnoRabbit全家桶-前端頁面模式投票前端模式
- 暴雪全家桶·經典遊戲回顧遊戲
- Jetbrains全家桶啟用方法AI
- mysql資料庫全家桶(安裝與如何寫sql,如何使用)MySql資料庫