Mongo 3 6 1版本Sharding集群配置

2021-08-14 08:19:07 字數 4375 閱讀 4865

mongo sharding集群由config server,mongos(路由)及shards伺服器組成。他們的關係及扮演的角色,網上到處都是,不再詳細介紹。

最開始,打算將config、mongos、shards等所有元件都部署到一台機器。部署的過程中碰到問題,啟動不了,以為是不能部署到一台機器導致的,於是最後的方案是部署到4臺機器。解決碰到的坑後,我覺得,部署到同一臺機器也是可以的。那些碰到的問題,並不是部署到同一臺機器引起的。

伺服器規劃如下:

執行:tar -xvzf mongodb-linux-x86_64-rhel62-3.6.1.tgz解壓即可。

高版本的mongo要求config server必須是集群模式,不能單點,包括配置和訪問都會涉及這點,與舊版不同。

每台伺服器上執行:

進入其中任意一台伺服器,執行如下步驟:

./mongo --port 30000

config = ,

, rs.initiate(config);

config server就配置完成了。

看起來是不是很簡單?但網上沒有這樣的示例。也是探索出來的。後面「碰到的問題」,會提一下。

shard伺服器的配置沒碰到大問題,注意別筆誤就行。shard1還是shard2,寫準了,多餘的空格要留心,會有影響。我是幾個筆誤磕巴了一下。

10.100.31.120伺服器:

通過mongoshell進入任意乙個示例,此處我們選擇27017示例,配置副本集並初始化:

./mongo 10.100.31.120:27017/admin

> cnf = ,,,

> rs.initiate(cnf);

可以檢查一下副本集狀態

> rs.status()

10.100.31.121伺服器一樣:

./mongo 10.100.31.121:27017/admin

> cnf = ,,,

> rs.initiate(cnf);

進入mongos所在伺服器的mongoshell,通過addshard來加入shard節點,多個副本集用逗號分隔:

./mongo 10.100.31.100:27017/admin

mongos> db.runcommand( );

mongos> db.runcommand( );

mongos> db.runcommand(  );

至此,mongo3.6.1版本sharding集群搭建完畢。

上面的步驟看起來是不是很清爽?很簡單?很容易?但在沒有前人完整示例的情況下,自己探索,處處踩坑處處碰壁,還是很痛苦的。下面把搭建過程中需要注意的方面和碰到的問題跟大家分享一下。

首先,配置configserver時,碰到no route to host,connect refused等。看起來似乎和網路、防火牆及埠有關。實際上,蹚完坑的結果是,非也,非也,和mongo自己的乙個配置有關。mongo裡有個bind ip的概念。網上很多地方,及官方都提到了,但說得雲裡霧裡,不太明白。我搭建的過程中,這個問題困擾我了很長時間。網友這篇文章及其中提到的另一篇文章講到了這個問題,但講得並不是很透,不過可以看看,有助於更好地了解這個問題:網上屢屢出現繫結127.0.0.1或/

及localhost

的說法,不明白。繫結127.0.0.1或/及localhost,集群跨機訪問能行?顯然不科學啊。linux下,埠繫結ip,如果不想限制ip的話,通常指定為0.0.0.0。感覺應該走這樣的套路才可以。研究了一下mongo的help,發現裡面有個引數:--bind_ip_all。眼睛一亮。這個應該好使!

說說我的經歷:

首先,配置configserver的時候,我在三颱機器分別部署了mongo,具體步驟見前面。

最後一步執行rs.initiate(config); 的時候,出錯,大概錯誤是訪問不到指定mongo。

telnet 10.100.31.131 30000

報:no route to host

執行:sudo iptables –f

no route的問題解決了。

但是再次執行rs.initiate(config); 還是失敗。

這次是報connect refused。

根據網上的提示,這是埠未開放訪問的原因,需要開放伺服器相關埠。

但後來了解到我的遭遇根本不是這個問題。因為我們測試環境的機器,iptables是關閉、未開啟的。也就是任何埠,隨意訪問,隨便用。

linux開放埠的步驟:

vi  /etc/sysconfig/iptables

新增你需要的埠,比如:

#mongo ports

-a input -m state --state new -m tcp -p tcp --dport 30000 -j accept

