Shard key:
1.每个需要分片的集合都需要指定分片键;
2.分片键必须是索引字段或者复合索引的左前缀;
3.根据分片键将数据分成多个块,并将他们平均分布在多个shards节点上;
4.支持两种分区算法:range和hash
搭建分片集群
准备10个节点:
1个路由router;
3个节点组成复制集作为配置服务器config server;
3个节点组成复制集作为分片1;
3个节点组成复制集作为分片2。
最后的文件形式:
分片节点数据文件存放目录
Config server节点目录以及一个router节点目录
分别对shard1,shard2,config_server以及router创建日志文件
单独创建一个分片集群的进程信息目录
创建节点配置文件存放目录,对分片1的复制集中三个节点编辑配置文件信息(端口号记得不同)
配置文件其中一个:
dbpath=/Users/haoniao/code/Nosql/mongodb/data/cluster/shard1/s1
logpath=/Users/haoniao/code/Nosql/mongodb/data/logs/cluster_logs/shard1_s1.log
logappend=true
bind_ip_all=true
port=27217
fork=true
replSet=shard1
pidfilepath=/Users/haoniao/code/Nosql/mongodb/pids/cluster_poids/shard1_s1.pid
oplogSize=1000
shardsvr=true
对分片2的复制集中三个节点编辑配置文件信息
dbpath=/Users/haoniao/code/Nosql/mongodb/data/cluster/shard2/s1
logpath=/Users/haoniao/code/Nosql/mongodb/data/logs/cluster_logs/shard2_s1.log
logappend=true
bind_ip_all=true
port=27317
fork=true
replSet=shard2
pidfilepath=/Users/haoniao/code/Nosql/mongodb/pids/cluster_poids/shard2_s1.pid
oplogSize=1000
shardsvr=true
启动两个分片共6个节点的mongod服务
//先到MongoDB的根目录
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/shard1_s1.conf
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/shard1_s2.conf
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/shard1_s3.conf
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/shard2_s1.conf
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/shard2_s2.conf
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/shard2_s3.conf
查看是否启动:
ps -ef|grep mongod
户端连接share1分片中其中一个节点,并做初始化
rs.initiate({
"_id":"replicatios",
"members":[
{"_id":0,"host":"127.0.0.1:27217","priority":3},
{"_id":1,"host":"127.0.0.1:27218","priority":1},
{"_id":3,"host":"127.0.0.1:27219","arbiterOnly":true},
]
});
当前分片1中端口为27217的服务为主机服务(查看一下):
客户端连接share2分片中其中一个节点,并做初始化
rs.initiate({
"_id":"shard1",
"members":[
{"_id":0,"host":"127.0.0.1:27217","priority":3},
{"_id":1,"host":"127.0.0.1:27218","priority":1},
{"_id":3,"host":"127.0.0.1:27219","arbiterOnly":true},
]
});
当前分片2中端口为27317的服务为主机服务
rs.initiate({
"_id":"shard2",
"members":[
{"_id":0,"host":"127.0.0.1:27317","priority":3},
{"_id":1,"host":"127.0.0.1:27318","priority":1},
{"_id":3,"host":"127.0.0.1:27319","arbiterOnly":true},
]
});
对config_server的复制集中三个节点编辑配置文件信息
configsvr=true
这里和上面不同
dbpath=/Users/haoniao/code/Nosql/mongodb/data/cluster/config_s/c1
logpath=/Users/haoniao/code/Nosql/mongodb/data/logs/cluster_logs/config_s1.log
logappend=true
bind_ip_all=true
port=27417
fork=true
replSet=config_server
pidfilepath=/Users/haoniao/code/Nosql/mongodb/pids/cluster_poids/config1.pid
oplogSize=1000
configsvr=true
分别启动config_server中的三个节点的mongodb服务
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/config_server_c1.conf
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/config_server_c2.conf
bin/mongod -f /Users/haoniao/code/Nosql/mongodb/conf/cluster_conf/config_server_c3.confd
客户端连接其中一个节点的mongodb服务,并初始化
rs.initiate({
"_id":"config_server",
"members":[
{"_id":0,"host":"127.0.0.1:27417","priority":3},
{"_id":1,"host":"127.0.0.1:27418","priority":1},
{"_id":3,"host":"127.0.0.1:27419","priority":1},
]
});
端口为27417的mongodb服务为主机
配置路由
logpath=/Users/haoniao/code/Nosql/mongodb/data/logs/cluster_logs/router.log
logappend=true
bind_ip_all=true
port=27517
fork=true
pidfilepath=/Users/haoniao/code/Nosql/mongodb/pids/cluster_poids/router.pid
configdb=config_server/127.0.0.1:27417,127.0.0.1:27418,127.0.0.1:27419
启动mongos服务
客户端连接
先切换到admin库,然后将两个分片添加到路由
在config库的shards集合下能看到分片信息
给指定的数据库开启分片能力,开启分片命令必须在admin库下运行
在开启分片能力的库中创建一个集合
分片键所在的字段必须要有索引
5.0以上用的这个,之前的ensureIndex 已经不用了
db.users.createIndex({"name":1,"age":1})
对集合开启分片,在此之前需要先对集合中的分片字段建立索引
先到admin ,
use admin
查看分片的状态信息
sh.status()