Day2.MongoDB學習筆記2
一、MongoDB副本集概要
- 什麼是MongoDB副本集?
副本集是一組mongodb程序,它維護了同樣的資料集。副本集提供了資訊冗餘和高可用,是所有生產部署的基礎。
客戶端,讀寫操作主節點,然後將資料複製到副節點中。
- 節點
-
Primary Node 主節點,一個副本集只能有一個主節點,主要作用接受客戶端所有寫操作(預設情況下,也可以讀取資料),並記錄主節點操作日誌,副節點複製主節點日誌,用其同步資料。
-
Secondary Node 副節點,複製主節點的操作,並同步其資料,實際上副節點是主節點資料的備份。如果主節點掛掉的話,剩餘的副節點會觸發選舉演算法,將其中的一個副節點,選舉為主節點。
-
Replication 通訊機制
-
Heartbeat 心跳檢測,主副、副副間都要心跳檢測
二、搭建MongoDB副本集(Replication)
主節點中插入一條資料,副節點當中檢視是否有同步資料
- 準備工作,並啟動起來三個服務
至少3臺伺服器 準備3份資料存放目錄 //bin目錄下,執行server,當作主伺服器 ./mongod --port 28000 --dbpath=/data/node1/ --bind_ip_all --replSet rs //再分別啟動兩個副伺服器 ./mongod --port 28001 --dbpath=/data/node2/ --bind_ip_all --replSet rs ./mongod --port 28002 --dbpath=/data/node3/ --bind_ip_all --replSet rs
- 副本集初始化(使用客戶端連線任意Mongo Server)
關閉防火牆 ./mongo 192.168.153.136:28000 //連線上一個服務 //# 初始化副本集(注意:_id的名字應該和啟動引數 `--replSet` value一致) rs.initiate( { _id : "rs", members: [ { _id: 0, host: "192.168.153.136:28000" }, { _id: 1, host: "192.168.153.136:28001" }, { _id: 2, host: "192.168.153.136:28002" } ] })
rs.status() //檢視副本集狀態 "stateStr" : "PRIMARY" //主節點、"SECONDARY" //副節點
- 測試副本集資料同步
先再主節點,插一條資料看看
連線到其他server
./mongo 192.168.153.136:28001
//檢視時,報錯,"errmsg" : "not master and slaveOk=false",
- 原因是因為副本集中預設使用主節點讀寫資料,副節點只做資料備份,不參與讀操作。
db.getMongo().setSlaveOk() //開啟副節點讀功能
- 高可用?選舉演算法,選副為主
低版本有主從叢集,高版本使用副本集代替
//停掉主節點服務,再在測試狀態,rs.status()
//原主節點:"stateStr" : "(not reachable/healthy)"
//其他節點,有一個副節點變成主節點
三、MongoDB基於副本集完成讀寫分離
利用Mongo副本集可以搭建一個高可用的叢集環境。但是在預設情況下,讀寫操作都在Primary主節點上進行,在高併發的環境下,Primary的負載較大。那如何解決這個問題呢?,我們可以利用讀寫分離,就是讓,Primary負責寫操作,Secondary負責讀操作,分攤Primary的壓力。
主寫副讀
- MongoDB驅動程式支援的5中讀優先順序模式
讀取首選模式 | 使用 |
---|---|
primary | 預設,從主節點讀取資料 |
primaryPreferred | 在主節點不可用時,從副節點讀取資料 |
secondary | 所有的讀操作,從副節點讀取資料 |
secondaryPreferred | 在副節點不可用時,從主節點讀取資料 |
nearest | 從網路延遲最小的節點獲取資料 |
- 配置
db.getMongo().setSlaveOk() /所有副節點開啟可讀
- 程式碼
- Spring Data MongoDB
在這裡我們使用Spring Data提供的MongoTemplate操作ReplSet(類似Spring Data Redis) - 依賴
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
- 配置檔案 applicationContext.xml
四、MongoDB分片集(Sharding)
-
Sharding(分片)是一種方法:
分片是一種支援海量資料儲存並進行高吞吐量操作的方式。(mysql的分庫分表也是分片的體現)
在大資料集和高吞吐量操作的情況下,對單一的伺服器硬體要求較高(一般要求算力優異的CPU提供運算能力,RAM或者DISK也要足夠大)。
傳統的方式就是對伺服器硬體進行升級,而這樣的做的成本往往很高(垂直擴充套件)。
而MongoDB提供的分片,其實上就是使用多數的廉價伺服器構建成叢集,提供海量的資料儲存以及平行計算的能力(水平擴充套件)
-
分片叢集的元件
- shard server
用於儲存實際的資料塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障。 - config server
顧名思義為配置伺服器,儲存所有資料庫元資訊(路由、分片)的配置。 - mongos server
資料庫叢集請求的入口,所有的請求都通過mongos進行協調,不需要在應用程式新增一個路由選擇器,mongos自己就是一個請求分發中心,它負責把對應的資料請求請求轉發到對應的shard伺服器上。在生產環境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。
與springboot整合:http://www.gaozhy.cn/blog/2018/04/12/springboot-mongodb/
五、MongoDB總結
- mongoDB適合儲存:海量資料、變化的資料、json形式資料
- 使用場景:日誌、物流資訊、商品資訊、訂單資訊、全文檢索、鉅額查詢、地理位置查詢(例:附近情況)
- 副本集和分片集 會搭建,瞭解即可(非重點,是加分項)