/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:
- 多个独立的shard分片组成整个shards分片集群。
- 每个shard分片可以是一个mongod单实例,也可以是一个复制集。
- Localhost Exception特性(集群安全认证相关特性,默认开启)。
config:
- 一般配置3个mongod实例作为config server(官方推荐)。
- MongoDB 3.2版本后,推荐3个config实例以复制集的方式配置:
- 作为config server的复制集必须采用 WiredTiger storage engine。
- 副本节点中没有arbiter。
- 副本节点中没有delayed members。
- 副本节点中必须build indexes。
mongos:
- mongos作为分片集群的路由节点,负责接入用户。
- 所有对集群的操作及数据读写都连接到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。
分片集群配置说明
- 创建shards、config、mongos配置文件
- 确认mongodb各目录存在及权限正确
- 启动mongodb各个组件实例(依次启动config->shards->mongos)
- 初始化复制集分片(若是单实例分片自然不需要)
- 初始化config server复制集
- 配置集群分片
- 对某个库开启分片功能
- 使用数据库都连接到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()