集群节点间的延迟问题
生活随笔
收集整理的這篇文章主要介紹了
集群节点间的延迟问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
集群節(jié)點(diǎn)間的延遲問(wèn)題
mongoDB 一個(gè)弱點(diǎn),就是最終一致性,這也是所有NoSQL 的一個(gè)問(wèn)題。
在CAP 理論中,數(shù)據(jù)庫(kù)在 (C)onsistency、(A)vailability和(P)artition-tolerance
三者只能滿足兩個(gè)。比如MongoDB 有更好的 高可用性,分布式。就不可避免的犧牲了 [一致性]
一、監(jiān)測(cè)網(wǎng)絡(luò)是否有瓶頸,并解決。
?? ??? ?這點(diǎn)我們網(wǎng)絡(luò),如果是全部放在云服務(wù)器內(nèi)網(wǎng)進(jìn)行,幾乎不存在,但也不能完全排除。
二、確認(rèn)硬件配置上,主從是否一致(cpu,mem,io)
?? ??? ?現(xiàn)在很多的集群中,已基本上一致的。比如[業(yè)務(wù)庫(kù)],[統(tǒng)計(jì)庫(kù)],[日志庫(kù)],
?? ??? ?但也有例外: [標(biāo)準(zhǔn)版 正式庫(kù)] 集群:[nginx101,db112,db115],nginx101 服務(wù)器的性能更好,
?? ??? ?但跑了其它的應(yīng)用。
?? ??? ?這些問(wèn)題有歷史原因。個(gè)人是一直建議,數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)節(jié)點(diǎn)上,不要跑其它的應(yīng)用。以免出現(xiàn)
?? ??? ?相互干擾問(wèn)題(io,net,cpu爭(zhēng)用)。
三、oplog 大小配置,不知會(huì)不會(huì)對(duì)延遲有影響,現(xiàn)在配置值為10G,數(shù)據(jù)保存大約20天左右的日志量。
個(gè)人認(rèn)為應(yīng)該可以減少到 3 - 5G
四、使用 readpreference 讀策略
?? ??? ?在確實(shí)遇到有些讀有延遲的問(wèn)題時(shí),可以使用讀策略,把一致性強(qiáng)的讀,放到主庫(kù)進(jìn)行讀
?? ??? ?#python code
?? ??? ?mon_conn = pymongo.MongoClient(['mongodb://192.168.20.11:28000,192.168.20.19:28000,192.168.20.13:28000,192.168.20.15:28000,192.168.20.17:28000'],
?? ??????????????????????????????? read_preference=pymongo.ReadPreference.PRIMARY)
(就我們當(dāng)前版本來(lái)說(shuō),也就只有上面3種方法可以做為解決問(wèn)題的處理方式了,所以建議還是優(yōu)先把升級(jí)放在前位)
(以下的方法,只在3.2版本可用,當(dāng)然,使用時(shí)也有利有弊,一般在日志類數(shù)據(jù)保存時(shí)也不會(huì)去使用 WriteConcern )
四、使用WriteConcern 機(jī)制把數(shù)據(jù)同步寫到多個(gè)從機(jī)
?? ??? ?1. 3個(gè)節(jié)點(diǎn)的集群中,保證2個(gè)節(jié)點(diǎn)插入成功,超時(shí)設(shè)置為5秒
?? ??? ?db.products.insert(
?? ??? ?{ item: "envelopes", qty : 100, type: "Clasp" },
?? ??? ?{ writeConcern: { w: 2, wtimeout: 5000 } }
?? ??? ?)
?? ??? ?2.在集群配置中設(shè)置多數(shù)插入成功才為成功。
?? ??? ??? ?cfg = rs.conf()
?? ??? ??? ?cfg.settings = {}
?? ??? ??? ?cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
?? ??? ??? ?rs.reconfig(cfg)
?? ??? ?3.使用TAG ,給各個(gè)集群節(jié)點(diǎn)設(shè)置標(biāo)簽,在插入,更新時(shí),保證某個(gè)TAG 成功才為成功(insert,update 返回1)
?? ??? ??? ?3.1 先配置節(jié)點(diǎn)tag
?? ??? ??? ?conf = rs.conf()
?? ??? ??? ?conf.members[0].tags = { "dc": "east", "use": "production" }
?? ??? ??? ?conf.members[1].tags = { "dc": "east", "use": "reporting" }
?? ??? ??? ?conf.members[2].tags = { "dc": "west","use": "production" }
?? ??? ??? ?rs.reconfig(conf)
?? ??? ??? ?
?? ??? ??? ?3.2 設(shè)置錯(cuò)誤
?? ??? ??? ?conf.settings = { getLastErrorModes: { MultipleDC : { "dc": 1, "use": 1 } } }
?? ??? ??? ?3.3 插入數(shù)據(jù)時(shí),指定保存到某個(gè)tag 對(duì)應(yīng)的節(jié)點(diǎn)(可能多個(gè)), 才算成功(insert,update 返回1)
?? ??? ??? ??? ?db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )
mongoDB 一個(gè)弱點(diǎn),就是最終一致性,這也是所有NoSQL 的一個(gè)問(wèn)題。
在CAP 理論中,數(shù)據(jù)庫(kù)在 (C)onsistency、(A)vailability和(P)artition-tolerance
三者只能滿足兩個(gè)。比如MongoDB 有更好的 高可用性,分布式。就不可避免的犧牲了 [一致性]
前段時(shí)間開(kāi)發(fā)組的反映說(shuō)一條記錄在插入后,再查詢,沒(méi)有查詢到,這問(wèn)題還不少。
但后面測(cè)試又到重現(xiàn)這個(gè)問(wèn)題。但延遲肯定是有的,但一直不知道具體有多嚴(yán)重。這里暫時(shí)先
解決辦法肯定是有的,但肯定也不能完全解決。
------------------------------------------------------------------------------------------------------
一、監(jiān)測(cè)網(wǎng)絡(luò)是否有瓶頸,并解決。
?? ??? ?這點(diǎn)我們網(wǎng)絡(luò),如果是全部放在云服務(wù)器內(nèi)網(wǎng)進(jìn)行,幾乎不存在,但也不能完全排除。
二、確認(rèn)硬件配置上,主從是否一致(cpu,mem,io)
?? ??? ?現(xiàn)在很多的集群中,已基本上一致的。比如[業(yè)務(wù)庫(kù)],[統(tǒng)計(jì)庫(kù)],[日志庫(kù)],
?? ??? ?但也有例外: [標(biāo)準(zhǔn)版 正式庫(kù)] 集群:[nginx101,db112,db115],nginx101 服務(wù)器的性能更好,
?? ??? ?但跑了其它的應(yīng)用。
?? ??? ?這些問(wèn)題有歷史原因。個(gè)人是一直建議,數(shù)據(jù)庫(kù)服務(wù)器數(shù)據(jù)節(jié)點(diǎn)上,不要跑其它的應(yīng)用。以免出現(xiàn)
?? ??? ?相互干擾問(wèn)題(io,net,cpu爭(zhēng)用)。
三、oplog 大小配置,不知會(huì)不會(huì)對(duì)延遲有影響,現(xiàn)在配置值為10G,數(shù)據(jù)保存大約20天左右的日志量。
個(gè)人認(rèn)為應(yīng)該可以減少到 3 - 5G
四、使用 readpreference 讀策略
?? ??? ?在確實(shí)遇到有些讀有延遲的問(wèn)題時(shí),可以使用讀策略,把一致性強(qiáng)的讀,放到主庫(kù)進(jìn)行讀
?? ??? ?#python code
?? ??? ?mon_conn = pymongo.MongoClient(['mongodb://192.168.20.11:28000,192.168.20.19:28000,192.168.20.13:28000,192.168.20.15:28000,192.168.20.17:28000'],
?? ??????????????????????????????? read_preference=pymongo.ReadPreference.PRIMARY)
(就我們當(dāng)前版本來(lái)說(shuō),也就只有上面3種方法可以做為解決問(wèn)題的處理方式了,所以建議還是優(yōu)先把升級(jí)放在前位)
(以下的方法,只在3.2版本可用,當(dāng)然,使用時(shí)也有利有弊,一般在日志類數(shù)據(jù)保存時(shí)也不會(huì)去使用 WriteConcern )
四、使用WriteConcern 機(jī)制把數(shù)據(jù)同步寫到多個(gè)從機(jī)
?? ??? ?1. 3個(gè)節(jié)點(diǎn)的集群中,保證2個(gè)節(jié)點(diǎn)插入成功,超時(shí)設(shè)置為5秒
?? ??? ?db.products.insert(
?? ??? ?{ item: "envelopes", qty : 100, type: "Clasp" },
?? ??? ?{ writeConcern: { w: 2, wtimeout: 5000 } }
?? ??? ?)
?? ??? ?2.在集群配置中設(shè)置多數(shù)插入成功才為成功。
?? ??? ??? ?cfg = rs.conf()
?? ??? ??? ?cfg.settings = {}
?? ??? ??? ?cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 }
?? ??? ??? ?rs.reconfig(cfg)
?? ??? ?3.使用TAG ,給各個(gè)集群節(jié)點(diǎn)設(shè)置標(biāo)簽,在插入,更新時(shí),保證某個(gè)TAG 成功才為成功(insert,update 返回1)
?? ??? ??? ?3.1 先配置節(jié)點(diǎn)tag
?? ??? ??? ?conf = rs.conf()
?? ??? ??? ?conf.members[0].tags = { "dc": "east", "use": "production" }
?? ??? ??? ?conf.members[1].tags = { "dc": "east", "use": "reporting" }
?? ??? ??? ?conf.members[2].tags = { "dc": "west","use": "production" }
?? ??? ??? ?rs.reconfig(conf)
?? ??? ??? ?
?? ??? ??? ?3.2 設(shè)置錯(cuò)誤
?? ??? ??? ?conf.settings = { getLastErrorModes: { MultipleDC : { "dc": 1, "use": 1 } } }
?? ??? ??? ?3.3 插入數(shù)據(jù)時(shí),指定保存到某個(gè)tag 對(duì)應(yīng)的節(jié)點(diǎn)(可能多個(gè)), 才算成功(insert,update 返回1)
?? ??? ??? ??? ?db.users.insert( { id: "xyz", status: "A" }, { writeConcern: { w: "MultipleDC" } } )
總結(jié)
以上是生活随笔為你收集整理的集群节点间的延迟问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MongoDB 从节点 延迟的测试
- 下一篇: mongoDB3.2.8 升级遇到的问题