MongoDB WT 存储引擎部署方案
集群规划
假设集群包含以下服务器
-
192.168.0.17 Mongo01,以下简称 17
-
192.168.0.18 Mongo02,以下简称 18
-
192.168.0.19 Mongo03,以下简称 19
-
192.168.0.16 Mongo04,以下简称 16
-
192.168.0.14 Mongo05,以下简称 14
-
192.168.0.15 Mongo06,以下简称 15
集群模型
组件 | 服务器 | 端口 |
---|---|---|
Mongos | 17、18、19 | 10000 |
Cofig Server | 17、18、19 | 11000 |
Shard1 | 17(master)、16(slave)、14(arbitrate) | 11001 |
Shard2 | 18(master)、14(slave)、15(arbitrate) | 11002 |
Shard3 | 19(master)、15(slave)、16(arbitrate) | 11003 |
MongoDB 3.4 高可用集群搭建(三)shard 分片
部署
- 创建目录
17~19
cd /data/mongo && mkdir -p config/{data,log} mongos/log
14~19
cd /data/mongo && mkdir -p shard{1,2,3}/{data,log}
- 创建配置文件(检查 mongos.conf 中的 port 和 configDB 以及 shard1.conf、shard2.conf、shard3.conf 中的 port)
14~19
mkdir -p /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/conf
17~19 创建 /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/conf/{config.conf,mongos.conf,shard1.conf,shard2.conf,shard3.conf}
config.conf
systemLog:
destination: file
###日志存储位置
path: /data/mongo/config/log/config.log
logAppend: true
storage:
##journal配置
journal:
enabled: true
##数据文件存储位置
dbPath: /data/mongo/config/data/
##是否一个库一个文件夹
directoryPerDB: true
##数据引擎
engine: wiredTiger
##WT引擎配置
wiredTiger:
engineConfig:
##WT最大使用cache(根据服务器实际情况调节)
cacheSizeGB: 8
##是否将索引也按数据库名单独存储
directoryForIndexes: true
##表压缩配置
collectionConfig:
blockCompressor: zlib
##索引配置
indexConfig:
prefixCompression: true
##端口配置
net:
port: 11000
##分片配置
sharding:
##分片角色
clusterRole: configsvr
mongos.conf
##日志配置
systemLog:
destination: file
##日志位置
path: /data/mongo/mongos/log/mongos.log
logAppend: true
##网路配置
net:
##端口配置
port: 10000
##分片配置
sharding:
##指定config server
configDB: 192.168.0.17:11000,192.168.0.18:11000,192.168.0.19:11000
shard1.conf
systemLog:
destination: file
###日志存储位置
path: /data/mongo/shard1/log/shard1.log
logAppend: true
storage:
##journal配置
journal:
enabled: true
##数据文件存储位置
dbPath: /data/mongo/shard1/data/
##是否一个库一个文件夹
directoryPerDB: true
##数据引擎
engine: wiredTiger
##WT引擎配置
wiredTiger:
engineConfig:
##WT最大使用cache(根据服务器实际情况调节)
cacheSizeGB: 8
##是否将索引也按数据库名单独存储
directoryForIndexes: true
##表压缩配置
collectionConfig:
blockCompressor: zlib
##索引配置
indexConfig:
prefixCompression: true
##端口配置
net:
port: 11001
replication:
##oplog大小
oplogSizeMB: 40960
##复制集名称
replSetName: shard1
##分片配置
sharding:
##分片角色
clusterRole: shardsvr
shard2.conf
systemLog:
destination: file
###日志存储位置
path: /data/mongo/shard2/log/shard2.log
logAppend: true
storage:
##journal配置
journal:
enabled: true
##数据文件存储位置
dbPath: /data/mongo/shard2/data/
##是否一个库一个文件夹
directoryPerDB: true
##数据引擎
engine: wiredTiger
##WT引擎配置
wiredTiger:
engineConfig:
##WT最大使用cache
cacheSizeGB: 8
##是否将索引也按数据库名单独存储
directoryForIndexes: true
##表压缩配置
collectionConfig:
blockCompressor: zlib
##索引配置
indexConfig:
prefixCompression: true
##端口配置
net:
port: 11002
replication:
##oplog大小
oplogSizeMB: 40960
##复制集名称
replSetName: shard2
##分片配置
sharding:
##分片角色
clusterRole: shardsvr
shard3.conf
systemLog:
destination: file
###日志存储位置
path: /data/mongo/shard3/log/shard3.log
logAppend: true
storage:
##journal配置
journal:
enabled: true
##数据文件存储位置
dbPath: /data/mongo/shard3/data/
##是否一个库一个文件夹
directoryPerDB: true
##数据引擎
engine: wiredTiger
##WT引擎配置
wiredTiger:
engineConfig:
##WT最大使用cache(根据服务器实际情况调节)
cacheSizeGB: 8
##是否将索引也按数据库名单独存储
directoryForIndexes: true
##表压缩配置
collectionConfig:
blockCompressor: zlib
##索引配置
indexConfig:
prefixCompression: true
##端口配置
net:
port: 11003
replication:
##oplog大小
oplogSizeMB: 40960
##复制集名称
replSetName: shard3
##分片配置
sharding:
##分片角色
clusterRole: shardsvr
14~16 创建 /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/conf/{shard1.conf,shard2.conf,shard3.conf}
- 启动服务
17
cd /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7 && \
bin/mongod -f conf/config.conf --fork && \
bin/mongos -f conf/mongos.conf --fork && \
bin/mongod -f conf/shard1.conf --fork
18
cd /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7 && \
bin/mongod -f conf/config.conf --fork && \
bin/mongos -f conf/mongos.conf --fork && \
bin/mongod -f conf/shard2.conf --fork
19
cd /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7 && \
bin/mongod -f conf/config.conf --fork && \
bin/mongos -f conf/mongos.conf --fork && \
bin/mongod -f conf/shard3.conf --fork
14
cd /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7 && \
bin/mongod -f conf/shard1.conf --fork && \
bin/mongod -f conf/shard2.conf --fork
15
cd /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7 && \
bin/mongod -f conf/shard2.conf --fork && \
bin/mongod -f conf/shard3.conf --fork
16
cd /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7 && \
bin/mongod -f conf/shard1.conf --fork && \
bin/mongod -f conf/shard3.conf --fork
- 配置分片
# shard1
$ /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/bin/mongo -port 11001 admin
mongos> rs.initiate({_id:"shard1",members:[{_id:0,host:"192.168.0.17:11001"},{_id:1,host:"192.168.0.16:11001"},{_id:2,host:"192.168.0.14:11001",arbiterOnly:true}]});
# shard2
$ /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/bin/mogno -port 11002 admin
mongos> rs.initiate({_id:"shard2",members:[{_id:0,host:"192.168.0.18:11002"},{_id:1,host:"192.168.0.14:11002"},{_id:2,host:"192.168.0.15:11002",arbiterOnly:true}]});
# shard3
$ /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/bin/mongo -port 11003 admin
mongos> rs.initiate({_id:"shard3",members:[{_id:0,host:"192.168.0.19:11003"},{_id:1,host:"192.168.0.15:11003"},{_id:2,host:"192.168.0.16:11003",arbiterOnly:true}]});
# mongos
$ /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/bin/mongo -port 10000 admin
mongos> db.runCommand({addshard:"shard1/192.168.0.17:11001,192.168.0.16:11001,192.168.0.14:11001"});
mongos> db.runCommand({addshard:"shard2/192.168.0.18:11002,192.168.0.14:11002,192.168.0.15:11002"});
mongos> db.runCommand({addshard:"shard3/192.168.0.19:11003,192.168.0.15:11003,192.168.0.16:11003"});
通过rs.status()
查看分片配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4m2wmCBP-1586339777184)(\images\rs_status.jpg)]
- 使分片在 bill 库生效,并对集合 bill 的 msg_id 字段创建哈希片键
$ /data/mongo/mongodb-linux-x86_64-rhel62-3.2.7/bin/mongo -port 10000 admin
mongos> db.runCommand({enablesharding:"bill"})
mongos> db.runCommand({shardcollection:"bill.bill",key:{"msg_id":"hashed"}})
哈希分片的片键只能使用单个字段,不能是复合的。
哈希分片的特点是均匀。好处是使数据均匀分布到各个节点,把“写”的压力分散给集群里更多的服务器,充分扩展“写”的能力。缺点是“读”的节点比较多,查询效率相对较低。
创建分片后 MongoDB 会自动生成该片键的索引,通过sh.status()
查看分片信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9TvzfBT1-1586339777185)(\images\sh_status.jpg)]
-
查看分片信息
mongos> db.shards.find()
-
查看数据库是否启用分片
db.databases.find()
partitioned 是否启用分片
- 关于索引
-
创建
替换 COllECTION_NAME
mongos> db.COllECTION_NAME.createIndex({})
目前生产上 bill 集合使用的索引有:
mongos> db.COllECTION_NAME.createIndex({"msg_id":"hashed"},{"unique":false,"sparse":true}) mongos> db.COllECTION_NAME.createIndex({"msg_id":1, "mobile":1, "msgseq":1},{"unique":false,"sparse":true}) mongos> db.COllECTION_NAME.createIndex({"ec_id":1, "mobile":1, "ap_submit_time":-1},{"unique":false,"sparse":true}) mongos> db.COllECTION_NAME.createIndex({"status":1},{"unique":false,"sparse":true}) mongos> db.COllECTION_NAME.createIndex({"ec_id":1, "ap_submit_time":-1},{"unique":false,"sparse":true}) mongos> db.COllECTION_NAME.createIndex({"international":1},{"unique":false,"sparse":true}) mongos> db.COllECTION_NAME.createIndex({"ec_id":1,"ap_id":1,"src_type":1,"sms_type":1,"sign_id":1,"src_id":1,"local":1,"status":1,"report":1},{"unique":false,"sparse":true})
-
查询
mongos> db.COllECTION_NAME.getIndexes()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kUS6Ka43-1586339777186)(\images\getIndexes.jpg)]
-
删除
替换 INDEX_NAME
INDEX_NAME 由以上查询命令 getIndexes() 获得
mongos> db.COllECTION_NAME.dropIndex("INDEX_NAME")