上一篇:MongoDB(11)—分片基础概念
1.分片集群架构 |
上一篇文章中记录了分片集群得基础概念,这里简单搭建一个分片集群:
路由服务:
Mongos1端口:27017
Mongos2端口:27117
配置服务器副本集:
主节点端口:27018
从节点端口1:27118
从节点端口2:27218
分片副本集:
副本集1
主节点端口:27019
从节点端口:27119
仲裁节点端口:27219
副本集2
主节点端口:27319
从节点端口:27419
仲裁节点端口:27519
-
搭建2个Mongos路由服务,避免一个路由服务宕机之后整个分片集群不可用,提高集群的容错性;
-
配置服务器副本集中,因为仲裁节点不存储任何数据,所以我们可以将其设置为一个从节点。
-
分片副本集我们一共搭建两个,实际项目中我们可以根据实际需要添加更多的分片集群。
2.搭建分片集群 |
1.搭建分片副本集
- 在Linux中,定位到安装的
MongoDB
目录上:
- 创建分片副本集1的
data/db
目录和log
目录
mkdir -p sharded_cluster/sharded01_27019/log \ &
mkdir -p sharded_cluster/sharded01_27019/data/db
mkdir -p sharded_cluster/sharded01_27119/log \ &
mkdir -p sharded_cluster/sharded01_27119/data/db
mkdir -p sharded_cluster/sharded01_27219/log \ &
mkdir -p sharded_cluster/sharded01_27219/data/db
- 创建配置文件
vi sharded_cluster/sharded01_27019/mongod.conf
在配置文件中粘贴如下配置(注意修改path路径以及端口号):
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: "/usr/local/mongodb-4.0.9/sharded_cluster/sharded01_27019/data/db"
#是否开启 journal 日志持久存储,journal 日志用来数据恢复,是 mongod 最基础的特性,通常用于故障恢复。64 位系统默认为 true,32 位默认为 false,建议开启,仅对 mongod 进程有效。
journal:
enabled: true
#存储引擎类型,mongodb 3.0 之后支持 “mmapv1”、“wiredTiger” 两种引擎,默认值为“mmapv1”;官方宣称 wiredTiger 引擎更加优秀。
engine: mmapv1
systemLog:
# 日志输出目的地,可以指定为 “file” 或者“syslog”,表述输出到日志文件,如果不指定,则会输出到标准输出中(standard output)
destination: file
# 如果为 true,当 mongod/mongos 重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件;默认为 false。
logAppend: true
# 日志路径
path: "/usr/local/mongodb-4.0.9/sharded_cluster/sharded01_27019/log/mongod.log"
processManagement:
#启用在后台运行mongos或者mongod进程的守护进程模式
fork: true
net:
# 绑定外网 op 多个用逗号分隔,默认是localhost
bindIp: 0.0.0.0
#指定端口
port: 27019
replication:
# 副本集的名称 同一个副本集的主节点、从节点、仲裁节点副本集必须同名
replSetName: sharded01
sharding:
# 分片角色
clusterRole: shardsvr
- 启动这
27019
、27119
、27219
三个端口
/usr/local/mongodb-4.0.9/bin/mongod -f sharded_cluster/sharded01_27019/mongod.conf
成功启动第一套分片副本集:
采用上面同样的步骤,但是需要修改端口以及配置文件中的路径来搭建第二套分片副本集并启动第二套分片副本集:
至此,我们的两套分片副本集就搭建完成并且成功启动了。
2.搭建配置服务副本集
- 创建
data\db
目录和log
目录
mkdir -p sharded_cluster/configServer_27018/log \ &
mkdir -p sharded_cluster/configServer_27018/data/db
mkdir -p sharded_cluster/configServer_27118/log \ &
mkdir -p sharded_cluster/configServer_27118/data/db
mkdir -p sharded_cluster/configServer_27218/log \ &
mkdir -p sharded_cluster/configServer_27218/data/db
- 创建
mongod.conf
配置文件(注意修改端口和路径)
storage:
# mongod 进程存储数据目录,此配置仅对 mongod 进程有效
dbPath: "/usr/local/mongodb-4.0.9/sharded_cluster/configServer_27018/data/db"
#是否开启 journal 日志持久存储,journal 日志用来数据恢复,是 mongod 最基础的特性,通常用于故障恢复。64 位系统默认为 true,32 位默认为 false,建议开启,仅对 mongod 进程有效。
journal:
enabled: true
#存储引擎类型,mongodb 3.0 之后支持 “mmapv1”、“wiredTiger” 两种引擎,默认值为“mmapv1”;官方宣称 wiredTiger 引擎更加优秀。
engine: mmapv1
systemLog:
# 日志输出目的地,可以指定为 “file” 或者“syslog”,表述输出到日志文件,如果不指定,则会输出到标准输出中(standard output)
destination: file
# 如果为 true,当 mongod/mongos 重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件;默认为 false。
logAppend: true
# 日志路径
path: "/usr/local/mongodb-4.0.9/sharded_cluster/configServer_27018/log/mongod.log"
processManagement:
#启用在后台运行mongos或者mongod进程的守护进程模式
fork: true
net:
# 绑定外网 op 多个用逗号分隔,默认是localhost
bindIp: 0.0.0.0
#指定端口
port: 27018
replication:
# 副本集的名称 同一个副本集的主节点、从节点、仲裁节点副本集必须同名
replSetName: configServer
sharding:
# 分片角色
clusterRole: configsvr
- 启动配置服务副本集(注意修改端口和路径)
/usr/local/mongodb-4.0.9/bin/mongod -f sharded_cluster/configServer_27018/mongod.conf
成功开启了配置服务副本集。
3.初始化副本集
1.登录windows命令窗口,并连接mongodb服务
2.初始化副本集
rs.initiate()
3.添加从节点
rs.add("IP地址:端口号")
3.添加仲裁节点
rs.addArb("IP地址:端口号")
至此,第一套分片副本集初始化完成。
4.登录27319
端口,使用同样得步骤来初始化第二套分片副本集
5.初始化配置服务副本集
因为配置服务也是一个副本集,所以按照上面初始化分片副本集的方法重复操作一次(配置服务副本集的配置文件mongod.conf
与分片副本集有所差异)。
3.搭建路由
1.创建存放日志的目录
路由节点不存储数据,只需要log
目录就可以了。
mkdir -p sharded_cluster/mongos_27017/log
2.创建路由配置文件
vi sharded_cluster/mongos_27017/mongos.conf
systemLog:
# 日志输出目的地,可以指定为 “file” 或者“syslog”,表述输出到日志文件,如果不指定,则会输出到标准输出中(standard output)
destination: file
# 如果为 true,当 mongod/mongos 重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件;默认为 false。
logAppend: true
# 日志路径
path: "/usr/local/mongodb-4.0.9/sharded_cluster/mongos_27017/log/mongod.log"
processManagement:
#启用在后台运行mongos或者mongod进程的守护进程模式
fork: true
pidFilePath: "/usr/local/mongodb-4.0.9/sharded_cluster/mongos_27017/log/mongod.pid"
net:
# 绑定外网 op 多个用逗号分隔,默认是localhost
bindIp: 0.0.0.0
#指定端口
port: 27017
sharding:
# 指定配置节点副本集
configDB: configServer/120.76.215.19:27018,120.76.215.19:27118,120.76.215.19:27218
3.启动路由服务
/usr/local/mongodb-4.0.9/bin/mongos -f sharded_cluster/mongos_27017/mongos.conf
4.将分片服务添加到路由节点
分别将sharded01
和sharded02
两套分片副本集添加到路由节点中。
sh.addShard("sharded01/120.76.215.19:27019,120.76.215.19:27119,120.76.215.19:27219")
……
5.开启分片
在之前的文章中说过,MongoDB的分片层级是对集合数据进行分片,所以这里我们可以使用以下命令来开启分片:
数据块开启分片服务:
sh.enableSharding("数据库名")
sh.shardCollection(namespace,key,unique)
Parameter | Type | Description |
---|---|---|
namespace | String | 要(分片)共享的目标集合的命名空间,格式:. |
key | document | 用作分片键的索引规范文档。shard键决定MongoDB如何在shard之间分发文档。除非集合为空,否则索引必须在shard collection命令之前存在。如果集合为空,则MongoDB在对集合进行分片之前创建索引,前提是支持分片键的索引不存在。简单地说:由包含字段和字段的索引遍历方向的文档组成。 |
unique | boolean | 当值为true情况下,片键字段上会限制为确保是唯一索引。哈希策略片键不支持唯一索引。默认是false。 |
注意:集合中如果由数据,则MongoDB会以id
键创建一个唯一索引
进行分片的时候,我们需要选择一个片键(Shard Key),该片键必须是所有的集合中的数据都包含的且建立了索引的字段,MongoDB会按照片键将数据划分到不同的数据块中,并将数据块均衡地分布到所有分片中,为了按照片键划分数据块,MongoDB使用基于哈希的分片方式(随即平均分配)或者基于范围的分布方式(数值大小分配)。
策略 | 语法 | 描述 |
---|---|---|
哈希策略 | sh.shardCollection(“数据库名.集合名”,{“片键名”:“hashed”}) | 对于基于哈希的分片,MongoDB计算一个字段的哈希值,并用这个哈希值来创建数据块。在使用基于哈希分片的系统中,拥有“相近”片键的文档,很可能不会存储在同一个数据块中,因为数据的分离性更好一些。 |
范围策略 | sh.shardCollection(“数据库名.集合名”,{“片键名”:1}) | 对于基于范围的分片,MongoDB按照片键的范围把数据分为不同部分,假设有一个数字的片键:想象一个从负无穷到正无穷的直线,每一个片键的值都在直线上画了一个点MongoDB把这条直线划分为更短的不重叠的片段,并称之为数据块,每个数据块包含了片键在一定范围内的数据。在使用片键做范围划分的系统中,拥有“相近”片键的文档很可能存储在同一个数据块中,因为也会存储在同一个分片中。 |
同一个集合中的同一个字段只能同时使用一种分片策略。不能一个字段既用哈希策略分片又用范围策略分片。
至此,一个简单的MongoDB分片集群就搭建好了,如果此时我们要通过IDEA
等工具进行连接MongoDB服务,则直接连接路由节点就可以了。
spring:
data:
mongodb:
#连接路由节点的IP地址和端口
uri: mongodb://IP地址:端口,IP地址:端口……/数据库名