Mongo服务器集群配置学习三——分片

本文介绍MongoDB分片部署的全过程,包括配置服务器、路由服务器、分片服务器的搭建及集群连接配置,还介绍了如何通过分片提升性能,并展示了如何在实际环境中配置分片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB的分片主要是指将集合拆分成小块并分别存在不同服务器上的过程。MongoDB支持自动分片,可摆脱手动分片管理上的困难。

在以下情况下需要运用分片:

1.服务器的磁盘不够用。

2.单个Mongod不能满足写数据的性能需求。

3.需要将大数据放入内存中提高性能。

下图为我们要实现的分片结构:

从图中我们看到原本一台Mongod节点被分成了A和B两个分片,由路由D读取配置服务器C的分片策略,然后决定数据存储在哪个分片上,而路由隐藏了决策的细节,用户直接访问路由就可以享受分片带来的优点,而不必关心路由读取分片的细节。

配置步骤:

1.创建配置服务器C

创建配置文件如下,端口为10000,并启动mongod -f config.cnf

dbpath=D:\mongodb\test\sharded\C\Data
bind_ip=127.0.0.1
port=10000

2.创建路由服务器D

路由器的配置文件如下:

bind_ip=127.0.0.1
port=20000
configdb=127.0.0.1:10000

其中configdb=127.0.0.1:10000配置的是路由监听的配置服务器的地址

路由器用mongos启动

mongos -f config.cnf

  注意:配置服务器要先启动,因为路由服务器需要监听配置服务器。

3.新建分片服务器A和B

A的配置,然后启动A

dbpath=D:\mongodb\test\sharded\A\Data
bind_ip=127.0.0.1
port=8001  

B的配置,然后启动B

dbpath=D:\mongodb\test\sharded\B\Data
bind_ip=127.0.0.1
port=8002

4.建立集群中分片服务器与路由器的连接

这个操作需要在路由器中配置,打开路由器的shell,执行数据库命令

db.runCommand({addshard:"127.0.0.1:8001",allowLocal:true})
db.runCommand({addshard:"127.0.0.1:8002",allowLocal:true})

 

 可以看到执行添加分片的操作要在admin库中进行

5.为业务数据库添加分片功能

为person添加分片功能,在路由中执行db.runCommand({"enablesharding":"person"})

6.为集合进行分片

  片键:集合中的一个键作为分拆的依据。

      为person库的集合info进行分片,key字段设置了片键

  执行下列命令db.runCommand({"shardcollection":"person.info","key":{"_id":1}})

7.添加一定的大数据量,测试分片的功能

用脚本插入80万条数据

for(i=1;i<=800001;i++){

  db.info.insert({name:i})

}

在分别在分片服务器A和B上查询数据量,如图:看到这800001条数据已经分别存放在2个分片中了

 

正式环境配置

成功地构建分片需要如下条件:

1.多个配置服务器

2.多个mongos服务器

3.每个片都是副本集

1.多个配置服务器

创建配置服务器如上,现在启动mongos的时候应将其连接到这3个配置服务器。假如3个配置文件的端口号是20001~20003

mongos --configdb localhost:20001,localhost:20002,localhost:20003

配置服务器使用的是两步提交机制,不是普通的MongoDB的异步复制,来维护集群配置的不同副本。这样能保证集群状态的一致性。这意味着某台配置服务器down了后,集群配置信息将是只读的。但是客户端还是能够读写的,只有所有配置服务器备份了以后才能重新均衡数据。

2.多个mongos

Mongos的数量不受限制,建议针对一个应用服务器只运行一个mongos进程。这样每个应用服务器就可以与mongos进行本地会话。

3.每个片都是副本集

生产环境中,每个片都应是副本集。这样单个服务器坏了,就不会导致整个片失效。用addshard命令就可以讲副本集作为片添加,添加时只要指定副本集的名字和种子就好了。

实现即达到数据的分片存储也实现备份和故障自动修复功能,可以副本集和分片混合使用,构建如下图的架构,(为了举例简单仅给shardA做了副本集配置)

1.修改A的配置如下:

dbpath=D:\mongodb\test\sharded\A\Data
bind_ip=127.0.0.1
port=8001
replSet=replicademo/127.0.0.1:8003

 新添加A1和A2两台节点与A组成副本集

A1的配置:

dbpath=D:\mongodb\test\sharded\A1\Data
bind_ip=127.0.0.1
port=8004
replSet=replicademo/127.0.0.1:8003

A2的配置:

dbpath=D:\mongodb\test\sharded\A2\Data
bind_ip=127.0.0.1
port=8003
replSet=replicademo/127.0.0.1:8001

在A的shell中执行副本集的舒适化

复制代码
db.runCommand({"replSetInitiate":
    {
        "_id":'replicademo',
        "members":[
               {
                "_id":1,
                "host":"127.0.0.1:8001"
               },
               {
                "_id":2,
                "host":"127.0.0.1:8003"
               },
        {
                "_id":3,
                "host":"127.0.0.1:8004"
               }
        ]
    }
})
复制代码

