分片简介

分片(shard)是指将数据拆分,将其分散在不同的机器上的过程,有时也用分区(partition)联表示这个概念。将数据分散到不同机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更大的负载。复制和分片是不同而概念,复制是让多台机器拥有同样的数据副本,每台机器都是其他服务器的镜像,而每一个分片都有其他分片拥有不同的数据子集。

mongos :路由进程, 应用程序接入mongos再查询到具体分片。

configdb:路由表服务,每一台都具有全部chunk的路由信息。

shard:为数据存储分片,每一个分片可以使副本集,这里我使用了三个复制集。

arbiter:如果主服务器崩溃了,仲裁服务器(ARBITER)会将优先级高的成员选为主节点。

每个成员每个两秒就会向其他成员发送一次心跳请求(heartbest request).心跳的请求信息量非常小。

一、拓扑图


wKiom1XjC9ST5tfnAAMvvC-vRDQ849.jpg


二、服务器信息

系统:Centos-6.5-x86-64位,内核版本:2.6.32

mogodb版本:mongodb-linux-x86_64-2.6.7.tgz

三台服务器多个实例:

复制集1 IP:192.168.2.134

端口分配:
mongos1:27111
configdb1:27100
mongo主分片1:27001
mongo备1:27011
arbiter1:27010

复制集2 IP:192.168.2.133

端口分配:
mongos2:27222
configdb2:27200
mongo主分片2:27002
mongo备2:27022
arbiter2:27020

复制集3 IP:192.168.2.132

端口分配:
mongos3:27333
configdb3:27300
mongo主分片3:27003
mongo备3:27033
arbiter3:27030

三、配置

三台服务器都执行:

tar -zxvf mongodb-linux-x86_64-2.6.7.tgz 
mv mongodb-linux-x86_64-2.6.7 /usr/local/
cd /usr/local/mongodb-linux-x86_64-2.6.7/
mkdir conf
mkdir /data/mongodb/{logs,pid}


3.1、 192.168.2.134服务器配置:

mkdir /data/mongodb/{shard1,shard3,configdb1,arbiter2}/data

mongos1:27111 

[root@localhost mongodb]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/mongos1.conf 

logpath = /data/mongodb/logs/mongos1.log
logappend = true
fork = true
port = 27111
configdb = 192.168.2.134:27100,192.168.2.133:27200,192.168.2.132:27300

configdb1:27100 

[root@localhost mongodb]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/configdb1.conf 

logpath = /data/mongodb/logs/configdb1.log
logappend = true
pidfilepath = /data/mongodb/pid/config.pid
dbpath = /data/mongodb/configdb1/data
fork = true
port = 27100
oplogSize = 2048
configsvr = true

mongo主分片1:27001  

[root@localhost mongodb]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard1.conf 

logpath = /data/mongodb/logs/shard1.log
logappend = true
pidfilepath = /data/mongodb/pid/shard1.pid
dbpath = /data/mongodb/shard1/data
directoryperdb = true
replSet = replset1
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27001
journal = true

mongo3备:27033  

[root@localhost mongodb]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard3.conf 

logpath = /data/mongodb/logs/shard3.log
logappend = true
pidfilepath = /data/mongodb/pid/shard3.pid
dbpath = /data/mongodb/shard3/data
directoryperdb = true
replSet = replset3
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27033
journal = true

arbiter2:27020

[root@localhost mongodb]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/arbiter2.conf 

logpath = /data/mongodb/logs/arbiter2.log
logappend = true
pidfilepath = /data/mongodb/pid/arbiter2.pid
dbpath = /data/mongodb/arbiter2/data
directoryperdb = true
replSet = replset2
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27020
journal = true

服务器启动实例:(先启动config,再启动mongos)

/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard1.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/arbiter2.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard3.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/configdb1.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongos -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/mongos1.conf


3.2、 192.168.2.133 服务器配置:

mkdir /data/mongodb/{shard1,shard2,configdb2,arbiter3}/data

mongos2:27222 

