mongodb sharding配置
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 建立索引。