这样A,A1,A2的副本集就建立完成,查询配置看到A为活跃节点,如下图:

回到路由器上设置分片配置

mongos> db.runCommand({addshard:"replicademo/127.0.0.1:8001"})

这样mongos会知道它所连接的是replicademo副本集,在活跃节点down掉之后就会去寻找新的活跃结点。

执行db.printShardingStatus(),会看到副本集的节点都已经自动的配置进来了,如下图:

 

 

管理分片

分片的信息主要存放在config数据库上,这样就能被任何连接到mongos的进程访问到了。

配置集合

下面的代码都假设已经在shell中连接了mongos,并且已经运行了use config。

 1.片

可以在shards集合中查到所有的片    >db.shards.find();

2.数据库

databases集合含有已经在片上的数据库列表和一些相关信息。

>db.databases.find()   键的解释如下

"_id" : 表示数据名

"partitioned" : 是否启用分片功能

"primary" :这个值与"_id"对应,表示这个数据的大本营在哪里。也就是开始创建数据库文件的位置

 3.块

块信息保存在chunks集合中,你可以看到数据到底是怎么切分到集群的。

>db.chunks.find()

 分片命令

1.获得概要

>db.printShardingStatus() 给出前面说的那些集合的概要

2.删除片

用removeshard就能从集群中删除片,removeshard会把给定片上的所有块都挪到其他片上。

>db.runCommand({"removeshard":"localhost:10000"})

### MongoDB分片集群部署最佳实践 #### 服务器角色分配 为了构建高效稳定的MongoDB分片集群,在六台服务器上的角色应合理分布。通常情况下,这六个节点可以被划分为配置服务器(config servers)、两个或更多mongos实例以及至少两个用于实际存储数据的shard节点。 - **Config Servers (CSRS)**: 负责保存关于整个集群状态的信息,包括哪些chunks位于哪个shards上等元数据。建议使用副本集形式提高可靠性。 - **Mongos Instances**: 查询路由器,作为应用程序与后端shards之间的中介层。可依据负载情况适当增加数量以平衡流量压力。 - **Shard Nodes**: 数据承载单元,每组shard最好也设置成副本集模式保障高可用性和容错能力[^1]。 #### 环境准备 确保所有参与机器已安装相同版本的MongoDB软件包——这里指定了`6.0.16`版,并完成基本网络互通测试;另外还需注意防火墙规则开放必要端口如默认的27017/tcp给外部连接请求[^2]。 #### 配置文件调整 针对不同类型的服务组件创建相应的配置文件: 对于**Config Server Replica Set**, 修改/etc/mongod.conf: ```yaml replication: replSetName: "cfgReplSet" sharding: clusterRole: "configsvr" net: bindIp: 0.0.0.0 storage: dbPath: "/data/config/" processManagement: fork: true #后台运行 systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log ``` 而对于每一个**Shard Node Replica Set**, 则需编辑对应路径下的conf.d/mongod.conf : ```yaml replication: replSetName: "rs-shardX" # X代表不同的编号区分各组 sharding: clusterRole: "shardsvr" net: port: 27018 #可根据实际情况更改监听端口号 security: keyFile: /etc/mongo-keyfile #启用内部认证机制所需密钥文件 ... ``` 最后是**Mongos Router Service** 的设定, 可放置于任意一台主机内 `/etc/mongos.conf` 中: ```yaml sharding: configDB: cfgReplSet/<cs_host_1>:27019,<cs_host_2>:27019,<cs_host_3>:27019 net: port: 27022 processManagement: fork: true systemLog: destination: file logAppend: true path: /var/log/mongodb/mongos.log ``` 以上配置均假设采用独立磁盘分区存放数据库文件(/data/)及其日志记录位置(/var/log/), 同时启用了进程守护(fork=true) 和追加方式的日志输出(logAppend=true)[^3]. #### 初始化复制集并加入集群 启动各个成员之前先初始化Replica Sets , 对于Config RS来说命令如下: ```bash mongo --host <one_of_the_config_server> <<EOF rs.initiate({ _id : "cfgReplSet", members:[{"_id":0,"host":"<cs_host_1>"},{"_id":1,"host":"<cs_host_2>"},{"_id":2,"host":"<cs_host_3>"}] }) EOF ``` 接着分别对每个Shard执行相似的操作建立各自的RS结构. 当所有的服务都已经正常上线之后就可以通过任一mongos实例来进行最终的Cluster Setup动作了: ```javascript use admin; db.runCommand({addShard:"rs-shard0/nodeA:27018,nodeB:27018"}); //重复上述指令直至所有预定好的shards都被成功添加进来. ``` 此时已经完成了基础架构层面的工作,接下来就是按照业务逻辑设计合适的sharded collection(s),选择恰当的shard key来指导后续的数据分布策略[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值