關於mysql開元資料庫的幾個隨想
現在已經是凌晨了,昨天晚上寫了我人生中的第一篇筆記,覺得沒什麼可寫的,寫了一個多小時都沒寫出什麼,現在突然想寫點東西了,這是一個比較有趣的問題,前兩個月換了新工作,記得當初面試這份工作的時候面試到第三關(專案經理這關)的時候,他問到了我用過什麼資料庫,因為在回答過程中無意中說了oracle資料庫是百萬級別的資料庫,mysql是中小型資料庫的時候,面試經理反問我說聽說現在的淘寶用的資料庫就是mysql,這個怎麼解釋呢?說真的當時我真的不知道怎麼解釋,只是知道mysql是開元的,而oracle不是,所以當時的回答是:首先mysql是開元的,而oracle不是,而且像馬雲現在業務做的這麼大,並不是他一個人在撐著的,而他能幹別人幹不了的事情的原因是他有很多聰明的員工,當然要看他的工程師怎麼用咯!雖然我覺得這個回答不是正確的,但是說出自己的思路和理解總比不說或者說不會好吧!好吧!事實的確是這樣。但經過工作之餘時間的檢視文件現在給這個問題做一個總結:
首相要宣告一點的是MYSQL是開元的,開元的意味著MYSQL發展的很快,會變得很優秀,而且MYSQL說是一個數據庫倒不如說是一種儲存的規則,mysql的工作原理也簡單明瞭,在最外層到裡層分為 connectors、(連線管理器,包括安全的認證)、connection pool(連線池,掛你緩衝使用者連線、執行緒處理)、management Service(系統管理和控制工具)、 &utilities、sql interface(sql介面,接手使用者的sql命令、返回使用者需要查詢的結果)、parser(解析器,解析sql命令)、optimizer(查詢優化器,歷史調優執行過程策略方案處理)、cache&buffers(查詢快取)、storage engines(儲存引擎)、file&logs。
通過配置mysql叢集儲存方案,可以提高效能和有較好的用錯性,具有不共享、分散式節點框架的特點
讀寫分離
一臺 Mysql 作為獨立的資料庫無法滿足實際需求。在實際生產環境中,不論是安全性,高可
用性,還是高併發性等各個方面,單獨一臺 Mysql 都不足以滿足業務需求。
故而現在的做法多為:通過主從複製(Master-Slave)的方式來實現資料同步,再通過讀寫分離
(MySQL-Proxy)來提升資料庫的併發負載能力。使用這種方式進行開發部署,可以較好的解決
業務需求
讀寫分離的原理:
讓 Mater 處理增、改、刪(INSERT、UPDATE、DELETE)操作,而 Slave 處理查詢(SELECT)操作。
可以通過 MySQL-Proxy 實現讀寫分離,進行 MySQL-Proxy 讀寫分離至少需要有以下配置:
1. 資料庫 Master 主伺服器 x1
2. 資料庫 Slave 從伺服器 x1
3. MySQL-Proxy 排程伺服器 x1
通過以下操作,可以實現讀寫分離,下列操作都是在 MySQL-Proxy 排程伺服器上進行的。
1. MySQL 的安裝與配置
2. 檢查系統所需軟體包
3. 編譯安裝 Lua
4. 安裝配置 MySQL-Proxy
5. 配置並使用 rw-splitting.lua 讀寫分離指令碼
完成以上操作後,即可測試讀寫分離效果。暫時關閉主從複製功能,連線 MySQL-Proxy,插
入任意記錄。查詢將發現沒有新記錄。分別登入到主從伺服器查詢,發現主伺服器有插入記
錄,從伺服器沒有。通過驗證,MySQL 的讀寫分離已經達成,所有的寫操作均在 Master 完
成。這樣做,就避免了多個數據庫同時寫入可能造成的資料庫不一致性。
此外,所有的讀操作分攤給了各個 Slave,以此減輕資料庫壓力。
跨地區容災
這裡簡單介紹一下使用雙機熱備進行跨地區容災。
雙機熱備,簡單來講,就是令兩個資料庫保持狀態自動同步。對於處於雙機熱備當中的資料
庫,對其中任何一個進行操作都可以自動同步到另外一個,這樣,就保持兩個資料庫當中的
資料始終一致。
這種方式有兩個好處:
1. 異地容災,其中一個壞了可以切換到另一個。
2. 負載均衡,可以將請求分攤到其中任何一臺上,提高網站吞吐量。
備份工作原理:
兩個原始資料相同的資料庫 A 和 B,A 資料庫中執行過的 sql 語句在 B 資料庫裡也同步執行一
遍,通過這樣,A、B 資料庫就可以一直保持同步。
上面是查閱資料找到的一些資料,這些資料足以證明mysql可提供配置和使用的方式很靈活,根據實際的資料特點配置合理的叢集資料庫的確有可能打贏oracle這個百萬級別的資料庫,而且通過靈活的配置反倒有更多的優點,例如容錯和容災性、沒有百萬級別資料庫的那種笨重,後期未婚遷移靈活。