【MongoDB】MSC集群部署(4)

TangLu MongoDB 2020-07-29 2208 0

一、什么是MSC

MongoDB Sharding Cluster简称MSC,是MongoDB的分片集群,相比MySQL的mycat和Redis的cluster更为完善,支持自分片能力,能将数据平均分配到数据节点的。很多产品的分布式设计理念也是参考的它。

MSC集群的组成

· 一个或多个mongos节点组成Router(至少1节点),Router负责对客户端请求进行调度与数据分片

· 一个高可用复制集(3节点)构成Config Servers,存储了后端数据节点的信息,类似注册中心

· 两个或多个复制集(至少6节点)构成后端数据节点(Shard)。

MSC集群工作流程

客户端请求先经过Router,然后Router从Config Servers中获取后端数据节点


二、MSC集群部署

1、部署Shard复制集

· 在6个节点上部署出2个Shard复制集,推荐一主一从一arbiter,配置文件参考:

cat >  /mongodb/conf/mongodb.conf  <<EOF
systemLog:
  destination: file
  path: /mongodb/log/mongodb.log   
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/data
  directoryPerDB: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
net:
  bindIp: 10.0.0.41,127.0.0.1  #修改每个节点的ip
  port: 38018
replication:
  oplogSizeMB: 2048
  replSetName: sh1  #定义复制集的名字
sharding:
  clusterRole: shardsvr  #定义复制集在集群中的角色,固定写法
processManagement: 
  fork: true
EOF



· 初始化集群

mongod -f  /mongodb/conf/mongodb.conf 
mongo --port 38018
use  admin
config = {_id: 'sh1', members: [
                          {_id: 0, host: '10.0.0.41:38018'},
                          {_id: 1, host: '10.0.0.42:38018'},
                          {_id: 2, host: '10.0.0.43:38018',"arbiterOnly":true}]
           }
rs.initiate(config)



2、部署Config Servers复制集,一主两从,不支持arbiter

· 在3个节点上部署复制集

cat > /mongodb/conf/mongodb.conf <<EOF
systemLog:
  destination: file
  path: /mongodb/log/mongodb.conf
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
net:
  bindIp: 10.0.0.51,127.0.0.1
  port: 38018
replication:
  oplogSizeMB: 2048
  replSetName: configReplSet
sharding:
  clusterRole: configsvr  #注意角色
processManagement: 
  fork: true
EOF



· 初始化集群

mongod -f /mongodb/conf/mongodb.conf 
mongo --port 38018
use  admin
 config = {_id: 'configReplSet', members: [
                          {_id: 0, host: '10.0.0.51:38018'},
                          {_id: 1, host: '10.0.0.52:38018'},
                          {_id: 2, host: '10.0.0.53:38018'}]
           }
rs.initiate(config)



3、mongos节点配置

cat > /mongodb/conf/mongos.conf <<EOF
systemLog:
  destination: file
  path: /mongodb/log/mongos.log
  logAppend: true
net:
  bindIp: 10.0.0.61,127.0.0.1
  port: 38018
sharding:
  configDB: configReplSet/10.0.0.51:38018,10.0.0.52:38018,10.0.0.53:38018  #这里写config servers的信息
processManagement: 
  fork: true
EOF



启动mongos

mongos -f /mongodb/conf/mongos.conf  #用mongos启动



将2个Shard加入到集群(后面要扩节点的话也是这样操作,先新建复制集,然后addshard)

mongo 10.0.0.51:38018/admin
db.runCommand( { addshard : "sh1/10.0.0.41:38018,10.0.0.42:38018,10.0.0.43:38018",name:"shard1"} )  #将之前定义的sh1复制集里的节点加入到cluster中并命名为shard1
db.runCommand( { listshards :1 } )  #查看shard 
admin > sh.status()  #查看分片详细信息



三、使用range和hash进行手动分片

1、MSC集群分为了RANGE分片和HASH分片,要手动设置分片方式的话需要先激活数据库分片功能

mongo 10.0.0.51:38018/dmin  
admin> db.runCommand( { enablesharding : "linuxe" } )  #激活linuxe这个库的分片


2、使用range方法分片,比如对linuxe库下的table1使用id列分片

use linuxe
> db.table1.ensureIndex( { id: 1 } )  #id:1是指按照id从小到大的顺序建立索引
use admin
> db.runCommand( { shardcollection : "linuxe.table1",key : {id: 1} }  )   #开启分片
# db.runCommand( { shardcollection : "linuxe.table1",key : {id: "hashed"} } )   #使用hash索引


3、在表中录入大量数据后进行查看

use linuxe
db.table1.count()  #在不同的节点执行命令查看


四、MSC的balancer

这是mongos的一个重要功能,它会自动巡查所有shard节点上的分片情况,自动对数据进行平衡迁移。balancer通常会在系统不繁忙的时候自动运行。但是当发生节点删除的时候,也会触发立即迁移。另外也可以让它只在预设定的时间窗口内运行。

1、关闭和开启blancer的方法(比如备份或者删除节点的时候)

mongos> sh.stopBalancer()
mongos> sh.startBalancer()


2、调整时间窗口

#调整时间窗口
use config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "1:00", stop : "5:00" } } }, true )

#查询时间窗口
sh.getBalancerWindow()
sh.status()


评论