zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mongodb sharding配置

MongoDB配置 Sharding
2023-09-11 14:18:56 时间

mongodb集群配置

1 Mongo使用sharding集群

mongodb副本集群

mongos1

192.168.20.137

mongos2

192.168.20.138

mongo_config1

192.168.20.139

mongo_config2

192.168.20.129

mongo_config3

192.168.20.128

mongod_shard1_replicaset1

192.168.20.127

mongod_shard1_replicaset2

192.168.20.126

mongod_shard1_replicaset3

192.168.20.125

mongod_shard2_replicaset1

192.168.20.123

mongod_shard2_replicaset2

192.168.20.122

mongod_shard2_replicaset3

192.168.20.121

 

 

 

 

 

2下载mongodb 源码包

[root@ ~]#  wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.9.tgz

 

3解压缩,并拷贝到/data目录下

tar -zxvf mongodb-linux-x86_64-rhel70-3.2.9.tgz

mv mongodb-linux-x86_64-rhel70-3.2.9    /data/mongodb

 

4新建mongodb目录

mkdir -p /data/mongodb/etc/
mkdir -p /data/mongodb/var/log/

mkdir /data/mongodb/run

mkdir /data/mongodb/data

mkdir /data/mongodb/logs

 

groupadd mongodb

useradd -g mongodb -s /sbin/nologin -M mongodb

chown -R mongodb.mongodb /data/mongodb

 

 

5 mongod配置文件文件:

vim  /data/mongodb/etc/mongodb.cnf

 

systemLog:

   verbosity: 0

   quiet: false

   syslogFacility: user

   path: "/data/mongodb/logs/mongod.log"

   logAppend: true

   logRotate: rename

   destination: file

   timeStampFormat: iso8601-utc

 

storage:

   dbPath: "/data/mongodb/data"

   indexBuildRetry: true

 

   journal:

      enabled: true

   directoryPerDB: true

   syncPeriodSecs: 60

   engine: wiredTiger

 

   wiredTiger:

      engineConfig:

         cacheSizeGB: 1

         statisticsLogDelaySecs: 0

         journalCompressor: snappy

         directoryForIndexes: true

      collectionConfig:

         blockCompressor: snappy

      indexConfig:

         prefixCompression: true

 

 

processManagement:

  fork: true

  pidFilePath: "/data/mongodb/run/mongod.pid"

 

net:

  bindIp: 0.0.0.0

  port: 27017

  http:

    enabled: true

    RESTInterfaceEnabled: true

 

operationProfiling:

  slowOpThresholdMs: 100

  mode: "slowOp"

 

security:

   authorization: "disabled"

 

replication:

  oplogSizeMB: 1024

  replSetName: " mongod_shard1_im_test"   ###同一个sharding相同,不同的sharding relSetName 不通

 

 

5. 设置开机启动

[root@ ~ ]# vim /etc/rc.local

[root@ ~]# /data/mongodb/bin/mongod -f /data/mongodb/etc/mongodb.cnf --rest

 

6启动mongodb

/data/mongodb/bin/mongod -f /data/mongodb/etc/mongodb.cnf –rest

 

7.配置副本集群

 

[root@  etc]#  /data/mongodb/bin/mongo  #登陆到mongodb中

 

查看副本集状态

> rs.status()

{

         "info" : "run rs.initiate(...) if not yet done for the set",

         "ok" : 0,

         "errmsg" : "no replset config has been received",

         "code" : 94

}

 

进入到admin 数据库

>use admin  

 

进行cfg配置 ,最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点

 

 

 

> cfg={_id:"mongod_shard1_im_test",members:[{_id:0,host:'192.168.20.127:27017',priority:10}, {_id:1,host:'192.168.20.126:27017',priority:5}, {_id:2,host:'192.168.20.125:27017',priority:1}]}

 

进行初始化

>rs.initiate(cfg)       

{ "ok" : 1 }

 

显示了每个节点的健康状况,名称,启动的时间,节点的类型等。查看当前副本集的配置表:

 

{

         "_id" : "mongod_shard1_im_test",

         "version" : 1,

         "protocolVersion" : NumberLong(1),

         "members" : [

                   {

                            "_id" : 0,

                            "host" : "192.168.20.127:27017",

                            "arbiterOnly" : false,

                            "buildIndexes" : true,

                            "hidden" : false,

                            "priority" : 10,

                            "tags" : {

                                    

                            },

                            "slaveDelay" : NumberLong(0),

                            "votes" : 1

                   },

                   {

                            "_id" : 1,

                            "host" : "192.168.20.126:27017",

                            "arbiterOnly" : false,

                            "buildIndexes" : true,

                            "hidden" : false,

                            "priority" : 5,

                            "tags" : {

                                    

                            },

                            "slaveDelay" : NumberLong(0),

                            "votes" : 1

                   },

                   {

                            "_id" : 2,

                            "host" : "192.168.20.125:27017",

                            "arbiterOnly" : false,

                            "buildIndexes" : true,

                            "hidden" : false,

                            "priority" : 1,

                            "tags" : {

                                    

                            },

                            "slaveDelay" : NumberLong(0),

                            "votes" : 1

                   }

         ],

         "settings" : {

                   "chainingAllowed" : true,

                   "heartbeatIntervalMillis" : 2000,

                   "heartbeatTimeoutSecs" : 10,

                   "electionTimeoutMillis" : 10000,

                   "getLastErrorModes" : {

                           

                   },

                   "getLastErrorDefaults" : {

                            "w" : 1,

                            "wtimeout" : 0

                   },

                   "replicaSetId" : ObjectId("57dfb646ed538f91da25889a")

         }

}

 

 

