Mongodb分片模式部署
MongoDB 分片集群部署教程
1. 概述
MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片,MongoDB 可以将数据分布在多个服务器上,从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。
介绍
分片集群中主要由三个部分组成,即分片服务器(Shard)、路由服务器(Mongos)以及配置服务器(Config Server)组成。其中,分片服务器有三个,即Shard1、Shard2、Shard3;路由服务器有两个,即Mongos1和Mongos2;配置服务器有三个,即主、副、副。
分片服务器
即MongoDB实例(即mongod,用Shard表示),分片服务器是实际存储数据的组件,持有完整数据集中的一部分,每个分片服务器都可以是一个MongoDB实例,也可是一组MongoDB实例组成的集群(副本集)。从MongoDB 3.6开始,必须将分片部署为副本集,这样具有更好的容错性。
路由服务器
即mongos,路由服务器主要提供客户端应用程序与分片集群交互的接口,所有请求都需要通过路由服务器进行协调工作。路由服务器实际上就是一个消息分发请求中心,它负责把客户端应用程序对应的数据请求转发到对应的分片服务器上。应用程序将查询、存储、更新等请求原封不动地发送给路由服务器。路由服务器询问配置服务器操作分片服务器需要获取哪些元数据,然后连接相应的分片服务器进行相关操作,最后将各个分片服务器的响应进行合并,返回给客户端应用程序。
生产环境中,一个分片集群通常会有多个路由服务器,一方面可以解决多个客户端同时请求,从而达到负载均衡的效果;另一方面可以解决当路由服务器宕机时导致整个分片集群无法使用的问题。
配置服务器
即Config Server。在生产环境中,通常需要多个配置服务器,因为它存储了分片集群的元数据,并且这些数据是不允许丢失的。因此,需要配置多个配置服务器以防止数据丢失,尽管其中一台分片服务器宕机,我们还有其它配置服务器,从而保证MongoDB分片集群依然能够正常工作。从MongoDB 3.4版本开始,配置服务器必须部署副本集,因此我们需要配置三个配置服务器组成的副本集。
配置服务器存储着分片集群的持久化元数据,而路由服务器存储着分片集群的非持久化元数据,这些数据均为内存缓存的数据。当路由服务器初次启动或关闭重启时,就会从配置服务器中加载分片集群的元数据。若是配置服务器的信息发生变化,则会通知所有路由服务器更新自己的状态,这样路由服务器就能继续准确的协调客户端与分片集群的交互工作。
2. 环境准备
在开始部署之前,确保已经准备好以下环境:
- 三台服务器(例如:nosql01, nosql02, nosql03)
- MongoDB 安装包
- 每台服务器上已创建
user_mongo
用户
虚拟机名称 | 服务器名称 | IP地址 | Shard1 | Shard2 | Shard3 | mongos | Config Server |
---|---|---|---|---|---|---|---|
NoSQL_1 | nosql01 | 192.168.121.134 | 27018主节点 | 27020仲裁节点 | 27019副节点 | 27021 | 27022主节点 |
NoSQL_2 | nosql02 | 192.168.121.135 | 27019副节点 | 27018主节点 | 27020仲裁节点 | 27021 | 27022副节点 |
NoSQL_3 | nosql03 | 192.168.121.136 | 27020仲裁节点 | 27019副节点 | 27018主节点 | 27022副节点 |
(1)/opt/servers/mongodb_demo/shardcluster/:存放分片集群的相关配置文件目录、日志文件目录和数据目录等内容。
(2)/opt/servers/mongodb_demo/shardcluster/configServer/configFile:存放配置服务器的配置文件。
(3)/opt/servers/mongodb_demo/shardcluster/configServer/data:存放配置服务器的数据文件。
(4)/opt/servers/mongodb_demo/shardcluster/configServer/logs:存放配置服务器的日志文件。
(5)/opt/servers/mongodb_demo/shardcluster/shard/configFile:存放分片服务器的配置文件。
(6)/opt/servers/mongodb_demo/shardcluster/shard/shard1_data:存放分片服务器1的数据文件。
(7)/opt/servers/mongodb_demo/shardcluster/shard/shard2_data:存放分片服务器2的数据文件。
(8)/opt/servers/mongodb_demo/shardcluster/shard/shard3_data:存放分片服务器3的数据文件。
(9)/opt/servers/mongodb_demo/shardcluster/shard/logs:存放分片服务器的日志文件。
(10)/opt/servers/mongodb_demo/shardcluster/mongos/configFile:存放路由服务器的配置文件。
(11)/opt/servers/mongodb_demo/shardcluster/mongos/logs:存放路由服务器的日志文件。
3. 部署 MongoDB
3.1 上传并解压 MongoDB 安装包
- 将 MongoDB 安装包上传到
nosql01
服务器的/opt/software/
目录下。 - 修改安装包的用户和用户组权限为
user_mongo
。 - 解压安装包到
/opt/servers/mongodb_demo/shardcluster/
目录下:$ tar -zxvf /opt/software/mongodb-linux-x86_64-rhel70-4.2.2.tgz -C /opt/servers/mongodb_demo/shardcluster/
- 重命名解压后的目录为
mongodb
:$ mv mongodb-linux-x86_64-rhel70-4.2.2/ mongodb
3.2 分发 MongoDB 安装包
将 mongodb
目录分发到 nosql02
和 nosql03
服务器:
$ scp -r /opt/servers/mongodb_demo/shardcluster/mongodb/ user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/mongodb/
$ scp -r /opt/servers/mongodb_demo/shardcluster/mongodb/ user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/mongodb/
4. 部署 Config Server
4.1 创建配置文件
- 在
nosql01
的/configServer/configFile/
目录下创建配置文件mongodb_config.conf
:$ touch /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf
- 编辑
mongodb_config.conf
,添加以下内容:# 数据文件存放路径 dbpath=/opt/servers/mongodb_demo/shardcluster/configServer/data # 日志文件路径 logpath=/opt/servers/mongodb_demo/shardcluster/configServer/logs/config_server.log # MongoDB 服务监听的端口号 port=27022 # 绑定 IP 地址,指定 MongoDB 服务监听的网络接口 bind_ip=nosql01 # 以追加方式写入日志文件 logappend=true # 以守护进程方式运行 MongoDB fork=true # 最大同时连接数 maxConns=5000 # 复制集名称 replSet=configs # 声明这是一个集群的 Config Server configsvr=true
4.2 分发配置文件
将配置文件分发到 nosql02
和 nosql03
:
$ scp /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/configServer/configFile/
$ scp /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/configServer/configFile/
- 修改
nosql02
和nosql03
上的bind_ip
为各自的 IP 地址。
4.3 启动 Config Server
在三台服务器上启动 Config Server:
$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/configServer/configFile/mongodb_config.conf
4.4 配置 Config Server 副本集
在任意一台服务器上初始化副本集:
$ ./mongo --host nosql01 --port 27022
> rs.initiate()
configs:SECONDARY> rs.add('nosql02:27022')
configs:PRIMARY> rs.add('nosql03:27022')
5. 部署 Shard
5.1 创建配置文件
-
在
nosql01
的/shard/configFile/
目录下创建三个配置文件mongodb_shard1.conf
,mongodb_shard2.conf
,mongodb_shard3.conf
:$ touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard1.conf $ touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard2.conf $ touch /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard3.conf
-
编辑
mongodb_shard1.conf
,添加以下内容:# 数据文件存放路径 dbpath=/opt/servers/mongodb_demo/shardcluster/shard/shard1_data # 日志文件路径 logpath=/opt/servers/mongodb_demo/shardcluster/shard/logs/shard1.log # MongoDB 服务监听的端口号 port=27018 # 绑定 IP 地址,指定 MongoDB 服务监听的网络接口 bind_ip=nosql01 # 以追加方式写入日志文件 logappend=true # 以守护进程方式运行 MongoDB fork=true # 最大同时连接数 maxConns=5000 # 复制集名称 replSet=shard1
-
类似地,编辑
mongodb_shard2.conf
和mongodb_shard3.conf
,分别修改dbpath
,logpath
,port
,bind_ip
, 和replSet
参数。
5.2 启动 Shard
在三台服务器上启动 Shard:
$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard1.conf
$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard2.conf
$ ./mongod -f /opt/servers/mongodb_demo/shardcluster/shard/configFile/mongodb_shard3.conf
5.3 配置 Shard 副本集
在每台服务器上初始化副本集:
$ ./mongo --host nosql01 --port 27018
> rs.initiate()
shard1:SECONDARY> rs.add('nosql02:27019')
shard1:PRIMARY> rs.addArb('nosql03:27020')
6. 部署 mongos
6.1 创建配置文件
- 在
nosql01
的/mongos/configFile/
目录下创建配置文件mongodb_mongos.conf
:$ touch /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf
- 编辑
mongodb_mongos.conf
,添加以下内容:# 日志文件路径 logpath=/opt/servers/mongodb_demo/shardcluster/mongos/logs/mongos.log # 以追加方式写入日志文件 logappend=true # MongoDB 服务监听的端口号 port=27021 # 绑定 IP 地址,指定 MongoDB 服务监听的网络接口 bind_ip=nosql01 # 以守护进程方式运行 MongoDB fork=true # 指定 Config Server 地址 configdb=configs/nosql01:27022,nosql02:27022,nosql03:27022 # 最大同时连接数 maxConns=20000
6.2 分发配置文件
将配置文件分发到 nosql02
:
$ scp /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/mongos/configFile/
- 修改
nosql02
上的bind_ip
为nosql02
。
6.3 启动 mongos
在 nosql01
和 nosql02
上启动 mongos:
$ ./mongos -f /opt/servers/mongodb_demo/shardcluster/mongos/configFile/mongodb_mongos.conf
7. 启动分片功能
7.1 登录 mongos
在 nosql01
上登录 mongos:
$ ./mongo --host nosql01 --port 27021
7.2 添加 Shard
向分片集群中添加 Shard:
mongos> use gateway
mongos> sh.addShard("shard1/nosql01:27018,nosql02:27019,nosql03:27020")
mongos> sh.addShard("shard2/nosql01:27020,nosql02:27018,nosql03:27019")
mongos> sh.addShard("shard3/nosql01:27019,nosql02:27020,nosql03:27018")
8. 分片基本操作
8.1 设置 chunk 大小
块大小的作用
数据分片:
MongoDB 将分片集合中的数据划分为多个块(chunk),每个块是一个连续的范围(range)。
默认情况下,每个块的大小为 64MB。
数据均衡:
当某个分片上的块数量过多或数据分布不均匀时,MongoDB 会自动触发数据迁移(chunk migration),将块从一个分片迁移到另一个分片,以实现数据均衡。
性能影响:
块大小会影响数据迁移的频率和性能。较小的块可以更精细地分布数据,但会增加迁移的频率;较大的块会减少迁移频率,但可能导致数据分布不均匀。
默认块大小
MongoDB 的默认块大小是 64MB。这个值在大多数场景下是一个合理的折衷方案。
查看 chunk 大小:
mongos> use config
mongos> db.settings.findOne({ _id: "chunksize" });
将 chunk 大小设置为 1MB:
mongos> use config
mongos> db.settings.save({"_id":"chunksize","value":1})
注意
在 MongoDB 5.0 及以上版本中,save() 方法已被弃用,不再支持。你需要使用 insertOne() 或 updateOne() 方法来插入或更新文档。
如果 config.settings 集合中还没有 chunksize 的记录,可以使用 insertOne() 插入新文档:
use config;
db.settings.insertOne({ _id: "chunksize", value: 1 });
如果 config.settings 集合中已经有 chunksize 的记录,可以使用 updateOne() 更新文档:
use config;
db.settings.updateOne(
{ _id: "chunksize" }, // 查询条件
{ $set: { value: 1 } }, // 更新操作
{ upsert: true } // 如果不存在则插入
);
8.2 模拟写入数据
创建数据库 school
并向集合 user
中插入 50000 条文档:
mongos> use school
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
8.3 启用数据库分片
启用数据库 school
的分片功能:
mongos> use gateway
mongos> sh.enableSharding("school")
8.4 对集合进行分片
为集合 user
创建索引并进行分片:
mongos> use school
mongos> db.user.createIndex({"id":1})
mongos> sh.shardCollection("school.user",{"id":1})
9. 验证分片集群
9.1 查看分片信息
查看数据库 school
中集合 user
的分片信息:
mongos> sh.status()
9.2 验证数据分布
通过查询不同分片上的数据,验证数据是否均匀分布:
mongos> db.user.getShardDistribution()
10. 安全认证(可选)
10.1 创建 KeyFile
- 生成 KeyFile:
$ openssl rand -base64 756 > /opt/servers/mongodb_demo/shardcluster/keyfile $ chmod 400 /opt/servers/mongodb_demo/shardcluster/keyfile
- 将 KeyFile 分发到所有服务器:
$ scp /opt/servers/mongodb_demo/shardcluster/keyfile user_mongo@nosql02:/opt/servers/mongodb_demo/shardcluster/ $ scp /opt/servers/mongodb_demo/shardcluster/keyfile user_mongo@nosql03:/opt/servers/mongodb_demo/shardcluster/
10.2 修改配置文件
在所有服务器的配置文件中添加以下内容:
# 启用安全认证
security:
keyFile: /opt/servers/mongodb_demo/shardcluster/keyfile
10.3 重启集群
重启所有 MongoDB 服务以应用安全认证配置。
10.4 创建管理员用户
在 mongos 上创建管理员用户:
mongos> use admin
mongos> db.createUser({user: "admin", pwd: "admin123", roles: ["root"]})
10.5 验证安全认证
以安全认证模式登录 mongos:
$ ./mongo --host nosql01 --port 27021 -u admin -p admin123 --authenticationDatabase admin
11. 集群关闭
11.1 Mongosr、Shard、Configserver依次关闭
在关闭集群之前先关闭平衡器
(Balancer)
$ ./mongo --host nosql01 --port 27021
mongos> use gateway
mongos> sh.stopBalancer()