真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MongodbReplicaSet讀寫分離

環(huán)境:MongoDB版本:2.4.6,Replica Set

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,黃陵企業(yè)網(wǎng)站建設,黃陵品牌網(wǎng)站建設,網(wǎng)站定制,黃陵網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,黃陵網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

需求:primary壓力過大,期望secondary分擔讀壓力

前言

    從應用程序角度來看,使用Replica Set 和使用單臺mongo很像。默認的驅動程序會連接primary節(jié)點,并且將所有讀寫請求都路由到主節(jié)點。但也可以通過設置驅動程序的Read Preferences 配置其他選項,將讀請求路由到其他節(jié)點。但需要知道的是將讀請求路由到其他節(jié)點所帶來的問題......  附:驅動程序連接到Replica Set常用的連接字符串類似:'mongodb://server1:27017,server2:27017' .具體可以查看相關驅動程序的文檔,php可參考:http://php.net/manual/zh/mongo.tutorial.php.

    問題是:

    1:  一致性的考慮,對一致性要求比較高的應用程序是不應該從備份節(jié)點讀取數(shù)據(jù),備份節(jié)點通常由于加載問題,網(wǎng)絡等原因,而落后于主節(jié)點幾毫秒,幾秒,幾分鐘 甚至更多。如果應用程序需要讀取它自己的寫操作(比如,先插入一個文檔,再去查詢它)

那么不應該從備份節(jié)點去讀取數(shù)據(jù),除非針對寫操作,使用Write Concern定義w數(shù)值,在復制到所有備份節(jié)點之后,再返回執(zhí)行成功與否??傊绻麖囊粋€落后的備份節(jié)點讀取數(shù)據(jù),就要犧牲一致性。如果希望寫入操作返回之前被復制到所有的副本集成員,就要犧牲寫入速度。

   2: 如果路由到的備份節(jié)點,其中一臺掛了,那么其他節(jié)點將承擔其相應的壓力,需要注意此時在線節(jié)點的負載壓力。

   小結論是: 一般是不建議做讀寫分離,但是我們這里業(yè)務,寫操作很少,大量的讀請求,這里決定做讀寫分離來分擔服務器壓力,然后慢慢過度到分片。

什么是Read Preference?

    Read Preference 描述了mongodb 如何將請求路由到副本集的節(jié)點,默認下,會路由到primary節(jié)點

Read Preference 的幾個模式:

    primary :  默認的模式,所有讀寫,都路由到primary節(jié)點

    primaryPreferred  :大部分情況,操作從primary節(jié)點讀數(shù)據(jù),除非primary節(jié)點不可用

    secondary: 所有操作從secondary節(jié)點讀取數(shù)據(jù)

    secondaryPreferred:大多數(shù)情況,操作從secondary節(jié)點讀取數(shù)據(jù),除非所有secondary節(jié)點不可用.

    nearest:從最小的網(wǎng)絡的延遲的那個節(jié)點讀取數(shù)據(jù),不管節(jié)點的類型

什么是 getLastError?

    http://docs.mongodb.org/v2.4/reference/command/getLastError/#dbcmd.getLastError

    驅動程序在執(zhí)行一個寫操作后,會執(zhí)行getLastError ,然后通過返回的信息來判斷是否執(zhí)行成功,返回的可以是:

       1 :null ,說明執(zhí)行成功

       2 : 一個最后的錯誤描述

    getLastError 可以有下面的選項來配置write concern:

       j or "journal" option:

         它會確認monod實利寫入journal數(shù)據(jù)到磁盤,保證數(shù)據(jù)在突然關機的情況下不會丟失 栗子:

         > db.runCommand( { getLastError: 1, j: "true" } )

         note: If you set journal to true, and the mongod does not have journaling enabled, as with nojournal, then getLastError will provide basic receipt acknowledgment, and will include a jnote field in its return document.

     w option:

         0  : 禁用基本的acknowledgment寫操作,返回socket異常和網(wǎng)絡異常

         1  : 提供acknowledgment 的寫操作,在單機或者副本集的primary節(jié)點

         >1  : 保證寫操作成功的應用到副本集指定的節(jié)點(包含primary)

         majority : 確認副本集成員多數(shù)寫入成功

   wtimeout option: 

         設置write concern超時的超時時間,如果不指定或指定為0 在某些情況下可以導致寫操作一直block.

什么是Write Concern?

    Write concern: 當一個mongodb的寫入操作成功執(zhí)行后什么時候返回給客戶端.通過getLastError實現(xiàn).

mongodb 提供不同的等級以方便客戶端特殊的請求Write Concern Levels:

    Unacknowledged: mongod不會確認寫入是否成功,客戶端也不會提示是否報錯,除非是網(wǎng)絡錯誤(在此版本之前是默認的級別).設置方法: 在你的驅動程序上設置此指定w為0.

Mongodb Replica Set 讀寫分離

    Acknowledged: mongodb 會確認寫入是否成功,客戶端也可以獲取到網(wǎng)絡,復制,或者其他的錯誤.(目前默認的級別)

設置方法:在你的驅動程序上設置此指定w為1.

    默認的write concern 會調用getLastError( 不帶參數(shù))來確認是否執(zhí)行寫入成功,  所以也可以在副本集中通過修改默認的getLastErrorDefaults來實現(xiàn) write concern的級別的更改,這里沒有修改mongo 的默認配置,是通過修改驅動程序的配置來實現(xiàn).

getLastError: http://docs.mongodb.org/v2.4/reference/command/getLastError/#dbcmd.getLastError

getLastErrorDefaults:  http://docs.mongodb.org/v2.4/reference/replica-configuration/#local.system.replset.settings.getLastErrorDefaults

Mongodb Replica Set 讀寫分離

    Journaled :mongodb 會在數(shù)據(jù)提交到 journal 后才返回寫操作成功.mongod服務必須開啟journal,mongodb2.4默認是開啟的. 另外在副本集中,只要primary的journal 寫入成功就返回.還可以增加mongodb 提交到journal的頻率來減小此種方式的延遲:http://docs.mongodb.org/v2.4/reference/configuration-options/#journalCommitInterval設置:指定w為1并且指定 j=true.

Mongodb Replica Set 讀寫分離

    Replica Acknowledged:可以保證寫操作寫入到副本集的成員后才返回成功 . 設置w 大于1 , 比如2  是保證2個成員寫入成功后返回.

Mongodb Replica Set 讀寫分離

如何設置mongodb的讀寫分離?

1: 應用程序設置write concern 看這里: http://api.mongodb.org/?_ga=1.237665031.647167877.1420012424

    php栗子:

2: mongodb Replica Sets 修改默認的 getLastError (getLastErrorDefaults 的設置只會在getLastError 命令沒有其他參數(shù)的情況下生效): 

cfg = rs.conf()
cfg.settings = {}
cfg.settings.getLastErrorDefaults = {w: 3,wtimeout: 6000}
rs.reconfig(cfg)

以上配置意思:數(shù)據(jù)成功寫入3個節(jié)點后返回,其中包含了primary.最好設置wtimeout,當指定w的數(shù)值比副本集的成員多的情況下,寫入操作會一直被block. 另外 wtimeout設置為0 意味這一直不超時.

參考:

http://docs.mongodb.org/v2.4/core/write-concern/

http://docs.mongodb.org/v2.4/reference/write-concern/

http://docs.mongodb.org/v2.4/core/replica-set-write-concern/

http://docs.mongodb.org/v2.4/reference/command/getLastError/#dbcmd.getLastError


標題名稱:MongodbReplicaSet讀寫分離
標題來源:http://weahome.cn/article/ggooho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部