Mongodb两种集群部署方案及命令合集

404 阅读5分钟

Mongodb分片集群部署

  1. 架构图,原地址为:MongoDB 分片集群部署 - 腾讯云开发者社区-腾讯云 (tencent.com) image.png

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/

image.png

2. 虚拟机部署

  1. 节点分布:
节点IP所部署服务
192.168.1.142configserver0, shard01-0, shard02-0, mongos
192.168.1.143configserver1, shard01-1, shard02-1
192.168.1.144configserver2, shard01-2, shard02-2
  1. 部署包准备:

    mongo服务包获取地址:Try MongoDB Community Edition | MongoDB

    mongosh:repo.mongodb.org/yum/redhat/…

  2. 部署步骤:

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一主一从一仲裁集群部署

  1. 架构图如下:

image.png

  1. 节点分布:
节点IP所部署角色节点名
192.168.1.142PRIMARYmaster-0
192.168.1.143SECONDARYslave-0
192.168.1.144ARBITERslave-1
  1. 部署包准备:

    mongo服务包获取地址:Try MongoDB Community Edition | MongoDB

  2. 部署步骤:

    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()
  1. 异常处理:

    1. 在从节点加入集群时状态为:STARTUP时,检查从节点时候能解析主节点hostname,及时添加解析。
    2. 仲裁节点长时间无法加入集群:可在主节点设置,后再次添加仲裁节点。
        db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 2 } })

Mongo控制台操作合集

以下为使用mongos连接的分片集群

  1. 连接:
    mongosh --host mongo-cluster-mongodb-sharded --port 27017 -u root -p 123456
  1. 数据库操作:
# 创建与切换:
use DATABASE_NAME # 如果数据库不存在,则创建数据库,否则切换到指定数据库。

# 查看所有数据库:
show dbs

# 查看当前数据库:
db

# 删除当前所在数据库:
db.dropDatabase()
  1. 集合操作:
# 创建集合:
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()
  1. 数据库导入导出:
# 导出
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/

  1. 用户系统:
# 连接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集合写入,可以在指定数据库里创建、删除和管理用户