再次查看副本集状态

mongod_shard1_im_test:PRIMARY> rs.status()

{

         "set" : "mongod_shard1_im_test",

         "date" : ISODate("2016-09-19T09:58:17.947Z"),

         "myState" : 1,

         "term" : NumberLong(1),

         "heartbeatIntervalMillis" : NumberLong(2000),

         "members" : [

                   {

                            "_id" : 0,

                            "name" : "192.168.20.127:27017",

                            "health" : 1,

                            "state" : 1,

                            "stateStr" : "PRIMARY",

                            "uptime" : 15779,

                            "optime" : {

                                     "ts" : Timestamp(1474279005, 1),

                                     "t" : NumberLong(1)

                            },

                            "optimeDate" : ISODate("2016-09-19T09:56:45Z"),

                            "infoMessage" : "could not find member to sync from",

                            "electionTime" : Timestamp(1474279004, 1),

                            "electionDate" : ISODate("2016-09-19T09:56:44Z"),

                            "configVersion" : 1,

                            "self" : true

                   },

                   {

                            "_id" : 1,

                            "name" : "192.168.20.126:27017",

                            "health" : 1,

                            "state" : 2,

                            "stateStr" : "SECONDARY",

                            "uptime" : 103,

                            "optime" : {

                                     "ts" : Timestamp(1474279005, 1),

                                     "t" : NumberLong(1)

                            },

                            "optimeDate" : ISODate("2016-09-19T09:56:45Z"),

                            "lastHeartbeat" : ISODate("2016-09-19T09:58:16.547Z"),

                            "lastHeartbeatRecv" : ISODate("2016-09-19T09:58:16.332Z"),

                            "pingMs" : NumberLong(0),

                            "syncingTo" : "192.168.20.127:27017",

                            "configVersion" : 1

                   },

                   {

                            "_id" : 2,

                            "name" : "192.168.20.125:27017",

                            "health" : 1,

                            "state" : 2,

                            "stateStr" : "SECONDARY",

                            "uptime" : 103,

                            "optime" : {

                                     "ts" : Timestamp(1474279005, 1),

                                     "t" : NumberLong(1)

                            },

                            "optimeDate" : ISODate("2016-09-19T09:56:45Z"),

                            "lastHeartbeat" : ISODate("2016-09-19T09:58:16.547Z"),

                            "lastHeartbeatRecv" : ISODate("2016-09-19T09:58:16.332Z"),

                            "pingMs" : NumberLong(0),

                            "syncingTo" : "192.168.20.127:27017",

                            "configVersion" : 1

                   }

         ],

         "ok" : 1

}

 

8 mongo  config server配置

mongo_config1

192.168.20.139

mongo_config2

192.168.20.129

mongo_config3

192.168.20.128

 

默认端口 27019

 

具体配置同上,配置文件中添加 configsvr = true

 

systemLog:

    quiet: false

    path: /data/mongodb/logs/mongod.log

    logAppend: false

    destination: file

processManagement:

    fork: true

    pidFilePath: /data/mongodb/run/mongod.pid

net:

    bindIp: 0.0.0.0

    port: 27019

    maxIncomingConnections: 65536

    wireObjectCheck: true

    ipv6: false

storage:

    dbPath: /data/mongodb/data

    indexBuildRetry: true

    journal:

        enabled: true

    directoryPerDB: false

    engine: mmapv1

    syncPeriodSecs: 60

    mmapv1:

        quota:

            enforced: false

            maxFilesPerDB: 8

        smallFiles: true

        journal:

            commitIntervalMs: 100

operationProfiling:

    slowOpThresholdMs: 100

    mode: off

sharding:

clusterRole: configsvr

 

 

 

启动加入到rc.local中

echo “/data/mongodb/bin/mongod -f /data/mongodb/etc/mongodb.cnf  --rest” >>/etc/rc.local

 

 

9.mongos配置

mongos1

192.168.20.137

mongos2

192.168.20.138

 

 

mongodb.cnf

systemLog:

    quiet: false

    path: /data/mongodb/logs/mongod.log

    logAppend: false

    destination: file

processManagement:

    fork: true

    pidFilePath: /data/mongodb/run/mongod.pid

net:

    bindIp: 0.0.0.0

    port: 27017

    maxIncomingConnections: 65536

    wireObjectCheck: true

    ipv6: false

sharding:

configDB: 192.168.20.139:27019,192.168.20.129:27019,192.168.20.128:27019

 

启动

/data/mongodb/bin/mongos  -f  /data/mongodb/etc/mongodb.cnf

10.配置sharding
把replica sets2个副本集群,加入到sharding中

