/article/2019/12/06/mongodb-setup-config-sharding-cluster/

Mongodb配置分片集群架构

  • 【作者】看不见我
  • 【分类】Service
  • 【发布】2019-12-06 10:20
  • 【更新】2019-12-06 10:20

Mongodb 配置分片集群

分片集群组件说明

在一个分片集群中,包含以下组件:

  • 分片(shards),实际存储数据的节点。
  • 集群配置集(config),存储整个分片集群的信息。
  • 路由(mongos),作为路由节点,是mongodb数据的统一入口。

shards:

  1. 多个独立的shard分片组成整个shards分片集群。
  2. 每个shard分片可以是一个mongod单实例,也可以是一个复制集。
  3. Localhost Exception特性(集群安全认证相关特性,默认开启)。

config:

  1. 一般配置3个mongod实例作为config server(官方推荐)。
  2. MongoDB 3.2版本后,推荐3个config实例以复制集的方式配置:
  3. 作为config server的复制集必须采用 WiredTiger storage engine。
  4. 副本节点中没有arbiter。
  5. 副本节点中没有delayed members。
  6. 副本节点中必须build indexes。

mongos:

  1. mongos作为分片集群的路由节点,负责接入用户。
  2. 所有对集群的操作及数据读写都连接到mongos进行。

高可用配置mongodb分片集群:

(1)配置mongodb分片集群时,推荐对每个mongod示例的配置都采用CNAMEs(hosts,DNS...)。

例如host形式:

  • 192.168.1.59 id1.shard22001.mongodb.projectname
  • 192.168.1.55 id2.shard22001.mongodb.projectname
  • 192.168.1.56 id3.shard22001.mongodb.projectname
  • 192.168.1.59 id1.configrs.mongodb.projectname
  • 192.168.1.55 id2.configrs.mongodb.projectname
  • 192.168.1.56 id3.configrs.mongodb.projectname

(2)分片集群至少配置2个分片,每个分片都为复制集(1P+1R+1A)。

(3)配置包含3个mongod实例的复制集作为config server。

(4)启用多个mongos实例,并在应用上使用负载均衡来连接mongos。

分片集群配置说明

  1. 创建shards、config、mongos配置文件
  2. 确认mongodb各目录存在及权限正确
  3. 启动mongodb各个组件实例(依次启动config->shards->mongos)
  4. 初始化复制集分片(若是单实例分片自然不需要)
  5. 初始化config server复制集
  6. 配置集群分片
  7. 对某个库开启分片功能
  8. 使用数据库都连接到mongos节点进行操作

Mongo分片集群配置步骤

1、配置文件参考下面的mongodb配置文件

复制集配置文件

# 是否后台 #
processManagement:
    fork: true

# 网络配置 #
net:
    #bindIp: 127.0.0.1,10.8.0.10,192.168.4.24
    #bindIp: id1.shard22001.mongodb.projectname
    port: 27018

# 安全认证配置 #
#security:
    # 启用认证配置:enabled|disabled
    #authorization: enabled
    # 使用Internal Authentication
    #keyFile: /etc/mongodbConf/DBNAME/keyfile

#setParameter:
    # Local Exception配置,默认true
    #enableLocalhostAuthBypass: false

# mongo实例日志配置 #
systemLog:
    destination: file
    path: /data/mongodb/DBNAME/logs/shardN.log
    # 设置logAppend为true后,mongod/mongos在重启后只会在现有日
    # 志的尾部继续添加日志,不会覆盖已有日志文件。(默认:False)
    logAppend: true
    # 日志滚动配置rename(重命名日志文件)|reopen(关闭并重新打开此日志文件)
    # reopen使用linux日志rotate特性,如果配置reopen,也要设置logAppend: true
    logRotate: rename
    # (default)iso8601-local|iso8601-utc|ctime
    #timeStampFormat: iso8601-local

# mongodb数据存储配置 #
storage:
    # journal配置
    journal:
        # 如果是Arbiter,最好设置为false
        enabled: true
    # 数据文件存储位置
    dbPath: /data/mongodb/DBNAME/data/shardN
    # 是否一个库一个文件夹
    directoryPerDB: true
    # 数据引擎配置
    engine: wiredTiger
    # WT引擎配置
    wiredTiger:
        engineConfig:
            # WT最大使用cache(根据服务器实际情况调节)
            # arbiter|configrs可配置成1
            cacheSizeGB: 10
            # 是否将索引也按数据库名单独存储
            directoryForIndexes: true
        # 表压缩配置
        collectionConfig:
            # blockCompressor参数:none|zlib
            blockCompressor: zlib
        # 索引配置
        indexConfig:
            prefixCompression: true

# 副本配置 #
replication:
    # oplog大小。默认磁盘空间5%(1G-50G)
    oplogSizeMB: 20480
    # 复制集名称
    replSetName: shardN

# 分片配置 #
sharding:
    # 分片角色
    clusterRole: shardsvr

configsvr配置文件

# 是否后台 #
processManagement:
    fork: true

# 网络配置 #
net:
    #bindIp: 127.0.0.1,10.8.0.10,192.168.4.24
    #bindIp: id3.configrs.mongodb.projectname
    port: 27019