[root@localhost ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/mongos2.conf 

logpath = /data/mongodb/logs/mongos.log
logappend = true
fork = true
port = 27222
configdb = 192.168.2.134:27100,192.168.2.133:27200,192.168.2.132:27300

configdb2:27200

[root@localhost ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/configdb2.conf 

logpath = /data/mongodb/logs/configdb2.log
logappend = true
pidfilepath = /data/mongodb/pid/config2.pid
dbpath = /data/mongodb/configdb2/data
fork = true
port = 27200
oplogSize = 2048
configsvr = true

mongo主分片2:27002  

[root@localhost ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard2.conf 

logpath = /data/mongodb/logs/shard2.log
logappend = true
pidfilepath = /data/mongodb/pid/shard2.pid
dbpath = /data/mongodb/shard2/data
directoryperdb = true
replSet = replset2
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27002
journal = true

mongo备1:27011  

[root@localhost ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard1.conf 

logpath = /data/mongodb/logs/shard1.log
logappend = true
pidfilepath = /data/mongodb/pid/shard1.pid
dbpath = /data/mongodb/shard1/data
directoryperdb = true
replSet = replset1
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27011
journal = true

arbiter3:27030

[root@localhost ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/arbiter3.conf 

logpath = /data/mongodb/logs/arbiter3.log
logappend = true
pidfilepath = /data/mongodb/pid/arbiter3.pid
dbpath = /data/mongodb/arbiter3/data
directoryperdb = true
replSet = replset3
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27030
journal = true

服务器启动实例:

/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard1.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/arbiter3.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard2.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/configdb2.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongos -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/mongos2.conf


3.3、 192.168.2.132 服务器配置:

mkdir /data/mongodb/{shard1,shard2,configdb2,arbiter3}/data

mongos3:27333 

[root@bjmdb4 ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/mongos3.conf 

logpath = /data/mongodb/logs/mongos.log
logappend = true
fork = true
port = 27333
configdb = 192.168.2.134:27100,192.168.2.133:27200,192.168.2.132:27300

configdb3:27300  

[root@bjmdb4 ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/configdb3.conf 

logpath = /data/mongodb/logs/configdb3.log
logappend = true
pidfilepath = /data/mongodb/pid/config3.pid
dbpath = /data/mongodb/configdb3/data
fork = true
port = 27300
oplogSize = 2048
configsvr = true

mongo主3:27003  

[root@bjmdb4 ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard3.conf 

logpath = /data/mongodb/logs/shard3.log
logappend = true
pidfilepath = /data/mongodb/pid/shard1.pid
dbpath = /data/mongodb/shard3/data
directoryperdb = true
replSet = replset3
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27003
journal = true

mongo备2:27022  

[root@bjmdb4 ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard2.conf 

logpath = /data/mongodb/logs/shard2.log
logappend = true
pidfilepath = /data/mongodb/pid/shard1.pid
dbpath = /data/mongodb/shard2/data
directoryperdb = true
replSet = replset2
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27022
journal = true

arbiter1:27010

[root@bjmdb4 ~]# cat /usr/local/mongodb-linux-x86_64-2.6.7/conf/arbiter1.conf 

logpath = /data/mongodb/logs/arbiter1.log
logappend = true
pidfilepath = /data/mongodb/pid/arbiter1.pid
dbpath = /data/mongodb/arbiter1/data
directoryperdb = true
replSet = replset1
rest = true
oplogSize = 1024
fork = true
shardsvr = true
port = 27010
journal = true

启动实例:

/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/arbiter1.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard2.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/shard3.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongod -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/configdb3.conf
/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongos -f /usr/local/mongodb-linux-x86_64-2.6.7/conf/mongos3.conf


四、配置复制集

4.1、 192.168.2.134服务器配置复制集:

/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongo 192.168.2.134:2700

config = { _id:"replset1", members:[

                     {_id:0,host:"192.168.2.134:27001",priority:10},

                     {_id:1,host:"192.168.2.133:27011",priority:8},

                     {_id:2,host:"192.168.2.132:27010",arbiterOnly:true},

                     

                ]

         }


wKioL1XgUGTibRM_AAKDiekPkAk493.jpg

wKiom1XgTkngvNHBAASDkef0-aM714.jpg

rs.initiate(config);  //更新配置

rs.status()           //查看配置信息

4.2、 192.168.2.133服务器配置复制集:

/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongo 192.168.2.133:27002

config = { _id:"replset2", members:[

                     {_id:0,host:"192.168.2.133:27002",priority:10},

                     {_id:1,host:"192.168.2.132:27022",priority:8},

                     {_id:2,host:"192.168.2.134:27020",arbiterOnly:true},

                     

                ]

         }

wKiom1XgTxfAhJcbAAHLZgHeNm0530.jpg

wKioL1XgUTLQ93T4AAOHNvKkOkI144.jpg

rs.initiate(config);  //更新配置

rs.status()           //查看配置信息

4.3、 192.168.2.132服务器配置复制集:

/usr/local/mongodb-linux-x86_64-2.6.7/bin/mongo 192.168.2.132:27003

config = { _id:"replset3", members:[

                     {_id:0,host:"192.168.2.132:27003",priority:10},

                     {_id:1,host:"192.168.2.134:27033",priority:8},

                     {_id:2,host:"192.168.2.133:27030",arbiterOnly:true},

                     

                ]

         }

wKiom1XgT5jSzNA9AAIExOBhmlM652.jpg

wKioL1XgUbOwcevEAAQ-Vr9g7So373.jpg

rs.initiate(config);  //更新配置

rs.status()           //查看配置信息

五、配置mongos串联路由信息

db.runCommand({ addshard :"replset1/192.168.2.134:27001"});

db.runCommand({ addshard :"replset2/192.168.2.133:27002"});

db.runCommand({ addshard :"replset3/192.168.2.132:27003"});        

[root@localhost ~]# /usr/local/mongodb-linux-x86_64-2.6.7/bin/mongo 192.168.2.134:27111/admin

MongoDB shell version: 2.6.7
connecting to: 192.168.2.134:27111/admin
mongos> 
mongos> 
mongos> 
mongos> 
mongos> show dbs
admin   (empty)
config  0.016GB
mongos> db.runCommand({ addshard :"replset1/192.168.2.134:27001"});
{ "shardAdded" : "replset1", "ok" : 1 }
mongos> db.runCommand({ addshard :"replset2/192.168.2.133:27002"});
{ "shardAdded" : "replset2", "ok" : 1 }
mongos> db.runCommand({ addshard :"replset3/192.168.2.132:27003"});
{ "shardAdded" : "replset3", "ok" : 1 }
mongos> printShardingStatus()    //查看分片信息
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"version" : 4,
	"minCompatibleVersion" : 4,
	"currentVersion" : 5,
	"clusterId" : ObjectId("55dfc20932ed635fd872d595")
}
  shards:
	{  "_id" : "replset1",  "host" : "replset1/192.168.2.133:27011,192.168.2.134:27001" }
	{  "_id" : "replset2",  "host" : "replset2/192.168.2.132:27022,192.168.2.133:27002" }
	{  "_id" : "replset3",  "host" : "replset3/192.168.2.132:27003,192.168.2.134:27033" }
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

mongos> sh.getBalancerState() //查看均衡器负责数据迁移
true
mongos>

六、创建数据分片

[root@localhost ~]# /usr/local/mongodb-linux-x86_64-2.6.7/bin/mongo 192.168.2.134:27111

mongos> use admin                                       //启用分片要切换到admin
switched to db admin
mongos> db.runCommand({"enablesharding": "db_jia"})    //首先对数据库开启分片,是对集合开启分片的先决条件
{ "ok" : 1 }
mongos> db.tab4.ensureIndex({"username" : "hashed"})  //创建索引
{
"raw" : {
"replset3/192.168.2.132:27003,192.168.2.134:27033" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}     
mongos> use admin
switched to db admin                               //使用GridFS散列片建(写强求会被均匀分发到分片上)
mongos> db.runCommand({"shardcollection":"db_jia.tab4", "key":{"username" : "hashed"}})
{ "collectionsharded" : "db_jia.tab4", "ok" : 1 }
mongos> for (var i= 1; i <= 90; i++)db.tab4.save({"username" : "user"+i,"crated_at" : new Date()});  //写90条数据
WriteResult({ "nInserted" : 1 })
mongos> db.tab4.find().count()
30

分片还是很均匀的:

6.1、 分片1查看数据:

wKiom1XgWTCzGDIPAAmK9Sqd644653.jpg

分片1备份库

wKioL1XgW0uzOu1KAAoIc6PlHwg448.jpg

6.2、 分片2查看数据:

wKiom1XgWXahyzC-AAkwqksCcec407.jpg

分片2备份库:

wKioL1XgW5GhgBq8AAn5LBQtqf8029.jpg

6.3、 分片3查看数据:

wKiom1XgWbny9O98AAl_h-amwVI134.jpg

分片3备份库:

wKioL1XgW9SwpmrvAAuWKjYrdA4531.jpg

七、模拟分片1主节点故障:

主节点停掉临时3秒

wKiom1XhHXrj_16SAASfWE4Ut38666.jpg

备份节点:

wKioL1XhH5Xw4huoAAObxVdlEdg734.jpg

仲裁节点:

wKiom1XhHXqgCeS4AAKbpqd6uik374.jpg

仲裁节点log:wKiom1XhHXrDrj_hAAV65Wgj9os586.jpg


总结:因为做了副本集,分片主节点出现故障,仲裁节点会重新选举主节点。