连接mongos 服务器进行配置(任意)

[root@shard2 bin]# ./mongo --host 192.168.20.137:27017

mongos>sh.help()

 

mongos> sh.help()

       sh.addShard( host )                       server:port OR setname/server:port

       sh.enableSharding(dbname)                 enables sharding on the database dbname

       sh.shardCollection(fullName,key,unique)   shards the collection

       sh.splitFind(fullName,find)               splits the chunk that find is in at the median

       sh.splitAt(fullName,middle)               splits the chunk that middle is in at middle

       sh.moveChunk(fullName,find,to)            move the chunk where 'find' is to 'to' (name of shard)

       sh.setBalancerState( <bool on or not> )   turns the balancer on or off true=on, false=off

       sh.getBalancerState()                     return true if enabled

       sh.isBalancerRunning()                    return true if the balancer has work in progress on any mongos

       sh.disableBalancing(coll)                 disable balancing on one collection

       sh.enableBalancing(coll)                  re-enable balancing on one collection

       sh.addShardTag(shard,tag)                 adds the tag to the shard

       sh.removeShardTag(shard,tag)              removes the tag from the shard

       sh.addTagRange(fullName,min,max,tag)      tags the specified range of the given collection

       sh.removeTagRange(fullName,min,max,tag)   removes the tagged range of the given collection

       sh.status()                               prints a general overview of the cluster

 

注意: 把mongod_shard1_im_test和 mongod_shard2_im_test加入到集群中,副本集中的其他机器自动加入了。添加replica set作为分片:

mongos> sh.addShard("mongod_shard1_im_test/192.168.20.127:27017")

{ "shardAdded" : "mongod_shard1_im_test", "ok" : 1 }

 

mongos> sh.addShard("mongod_shard2_im_test/192.168.20.120:27017")

{ "shardAdded" : "mongod_shard2_im_test", "ok" : 1 }

 

通过sh.status()查看

 

mongos> sh.status()

--- Sharding Status ---

  sharding version: {

         "_id" : 1,

         "minCompatibleVersion" : 5,

         "currentVersion" : 6,

         "clusterId" : ObjectId("57e0d5c4eb504a0629599e18")

}

  shards:

         {  "_id" : "mongod_shard1_im_test",  "host" : "mongod_shard1_im_test/192.168.20.125:27017,192.168.20.126:27017,192.168.20.127:27017" }

         {  "_id" : "mongod_shard2_im_test",  "host" : "mongod_shard2_im_test/192.168.20.120:27017,192.168.20.121:27017,192.168.20.122:27017" }

  active mongoses:

         "3.2.9" : 2

  balancer:

         Currently enabled:  yes

         Currently running:  no

         Failed balancer rounds in last 5 attempts:  0

         Migration Results for the last 24 hours:

                   No recent migrations

  databases:

 

 

11 .数据库 启动分区功能,默认,不启动,都回保存到主sharding上


testdb 启动Sharding功能
mongos> sh.enableSharding("testdb")
{ "ok" : 1 }

 

12.对collections进行顺序分区

一个数据库中有多个collections,未必所有的collection都分区,
要想让collections使用分区功能,必须使用sh.sharCollection 功能简单,明确说明对那个表进行分区,并
指明分区的key

例: 对testdb.sutable(全名),name 和 Age 进行分区

mongos> sh.shardCollection("testdb.sutable",{age:1,name:1})

 

 

 

建立testdb数据库,并且对sutable表插入数据

use testdb
for(i=1;i<1000;i++) db.sutable.insert({name: "User"+i,age:i,sex: "boy",book: ["book1","book2"]})

 

 

查看分片状态
mongos> use admin
mongos> db.runCommand({listshards:1})

 

删除一个sharding:

db.runCommand({"removeshard" :"mongod_shard1_im_test/192.168.20.125:27017,192.168.20.126:27017,192.168.20.127:27017"});

 

补充:对有数据的数据进行分片

use test
for(i=50000;i<60000;i++) db.messages.insert({"packType": i,"fromName":i,"toName": "boy",roomId:i,"creationDate":i,"stanza":i,"deleteFlag":i,"day":i })

需要手动创建索引
db.messages.ensureIndex({"roomId":1,"creationDate":1,"deleteFlag":1})

指出对那个表的key进行分区
sh.shardCollection("test.messages",{roomId:1,creationDate:1,deleteFlag:1})

删除索引
#db.messages.dropIndex({"roomId" : 1})

写入数据
for(i=50000;i<60000;i++) db.messages.insert({"packType": i,"fromName":i,"toName": "boy",roomId:i,"creationDate":i,"stanza":i,"deleteFlag":i,"day":i })

查看
sh.status()

 

对没有数据的数据库进行分片准备:

sh.enableSharding("im_message_db")
sh.shardCollection("im_message_db.messages",{roomId:1,creationDate:1,deleteFlag:1})

use im_message_db

for(i=1;i<6000;i++) db.messages.insert({"packType": i,"fromName":i,"toName": "boy",roomId:i,"creationDate":i,"stanza":i,"deleteFlag":i,"day":i })
sh.status()


此方法,不用对collection 建立索引。