当前位置:Gxlcms > 数据库问题 > mongodb分片部署和管理

mongodb分片部署和管理

时间:2021-07-01 10:21:17 帮助过:2人阅读

root@mongodb1 db]# mongod -hOptions:...Sharding options: --configsvr declare this is a config db of a cluster; default port 27019; default dir /data/configdb --configsvrMode arg Controls what config server protocol is in use. When set to "sccc" keeps server in legacy SyncClusterConnection mode even when the service is running as a replSet --shardsvr declare this is a shard db of a cluster; default port 27018 其中说的很明白了,如果要将机器配置为configserver只要在配置文件中添加上configsvr选项,下面是我们的配置文件:
[root@mongodb1 db]# cat /etc/mongod.conf port = 27017dbpath = /data/dblogpath = /data/log/config.loglogappend = truefork = trueconfigsvr = true#replSet = configreplset
启动mongod:
[root@mongodb1 db]# mongod -f /etc/mongod.conf about to fork child process, waiting until server is ready for connections.forked process: 3767child process started successfully, parent exiting
这样config server就配置完成了,还是很简单的,如果要配置成复制集(一般是三节点),还需要在上面的再配置复制集的信息:
rs.initiate( {   _id: "configReplSet",   configsvr: true,   members: [      { _id: 0, host: "<host1>:<port1>" },      { _id: 1, host: "<host2>:<port2>" },      { _id: 2, host: "<host3>:<port3>" }   ]} )
这里就不详细描述复制集了.

2.部署mongos

mongos实例是轻量服务,并且不需要数据目录,你可以将 mongos 运行在已经部署了其他服务的系统中,比如应用服务器或者运行了mongod 的机器上.mongos 默认运行在 27017 端口上.
mongos启动的时候最重要的参数是configdb,用来指定config server,因为mongos要缓存config server中的元信息,用来路由数据.
[root@mongodb2 ~]# mongos -h
Options:
  • ...Sharding options: --configdb arg Connection string for communicating with config servers. Acceptable forms: CSRS: <config replset name>/<host1:port>,<host2: port>,[...]

  • 下面是我的mongos参数,如果config server是复制集使用configReplSet/<cfgsvr1:port1>,<cfgsvr2:port2>,<cfgsvr3:port3>:
    [root@mongodb2 ~]# cat /etc/mongos.conf logpath = /data/log/mongos.loglogappend = trueconfigdb = mongodb1:27017 port = 27018fork = true
    启动mongos服务,注意这里的mongos端口是27018,因为这台机器等会还要启动一个mongod,我设置mongod的端口为27017:
    [root@mongodb2 ~]# mongos -f /etc/mongos.conf 2016-06-21T20:27:15.748+0800 W SHARDING [main] Running a sharded cluster with fewer than 3 config servers should only be done for testing purposes and is not recommended for production.about to fork child process, waiting until server is ready for connections.forked process: 3878child process started successfully, parent exiting

    3.部署mongod server

    mongod server的部署和普通的单实例没太大的区别,添加一个shardsvr参数,如果是复制集要添加replSet参数,这里测试并没有:
    [root@mongodb2 ~]# cat /etc/mongod.conf port=27017dbpath=/data/dblogpath=/data/log/mongod.loglogappend=truefork = true#replSet = rs0oplogSize = 500shardsvr = true
    分别启动mongodb2,mongodb3的mongod服务,如果是复制集先搭建好复制集,这里就赘述.
    [root@mongodb2 db]# mongod -f /etc/mongod.conf  about to fork child process, waiting until server is ready for connections.forked process: 3944child process started successfully, parent exiting

    4.将mongod添加到集群

    连接到mongos,即mongodb2的27018端口:
    [root@mongodb2 db]# mongo 127.0.0.1:27018MongoDB shell version: 3.2.6connecting to: 127.0.0.1:27018/testServer has startup warnings: 2016-06-21T20:27:15.759+0800 I CONTROL  [main] ** WARNING: You are running this process as the root user, which is not recommended.2016-06-21T20:27:15.760+0800 I CONTROL  [main] mongos> 
    可以看到这里的提示符为mongos.使用sh.addShard("host:port")命令来添加mongod到集群,如果集群是复制集需要使用sh.adShard("replname/host:port")来添加:
    mongos> sh.addShard("mongodb2:27017"){ "shardAdded" : "shard0000", "ok" : 1 }mongos> sh.addShard("mongodb3:27017"){ "shardAdded" : "shard0001", "ok" : 1 }

    5.为集群开启分片

    首先使用sh.enableSharding("database")对数据库开启分片,你也可以使用数据库命令开启分片,语法如下: db.runCommand( { enableSharding: <database> } ) 例如我们对test数据库开启分片功能,连接的仍然是mongos:
    mongos> show dbs
    config  0.000GBmongos> sh.enableSharding("test");{ "ok" : 1 }
    分片是集合级别的,所以还需要在集合上开启, 1.首先选择一个 shard key ,所选择的片键会影响集群的效率.参见 选择片键的注意事项. 获得注意事项. 2.如果集合中已经包含有数据,需要使用ensureIndex() 在片键上创建索引.如果集合是空的,MongoDB会在 sh.shardCollection() 过程中自动创建索引. 3.使用sh.shardCollection()方法来为一个集合启用分片,语法如下: sh.shardCollection("<database>.<collection>", shard-key-pattern) 示例如下: sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } ) sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } ) sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } ) sh.shardCollection("events.alerts", { "_id": "hashed" } ) 我们先来创建一张users表:
    mongos> use testswitched to db testmongos> for(i=0;i<100;i++){... db.users.insert(...     {...     "i":i,...     "username":"user"+i,...     "age":Math.floor(Math.random()*120),...     "created":new Date()...     }... );... }WriteResult({ "nInserted" : 1 })
    假设我们以i和username为分片键,那么首先创建索引:
    mongos> db.users.createIndex({i:1,username:1}){	"raw" : {		"mongodb2:27017" : {			"createdCollectionAutomatically" : false,			"numIndexesBefore" : 1,			"numIndexesAfter" : 2,			"ok" : 1		}	},	"ok" : 1}
    最后为集合users开启分片:
    mongos> sh.shardCollection("test.users",{"i":1,"username":1}){ "collectionsharded" : "test.users", "ok" : 1 }
    如果要使用hash分片,那么首先需要为片键创建hash索引使用db.colname.createIndex({"field":"hashed"}); 在使用sh.shardCollection("test.users",{"field":"hashed"})来创建hash分片. 到此mongodb的分片已经搭建完成.可以使用sh.status()查看集群的状态:
    mongos> sh.status()--- Sharding Status ---   sharding version: {	"_id" : 1,	"minCompatibleVersion" : 5,	"currentVersion" : 6,	"clusterId" : ObjectId
                            
                        

    人气教程排行