MongoDB分片详解
什么是MongoDB分片
MongoDB分片是指将数据水平分隔为多个部分,存储在不同的服务器上。这样做的目的是为了解决单一MongoDB实例容量有限的问题,以此来满足庞大数据量的存储需求。
分片设置
分片设置主要包括3个部分:配置服务器、mongod分组和路由器(mongos)。
配置服务器
配置服务器是MongoDB集群的核心部分,用于存储集群的元数据信息。配置服务器通常至少需要3 个。
以下是在Linux上安装配置服务器的步骤:
- 在MongoDB官网下载二进制文件
- 解压后放在/usr/local/mongodb-shard目录下
- 在/usr/local/mongodb-shard下创建mkdir db/cs1/db
- 创建配置文件touch cs1.cfg
- 编辑配置文件vim cs1.cfg
- 添加内容
```
systemLog:
destination: file
path: "/usr/local/mongodb-shard/logs/cs1.log"
logAppend: true
storage:
dbPath: "/usr/local/mongodb-shard/db/cs1/db"
journal:
enabled: true
端口号 27017 是一个不错的选择
net:
port: 27017
bindIp: 0.0.0.0
sharding:
clusterRole: configsvr
```
7. 启动MongoDB配置服务器/ usr / local / mongodb-shard / bin /mongod --config / usr / local / mongodb-shard/cs1.cfg
mongod分片组
mongod分片组是用于MongoDB分片的核心部分。主要作用是将数据分布在不同的服务器上。
以下是在Linux上安装mongod分片组的步骤:
- 在MongoDB官网下载二进制文件
- 解压后放置在/usr/local/mongodb-shard文件夹中
- 在/usr/local/mongodb-shard下创建mkdir db/shard1/db
- 创建配置文件touch shard1.cfg
- 编辑配置文件vim shard1.cfg
- 添加内容
```
systemLog:
destination: file
path: "/usr/local/mongodb-shard/logs/shard1.log"
logAppend: true
storage:
dbPath: "/usr/local/mongodb-shard/db/shard1/db"
journal:
enabled: true
注意,每个分片的端口应该一致
比如在服务1 和服务2上,都应该使用 27017
net:
port: 27017
bindIp: 0.0.0.0
sharding:
clusterRole: shardsvr
# 以上参数会经常变化,需要根据需要配置
# 下面这个参数是mongod运行后,能够被mongos所识别的名字
# 这个名字要含有这个分片的具体位置信息
# 比如,我选择用mongod1,mongod2来表示两台服务器的不同分片
# 意味着这些分片位于完全不同的物理位置,需要命名不同的名称
replication:
replSetName: shard1
```
7. 启动mongod分片组/ usr / local / mongodb-shard / bin /mongod --config / usr / local / mongodb-shard/shard1.cfg
路由器(mongos)
路由器(mongos)是MongoDB分片的入口,它将所有的读写请求路由到正确的mongod实例上。
以下是在Linux上安装路由器(mongos)的步骤:
- 在MongoDB官网下载二进制文件
- 解压后放置在/usr/local/mongodb-shard文件夹中
- 创建配置文件touch mongos1.cfg
- 编辑配置文件vim mongos1.cfg
- 添加内容
systemLog:
destination: file
path: "/usr/local/mongodb-shard/logs/mongos1.log"
logAppend: true
net:
port: 27017
bindIp: 0.0.0.0
sharding:
configDB: "config/localhost:27017"
- 启动mongos
/usr/local/mongodb-shard/bin/mongos --config /usr/local/mongodb-shard/mongos1.cfg
分片集合
场景:假设有一个名为customers的集合,他们的数据比较大,现希望将该集合进行分片。
创建索引
在mongos实例中运行以下命令创建索引:
use db
db.customers.createIndex({phone:1,email:1})
启用分片
在mongos实例中运行以下命令启用分片:
use admin
sh.enableSharding("db")
sh.shardCollection("db.customers",{phone:1,email:1})
这个命令的含义是:使用phone
和email
字段将集合db.customers
进行分片。这样做后,每条文档都会分配到不同的mongod实例中存储。
示例说明
以上内容可能不是太好理解,下面我将通过一个简单的例子说明怎样进行MongoDB分片。
假设我们的数据包含两个collection:名称为students和teachers,students至少拥有1000万条数据,teachers仅有几千条数据。在这种情况下,我们可以将students进行分片,而将teachers保留在单实例中。
具体步骤如下:
克隆现有实例,以3副本的方式在三个节点上运行
# clone mongoD2
mongod --port 20001 --dbpath /data/db2_1 --replSet myset --fork --logpath /data/db2_1/log
# create dir
mkdir /data/db2_2 /data/db2_3
# Start the second and third instances
mongod --port 20002 --dbpath /data/db2_2 --replSet myset --fork --logpath /data/db2_2/log
mongod --port 20003 --dbpath /data/db2_3 --replSet myset --fork --logpath /data/db2_3/log
启动MongoS路由器
mongos --configdb myset/localhost:20001,localhost:20002,localhost:20003 --port 20000 --fork --logpath /data/mongos.log
启用分片
此时,我们要将students集合进行分片,我们应该做的第一步是向MongoDB导入一些数据。然后我们在MongoS实例上运行以下命令:
# Insert data
for(i=1; i<2000000; i++) {
db.students.insert({sid:i,name:"test",score:i%100})
}
# Enable Sharding
sh.enableSharding("test")
sh.shardCollection("test.students",{sid: "hashed"})
现在,列表test.students
已经成功进行分片。
总结
通过以上步骤,MongoDB分片集群就可以顺利地建立了。我们可以向其中的任何一个mongos节点发出任何查询请求,mongos会将请求转发到正确的MongoDB分片集群服务器上。这样,我们就可以存储更多的数据来处理业务需求了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MongoDB分片详解 - Python技术站