mangodb—分片和副本集架构部署
Posted 修勾不修勾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mangodb—分片和副本集架构部署相关的知识,希望对你有一定的参考价值。
mangodb—分片和副本集架构部署
三台服务器20.0.0.18(19)(20)
**服务器18 | **服务器19 | **服务器20 |
---|---|---|
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 主节点 |
一.每台机器上先安装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—分片和副本集架构部署的主要内容,如果未能解决你的问题,请参考以下文章