位元組面試:什麼是讀寫分離?讀寫分離的底層如何實現?
來源: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ShardingSphere(七) 讀寫分離配置,實現分庫讀寫操作
- ProxySQL實現MySQL讀寫分離MySql
- 【Mongo】Mongo讀寫分離的實現Go
- Docker實現Mariadb分庫分表、讀寫分離Docker
- Redis的讀寫分離Redis
- Kubernetes 中實現 MySQL 的讀寫分離MySql
- 搭建基於springmvc,ibatis的工程實現讀寫分離,配置分離SpringMVCBAT
- PostgreSQL+Pgpool實現HA讀寫分離SQL
- docker+atlas+mysql實現讀寫分離DockerMySql
- KunlunBase 讀寫分離方案
- Laravel讀寫分離原理Laravel
- discuz 配置讀寫分離(主寫從讀)
- StoneDB 讀寫分離實踐方案
- mysql讀寫分離的最佳實踐MySql
- MyCat分庫分表、讀寫分離
- 資料讀寫壓力大,讀寫分離
- Spring Aop實現資料庫讀寫分離Spring資料庫
- ProxySQL實現Mysql讀寫分離 - 部署手冊MySql
- SpringBoot 專案優雅實現讀寫分離Spring Boot
- 搭建MySQL主從實現Django讀寫分離MySqlDjango
- MHA+ProxySQL實現讀寫分離高可用SQL
- Mycat實現mysql的負載均衡讀寫分離MySql負載
- 資料庫讀寫分離資料庫
- 探究MySQL MGR的讀寫分離MySql
- MySQL 讀寫分離的好處MySql
- ShardingSphere + Mysql,實現分庫分表、讀寫分離,並整合 SpringBootMySqlSpring Boot
- 分庫分表(6)--- SpringBoot+ShardingSphere實現分表+ 讀寫分離Spring Boot
- 基於Sharding-Jdbc 實現的讀寫分離實現JDBC
- 讀寫分離 & 分庫分表 & 深度分頁
- Mycat中介軟體實現Percona Cluster讀寫分離
- redis客戶端實現高可用讀寫分離Redis客戶端
- 關於Dapper實現讀寫分離的個人思考APP
- 線上MySQL讀寫分離,出現寫完讀不到問題如何解決MySql
- mysql優化之讀寫分離MySql優化
- 【Cetus】Cetus-讀寫分離版
- Sharding-JDBC基本使用,整合Springboot實現分庫分表,讀寫分離JDBCSpring Boot
- MySQL怎麼實現主從同步和Django實現MySQL讀寫分離MySql主從同步Django
- MySQL-SpringBoot整合JPA實現資料讀寫分離MySqlSpring Boot