-a input -m state --state new -m tcp -p tcp --dport 27017 -j accept

-a input -m state --state new -m tcp -p tcp --dport 27018 -j accept

-a input -m state --state new -m tcp -p tcp --dport 27019 -j accept

注意:這裡有個坑,新增的位置必須在

-a input -j reject --reject-with icmp-host-prohibited  

-a forward -j reject --reject-with icmp-host-prohibited  

上方儲存修改後,執行:

service  iptables restart

就可以了。

剛才說到,我的測試伺服器端口是ok的。可我的mongo為何死活不通呢?這和mongo bind ip配置項有關。加上啟動引數--bind_ip_all就好了。

具體命令見前面步驟。

不過,實際配置過程中,我加上--bind_ip_all後,又碰到問題。

報錯:error: child process failed, exited with error number 100

調研了一下,這是因為之前啟動mongo,未正常關閉導致的問題。比如用kill -9 23245殺掉了mongo程序。mongo強烈不建議用kill命令來殺程序。如果實在要用,也不要用kill -9 ,有網友說可考慮kill -2 。但是,以我的親身實踐,kill-2也不好。還是要老老實實用官方推薦的shutdown辦法:

./mongo

use admin

db.shutdownserver();

沒殺乾淨怎麼辦?

請參考:

網友的啟動方式是用配置檔案。命令列修復模式啟動,其實就是加個--repair引數。

我照網友的說法,repair方式啟動,接著正常啟動,好像還是有問題,不過報錯變了:

error: child process failed, exited with error number 48

結果碼由100變成了48。

看了下mongo啟動日誌:address already in use

netstat –lp 檢查。發現mongo已經起起來了,不知道是其中哪一次啟動成功的。

試了下可以用。

看來是根據網友的說法,修復啟動後,已經成功啟動mongo了。

照貓畫虎部署131伺服器的config server,又碰到新問題,報錯如下:

2018-01-04t10:56:39.936+0800 e storage  [initandlisten] wiredtiger error (1) [1515034599:936145][6277:0x7f76fc3e6a80], file:wiredtiger.wt, connec

查了一下,可能和之前用root使用者啟動過mongo有關,導致普通使用者起不了。

怎麼破?

用root使用者賦權:chmod 777 mongo

然後依次建立 config的data和log目錄:

以上是配在config server的時候碰到的問題,配mongos(路由器)的時候,碰到兩個問題,其中乙個仍然是bind ip的問題,像config server配置一樣,加上--bind_ip_all啟動引數即可。另乙個問題,則是「複製集」的概念。高版本的mongo,強調複製集的概念,很多地方多強制要求配置複製集,訪問也用複製集方式的連線串。例如:配置mongos(路由器)的時候,網上的啟動示例如下:

3.6.1版本這樣是不行的。會報錯:badvalue:configdb supports only replica set connection string。configdb引數強制必須用複製集連線串。格式類似:

conf/10.100.31.120:30000,10.100.31.121:30000,10.100.31.131:30000

即完整命令參考上面步驟三。

配置檔案啟動的方式,還不明就裡。有模板的同學,可分享一下。

Mysql資料遷移 8 0版本至5 7版本

寫這篇帖子的原因 昨天在本地將資料遷移完後,部署至生產環境報錯,資料匯入的時候發生問題。為了避免踩雷所以在本地裝的mysql 5.7,但很奇怪不知道咋回事變成了8.0版本。於是乎在遷移至生產環境是出現了字符集的問題。之前在網上也搜了不少帖子,甚至不知道如何去搜。搜出來的內容沒有很具體到版本。有在命令...

1 5 版本編號

在深入程式設計之前,我們應當對 linux 使用的版本編號方法和本書涉及的版本做些說明.首先,注意的是在 linux 系統中使用的每乙個軟體包有自己的發行版本號,它們之間存在相互依賴性 你需要乙個包的特別的版本來執行另外乙個包的特別版本.linux 發布的建立者常常要處理匹配軟體包的繁瑣問題,這樣使...

1 版本控制

1 本系列文章環境 os windows 8.1專業版 64位 ide eclipse 4.3 r2 kepler tools subversion 32位 setup subversion 1.8.13 x32.msi apache http server 32位 httpd 2.4.12 x86...