MongoDB分布式分片集群部署与架构设计(运维必会知识)

MongoDB分片集群(架构简介):

分片官方文档

  • config server必须为复制集,但是不支持Arbiter仲裁者。

Config server:

  • 存储集群所有节点、分片数据路由信息。默认需要配置3个 Config Server节点。

Mongos:

  • 提供对外应用访问,所有操作均通过 mongos执行。一般有多个 mongos节点。数据迁移和数据自动平衡。

Mongod:

  • 存储应用数据记录。一般有多个Mongod节点,达到数据分片目的。

默认分片规则:

初始1个chunk
缺省chunk大小:64MB
MongoDB:自动拆分并迁移chunk

默认是在存储数据时先在第一个节点开辟一个chunk开始存数据,当存满了以后会分裂出一个新的chunk继续存储。

在MongoDB空闲时,均衡器(balancer)会自动把第一个节点的数据进行对所有节点平均分配,也就是迁移chunk。

MongoDB自动迁移chunk块图:

范围分片:

1)必须为分片 collection定义分片键。
2)基于一个或多个列(类似一个索引)。
3)分片键定义数据空间。
4)想象 key space类似一条线上一个点数据。
5)一个 key range是一条线上一段数据。
6)我们可以按照分片键进行Range和Hash分片。

本次部署分片集群环境:

MongoDB分片集群(部署):

环境:

hostnamectl set-hostname mongodb-01       #data01数据集
hostnamectl set-hostname mongodb-02       #data02数据集
hostnamectl set-hostname mongodb-03       #configserver信息数据集
hostnamectl set-hostname mongos           #用于连接使用配置数据集

地址:(所有节点)

cat >>/etc/hosts<<EOF
10.0.0.10 mongodb-01
10.0.0.20 mongodb-02
10.0.0.30 mongodb-03
10.0.0.40 mongos
EOF
  • 每个节点安装三个实例,3个节点9个实例做成3个集群。
  • 每个节点拿出两个实例做两个一主一从一仲裁的集群环境
  • 另外一个实例做为config server,做一主两从集群环境

data01分片集群配置:(其他实例根据实例端口修改监听端口)(mongodb-01节点)

systemLog:
   destination: file
   path: "/mongodb/28017/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/28017/data"
   directoryPerDB: true
   #engine: wiredTiger
   wiredTiger:
     engineConfig:
       cacheSizeGB: 1
       directoryForIndexes: true
     collectionConfig:
       blockCompressor: zlib
     indexConfig:
       prefixCompression: true
processManagement:
  fork: true
net:
  bindIp: 10.0.0.10
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: data01
sharding:
  clusterRole: shardsvr

data02分片集群配置:(其他实例根据实例端口修改监听端口)(mongodb-02节点)

systemLog:
   destination: file
   path: "/mongodb/28017/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/28017/data"
   directoryPerDB: true
   #engine: wiredTiger
   wiredTiger:
     engineConfig:
       cacheSizeGB: 1
       directoryForIndexes: true
     collectionConfig:
       blockCompressor: zlib
     indexConfig:
       prefixCompression: true
processManagement:
  fork: true
net:
  bindIp: 10.0.0.20
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: data02
sharding:
  clusterRole: shardsvr

configserver集群配置:(其他实例根据实例端口修改监听端口)(mongodb-03节点)

systemLog:
   destination: file
   path: "/mongodb/28017/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/28017/data"
   directoryPerDB: true
   #engine: wiredTiger
   wiredTiger:
     engineConfig:
       cacheSizeGB: 1
       directoryForIndexes: true
     collectionConfig:
       blockCompressor: zlib
     indexConfig:
       prefixCompression: true
processManagement:
  fork: true
net:
  bindIp: 10.0.0.30
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: configserver
sharding:
  clusterRole: configsvr

重启多实例:(所有节点)

systemctl restart mongodb-28017
systemctl restart mongodb-28018
systemctl restart mongodb-28019

最终多实例环境为:

data01构建复制集群:(mongodb-01节点)
mongo --port 28017 10.0.0.10

config = {_id: 'data01', members: [
     {_id: 0,host: '10.0.0.10:28017'},
     {_id: 1,host: '10.0.0.10:28018'},
     {_id: 2,host: '10.0.0.10:28019'}, "arbiterOnly": true]
}

rs.initiate(config)

data02构建复制集群:(mongodb-02节点)
mongo --port 28017 10.0.0.20

config = {_id: 'data02', members: [
     {_id: 0,host: '10.0.0.20:28017'},
     {_id: 1,host: '10.0.0.20:28018'},
     {_id: 2,host: '10.0.0.20:28019'}, "arbiterOnly": true]
}

rs.initiate(config)

configserver构建复制集群:(mongodb-03节点)
mongo --port 28017 10.0.0.30

config = {_id: 'configserver', members: [
     {_id: 0,host: '10.0.0.30:28017'},
     {_id: 1,host: '10.0.0.30:28018'},
     {_id: 2,host: '10.0.0.30:28019'}]
}

rs.initiate(config)

此时,每个节点都是一个复制集群:--------------------------------------------------------------------

配置mongs:(mongos节点)
vim /mongodb/conf/mongos.conf

就是默认安装MongoDB后配置文件写成mongos需要的文件

#configDB的复制集名称要和配置的复制集名称一致,IP地址逗号也不能有空格。否者报错(注意!!!)

