MongoDB-集群搭建
前言
????? 搭建一個MongoDB的集群,這個環境只是內網的一個測試環境,分片沒有使用副本集,配置并分配好端口后,開啟集群的身份驗證功能,在開啟集群權限時,有些注意事項,在搭建過程中會著重標出。
一、集群規劃
????? 首先有三臺服務器分別為192.168.0.230,192.168.0.232,192.168.0.234。集群規劃如下:3個 用來分片,3個 mongos路由服務,3個 config配置服務器。
? ? ?注意:保證三臺服務器的端口是通的。
1.1端口分配
????? 端口號分配情況,所有的分片都使用27017端口,所有的配置都使用20000端口,所有的mongos路由服務都使用30000端口,每個服務器具體信息如下:
表1-1 端口號分配表
| ? | 192.168.0.230 | 192.168.0.232 | 192.168.0.234 |
| mongos | 30000 | 30000 | 30000 |
| config | 20000 | 20000 | 20000 |
| sharing | 27017 | 27017 | 27017 |
1.2集群整體規劃圖
?
二、集群啟動和配置
2.1 啟動集群服務器
2.1.1 創建數據文件目錄
230服務器分片1 # mkdir –p /data/mongodb/config /data/mongodb/shard1_1 232服務器分片2 # mkdir –p /data/mongodb/config /data/mongodb/shard1_2 234服務器分片3 # mkdir –p /data/mongodb/config /data/mongodb/shard1_3然后按照順序啟動,分片服務器,配置服務器和路由服務器:
2.1.2 啟動分片服務
230服務器: mongod --shardsvr --port 27017 --dbpath /data/mongodb/shard1_1 --logpath /data/mongodb/shard1_1/rs0.log --logappend --directoryperdb --fork 232服務器: mongod --shardsvr --port 27017 --dbpath /data/mongodb/shard1_2 --logpath /data/mongodb/shard1_2/rs0.log --logappend --directoryperdb --fork 234服務器: mongod --shardsvr --port 27017 --dbpath /data/mongodb/shard1_3 --logpath /data/mongodb/shard1_3/rs0.log --logappend --directoryperdb --fork然后在三臺服務器上各自啟動配置服務器和路由服務器:
2.1.3 啟動配置服務器
三臺服務器分別執行:
mongod --configsvr --port 20000 --dbpath /data/mongodb/config --logpath /data/mongodb/config.log --logappend --directoryperdb –fork2.1.4 啟動路由服務
三臺服務器分別執行:
mongos --configdb 192.168.0.230:20000, 192.168.0.232:20000, 192.168.0.234:20000 --port=30000 --chunkSize=1--logpath=/data/mongogdb/mongos.log --logappend --fork
注意:這里指定了—chunkSize分片塊大小為1M,默認為64M,是為了能夠更快的實現分片。
2.2 配置集群服務器
2.2.1 配置分片
????? 連接到任意服務器的路由服務30000端口,把三個分片服務器添加到集群配置中去:
?添加分片服務器
# mongo –port 30000 mongos> use admin switched to db admin mongos> db.runCommand({"addshard":"192.168.0.230:27017"}) mongos> db.runCommand({"addshard":"192.168.0.232:27017"}) mongos> db.runCommand({"addshard":"192.168.0.234:27017"})現在執行sh.status()就能看到集群的分片情況。分片環境已經配置完成,但還沒開啟集合的分片,接下來測試一個集合的分片功能。
2.2.2 激活并驗證分片功能
? ? ?集合開啟分片之前,需要選擇一個片鍵來指定分片規則,片鍵的選擇直接影響數據分發的效果,關于片鍵的選擇策略,具體問題具體分析,后續會簡單整理一下。
注意:分片片鍵必須是索引
激活數據庫foo的分片功能,并把其中的bar集合按照timestamp升序片鍵開啟分片,操作如下:
# mongo –port 30000 mongos> sh.enableSharding("foo") { "ok" : 1 } mongos> sh.shardCollection("foo.bar",{"timestamp":1}) { "collectionsharded" : "foo.bar", "ok" : 1 }這時使用sh.status()命令,就可以看到相應的集合已經開啟了分片
mongos> for(var i=1; i<=500000; i++){ db.bar.insert({"inc":i, "timestamp":new Date()}) }
往數據庫中插入50萬數據,使用sh.status()查看數據已經均勻分布在各個分片上。
三、開啟集群身份驗證
? ? ? 默認情況下,MongoDB是不啟動訪問控制的,對于單機模式下,只需在啟動mongod服務時添加--auth參數即可。但是在分片集群下只能使用keyfile的方式啟動訪問控制。
首先,生成一個keyfile文件,并把這個文件復制到其他服務器上。
# openssl rand -base64 741 > /data/mongodb/mongodb-keyfile # chmod 600 mongodb-keyfile 重要注意:在啟用訪問控制之前,要保證路由服務和每個分片服務器已經存在一個管理員用戶,用于添加用戶和關閉集群使用。
添加用戶也很簡單,分別連到3000和27017端口在admin數據庫執行以下命令:
mongos> use admin switched to db admin mongos> db.createUser({user:"admin", pwd:"111111", roles:[{role: "root", db: "admin" }]}) Successfully added user: {"user" : "admin","roles" : [{"role" : "root","db" : "admin"}] }? ? ? 接下來開啟集群的訪問控制,這里我講keyfile文件拷貝到了/data/mongodb/keyfile目錄下,在啟動每個服務時(分片服務,配置服務,路由服務)添加--keyFile /data/mongodb/keyfile參數即可。
如啟動路由服務時mongos --configdb 192.168.0.230:20000, 192.168.0.232:20000, 192.168.0.234:20000 --port=30000 --chunkSize=1 --logpath=/data/mongogdb/mongos.log
--logappend –fork --keyFile /data/mongodb/keyfile
之后在連接到集群時,操作之前就需要驗證用戶身份了,其中驗證有兩種方式:
一是在連接時進行驗證:
mongo --port 30000 -u "admin" -p "111111" --authenticationDatabase "admin"二是在連接后進行驗證:
# mongo --port 30000 mongos> use admin switched to db admin mongos> db.auth("admin", "111111")驗證成功后就可以進行相應的操作了。
四、集群中一些問題
1 關閉集群服務器
? ? ?關閉順序按照路由服務,配置服務,分片服務,分別連接到對應端口的admin數據庫,使用db.shutdownServer()關閉服務。如果開啟了身份驗證,這里就用到了預先建好的admin用戶
2 集群某個服務起不來
????? 比如配置服務或分片服務啟動錯誤,可能是上次退出不正常,這是可以選擇修復數據,也可直接把數據文件中的mongod.lock文件刪除。
3 數據沒分片
? ? ? 首先保證集合開啟了分片,然后查看一下config配置數據庫中配置的chunkSize是多少,是不是數據不夠大,最后查看一下服務器的時間,如果服務器的時間相差比較大,也會導致分片失敗,服務器時間差最好保持在30秒以內。
?
?
轉載于:https://www.cnblogs.com/cwane/p/5428436.html
總結
以上是生活随笔為你收集整理的MongoDB-集群搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu安装PHP时候出错--xml
- 下一篇: 设计原则--开放-封闭原则(OCP)