1. 程式人生 > >Day2.MongoDB學習筆記2

Day2.MongoDB學習筆記2

一、MongoDB副本集概要

  • 什麼是MongoDB副本集?

副本集是一組mongodb程序,它維護了同樣的資料集。副本集提供了資訊冗餘和高可用,是所有生產部署的基礎。
客戶端,讀寫操作主節點,然後將資料複製到副節點中。

  1. 節點
  • Primary Node 主節點,一個副本集只能有一個主節點,主要作用接受客戶端所有寫操作(預設情況下,也可以讀取資料),並記錄主節點操作日誌,副節點複製主節點日誌,用其同步資料。

  • Secondary Node 副節點,複製主節點的操作,並同步其資料,實際上副節點是主節點資料的備份。如果主節點掛掉的話,剩餘的副節點會觸發選舉演算法,將其中的一個副節點,選舉為主節點。

  • Replication 通訊機制

  • Heartbeat 心跳檢測,主副、副副間都要心跳檢測

二、搭建MongoDB副本集(Replication)

主節點中插入一條資料,副節點當中檢視是否有同步資料

  1. 準備工作,並啟動起來三個服務
至少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
  1. 副本集初始化(使用客戶端連線任意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" }
   ]
})

圖2.01

rs.status()	//檢視副本集狀態	"stateStr" : "PRIMARY" //主節點、"SECONDARY" //副節點
  1. 測試副本集資料同步
    先再主節點,插一條資料看看
    圖2.02
    連線到其他server
./mongo 192.168.153.136:28001

//檢視時,報錯,"errmsg" : "not master and slaveOk=false",
  1. 原因是因為副本集中預設使用主節點讀寫資料,副節點只做資料備份,不參與讀操作。
db.getMongo().setSlaveOk()	//開啟副節點讀功能
  1. 高可用?選舉演算法,選副為主
    低版本有主從叢集,高版本使用副本集代替
//停掉主節點服務,再在測試狀態,rs.status()

//原主節點:"stateStr" : "(not reachable/healthy)"
//其他節點,有一個副節點變成主節點

三、MongoDB基於副本集完成讀寫分離

利用Mongo副本集可以搭建一個高可用的叢集環境。但是在預設情況下,讀寫操作都在Primary主節點上進行,在高併發的環境下,Primary的負載較大。那如何解決這個問題呢?,我們可以利用讀寫分離,就是讓,Primary負責寫操作,Secondary負責讀操作,分攤Primary的壓力。
主寫副讀

  1. MongoDB驅動程式支援的5中讀優先順序模式
讀取首選模式 使用
primary 預設,從主節點讀取資料
primaryPreferred 在主節點不可用時,從副節點讀取資料
secondary 所有的讀操作,從副節點讀取資料
secondaryPreferred 在副節點不可用時,從主節點讀取資料
nearest 從網路延遲最小的節點獲取資料
  1. 配置
db.getMongo().setSlaveOk()	/所有副節點開啟可讀
  1. 程式碼
  • 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)

  1. Sharding(分片)是一種方法:
    分片是一種支援海量資料儲存並進行高吞吐量操作的方式。(mysql的分庫分表也是分片的體現)
    在大資料集和高吞吐量操作的情況下,對單一的伺服器硬體要求較高(一般要求算力優異的CPU提供運算能力,RAM或者DISK也要足夠大)。
    傳統的方式就是對伺服器硬體進行升級,而這樣的做的成本往往很高(垂直擴充套件)。
    而MongoDB提供的分片,其實上就是使用多數的廉價伺服器構建成叢集,提供海量的資料儲存以及平行計算的能力(水平擴充套件)
    圖2.03

  2. 分片叢集的元件

  • shard server
    用於儲存實際的資料塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障。
  • config server
    顧名思義為配置伺服器,儲存所有資料庫元資訊(路由、分片)的配置。
  • mongos server
    資料庫叢集請求的入口,所有的請求都通過mongos進行協調,不需要在應用程式新增一個路由選擇器,mongos自己就是一個請求分發中心,它負責把對應的資料請求請求轉發到對應的shard伺服器上。在生產環境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。
  1. 操作
    詳見:http://www.gaozhy.cn/blog/2018/01/19/MongoDB的分片集/

與springboot整合:http://www.gaozhy.cn/blog/2018/04/12/springboot-mongodb/

五、MongoDB總結

  • mongoDB適合儲存:海量資料、變化的資料、json形式資料
  • 使用場景:日誌、物流資訊、商品資訊、訂單資訊、全文檢索、鉅額查詢、地理位置查詢(例:附近情況)
  • 副本集和分片集 會搭建,瞭解即可(非重點,是加分項)