# 安全认证配置 #
#security:
    # 启用认证配置:enabled|disabled
    #authorization: enabled
    # 使用Internal Authentication
    #keyFile: /etc/mongodbConf/DBNAME/keyfile

#setParameter:
    # Local Exception配置,默认true
    #enableLocalhostAuthBypass: false

# mongo实例日志配置 #
systemLog:
    destination: file
    path: /data/mongodb/DBNAME/logs/configReplSetNAME27019.log
    # 设置logAppend为true后,mongod/mongos在重启后只会在现有日
    # 志的尾部继续添加日志,不会覆盖已有日志文件。(默认:False)
    logAppend: true
    # 日志滚动配置rename(重命名日志文件)|reopen(关闭并重新打开此日志文件)
    # reopen使用linux日志rotate特性,如果配置reopen,也要设置logAppend: true
    logRotate: rename
    # (default)iso8601-local|iso8601-utc|ctime
    #timeStampFormat: iso8601-local

# mongodb数据存储配置 #
storage:
    # journal配置
    journal:
        enabled: true
    # 数据文件存储位置
    dbPath: /data/mongodb/DBNAME/data/configReplSetNAME27019
    # 是否一个库一个文件夹
    directoryPerDB: true
    # 数据引擎配置
    engine: wiredTiger
    # WT引擎配置
    wiredTiger:
        engineConfig:
            # WT最大使用cache(根据服务器实际情况调节)
            # arbiter|configrs可配置成1
            cacheSizeGB: 1
            # 是否将索引也按数据库名单独存储
            directoryForIndexes: true
        # 表压缩配置
        collectionConfig:
            # blockCompressor参数:none|zlib
            blockCompressor: zlib
        # 索引配置
        indexConfig:
            prefixCompression: true

# 副本配置 #
replication:
    # oplog大小,默认磁盘空间5%(1G-50G)
    #oplogSizeMB: 4096
    # 复制集名称
    replSetName: configReplSetNAME

# 分片配置 #
sharding:
    # 分片角色
    clusterRole: configsvr

mongos配置文件

# 是否后台
processManagement:
    fork: true

# 安全认证配置
#security:
    # 使用Internal Authentication
    #keyFile: /etc/mongodbConf/DBNAME/keyfile

# 网路配置 #
net:
    #bindIp: 127.0.0.1,10.8.0.10,192.168.4.24
    # 端口配置
    port: 27017

#setParameter:
    # Local Exception配置,默认true
    #enableLocalhostAuthBypass: false

# mongo实例日志配置 #
systemLog:
    destination: file
    # 日志位置
    path: /data/mongodb/DBNAME/logs/mongos27017.log
    # 设置logAppend为true后,mongod/mongos在重启后只会在现有日
    # 志的尾部继续添加日志,不会覆盖已有日志文件。(默认:False)
    logAppend: true
    # 日志滚动配置rename(重命名日志文件)|reopen(关闭并重新打开此日志文件)
    # reopen使用linux日志rotate特性,如果配置reopen,也要设置logAppend: true
    logRotate: rename
    # (default)iso8601-local|iso8601-utc|ctime
    #timeStampFormat: iso8601-local

# 分片配置
sharding:
    # 指定config server
    #configDB: 10.96.29.2:29017,10.96.29.2:29018,10.96.29.2:29019
    # 如果config server是一个副本集,则必须使用以下的配置
    configDB: configReplSetNAME/192.168.1.18:21001,192.168.1.55:21001,192.168.1.56:21001

2、启动各个组件的实例

# shard和config的启动都是使用mongod启动
sudo -u mongodb numactl --interleave=all mongod -f /etc/mongodbConf/DBNAME/shardPORT.conf
sudo -u mongodb numactl --interleave=all mongod -f /etc/mongodbConf/DBNAME/configPORT.conf

# mongos的启动
sudo -u mongodb mongos -f /etc/mongodbConf/DBNAME/mongosPORT.conf

3、对各个分片的复制集进行初始化

mongo 192.168.1.54:22001
use admin
db.runCommand({
    "replSetInitiate":{
        "_id":"RsDBNAME",
        "members":[
            {"_id":1,"host":"192.168.1.54:22001","priority": 2},
            {"_id":2,"host":"192.168.1.53:22001"},
            {"_id":3,"host":"192.168.1.52:22001","arbiterOnly":true}
        ]
    }
})

4、初始化config server复制集

use admin
rs.initiate({
    _id: "configReplSetNAME",
    configsvr: true,
    members: [
        { _id: 1, host: "<host1>:<port1>", "priority": 2 },
        { _id: 2, host: "<host2>:<port2>" },
        { _id: 3, host: "<host3>:<port3>" }
   ]
})

5、连接到mongos进行集群分片的配置

mongo 192.168.1.54:20001
use admin
sh.addShard("<replica_set>/<hostname><:port>")
# or:
#db.runCommand({"addShard":"shard1/192.168.1.54:22001"})

6、对某个库开启分片功能

mongo 192.168.1.54:20001
use admin
sh.enableSharding("test")
# or:
#db.runCommand({"enablesharding":"test"})

7、使用数据库都连接到mongos节点进行操作

mongo 192.168.1.54:20001
use test
db.collname.insert({"aaa": 1})
db.collname.find()
Top