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...