MongoDB開發系列-複製集對程序開發的影響

本篇文章主要從如下幾個方面說明覆制集架構對程序開發的影響php

筆者把基於MongoDb的應用開發分爲軟件運維和 軟件開發兩個階段java

本篇會側重後一階段的實踐經驗分享git

  1. 理解複製集與主從結構
  2. 關注數據庫鏈接字符串

複製集的基本概念

談到複製集,它是副本的集合,分佈式系統的基本屬性之一。github

副本(Replica)

副本是分佈式系統最多見的概念之一,指分佈式系統對數據和服務提供的一種冗餘方式。在常見的分佈式系統中,爲了對外提供高可用的服務,咱們每每會對數據和服務進行副本處理。有副本的概念,就會關聯到副本數據一致性問題。mongodb

MongoDb環境下,咱們很容易從公開資料查詢到複製集的基本你含義數據庫

MongoDB 複製(副本集)MongoDB複製是將數據同步在多個服務器的過程。安全

複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提升了數據的可用性, 並能夠保證數據的安全性。服務器

複製還容許您從硬件故障和服務中斷中恢復數據yii2

副本集角色

MongoDB副本集是一組mongod進程的集合,它經過一系列機制實現了高可用。網絡

mongod is the primary daemon process for the MongoDB system. It handles data requests, manages data access, and performs background management operations.

副本集角色主要包括主節點,從節點,和仲裁節點。 主節點負責全部的寫操做。

複製集與主從結構的關係

二者屬於不一樣的MongoDb數據庫結構,主從結構已經不被官方推薦

Deprecated since version 3.6: MongoDB 3.6 deprecates the use of
master-slave replication.Master-slave replication has been deprecated
for components of sharded clusters since MongoDB 3.2.

主從結構與複製集最主要的區別是前者有真正的主服務器的概念,複製集沒有主服務器的概念,經過選舉選出主要的主節點Primary

Do not run an arbiter on systems that also host the primary or the secondary members of the replica set

仲裁者必定要部署在獨立的服務器上,避免與主節點和複製節點部署在一塊兒

傳統的主從部署

MongoDB開發系列-複製集對程序開發的影響

複製集

這是Mongo官方更推薦的部署結構

MongoDB開發系列-複製集對程序開發的影響

MongoDB開發系列-複製集對程序開發的影響

複製集

關注數據庫鏈接字符串

複製集屬於MongoDb高可用架構的一種部署方式,對於使用數據庫的應用者來講應該是極度透明的,內部主從實例切換應該作到無感切換,也就是說應用並不關心具體的一次數據庫操做,是由哪一個實例來處理的。

咱們能夠在程序中指定如何鏈接複製集,正確的鏈接方式能夠避免當主節點宕機或者故障時,應用程序無感知正常切換,借用網絡的一張圖來講明

MongoDB開發系列-複製集對程序開發的影響-圖南科技-正確的鏈接複製集

這張圖的左邊部分其實是有問題的,直連一個實例,而且標明Primary,對於鏈接Db數據庫的Driver來講,它應該不用關心哪一個實例是主,而且哪一個實例是主也是會變化的。

試想運維給到開發的數據庫鏈接串是一組配置,那咱們如何集成到應用程序中?

基礎設置

對於PHP應用來說,框架使用YII2,驅動使用yii2-mongodb

https://www.yiiframework.com/...

Github地址

https://github.com/yiisoft/yi...

  1. 安裝
Either run

php composer.phar require --prefer-dist yiisoft/yii2-mongodb

or add

"yiisoft/yii2-mongodb": "~2.1.0"
  1. 鏈接字符串

直連方式

return [

    'class' => '\yii\mongodb\Connection',

    'dsn'  => 'mongodb://username:password@s1.test.mongodb.domain.cn:10000/databasename',

    'options'=>[

        'socketTimeoutMS' => 1000

    ]

];

複製集鏈接

return [

'class' => '\yii\mongodb\Connection',

'dsn' => 'mongodb://user:pqssword@s1._test.mongodb.domain.cn:30000,s2.mongodb.domain.cn:30000,s3._test.mongodb.domain.cn:30000/databasename',

];

問題來了

1 應該都鏈接,仍是隻鏈接一臺數據庫實例便可?

生產環境下,複製集合實例有3個,咱們都配到了鏈接串中。是否應該只鏈接一臺,我我的也沒有很好的解釋,理論上應用只須要一個入口便可,後續都交給數據庫處理。

2 鏈接超時設置是否應該顯示設置?

https://docs.mongodb.com/manu... 官方有針對鏈接串的參考說明。

談到超時問題,咱們來看數據庫鏈接週期

一次完整的請求包括三個階段:一、創建鏈接 二、數據傳輸 三、斷開鏈接。

一般咱們談到的超時分爲兩種,connectTimeout 和socketTimeout,前者是網絡鏈接超時,後者是執行超時。

若是與數據庫服務器請求創建鏈接的時間超過ConnectionTimeOut,就會拋 ConnectionTimeOutException,即服務器鏈接超時,沒有在規定的時間內創建鏈接。若是服務器處理數據用時過長,超過了SocketTimeOut,就會拋SocketTimeOutExceptin,即服務器響應超時,服務器沒有在規定的時間內返回給客戶端數據。(這裏的異常是java驅動返回的異常)

這兩個參數,官方給出的是 connectTimeoutMS和socketTimeoutMS

MongoDB開發系列-複製集對程序開發的影響-圖南科技-超時時間

生產環境下關於options參數

咱們在生產環境下,參數replicaSet,connectTimeoutMS,socketTimeoutMS都沒有配置。

官方文檔

https://docs.mongodb.com/manu...

https://docs.mongodb.com/manu...

https://docs.mongodb.com/manu...


文章中的觀點有不嚴謹之處,歡迎評論溝通,關於副本集,筆者也是在不斷探索中。

抱着不肯定性思惟,學習MongoDb數據庫的基本態度:邊學習,邊實踐,邊參考,邊改進,在問題中成長。

歡迎關注公衆號《圖南科技》

圖南科技

相關文章
相關標籤/搜索