天天看點

RDS最佳實踐(三)—如何制定相關的流程來規範RDS的使用

上一篇文章中,我們介紹了如何快速的把本地自建的資料庫遷移入雲,那是不是把資料庫遷移到rds後,使用者就什麼都不需要做了?比如rds幫你的資料庫做到了高可用,在主庫出現down機後能夠快速切換到備庫,立刻恢複應用;每天會定時的備份資料和日志,如果出現誤操作能夠幫你恢複到任意時間點;如果擔心黑客攻擊或者sql注入漏洞,rds能夠幫助你進行sql注入的攔截;當資料庫使用中出現bug時,後端有專業的源碼和dba團隊幫助使用者執行個體打上patch,讓使用者無後顧之憂;當執行個體的性能出現瓶頸的時候,可以進行快速的彈性更新,保證服務的正常運作等等。

可以看到rds已經具備相當豐富的自動化資料庫運維的功能,使用者不用太關心後端資料庫的運維,以前這些非常專業的dba工作完完全全可以交由rds系統來完成,那麼還需要使用者做什麼,是不是不需要使用者幹預了?答案是需要的,在日常的工單問題發現:

一. 經常會發現由于自己的開發人員誤操作導緻使用者資料被誤删除,雖然rds支援恢複到任意時間點,但畢竟需要時間去恢複,會造成對使用者的影響;是以線上的操作務必謹慎,必須在測試環境中完全驗證後才能到線上執行,同時需要必要的資料備份;

二.開發人員釋出了一個新功能,但是新功能中的一條sql語句沒有添加索引,導緻了全表掃描,rds的cpu,io達到100%,影響了整個應用的響應時間;是以新釋出的任何sql都必須進過嚴格的稽核,添加上必要的索引;

三. 開發人員在業務高峰期對表進行一個表添加索引或者添加字段的操作(删除資料),導緻該表的其他通路堵塞,影響前端應用;是以任何的線上操作都需要在業務的低峰期進行,生産變更必須嚴格控制在可允許的變更視窗内;

四.rds執行個體由于時間到期後沒有及時進行處理,導緻執行個體被鎖定或者釋放,雖然最終資料可以恢複回來,但這種故障的發生往往令人心驚膽寒;

是以需要使用者制定出合理的流程規範來使用rds,比如設計開發過程中的資料庫流程規範,線下測試環境與線上生産環境資料的導入導出流程規範,線上資料訂正的流程規範,線上資料庫操作(添加字段,添加索引)的流程規範,資料庫上線下線的流程規範。

在阿裡巴巴資料庫技術團隊,即使有了非常自動化的運維平台,上述的這些流程制定也是開發,測試,dba都必須遵守的,就是因為有了上述的這些流程才避免了很多不必要的故障發生,大大提高了整個平台的穩定性,除此之外還制定了運維紅線:

一.禁止在非變更視窗執行變更:

.所有的變更必須提前4小時送出申請,進過審批後才能執行操作;

.全網變更必須經過線下測試,線上小規模驗證後,才能全網推送;

.重大變更(資料庫停機,擴容,遷移)必須團隊review;

.資料訂正和資料提取必須經過團隊leader稽核通過後才能進行操作;

二.安全保密:

.禁止未經正式審批進行查閱,變更,傳播,移動線上資料;

.禁止對無關人員提供系統登入和釋出權限;

資料庫開發規範:趕集網(國内網際網路公司)的dba 吳詩展把自己多年的資料庫mysql運維開發檢驗總結了—mysql資料庫開發的三十六條軍,對于很多的rds使用者來說同樣是很受用的,包括了:基本軍規,字段軍規,索引軍規,sql類軍規,約定類軍規,在此也很感謝他能夠把多年來的經驗總結分享給衆多的資料庫使用者,在這裡也在着重強調一些比較重要的規範:

一.表主鍵的設定:自增主鍵是你的最佳選擇

.在設計表的時候預設都添加一列無業務意義的自增id的主鍵:id bigint not null auto_increment;

.自增型主鍵以利于插入性能的提高

.自增型主鍵設計(int,bigint)可以降低二級索引的空間,提升二級索引的記憶體命中率;

.自增型的主鍵可以減小page的碎片,提升空間和記憶體的使用;

.無主鍵的表删除,更新在row模式的主從架構,會導緻備庫hang住;

可參考:mysql主鍵的缺少導緻備庫hang

二.引擎選擇:innodb 引擎是你的最佳選擇

使用innodb存儲引擎還是myisam存儲引擎?

.rds的記憶體配置innodb的innodb_buffer_pool_size,myisam的key_cache配置32k;

.主機斷電,crash後myisam表容易出現索引壞葉,需要手工repair修複索引;

.myisam存儲引擎的表備份時候會被全局鎖住,導緻無法寫入資料;

案例一:下面的這幅圖檔就是myisam引擎的表由于一個大查詢堵塞了該表的其他更新:

RDS最佳實踐(三)—如何制定相關的流程來規範RDS的使用

案例二:.federated 存儲引擎使用存在bug,會導緻備份失敗

三.索引設計誤區:

誤區案例一:對查詢條件的每個字段建立單列索引

sql查詢:

select count(*) from order o  where   is_send=0  and

 o.order_status in (0,1) and o.shipping_status = 0 and

        o.is_separate > 0  and o.is_yushou=0 and o.sd_id=23

 and o.add_time>= ‘1370246433’ and o.add_time<= ‘1370332842’

 and o.jhd_id=0 group by o.order_id;

key:該表有近30個索引

索引設計誤區二:對查詢的所有字段建立組合索引

希望這篇blog能夠對你使用rds有所幫助.