开发者学堂课程【MongoDB精讲课程(下):路由节点进行分片操作】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/727/detail/12986
路由节点进行分片操作
内容介绍:
一、 使用命令添加分片
1. 添加分片
2. 开启分片功能
3. 集合分片
一、 使用命令添加分片:
1.添加分片:
语法:
sh.addshard("IP:Port)
//把两个分片分别给他加进来,加进来的语法也比较简单,sh.addshard。你的IP包括你的段落号,分片可以是单机的,如果是单机的,直接把IP和段落号带进来。
//如果使用的是分片,需要使用这种语法,前面是分片的副本集名称。
第一个分片是 myshardrs01,后面跟上三个成员,三个成员分别的IP和段落号。因为加的时候副本集初始化的时候,第一个主节点实际上用的是局网的IP。
//新建一个窗口,连接第一套分片的副本集,第一套分片的副本集是27018,连接一下客户端,
将第一套分片副本集添加进来:
mongos>
sh.addshard("myshardrs01/192.168.0.2:27018.180.76.159.126:27118180.76.159.12627218
)
{
"shardAdded":"myshardrs01"
"ok": 1,
"operationTime":Timestamp(15646119704)
,
SclusterTime":{
"clusterTimeT:Timestamp(1564611970,4)
,
"signature":{
"hash":BinData(O,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="
),
“keyId":NumberLong(0)
}
}
}
"mincompatibleVersion":5,
"currentversion":6
,
"clusterid”:Objectid("5d4211b798f3f9a48522c68b)
}
shards:
{ "_id" :"myshardrs01", "host" :
"myshardrs01/180.76.159.126:27018.180.76.159.12627118""state":1}
active mongoses:
"4.0.10”:1
autosplit:
Currentlyenabled:yes
balancer:
Currently enabled: yes
Current1y running: no
Failed balancer rounds in 1ast 5 attempts:0
Migration Results for the 1ast 24hours:
No recent migrations
databases:
{ “_id":"config","primary" : "config","partitioned" : true }
//继续将第二套分片副本集添加进来,一样的语法,一样的 IP。段落号不同:2
7318.27418.27518
。
mongos>
sh.addshard("myshardrs02/192.168.0.2:27318180.76.15912627418180.76.159.126
:
27518
)
{
"shardAdded":"myshardrs02"
"ok":1,
"operationTime”:Timestamp(1564612147
,
5)
,
shards:
{ "_id" :"myshardrs01", "host" :
"myshardrs01/180.76.159.126:27018,180.76.15912627118","state":1 }
{ "_id" :"myshardrs02"."host" :
"myshardrs02/180.76.159.126:27318,180.76.159.126:27418", "state":1 }
active mongoses:
“
4.0.10":1
autosplit:
Currentlyenabled:yes
balancer:
Currently enabled: yes
Currently running:no
Failed balancer rounds in 1ast5attempts:0
Migration Results for the 1ast 24 hours:
No recent migrations
databases:
{ "_id" : "config",-"primary" : "config", "partitioned" : true }
提示:如果添加分片失败,需要先手动移除分片,检查添加分片的信息的正确性后,再次添加分片。
移除分片参考(了解):
use admin
db.runcommand({removeshard:"myshardrs02"})
注意:如果只剩下最后一个 shard,是无法删除的。移除时会自动转移分片数据,需要一个时间过程。完成后,再次执行删除分片命令才能真正删除。
2.开启分片功能:
//现在分片想要使用,要初始化,首先初始化库名,在调用 shshardCollection,开启分片,最终开启的是集合。要先让某一个库开启分片功能,调用的是enablesharding,后面跟上库名。
//例如,要分片的库是 articledb,要开启 articledb 的分片功能,开启之后,对它具体某一个集合进行分片。
shenableSharding ("库名")、shshardCollection ("库名集合名"{"key":1})
在 mongos 上的 articledb 数据库配置 sharding:
mongos> sh.enablesharding("articledb) I
{
"ok": 1,
"operationTime":Timestamp(1564612296,5),
"SclusterTime":{
"clusterTime": Timestamp(1564612296,5),
"signature":{
"hash":BinData(0
,
"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId":NumberLong(0)
}
}
}
查看分片状态:
mongos> sh.status()
---sharding Status--- sharding version: {
"_id": 1,
"mincompatibleversion”:5.
"currentversion":6.
"clusterid":objectid("5d4211b798f3f9a48522p68b")
}
shards:
{ "_id":"myshardrs01","host":
"myshardrs01/180.76.159.126:27018,180.76.159.126:27118","state":1 }
{ "id":"myshardrs02", "host":
“
myshardrs02/180.76.159.126:27318180.76.159.12627418", “state": 1 }
active mongoses:
"4.0.10":1
autosplit:
Currentlyenabled:yes
balancer:
Currently enabled: yes
Currentlyrunning: no
Failed balancer rounds in ast5attempts:0
Migration Results for the 1ast 24 hours:
No recent migrations
databases:
{ "_id":"articledb","primary" :"myshardrs02", "partitioned": true,
"version":{ "uuid":UUID("788c9a3b-bb6a-4cc2-a597-974694772986"),"7astMod":1}}
{ “_id":"config", "primary" :"config","partitioned": true }
config.system.sessions
shard key:{ "_id":1 }
unique:false
balancing: true
chunks:
myshardrs01
{"id":{ "$minkey":1}
)
->> {"_id":{"Smaxkey" :1 }}
on :myshardrs01 Timestamp(1
,
0)
3.集合分片
对集合分片,你必须使用 shshardCollection() 方法指定集合和分片键。
语法:
sh.shardco
l
lection(namespace
,
key
,
unique)
参数:
Parameter |
Type |
Description |
namespace |
string |
要(分片)共享的目标集合的命名空间,格式:<database><co1lection> |
key |
document |
用作分片键的索引规范文档。shard 键决定 MongoDB 如何在 shard 之间分发文档。除非集合为空,否则索引必须在shardcollection命令之前存在。如果集合为空,则 MongoDB 在对集合进行分片之前创建索引,前提是支持分片键 的索引不存在。简单的说:由包含字段和该字段的索引遍历方向的文档组成。 |
unique |
boolean |
当值为true情况下,片键字段上会限制为确保是唯一索引。哈希策略片键不支持唯一索引。默认是false。 |
对集合进行分片时,你需要选择一个片键(ShardKey),shardkey是每条记录都必须包含的,且建立了索引的单个字段或复合字段,MongoDB按照片键将数据划分到不同的数据块中,并将数据块均衡地分布到所有分片中。为了按照片键划分数据块MongoDB使用基于哈希的分片方式(随机平均分配)或者基于范围的分片方式(数值大小分配)。
用什么字段当片键都可以,如:nickname作为片键,但一定是必填字段。
//第一个参数 namespace 是命名空间,命名空间是分片的数据,数据库.和集合就是命名空间,代表要对哪个库的哪个集合进行分片。第二个Key是索引规则,就是片键(ShardKey),片键的意思就是根据某一个字段或者某一个复合字段来分片。分片有一定的规则,根据字段。第三个参数 unique 不常用,为了提升性能。
//主要看前两个字段。一个是 namespace,namespace 是数据库.集合。一个是 key,片键就是前面你的字段,你要用哪个字段进行分片。
分片规则一:哈希策略
对于基于哈希的分片,MongoDB 计算一个字段的哈希值,并用这个哈希值来创建数据块.
在使用基于哈希分片的系统中拥有相近片键的文档很可能不会存储在同一个数据块中,因此数据的分离性更好一些.
使用 nickname 作为片键,根据其值的哈希值进行数据分片
mongos> sh.shardco1lection("articledb.comment",{"nickname":"hashed"})
{
"collectionsharded":"articledb.comment",
"co1lectionUUID”:UUID(“ddea6ed8-ee61-4693-bd16-196acc3a45e8")
"ok":1,
"operationTime":Timestamp(1564612840,28)
,
"SclusterTime":{
"clusterTime":Timestamp(1564612840,28),
"signature":{
"hash":BinData(O."AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId":NumberLong(0)
}
}
}
//哈希规则相对来说应用的较多,如果要用 shardco1lection 这个语法,首先命名空间是 articledb,集合是 comment。
对 comment 这个集合进行分片,分片规则是通过 nickname这个字段,nickname 字段的策略是哈希规则。
哈希规则就是通过计算这个字段时要存储的 nickname 值的一些哈希,通过哈希值进行分片。