Mongodb分片集群部署
1. 容器版,helm一键部署
chart获取地址:github.com
# 建议资源配置比例:
mongos:
resources:
limits:
cpu: '1'
mem: 512Mi
requests:
cpu: 0.1
mem: 128Mi
configsvr:
resources:
limits:
cpu: '2'
mem: 1Gi
requests:
cpu: 1
mem: 512Mi
shard-data:
resources:
limits:
cpu: '1'
mem: 2Gi
requests:
cpu: 0.5
mem: 1Gi
# 安装
helm install -f mongodb-sharded/values.yaml mongo-cluster mongodb-sharded/
2. 虚拟机部署
- 节点分布:
| 节点IP | 所部署服务 |
|---|---|
| 192.168.1.142 | configserver0, shard01-0, shard02-0, mongos |
| 192.168.1.143 | configserver1, shard01-1, shard02-1 |
| 192.168.1.144 | configserver2, shard01-2, shard02-2 |
-
部署包准备:
mongo服务包获取地址:Try MongoDB Community Edition | MongoDB
mongosh:repo.mongodb.org/yum/redhat/…
-
部署步骤:
3.1 整理文件目录:
按实际节点数据目录创建如下目录(三台节点均创建):
config server存储目录:mkdir -p /data/mongodb/config
shard1 存储目录:mkdir -p /data/mongodb/shard01
shard2 存储目录:mkdir -p /data/mongodb/shard02
mongos 存储目录:mkdir -p /data/mongodb/mongos
3.2 部署config server
在三个节点分别执行(IP替换为实际节点IP):
mongod --configsvr --replSet config --dbpath /data/mongodb/config --bind_ip localhost,192.168.1.142 --logpath /data/mongodb/config/mongod.log --port 27020 --fork
3.3 连接一个config server服务并创建副本集
# 连接
mongosh --host 192.168.1.142 --port 27020
# 执行创建副本集
rs.initiate(
{
_id: "config",
configsvr: true,
members: [
{ _id : 0, host : "192.168.1.142:27020" },
{ _id : 1, host : "192.168.1.143:27020" },
{ _id : 2, host : "192.168.1.144:27020" }
]
}
)
# 查询
rs.status()
有 1 个 PRIMARY 和 2 个 SECONDARY,并且 health 的值都为 1,说明集群创建正常。
3.4 mongodb shard启动(IP替换为实际节点IP)
mongod --shardsvr --replSet shard01 --dbpath /data/mongodb/shard01 --bind_ip localhost,192.168.1.142 --logpath /data/mongodb/shard01/mongod.log --port 27001 --fork
mongod --shardsvr --replSet shard02 --dbpath /data/mongodb/shard02 --bind_ip localhost,192.168.1.142 --logpath /data/mongodb/shard02/mongod.log --port 27002 --fork
3.5 创建shard副本集
# 连接一个shard01
mongosh --host 192.168.1.142 --port 27001
# 组件副本集
rs.initiate(
{
_id: "shard01",
members: [
{ _id : 0, host : "192.168.1.142:27001" },
{ _id : 1, host : "192.168.1.143:27001" },
{ _id : 2, host : "192.168.1.144:27001" }
]
}
)
# 连接一个shard02
mongosh --host 192.168.1.142 --port 27002
# 组件副本集
rs.initiate(
{
_id: "shard02",
members: [
{ _id : 0, host : "192.168.1.142:27002" },
{ _id : 1, host : "192.168.1.143:27002" },
{ _id : 2, host : "192.168.1.144:27002" }
]
}
)
# 两个检查
rs.status()
3.6 启动mongos
mongos --configdb config/192.168.1.142:27020,192.168.1.143:27020,192.168.1.144:27020 --bind_ip localhost,192.168.1.142 --logpath /data/mongodb/mongos/mongos.log --fork
3.7 将分片副本集加入到集群中
sh.addShard( "shard01/192.168.1.142:27001,192.168.1.143:27001,192.168.1.144:27001")
sh.addShard( "shard02/192.168.1.142:27002,192.168.1.143:27002,192.168.1.144:27002")
3.8 为数据库启动分片
# 为数据库开启分片
sh.enableSharding("martin").
# 选择主键字段
sh.shardCollection("martin.userinfo", {_id: "hashed" } )
# 查看状态
sh.status()
Mongodb一主一从一仲裁集群部署
- 架构图如下:
- 节点分布:
| 节点IP | 所部署角色 | 节点名 |
|---|---|---|
| 192.168.1.142 | PRIMARY | master-0 |
| 192.168.1.143 | SECONDARY | slave-0 |
| 192.168.1.144 | ARBITER | slave-1 |
-
部署包准备:
mongo服务包获取地址:Try MongoDB Community Edition | MongoDB
-
部署步骤:
4.1 整理文件目录:
三台执行:mv 安装包名 /data/mongodb
第一、二台(主、从):cd /data/mongodb && mkdir -p data log && touch mongodb.conf
第三台(仲裁):cd /data/mongodb && mkdir -p log arbiter && touch mongodb.conf
用root用户安装需要单独赋权:chown -R mongodb.mongodb /data/mongodb/
如不存在,则创建:groupadd mongodb && useradd mongodb -g mongodb
4.2 三节点配置文件如下:
[root@master-0 mongodb]# cat mongodb.conf
pidfilepath=/data/mongodb/log/mongod.pid
logpath=/data/mongodb/log/mongod.log
dbpath=/data/mongodb/data
logappend=true
bind_ip=192.168.1.142
port=27017
fork=true
replSet=rs0
[root@slave-0 mongodb]# cat mongodb.conf
pidfilepath=/data/mongodb/log/mongod.pid
logpath=/data/mongodb/log/mongod.log
dbpath=/data/mongodb/data
logappend=true
bind_ip=192.168.1.143
port=27017
fork=true
replSet=rs0
[root@slave-1 mongodb]# cat mongodb.conf
pidfilepath=/data/mongodb/log/mongod.pid
logpath=/data/mongodb/log/mongod.log
dbpath=/data/mongodb/arbiter
logappend=false
bind_ip=192.168.1.144
port=27017
fork=true
replSet=rs0
4.3 启动三个节点:
nohup ./bin/mongod --config /data/mongodb/mongodb.conf &
4.4 初始化复制集:
rs.initiate(
{
_id: "rs0",
members: [
{ _id : 0, host : "192.168.1.142:27017, priority : 2" },
{ _id : 1, host : "192.168.1.143:27017, priority : 1" },
{ _id : 2, host : "192.168.1.144:27017, arbiterOnly : true" }
]
}
)
4.5 查询成员信息:
rs.status()
-
异常处理:
- 在从节点加入集群时状态为:STARTUP时,检查从节点时候能解析主节点hostname,及时添加解析。
- 仲裁节点长时间无法加入集群:可在主节点设置,后再次添加仲裁节点。
db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 } })
Mongo控制台操作合集
以下为使用mongos连接的分片集群
- 连接:
mongosh --host mongo-cluster-mongodb-sharded --port 27017 -u root -p 123456
- 数据库操作:
# 创建与切换:
use DATABASE_NAME # 如果数据库不存在,则创建数据库,否则切换到指定数据库。
# 查看所有数据库:
show dbs
# 查看当前数据库:
db
# 删除当前所在数据库:
db.dropDatabase()
- 集合操作:
# 创建集合:
db.createCollection("runoob")
# 自动创建集合:
db.mycoll.insert({"text" : "renytest"}) # 在库中插入数据,如集合不存在则自动创建
# 查询集合(类似RDBMS中的table):
show collections / show tables
# 删除集合:
db.{collection}.drop() # {collection} 是变量,用实际集合名替换
# 插入一行:
db.mycoll.insert({"text" : "renytest"})
db.mycoll.insertOne({"text" : "renytest"})
# 插入多行:
db.mycoll.insertMany([{"text" : "renytest"},{"text" : "renytest1111"}])
# 更新一行
db.mycoll.replaceOne({"text" : "renytest"}, {"text" : "renytest123"})
db.mycoll.updateOne({"text" : "renytest"}, {$set:{"text" : "renytest123"}})
# 更新多行
db.mycoll.updateMany({"text" : "renytest123"}, {$set:{"text" : "renytest-update"}})
# 删除多行
db.mycoll.deleteOne({"text" : "renytest"})
db.mycoll.deleteMany({"text" : "renytest"})
# 查询文档
db.mycoll.find().pretty()
db.mycoll.find({"text": "renytest1111"}).pretty()
- 数据库导入导出:
# 导出
mongodump --host mongo-cluster-mongodb-sharded --port 27017 -u root -p 123456 -o /tmp/
# 导入
mongorestore --host mongo-cluster-mongodb-sharded --port 27017 -u root -p 123456 /tmp/renytest/
- 用户系统:
# 连接root用户略
# 创建admin用户
db.createUser({user:"admin",customData:{description:"superuser"},pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
# 创建库级角色的用户:读写renytest库,其他数据库只读
db.createUser({
user:"test1",
pwd:"123456",
roles:[
{role:"readWrite",db:"renytest"},
'read'
]
})
# 查询用户
show users
# 修改密码
use admin
db.changeUserPassword("test1", "xxx")
# 删除用户
use admin
db.dropUser('test1')
# 角色详细说明
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户