MongoDB Test2:实验集群6.0搭建(分片设置存在问题)

MongoDB Test2:实验集群6.0搭建(分片设置存在问题)

0. 准备

三台机器安装好mongodb
notion image

1. 集群规划

1.1 节点配置

master:192.168.92.159
worker1:192.168.92.160
worker2:192.168.92.161
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.159(master)
    • 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.160(worker1)
    • 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.161(worker2)
    • 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
notion image

3.2 使配置生效

source /etc/profile

4. 配置config server配置服务器

在节点master、worker1、worker2配置

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

在节点master、worker1、worker2启动
mongod -f /usr/local/mongodb/conf/config.conf
notion image

4.3 初始化配置副本集

在节点master、worker1、worker2,登录任意一台配置服务器

4.3.1 连接

mongosh --port 21000

4.3.2 添加如下信息

config = { _id : "configs", members : [ {_id : 0, host : "192.168.92.159:21000" }, {_id : 1, host : "192.168.92.160:21000" }, {_id : 2, host : "192.168.92.161:21000" }, ] }
notion image

4.3.3 初始化副本集

rs.initiate(config)
notion image

4.3.4 查看状态

rs.status()
notion image

5. 配置分片副本集

5.1 设置第一个分片shard1副本集

  • 在节点master、worker1、worker2
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

  • 三个节点master、worker1、worker2
mongod -f /usr/local/mongodb/conf/shard1.conf
notion image

5.1.3 初始化副本集

  • 登陆任意一台服务器(节点master、worker1),初始化副本集 (除了worker2:192.168.92.161,因为这是仲裁节点)
  1. 连接shard1:27001
mongosh --port 27001
  1. 使用admin数据库
use admin
  1. 定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。输入如下信息,回车。
config = { _id : "shard1", members : [ {_id : 0, host : "192.168.92.159:27001" }, {_id : 1, host : "192.168.92.160:27001" }, {_id : 2, host : "192.168.92.161:27001" , arbiterOnly: true }, ] }
notion image
  1. 初始化副本集
rs.initiate(config)
notion image

5.2 设置第二个分片shard2副本集

  • 在节点master、worker1、worker2
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

  • 三个节点master、worker1、worker2
mongod -f /usr/local/mongodb/conf/shard2.conf
notion image

5.2.3 初始化副本集

  • 登陆任意一台服务器(节点worker1、worker2),初始化副本集 (除了master:192.168.92.159,因为这是仲裁节点)
  1. 连接shard2:27002
mongosh --port 27002
  1. 使用admin数据库
use admin
  1. 定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。输入如下信息,回车。
config = { _id : "shard2", members : [ {_id : 1, host : "192.168.92.160:27002" }, {_id : 2, host : "192.168.92.161:27002" }, {_id : 0, host : "192.168.92.159:27002" , arbiterOnly: true }, ] }
notion image
  1. 初始化副本集
rs.initiate(config)
notion image

5.3 设置第三个分片shard3副本集

  • 在节点master、worker1、worker2
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

  • 三个节点master、worker1、worker2
mongod -f /usr/local/mongodb/conf/shard3.conf

5.3.3 初始化副本集

  • 登陆任意一台服务器(节点master、worker2),初始化副本集 (除了worker1:192.168.92.160,因为这是仲裁节点)
  1. 连接shard3:27003
mongosh --port 27003
  1. 使用admin数据库
use admin
  1. 定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。输入如下信息,回车。
config = { _id : "shard3", members : [ {_id : 0, host : "192.168.92.159:27003" }, {_id : 2, host : "192.168.92.161:27003" }, {_id : 1, host : "192.168.92.160:27003" , arbiterOnly: true }, ] }
notion image
  1. 初始化副本集
rs.initiate(config)
notion image

6. 配置路由器mongos

先启动配置服务器和分片服务器,后启动路由实例启动路由实例:(三台机器master、worker1、worker2
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.159:21000,192.168.92.160:21000,192.168.92.161:21000 #设置最大连接数 maxConns=20000
启动三台服务器的mongos server
mongos -f /usr/local/mongodb/conf/mongos.conf
notion image

7. 启动分片

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

7.1 登陆任意一台mongos

mongosh --port 20000

7.2 使用admin数据库

use admin

7.3 串联路由服务器与分配副本集(6.0.8报错,5.0.8正常)

  • 我这里6.0配置报错。我安装了MonmgoDB5.0.8一切正常!
sh.addShard("shard1/192.168.92.159:27001,192.168.92.160:27001,192.168.92.161:27001") sh.addShard("shard2/192.168.92.160:27002,192.168.92.161:27002,192.168.92.159:27002") sh.addShard("shard3/192.168.92.161:27003,192.168.92.159:27003,192.168.92.160:27003")
notion image

7.4 查看集群状态

sh.status()
notion image

8. 测试

目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。

8.1 登录任意一台mongos

mongosh --port 20000

8.2 使用管理数据库

use admin

8.3 指定分片生效

  • 指定testdb分片生效
db.runCommand({ enablesharding :"testdb"});
notion image

8.4 指定数据库里需要分片的集合和片键

  • 指定数据库里需要分片的集合和片键,哈希id分片
#指定数据库里需要分片的集合和片键 db.runCommand( { shardcollection : "testdb.table",key : {id: 1} } ) #或者 db.runCommand( { shardcollection : "testdb.table",key : {"id": "hashed"} } );
notion image

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多行信息,,这里截取部分信息
      notion image
      notion image
      notion image
  • 查看分片情况如下
    • shard1: “count”:33755
    • shard2: “count”:33143
    • shard3: “count”:33102
    • 结论数据基本均匀
  • 总条数
    • db.table.aggregate([{$group : {_id : "$name", totle : {$sum : 1}}}])
notion image
  • 创建索引
    • db.table.createIndex({"name":1})
notion image
  • 索引
    • db.table.getIndexes()
      notion image

10. 启动关闭

先启动mongodb,我这里没有设置mongodb开机自动启动
# 启动服务 sudo service mongod start # 再次查看 sudo service mongod status
📢📢📢在root权限下
  1. mongodb的启动顺序是,先启动所有节点配置服务器(在节点master、worker1、worker2配置
mongod -f /usr/local/mongodb/conf/config.conf
  1. 再启动所有节点的分片
  • shard1 server(在节点master、worker1、worker2
mongod -f /usr/local/mongodb/conf/shard1.conf
  • shard2 server(在节点master、worker1、worker2
mongod -f /usr/local/mongodb/conf/shard2.conf
  • shard3 server(在节点master、worker1、worker2
mongod -f /usr/local/mongodb/conf/shard3.conf
  1. 最后启动所有节点的mongos (在节点master、worker1、worker2
mongos -f /usr/local/mongodb/conf/mongos.conf
  1. 连接mongos
mongosh 127.0.0.1:20000
  1. 关闭时,直接killall杀掉所有进程
killall mongod killall mongos

11. Navicat连接

notion image

12. 卸载集群

rm -rf /usr/local/mongodb/