systemLog:
  destination: file
  path: "/mongodb/log/mongodb.log"
  logAppend: true
net:
  bindIp: 10.0.0.40
  port: 28017
sharding:
 configDB: configserver/10.0.0.30:28017,10.0.0.30:28018,10.0.0.30:28019
processManagement:
  fork: true

启动mongos并连接configsvr:
/mongodb/bin/mongos -f /mongodb/conf/mongos.conf
echo '/mongodb/bin/mongos -f /mongodb/conf/mongos.conf' >>/etc/rc.local

连接到mongs的admin数据库:

#管理mongodb需要进入admin验证库
su - mongod
mongo  10.0.0.40:28017/admin

添加数据节点到分片集群中:

#data01是复制集名称
sh.addShard("data01/10.0.0.10:28017,10.0.0.10:28018,10.0.0.10:28019")
sh.addShard("data02/10.0.0.20:28017,10.0.0.20:28018,10.0.0.20:28019")

检查复制集添加状态:

#不显示数据节点的仲裁者节点
db.runCommand( { listshards : 1 } )
---------------------------------------------------------
{
    "shards" : [
        {
            "_id" : "data01",
            "host" : "data01/10.0.0.10:28017,10.0.0.10:28018",
            "state" : 1
        },
        {
            "_id" : "data02",
            "host" : "data02/10.0.0.20:28017,10.0.0.20:28018",
            "state" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1551278902, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1551278902, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }

显示详细集群状态信息:

sh.status()
---------------------------------------------------------
--- Sharding Status --- 
  sharding version: {
    "_id" : 1,
    "minCompatibleVersion" : 5,
    "currentVersion" : 6,
    "clusterId" : ObjectId("5c7650b39f3c1a902392b07d")
  }
  shards:
        {  "_id" : "data01",  "host" : "data01/10.0.0.10:28017,10.0.0.10:28018",  "state" : 1 }
        {  "_id" : "data02",  "host" : "data02/10.0.0.20:28017,10.0.0.20:28018",  "state" : 1 }
  active mongoses:
        "3.6.10" : 1
  autosplit:
        Currently enabled: yes
  balancer:
        Currently enabled:  yes
        Currently running:  no
        Failed balancer rounds in last 5 attempts:  0
        Migration Results for the last 24 hours: 
                No recent migrations
  databases:
        {  "_id" : "config",  "primary" : "config",  "partitioned" : true

MongoDB分片集群(管理分片):

配置分片键策略:--------------------------------------------------------------------------(范围分片)

对olda库下的student表进行范围分片

进入mongos连接:(mongos节点)

su - mongod
mongo  10.0.0.40:28017/admin

激活数据库分片功能:(mongos节点)

#'指定olda库开启分片功能
use admin
db.runCommand( { enablesharding : "olda" } )

指定表名创建索引:(mongos节点)

#'以id列为索引(范围索引)(例如1..100)
use olda
db.student.ensureIndex( { id: 1 } )

开启分片:(mongos节点)

#'对olda库下的student表开始分片
use admin
db.runCommand( { shardcollection : "olda.student",key : {id: 1} } )

集群分片测试:(mongos节点)

#插入10万条数据到student表
use olda
for(i=1;i<100000;i++){ db.student.insert({"id":i,"name":"olda","age":20,"date":new Date()}); }

在data的某一个复制集中:(data节点,具体哪个不一定)

#mongo --port 28018 10.0.0.10 或 mongo --port 28018 10.0.0.20
#当前才插入了19万行数据

use olda
db.student.count()
#'191553

配置分片键策略:--------------------------------------------------------------------------(哈希分片)

对oldb库下的student表进行哈希分片

进入mongos连接:(mongos节点)

su - mongod
mongo  10.0.0.40:28017/admin

激活数据库分片功能:(mongos节点)

#'指定oldb库开启分片功能
use admin
db.runCommand( { enablesharding : "oldb" } )

开启分片功能:(mongos节点)

#'对oldb库下的student表开始分片
use oldb
sh.shardCollection( "oldb.student", { id: "hashed" } )

集群分片测试:(mongos节点)

#插入10万条数据到student表
use oldb
for(i=1;i<100000;i++){ db.student.insert({"id":i,"name":"oldb","age":21,"date":new Date()}); }

在data的某一个复制集中:(data节点,具体哪个不一定)

#mongo --port 28018 10.0.0.10 或 mongo --port 28018 10.0.0.20
#当前才插入了19万行数据

use oldb
db.student.count()
#'191553

检查是否为shard集群:(mongos节点)
db.runCommand({ isdbgrid : 1})

列出开启分片的数据库:(mongos节点)

use config
db.databases.find( { "partitioned": true } )  或者  db.databases.find()

查看分片的片键:(mongos节点)
db.collections.find().pretty()

查看分片的详细信息:(mongos节点)

use admin
db.printShardingStatus()  或者  sh.status()

查看blancer是否在工作:(mongos节点)
sh.getBalancerState()

添加数据节点到分片集群中:(mongos节点)
sh.addShard("data02/10.0.0.20:28017,10.0.0.20:28018,10.0.0.20:28019")

删数集群数据节点(谨慎):(mongos节点)
db.runCommand( { removeShard: "data02" } )

注意:删除操作一定会立即触发blancer。

「点点赞赏,手留余香」

1人已赞赏

  • rm -rf /*

    ¥5.00
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论