mangodb—分片和副本集架构部署

Posted 修勾不修勾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mangodb—分片和副本集架构部署相关的知识,希望对你有一定的参考价值。

mangodb—分片和副本集架构部署

三台服务器20.0.0.18(19)(20)

**服务器18**服务器19**服务器20
mongosmongosmongos
config serverconfig serverconfig server
shard server1 主节点shard server1副节点shard server1 仲裁
shard server2 仲裁shard server2主节点shard server2 副节点
shard server3 副节点shard server3 仲裁shard server3 主节点

一.每台机器上先安装mongodb

1.关闭系统防火墙和安全机制

systemctl stop firewalld.service 
setenforce 0

2.先把安装包上传到/opt目录下解压

tar zxvf mongodb-linux-x86_64-3.6.3.tgz

3.在usr/local/文件夹下创建mongodb文件夹
mkdir mongodb

4.然后将mongodb-linux-x86_64-3.6.3下的文件移动到mongodb文件夹下
cd  /opt
mv mongodb-linux-x86_64-3.6.3/* /usr/local/mongodb/
cd /usr/local/mongodb/
mkdir data

5.在usr/local/mongodb文件夹下创建logs文件
touch /usr/local/mongodb/logs
6.进入/usr/local/mongodb/bin目录下,启动mongodb服务
cd /usr/local/mongodb/bin
./mongod --dbpath=/usr/local/mongodb/data --logpath=/usr/local/mongodb/logs --logappend  --port=27017 --fork

./mongo   ##启动客户端

7.分别在每台机器建立conf、mongos、config、shard1、shard2、shard3六个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
mkdir -p /usr/local/mongodb/conf
mkdir -p /usr/local/mongodb/mongos/log
mkdir -p /usr/local/mongodb/config/data
mkdir -p /config/log
mkdir -p /usr/local/mongodb/shard1/data
mkdir -p /usr/local/mongodb/shard1/log
mkdir -p /usr/local/mongodb/shard2/data
mkdir -p /usr/local/mongodb/shard2/log
mkdir -p /usr/local/mongodb/shard3/data
mkdir -p /usr/local/mongodb/shard3/log

二.配置服务器搭建副本集

Mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。添加配置文件。(每个都要配置)
vi /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 = 24000
fork = true
#declare this is a config db of a cluster;
configsvr = true
#副本集名称
replSet=configs
#设置最大连接数
maxConns=20000

分别启动三台服务器的config server,连接:进入/etc目录下
./mongod -f /usr/local/mongodb/conf/config.conf

登录任意一台配置服务器,初始化配置副本集,登录:进入/usr/local/mongodb/bin目录下
./mongo --port 24000

使用admin数据库

use admin

config变量:

config = 
...  members : [
... _id : 0, host : "20.0.0.18:24000" ,
...  _id : 1, host : "20.0.0.19:24000" ,
...   _id : 2, host : "20.0.0.20:24000" 
... ]
... 

初始化副本集:

rs.initiate(config)

这一步非常重要,必须初始化成功。不成功的话,路由服务器与配置服务器连接不上。
其中,”_id” : “configs”应与配置文件中配置的 replicaction.replSetName 一致,”members” 中的 “host” 为三个节点的 ip 和 port。

三台分片服务器搭建副本集

配置分片副本集(三台机器一起配置)。

1.设置第一个分片副本集
配置文件:

vi /usr/local/mongodb/conf/shard1.conf

#配置文件内容
#——————————————–
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 = 25001
fork = true
#副本集名称
replSet=shard1
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000

启动三台服务器的shard1 server,进入/usr/local/mongodb/bin目录下:

./mongod -f /usr/local/mongodb/conf/shard1.conf

登陆任意一台服务器,初始化副本集,进入/usr/local/mongodb/bin目录下:

./mongo --port 25001

使用admin数据库
use admin

定义副本集配置,第三个节点的 “arbiterOnly”:true 代表其为仲裁节点。

 config = 
...   _id : "shard1",
... members : [
...  _id : 0, host : "20.0.0.18:25001" ,
...  _id : 1, host : "20.0.0.19:25001" ,
...  _id : 2, host : "20.0.0.20:25001" , arbiterOnly: true 
...      ]
...  


初始化副本集配置

rs.initiate(config);

2.设置第二个分片
进入配置文件(三台机子一起配置)

vi /usr/local/mongodb/conf/shard2.conf

#配置文件内容
#——————————————–
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 = 25002
fork = true
#副本集名称
replSet=shard2
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000

启动三台服务器的shard2 server,进入/usr/local/mongodb/bin目录下:

./mongod -f /usr/local/mongodb/conf/shard2.conf

登陆任意一台服务器,进入/usr/local/mongodb/bin初始化副本集

./mongo --port 25002

use admin

定义副本集配置

config = 
...  _id : "shard2",
... members : [
...  _id : 0, host : "20.0.0.18:25002"  , arbiterOnly: true ,

...  _id : 1, host : "20.0.0.19:25002" ,
...  _id : 2, host : "20.0.0.20:25002" 
... ]
... 

初始化副本集配置
rs.initiate(config);

这里出现了错误 ,换另外一台机子做

设置第三个分片副本集
配置文件代码如下:

vi /usr/local/mongodb/conf/shard3.conf

#配置文件内容
#——————————————–
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 = 25003
fork = true
#副本集名称
replSet=shard3
#declare this is a shard db of a cluster;
shardsvr = true
#设置最大连接数
maxConns=20000

启动三台服务器的shard3 server,进入/usr/local/mongodb/bin目录下:

./mongod -f /usr/local/mongodb/conf/shard3.conf

登陆任意一台服务器,初始化副本集

./mongo --port 25003

use admin

定义副本集配置

config = 
...  _id : "shard3",
...   members : [
... _id : 0, host : "20.0.0.18:25003" ,
...  _id : 1, host : "20.0.0.19:25003" , arbiterOnly: true,
... _id : 2, host : "20.0.0.20:25003" 
... ]
... 


初始化副本集配置

rs.initiate(config);

4、 配置路由服务器

先启动配置服务器和分片服务器,后启动路由实例启动路由实例:(三台机器)

vi /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 = 23000
fork = true
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
configdb = configs/20.0.0.18:24000,20.0.0.19:24000,20.0.0.20:24000

#设置最大连接数
maxConns=20000

启动三台服务器的mongos server,进入/usr/local/mongodb/bin目录下:

./mongos -f /usr/local/mongodb/conf/mongos.conf

ps:中间出现服务一直等待连接中,也没有报错 就是连接不上,后来 排错是因为初始化config.server副本集出错了 忘记加 _id : “configs”,服务一直找不到它(遇到问题可以查看config.log的日志文件,看不懂直接有道翻译)

5、分片

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

登陆任意一台mongos,进入/usr/local/mongodb/bin目录下
./mongo --port 23000

使用admin数据库
use  admin


串联路由服务器与分配副本集
sh.addShard("shard1/20.0.0.18:25001,20.0.0.19:25001,20.0.0.20:25001")

sh.addShard("shard2/20.0.0.18:25002,20.0.0.19:25002,20.0.0.20:25002")

sh.addShard("shard3/20.0.0.18:25003,20.0.0.19:25003,20.0.0.20:25003")


查看集群状态
sh.status()

6、 测试

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

指定testdb分片生效
db.runCommand(  enablesharding :"testdb");

指定数据库里需要分片的集合和片键
db.runCommand(  shardcollection : "testdb.table1",key : id: "hashed"  )

我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!插入100000条数据测试:

 先进入testdb数据库
 use testdb  ##因为上面设置了 只有这个库才有数据分片的功能
 
 for(var i=1;i<=10000;i++)
... db.table1.insert(id:i,name:"sundenghui")
... 

查看分配状态
db.table1.stats();

的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!插入100000条数据测试:

 先进入testdb数据库
 use testdb  ##因为上面设置了 只有这个库才有数据分片的功能
 
 for(var i=1;i<=10000;i++)
... db.table1.insert(id:i,name:"sundenghui")
... 

[外链图片转存中…(img-DRxwTwFK-1662436163063)]

查看分配状态
db.table1.stats();

[外链图片转存中…(img-Xz7tW315-1662436163064)]

[外链图片转存中…(img-5OjsIV8l-1662436163064)]

[外链图片转存中…(img-P07DlRbm-1662436163064)]

每个节点上根据hash算法分配这10000条数据

MongoDB4.0 WINDOWS环境下 副本集分片部署

部署开始:

创建路径 D:Program FilesMongoDBMySet下

config Data log 文件夹

config文件夹下准备配置文件:

分片1的副本集1

storage:
  dbPath: D:/Program Files/MongoDB/MySet/Data/shard11
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: D:/Program Files/MongoDB/MySet/log/shard11.log
net:
  port: 13211
  bindIp: 192.168.33.52

replication:
  oplogSizeMB: 10240
  replSetName: shard1

sharding:
  clusterRole: shardsvr

分片1的副本集2

storage:
  dbPath: D:Program FilesMongoDBMySetDatashard12
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogshard12.log
net:
  port: 13212
  bindIp: 192.168.33.52

replication:
  oplogSizeMB: 10240
  replSetName: shard1

sharding:
  clusterRole: shardsvr

分片1的副本集3

storage:
  dbPath: D:Program FilesMongoDBMySetDatashard13
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogshard13.log
net:
  port: 13213
  bindIp: 192.168.33.52

replication:
  oplogSizeMB: 10240
  replSetName: shard1

sharding:
  clusterRole: shardsvr

分片2的副本集1

storage:
  dbPath: D:Program FilesMongoDBMySetDatashard21
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogshard21.log
net:
  port: 13221
  bindIp: 192.168.33.52

replication:
  oplogSizeMB: 10240
  replSetName: shard2

sharding:
  clusterRole: shardsvr

分片2的副本集2

storage:
  dbPath: D:Program FilesMongoDBMySetDatashard22
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogshard22.log
net:
  port: 13222
  bindIp: 192.168.33.52

replication:
  oplogSizeMB: 10240
  replSetName: shard2

sharding:
  clusterRole: shardsvr

分片2的副本集3

storage:
  dbPath: D:Program FilesMongoDBMySetDatashard23
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogshard23.log
net:
  port: 13223
  bindIp: 192.168.33.52

replication:
  oplogSizeMB: 10240
  replSetName: shard2

sharding:
  clusterRole: shardsvr

配置节点1

storage:
  dbPath: D:Program FilesMongoDBMySetDataconfig1
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogconfig1.log
net:
  port: 13201
  bindIp: 192.168.33.52
  
replication:
  oplogSizeMB: 10240
  replSetName: rscfg

sharding:
  clusterRole: configsvr

配置节点2

storage:
  dbPath: D:Program FilesMongoDBMySetDataconfig2
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogconfig2.log
net:
  port: 13202
  bindIp: 192.168.33.52
  
replication:
  oplogSizeMB: 10240
  replSetName: rscfg

sharding:
  clusterRole: configsvr

配置节点3

storage:
  dbPath: D:Program FilesMongoDBMySetDataconfig3
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlogconfig3.log
net:
  port: 13203
  bindIp: 192.168.33.52
  
replication:
  oplogSizeMB: 10240
  replSetName: rscfg

sharding:
  clusterRole: configsvr

路由节点

systemLog:
  destination: file
  logAppend: true
  path:  D:Program FilesMongoDBMySetlog
oute.log
net:
  port: 13200
  bindIp: 192.168.33.52

sharding:
  configDB: rscfg/192.168.33.52:13201,192.168.33.52:13202,192.168.33.52:13203

配置文件准备完成,打开一个cmd窗口

切换到mongo的bin路径

cd /d D://

cd D:Program FilesMongoDBServer4.0in

找到配置文件地址进行服务的安装,服务名和服务展示名都需要加上,不然会提示服务名已存在,分片11,12,13,21,22,23,配置1,2,3 这9个节点都是由mongod进程寄宿,路由节点由mongos进程寄宿

mongod -config "D:Program FilesMongoDBMySetconfigshard11.cfg" --serviceName "MongoDB_Shard11" --install --serviceDisplayName "MongoDB_Shard11"
mongod -config "D:Program FilesMongoDBMySetconfigshard12.cfg" --serviceName "MongoDB_Shard12" --install --serviceDisplayName "MongoDB_Shard12"
mongod -config "D:Program FilesMongoDBMySetconfigshard13.cfg" --serviceName "MongoDB_Shard13" --install --serviceDisplayName "MongoDB_Shard13"

mongod -config "D:Program FilesMongoDBMySetconfigshard21.cfg" --serviceName "MongoDB_Shard21" --install --serviceDisplayName "MongoDB_Shard21"
mongod -config "D:Program FilesMongoDBMySetconfigshard22.cfg" --serviceName "MongoDB_Shard22" --install --serviceDisplayName "MongoDB_Shard22"
mongod -config "D:Program FilesMongoDBMySetconfigshard23.cfg" --serviceName "MongoDB_Shard23" --install --serviceDisplayName "MongoDB_Shard23"

mongod -config "D:Program FilesMongoDBMySetconfigconfig1.cfg" --serviceName "MongoDB_Config1" --install --serviceDisplayName "MongoDB_Config1"
mongod -config "D:Program FilesMongoDBMySetconfigconfig2.cfg" --serviceName "MongoDB_Config2" --install --serviceDisplayName "MongoDB_Config2"
mongod -config "D:Program FilesMongoDBMySetconfigconfig3.cfg" --serviceName "MongoDB_Config3" --install --serviceDisplayName "MongoDB_Config3"

mongos -config "D:Program FilesMongoDBMySetconfig oute.cfg" --serviceName "MongoDB_Route" --install --serviceDisplayName "MongoDB_Route"

所有节点都安装完成后,找到log文件夹下的log文件,如果出现提示,当前可以使用命令行“XXXXX”启动服务,那就成功安装服务了

开启服务,shard1分片的副本集群

net start MongoDB_Shard11
net start MongoDB_Shard12
net start MongoDB_Shard13

开起之后需要进行初始化以及副本集设置

cd /d D://
cd D:Program FilesMongoDBServer4.0in

连接到副本集的任意一个节点
mongo 192.168.33.52:13211

初始化副本集
rs.initiate( {_id : "shard1",members: [{ _id: 0, host: "192.168.33.52:13211" },{ _id: 1, host: "192.168.33.52:13212" },{ _id: 2, host: "192.168.33.52:13213" }]})

查看副本集初始化状态

rs.conf()

查看副本集是否是主节点
db.isMaster()

退出当前查询窗口
exit

shard2副本集相关设置,同上

net start MongoDB_Shard21
net start MongoDB_Shard22
net start MongoDB_Shard23

cd /d D://
cd D:Program FilesMongoDBServer4.0in
mongo 192.168.33.52:13221
rs.initiate( {_id : "shard2",members: [{ _id: 0, host: "192.168.33.52:13221" },{ _id: 1, host: "192.168.33.52:13222" },{ _id: 2, host: "192.168.33.52:13223" }]})

rs.conf()
db.isMaster()
exit

配置节点副本集相关设置(新版本的配置节点不能使用mirro模式,需要也形成副本集才能由路由节点调用),同上

net start MongoDB_Config1
net start MongoDB_Config2
net start MongoDB_Config3

cd /d D://
cd D:Program FilesMongoDBServer4.0in
mongo 192.168.33.52:13201
rs.initiate( {_id : "rscfg",members: [{ _id: 0, host: "192.168.33.52:13201" },{ _id: 1, host: "192.168.33.52:13202" },{ _id: 2, host: "192.168.33.52:13203" }]})

rs.conf()
db.isMaster()
exit

开启路由节点的服务

net start MongoDB_Route

cd /d D://
cd D:Program FilesMongoDBServer4.0in

连接路由节点
mongo 192.168.33.52:13200

配置分片shard1,shard2

use admin
db.runCommand({addshard:"shard1/192.168.33.52:13211,192.168.33.52:13212,192.168.33.52:13213"})
db.runCommand({addshard:"shard2/192.168.33.52:13221,192.168.33.52:13222,192.168.33.52:13223"})

查看一下分片列表,确认分片是否配置成功

 

db.runCommand({ listshards:1 })

对Monitor库启用分片
db.runCommand({enablesharding:"Monitor"})

对多张表设置片键,片键设置模式为 第一个字段为大粒度的局部字段比如类型、月份,第二个字段为常查询字段,粒度细,能够增加随机度

这里设置的前提为未创建表,设置片键后会自动创建索引,已有表,字段又无索引的会提示错误

db.runCommand( { shardcollection : "Monitor.LoadTable",key : {server_type: 1,time:1}} )
db.runCommand( { shardcollection : "Monitor.LogInfo",key : {server_type: 1,time:1}} )
db.runCommand( { shardcollection : "Monitor.LogError",key : {server_type: 1,time:1}} )
db.runCommand( { shardcollection : "Monitor.RequestLog",key : {server_type: 1,time:1}} )

到此为止配置完成,可连接路由节点使用,未测试failover是否生效

删除服务的语句,预留以防需要重新部署

sc delete MongoDB_Shard11
sc delete MongoDB_Shard12
sc delete MongoDB_Shard13

sc delete MongoDB_Shard21
sc delete MongoDB_Shard22
sc delete MongoDB_Shard23

sc delete MongoDB_Config1
sc delete MongoDB_Config2
sc delete MongoDB_Config3

sc delete MongoDB_Route


停止服务的语句,预留以防需要重新部署

net stop MongoDB_Shard11
net stop MongoDB_Shard12
net stop MongoDB_Shard13

net stop MongoDB_Shard21
net stop MongoDB_Shard22
net stop MongoDB_Shard23

net stop MongoDB_Config1
net stop MongoDB_Config2
net stop MongoDB_Config3

net stop MongoDB_Route

以上是关于mangodb—分片和副本集架构部署的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 学习笔记之 分片和副本集混合运用

Web架构之路:MongoDB集群及高可用实践

MongoDB 高可用集群副本集+分片搭建

MongoDB之shard_副本集和分片部署

mongodb4.0分片集群安装

MongoDB——MongoDB分片集群(Sharded Cluster)