位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?
來源:mikechen的網際網路架構
資料庫在高併發大資料量的場景尤其重要,特別是效能的的問題,這其中就會涉及到資料庫讀寫分離機制,比如:什麼是讀寫分離?底層如何實現?優先順序如何排定等問題@mikechen
什麼是讀寫分離
讀寫分離就是將資料庫分為主從庫,一個主庫(Master)用於寫資料,多個從庫(Slaver)進行輪詢讀取資料的過程。
主從庫之間透過某種通訊機制進行資料的同步,是一種常見的資料庫架構。
為什麼要讀寫分離呢?
因為資料庫的“寫”,比如:10000條資料到oracle可能要3分鐘,操作是比較耗時的。
但是資料庫的“讀”,比如:從oracle讀10000條資料可能只要5秒鐘,相對應寫就沒有這麼耗時。
所以讀寫分離解決的是:把資料庫的寫入與查詢,在伺服器上分開來,從而可以極大的提升查詢效率。
什麼時候要讀寫分離?
資料庫不一定要讀寫分離,但是如果程式使用資料庫較多時,而更新少,查詢多的情況下就可以考慮使用。
這樣可以減少資料庫壓力,提高效能,當然資料庫也有其它最佳化方案,比如:分庫分表,或是搜尋引擎等都是解決方法。
讀寫分離的原理
讀寫分離基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。
讀寫分離是為了將請求流量分散到不同的資料庫節點上,將寫入資料的請求分發到主資料庫,讀取資料的請求分發到從資料庫,從資料可以有多臺,即一主多從。
整體架構如下圖:
從上圖可看出,有個關鍵技術就是主從複製,每次寫入資料的時候,需要將主伺服器資料複製到從伺服器中,用來確保資料一致性。
下面我以MySQL的主從複製為例,如下圖所示:
主從複製
從伺服器連線上主伺服器,啟動複製的時候,則會自身建立一個IO執行緒去像主資料庫伺服器拉取binlog的更新資訊。
把拉過來的binlog資訊寫到自己伺服器的一個relay log日誌檔案中。
從資料庫伺服器建立一個SQL執行緒,是為了將relay log的所有日誌資訊,進行sql回寫到自己的資料庫中,這樣就和主庫的資料一模一樣了。
當主資料庫有資料更新的時候,比如新插入了一條或者update了一條資料,這時候主庫會將這些資料更新到binlog二進位制檔案中,同時,主庫會建立一個binlog dump執行緒,這個執行緒將更新了的binlog資訊傳送到從庫的IO執行緒,需要注意的是,這個過程是非同步的,如果等著從庫接受完成,是不是特別慢,且影響效能。
讀寫分離總結
在實際的生產環境中,對資料庫的讀和寫都在同一個資料庫伺服器中,是不能滿足實際需求的,無論是在安全性、高可用性還是高併發等各個方面都是完全不能滿足實際需求的。
因此,透過主從複製的方式來同步資料,再透過讀寫分離來提升資料庫的併發負載能力,即可以解決可用性的問題,又解決了資料庫效能問題。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024420/viewspace-3004261/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CQRS如何實現讀寫分離
- Amoeba實現讀寫分離
- ProxySQL實現MySQL讀寫分離MySql
- Amoeba 實現 MySQL 讀寫分離MySql
- 【Mongo】Mongo讀寫分離的實現Go
- Amoeba+Mysql 實現讀寫分離MySql
- springboot實現讀寫分離Spring Boot
- mysql-proxy實現讀寫分離MySql
- Redis的讀寫分離Redis
- mongodb的讀寫分離MongoDB
- Docker實現Mariadb分庫分表、讀寫分離Docker
- Laravel讀寫分離原理Laravel
- MySQL Amoeba讀寫分離MySql
- Amoeba for mysql讀寫分離MySql
- MySQL讀寫分離AtlasMySql
- PostgreSQL+Pgpool實現HA讀寫分離SQL
- docker+atlas+mysql實現讀寫分離DockerMySql
- StoneDB 讀寫分離實踐方案
- Mycat讀寫分離配置實踐
- MyCat分庫分表、讀寫分離
- Mycat 讀寫分離+分庫分表
- 資料讀寫壓力大,讀寫分離
- 搭建MySQL主從實現Django讀寫分離MySqlDjango
- MHA+ProxySQL實現讀寫分離高可用SQL
- ProxySQL實現Mysql讀寫分離 - 部署手冊MySql
- MySQL 中介軟體Atlas 實現讀寫分離MySql
- Spring實現資料庫讀寫分離Spring資料庫
- 搭建基於springmvc,ibatis的工程實現讀寫分離,配置分離SpringMVCBAT
- MySQL + Atlas --- 部署讀寫分離MySql
- Amoeba for MySQL讀寫分離配置MySql
- mysql讀寫分離(PHP類)MySqlPHP
- 資料庫讀寫分離資料庫
- Mycat實現mysql的負載均衡讀寫分離MySql負載
- MySQL 讀寫分離的好處MySql
- 探究MySQL MGR的讀寫分離MySql
- 【Mongodb】 Replica set 的讀寫分離MongoDB
- 資料庫的讀寫分離資料庫
- mysql讀寫分離Amoeba的部署MySql