0. 准备1. 集群规划1.1 节点配置1.2 端口号分配2. 创建相关目录3. 配置环境变量3.1 配置环境变量3.2 使配置生效4. 配置config server配置服务器4.1 配置4.2 启动三台服务器的config server4.3 初始化配置副本集4.3.1 连接4.3.2 添加如下信息4.3.3 初始化副本集4.3.4 查看状态5. 配置分片副本集5.1 设置第一个分片shard1副本集5.1.1 添加信息5.1.2 启动三台服务器的shard1 server5.1.3 初始化副本集5.2 设置第二个分片shard2副本集5.2.1 添加信息5.2.2 启动三台服务器的shard2 server5.2.3 初始化副本集5.3 设置第三个分片shard3副本集5.3.1 添加信息5.3.2 启动三台服务器的shard3 server5.3.3 初始化副本集6. 配置路由器mongos7. 启动分片7.1 登陆任意一台mongos7.2 使用admin数据库7.3 串联路由服务器与分配副本集7.4 查看集群状态8. 测试8.1 登录任意一台mongos8.2 使用管理数据库8.3 指定分片生效8.4 指定数据库里需要分片的集合和片键9. 测试分片配置结果10. 启动关闭11. Navicat连接12. 卸载集群
0. 准备
三台机器安装好mongodb
1. 集群规划
1.1 节点配置
redis01:192.168.92.145 | redis02:192.168.92.147 | redis03:192.168.92.147 |
mongos | mongos | mongos |
config server | config server | config server |
shard server1(主) | shard server1(从) | shard server1(仲裁) |
shard server2(仲裁) | shard server2(主) | shard server2(从) |
shard server3(从) | shard server3(仲裁) | shard server3(主) |
1.2 端口号分配
mongos | 20000 |
config | 21000 |
shard1 | 27001 |
shard2 | 27002 |
shard3 | 27003 |
2. 创建相关目录
- 每台机器建立conf、mongos、config、shard1、shard2、shard3目录,因为mongos不存储数据,只需要建立日志文件目录即可。
- 192.168.92.145(redis01)
- conf、mongos、config、shard1、shard2、shard3
mkdir -p /usr/local/mongodb/conf mkdir -p /usr/local/mongodb/mongos/log mkdir -p /usr/local/mongodb/config/{data,log} mkdir -p /usr/local/mongodb/shard1/{data,log} mkdir -p /usr/local/mongodb/shard2/{data,log} mkdir -p /usr/local/mongodb/shard3/{data,log}
- 192.168.92.146(redis02)
- conf、mongos、config、shard1、shard2、shard3
mkdir -p /usr/local/mongodb/conf mkdir -p /usr/local/mongodb/mongos/log mkdir -p /usr/local/mongodb/config/{data,log} mkdir -p /usr/local/mongodb/shard1/{data,log} mkdir -p /usr/local/mongodb/shard2/{data,log} mkdir -p /usr/local/mongodb/shard3/{data,log}
- 192.168.92.147(redis03)
- conf、mongos、config、shard1、shard2、shard3
mkdir -p /usr/local/mongodb/conf mkdir -p /usr/local/mongodb/mongos/log mkdir -p /usr/local/mongodb/config/{data,log} mkdir -p /usr/local/mongodb/shard1/{data,log} mkdir -p /usr/local/mongodb/shard2/{data,log} mkdir -p /usr/local/mongodb/shard3/{data,log}
3. 配置环境变量
📢📢📢所有节点
3.1 配置环境变量
# centos中我一般在这儿配vim /etc/profile vim /etc/profile.d/my_env.sh
添加如下信息
#MongoDB Shard export MONGODB_HOME=/usr/local/mongodb export PATH=$MONGODB_HOME/bin:$PATH
3.2 使配置生效
source /etc/profile
4. 配置config server配置服务器
在节点redis01、redis02、redis03配置
4.1 配置
vim /usr/local/mongodb/conf/config.conf
添加如下信息
## 配置文件内容 pidfilepath = /usr/local/mongodb/config/log/configsrv.pid dbpath = /usr/local/mongodb/config/data logpath = /usr/local/mongodb/config/log/congigsrv.log logappend = true bind_ip = 0.0.0.0 port = 21000 fork = true #declare this is a config db of a cluster; configsvr = true #副本集名称 replSet=configs #设置最大连接数 maxConns=20000
4.2 启动三台服务器的config server
在节点redis01、redis02、redis03启动
mongod -f /usr/local/mongodb/conf/config.conf
4.3 初始化配置副本集
在节点redis01、redis02、redis03,登录任意一台配置服务器
4.3.1 连接
mongosh --port 21000
4.3.2 添加如下信息
config = { _id : "configs", members : [ {_id : 0, host : "192.168.92.145:21000" }, {_id : 1, host : "192.168.92.146:21000" }, {_id : 2, host : "192.168.92.147:21000" }, ] }
4.3.3 初始化副本集
rs.initiate(config)
4.3.4 查看状态
rs.status()
5. 配置分片副本集
5.1 设置第一个分片shard1副本集
- 在节点redis01、redis02、redis03
vim /usr/local/mongodb/conf/shard1.conf
5.1.1 添加信息
#配置文件内容 #——————————————– pidfilepath = /usr/local/mongodb/shard1/log/shard1.pid dbpath = /usr/local/mongodb/shard1/data logpath = /usr/local/mongodb/shard1/log/shard1.log logappend = true bind_ip = 0.0.0.0 port = 27001 fork = true #副本集名称 replSet=shard1 #declare this is a shard db of a cluster; shardsvr = true #设置最大连接数 maxConns=20000
5.1.2 启动三台服务器的shard1 server
- 三个节点redis01、redis02、redis03
mongod -f /usr/local/mongodb/conf/shard1.conf
5.1.3 初始化副本集
- 登陆任意一台服务器(节点redis01、redis02),初始化副本集 (除了redis03:192.168.92.147,因为这是仲裁节点)
- 连接shard1:27001
mongosh --port 27001
- 使用admin数据库
use admin
- 定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。输入如下信息,回车。
config = { _id : "shard1", members : [ {_id : 0, host : "192.168.92.145:27001" }, {_id : 1, host : "192.168.92.146:27001" }, {_id : 2, host : "192.168.92.147:27001" , arbiterOnly: true }, ] }
- 初始化副本集
rs.initiate(config)
5.2 设置第二个分片shard2副本集
- 在节点redis01、redis02、redis03
vim /usr/local/mongodb/conf/shard2.conf
5.2.1 添加信息
#配置文件内容 #——————————————– pidfilepath = /usr/local/mongodb/shard2/log/shard2.pid dbpath = /usr/local/mongodb/shard2/data logpath = /usr/local/mongodb/shard2/log/shard2.log logappend = true bind_ip = 0.0.0.0 port = 27002 fork = true #副本集名称 replSet=shard2 #declare this is a shard db of a cluster; shardsvr = true #设置最大连接数 maxConns=20000
5.2.2 启动三台服务器的shard2 server
- 三个节点redis01、redis02、redis03
mongod -f /usr/local/mongodb/conf/shard2.conf
5.2.3 初始化副本集
- 登陆任意一台服务器(节点redis02、redis03),初始化副本集 (除了redis01:192.168.92.145,因为这是仲裁节点)
- 连接shard2:27002
mongosh --port 27002
- 使用admin数据库
use admin
- 定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。输入如下信息,回车。
config = { _id : "shard2", members : [ {_id : 1, host : "192.168.92.146:27002" }, {_id : 2, host : "192.168.92.147:27002" }, {_id : 0, host : "192.168.92.145:27002" , arbiterOnly: true }, ] }
- 初始化副本集
rs.initiate(config)
5.3 设置第三个分片shard3副本集
- 在节点redis01、redis02、redis03
vim /usr/local/mongodb/conf/shard3.conf
5.3.1 添加信息
#配置文件内容 #——————————————– pidfilepath = /usr/local/mongodb/shard3/log/shard3.pid dbpath = /usr/local/mongodb/shard3/data logpath = /usr/local/mongodb/shard3/log/shard3.log logappend = true bind_ip = 0.0.0.0 port = 27003 fork = true #副本集名称 replSet=shard3 #declare this is a shard db of a cluster; shardsvr = true #设置最大连接数 maxConns=20000
5.3.2 启动三台服务器的shard3 server
- 三个节点redis01、redis02、redis03
mongod -f /usr/local/mongodb/conf/shard3.conf
5.3.3 初始化副本集
- 登陆任意一台服务器(节点redis03、redis01),初始化副本集 (除了redis02:192.168.92.146,因为这是仲裁节点)
- 连接shard3:27003
mongosh --port 27003
- 使用admin数据库
use admin
- 定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。输入如下信息,回车。
config = { _id : "shard3", members : [ {_id : 0, host : "192.168.92.145:27003" }, {_id : 2, host : "192.168.92.147:27003" }, {_id : 1, host : "192.168.92.146:27003" , arbiterOnly: true }, ] }
- 初始化副本集
rs.initiate(config)
6. 配置路由器mongos
先启动配置服务器和分片服务器,后启动路由实例启动路由实例:(三台机器redis01、redis02、redis03)
vim /usr/local/mongodb/conf/mongos.conf
添加如下信息
#内容 pidfilepath = /usr/local/mongodb/mongos/log/mongos.pid logpath = /usr/local/mongodb/mongos/log/mongos.log logappend = true bind_ip = 0.0.0.0 port = 20000 fork = true #监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字 configdb = configs/192.168.92.145:21000,192.168.92.146:21000,192.168.92.147:21000 #设置最大连接数 maxConns=20000
启动三台服务器的mongos server
mongos -f /usr/local/mongodb/conf/mongos.conf
7. 启动分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
7.1 登陆任意一台mongos
mongosh --port 20000
7.2 使用admin数据库
use admin
7.3 串联路由服务器与分配副本集
- 我这里
sh.addShard("shard1/192.168.92.145:27001,192.168.92.146:27001,192.168.92.147:27001") sh.addShard("shard2/192.168.92.146:27002,192.168.92.147:27002,192.168.92.145:27002") sh.addShard("shard3/192.168.92.147:27003,192.168.92.145:27003,192.168.92.146:27003")
7.4 查看集群状态
sh.status()
8. 测试
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
8.1 登录任意一台mongos
mongosh --port 20000
8.2 使用管理数据库
use admin
8.3 指定分片生效
- 指定testdb分片生效
db.runCommand({ enablesharding :"testdb"});
8.4 指定数据库里需要分片的集合和片键
- 指定数据库里需要分片的集合和片键,哈希id分片
#指定数据库里需要分片的集合和片键 db.runCommand( { shardcollection : "testdb.table",key : {id: 1} } ) #或者 db.runCommand( { shardcollection : "testdb.table",key : {"id": "hashed"} } );
9. 测试分片配置结果
- 连接mongos路由服务
mongosh 127.0.0.1:20000 mongosh --port 20000
- 切换到testdb数据库
use testdb
- 插入测试数据
- 插入100000条测试数据,插入的速度属实慢,我这里150条/秒😥😥😥(我在centos搭建MongoDB4.2分片副本集群时速度快一些)
for(i=1;i<=100000;i++){db.table.insertOne({"id":i,"name":"henggao"})};
- 查看分片情况如下
#查看分片情况,可以看到1000条数据分布于三个片上 db.table.stats(); #或者 sh.status()
db.table.stats()
;有1000多行信息,,这里截取部分信息- 查看分片情况如下
- shard1: “count”:33755
- shard2: “count”:33143
- shard3: “count”:33102
- 结论数据基本均匀
- 总条数
db.table.aggregate([{$group : {_id : "$name", totle : {$sum : 1}}}])
- 创建索引
db.table.createIndex({"name":1})
- 索引
db.table.getIndexes()
10. 启动关闭
📢📢📢在root权限下
- mongodb的启动顺序是,先启动所有节点配置服务器(在节点redis01、redis02、redis03配置)
mongod -f /usr/local/mongodb/conf/config.conf
- 再启动所有节点的分片
- shard1 server(在节点redis01、redis02、redis03)
mongod -f /usr/local/mongodb/conf/shard1.conf
- shard2 server(在节点redis01、redis02、redis03)
mongod -f /usr/local/mongodb/conf/shard2.conf
- shard3 server(在节点redis01、redis02、redis03)
mongod -f /usr/local/mongodb/conf/shard3.conf
- 最后启动所有节点的mongos (在节点redis01、redis02、redis03)
mongos -f /usr/local/mongodb/conf/mongos.conf
- 连接mongos
mongosh 127.0.0.1:20000
- 关闭时,直接killall杀掉所有进程
killall mongod killall mongos
11. Navicat连接
12. 卸载集群
rm -rf /usr/local/mongodb/