欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mongodb分片 学习小结

程序员文章站 2024-02-07 16:33:16
前一篇 https://www.cnblogs.com/frx9527/p/mongodb.html 学会搭建复制集Replication之后,就可以学习分片Sharding了。 教程建议看官方文档:https://docs.mongodb.com/manual/ 总结一下笔记,为了后续速查. 环境 ......

前一篇 https://www.cnblogs.com/frx9527/p/mongodb.html 学会搭建复制集replication之后,就可以学习分片sharding了。

教程建议看官方文档: 

总结一下笔记,为了后续速查.

环境准备,安装,不再多述,如有问题查:

4核8g, centos7.6    mongodb4.2

单机安装测试环境,或者多机安装生产环境,其实仅仅是个主机名(或ip)和端口的区别,

官方建议使用主机名。前提需要做好局域网内dns解析或者使用统一的hosts文件。

主要是三个部分组成: shard server  ,  config server ,  mongos 

# ------------------------------------ cluster -------------------------
# 单机使用不同端口的方式(测试环境)
cd /data/
tar zxf mongodb-linux-x86_64-rhel70-4.2.0.tgz 
mv mongodb-linux-x86_64-rhel70-4.2.0 mongo4.2.0
cd mongo4.2.0/

# 准备好数据/日志/pid/配置文件 目录
mkdir -p shard conf logs pid
cd shard
mkdir -p rs00 rs01 rs02 rs10 rs11 rs12  
chown -r mongodb:mongodb /data
# 然后切换成mongodb用户操作。

 

先配置config server 使用配置文件/data/mongo4.2.0/conf/conf1.conf:

systemlog:
    path: /data/mongo4.2.0/logs/conf1.log
    logappend: true
    logrotate: rename
    destination: file

operationprofiling:
  mode: slowop
  slowopthresholdms: 300
  slowopsamplerate: 1.0

storage:
    dbpath: /data/mongo4.2.0/shard/conf1
    journal:
        enabled: true
    directoryperdb: true
    engine: wiredtiger
    wiredtiger:
        engineconfig:
            cachesizegb: 2
            directoryforindexes: true

processmanagement:
    fork: true
    pidfilepath: /data/mongo4.2.0/pid/conf1.pid

net:
    port: 27100
    bindipall: true
    maxincomingconnections: 16384

security:
    keyfile: /data/mongo4.2.0/conf/ms.key
    authorization: enabled

replication:
    oplogsizemb: 4096
    replsetname: conf

sharding:
    clusterrole: configsvr
可以使用2个以上节点组成config server,注意配置文件中要区分不同路径及端口,统一复制集名称。
security 节中提到的 key 文件,单机环境下所有节点可以使用同一个。多机环境下则要保持内容一致。注意权限设成 600
操作:
#------- config server 
# 配置文件 先不启用安全, 注释掉以下三行,为了设置replset账号。
#security:
#    keyfile: /data/mongo4.2.0/conf/conf1.key
#    authorization: enabled

# 启动服务: sudo ./mongod -f /data/mongo4.2.0/conf/conf1.conf sudo ./mongod -f /data/mongo4.2.0/conf/conf2.conf # 初始化 ./mongo testdb01:27100 >rs.initiate({_id:'conf',members:[{_id:0,host:'testdb01:27100'},{_id:1,host:'testdb01:27101'}]}) # 设置账号密码: > use admin > db.createuser({user: "root", pwd: "123456", roles:[{ role:"root",db:"admin"}]}) > db.auth( "root","123456") # 确认是否正确

 

再配置 shard server   使用配置文件 /data/mongo4.2.0/conf/rs00.conf

systemlog:
    path: /data/mongo4.2.0/logs/rs00.log
    logappend: true
    logrotate: rename
    destination: file

operationprofiling:
  mode: slowop
  slowopthresholdms: 300
  slowopsamplerate: 1.0

storage:
    dbpath: /data/mongo4.2.0/shard/rs00
    journal:
        enabled: true
    directoryperdb: true
    engine: wiredtiger
    wiredtiger:
        engineconfig:
            cachesizegb: 3.5
            directoryforindexes: true

processmanagement:
    fork: true
    pidfilepath: /data/mongo4.2.0/pid/rs00.pid

net:
    port: 27000
    bindipall: true
    maxincomingconnections: 16384

security:
    keyfile: /data/mongo4.2.0/conf/ms.key
    authorization: enabled

replication:
    oplogsizemb: 3300
    replsetname: rs0

sharding:
    clusterrole: shardsvr
2个复制集各配置了3个节点,rs0 三个,rs1 三个。 注意配置文件中要区分不同路径及端口,统一复制集名称。
准备好6个节点的配置文件后,继续操作:
#------- shard server 差不多,仅配置文件稍有不同,先不启用安全。启动服务:
sudo ./mongod -f /data/mongo4.2.0/conf/rs00.conf
sudo ./mongod -f /data/mongo4.2.0/conf/rs01.conf
sudo ./mongod -f /data/mongo4.2.0/conf/rs02.conf
sudo ./mongod -f /data/mongo4.2.0/conf/rs10.conf
sudo ./mongod -f /data/mongo4.2.0/conf/rs11.conf
sudo ./mongod -f /data/mongo4.2.0/conf/rs12.conf

# 初始化 组织2个replset ./mongo testdb01:27000 >rs.initiate({_id:'rs0',members:[{_id:0,host:'testdb01:27000'},{_id:1,host:'testdb01:27001'},{_id:2,host:'testdb01:27002'}]}) ./mongo testdb01:27010 >rs.initiate({_id:'rs1',members:[{_id:0,host:'testdb01:27010'},{_id:1,host:'testdb01:27011'},{_id:2,host:'testdb01:27012'}]})

# 设置账号密码, 两个replset都要在 primary上设置一次,secondary不用 > use admin > db.createuser({user: "rsroot", pwd: "123456", roles:[{ role:"root",db:"admin"}]}) > db.auth( "rsroot","123456") # 确认是否正确

 

接下来停止所有 mongod 服务( --shutdown),修改配置文件,启用安全配置后,重新启动各项服务.
先启动 config server, 再 shard server。

 

最后配置 mongos 路由服务,使用配置文件 /data/mongo4.2.0/conf/mongos.conf

systemlog:
    path: /data/mongo4.2.0/logs/mongos.log
    logappend: true
    logrotate: rename
    destination: file

operationprofiling:
#  mode: slowop
  slowopthresholdms: 300
  slowopsamplerate: 1.0

processmanagement:
    fork: true
    pidfilepath: /data/mongo4.2.0/pid/mongos.pid

net:
    port: 27019
    bindipall: true
    maxincomingconnections: 51200

security:
    keyfile: /data/mongo4.2.0/conf/ms.key

sharding:
    configdb: conf/testdb01:27100,testdb01:27101

继续操作:

#------- mongos路由  配置文件不同
sudo ./mongos -f /data/mongo4.2.0/conf/mongos.conf    # 27019
sudo ./mongos -f /data/mongo4.2.0/conf/mongos2.conf   # 27018

# 连接mongos 并添加shard server ./mongo testdb01:27019 > use admin > db.auth( "root","123456") >sh.addshard("rs0/testdb01:27000,testdb01:27001,testdb01:27002") >sh.addshard("rs1/testdb01:27010,testdb01:27011,testdb01:27012") # 查看集群状态 > sh.status() # 另一个mongos不必再添加分片设置,因为是连接同一个config server,所以自动与前一个mongos相同 # 如果需要更改密码: > db.changeuserpassword() ##### 如果要停止 mongos 服务, 必须localhost登录shell ./mongo localhost:27019 use admin db.shutdownserver({timeoutsecs: 5}); # 5s shutdown

 

测试 以及 其它命令参考:

# 测试 > 启用指定库分片 > 指定分片key > 插入测试数据
./mongo -u root -p 123456 --authenticationdatabase admin --port 27019
> use admin
#> db.runcommand({enablesharding:"testdb"})  # 库启用分片
#> db.runcommand( { shardcollection : "testdb.users",key : {_id: 1} } )
> sh.enablesharding("testdb")
> sh.shardcollection("testdb.users",{_id: 1})

> use testdb
> for (let i=1; i<100000; i++){db.users.save({name:"user"+i,age:i+1})}  

#> db.runcommand( { shardcollection : "testdb.goods",key : {_id: 1} } )
> sh.shardcollection("testdb.goods", { _id: 1 } )
> use testdb
> for (let i=1; i<100000; i++){db.goods.save({name:"goods"+i,price:i+1,weight:i+2,desc:"test goods"})}
> db.goods.stats()

# 查看集合是否分片:
db.prod_info.stats().sharded



## replset cmd
rs.add()                        # 将成员添加到副本集
rs.addarb()                     # 将仲裁器添加到副本集
rs.conf()                       # 返回副本集配置文档

rs.initiate()                   # 初始化新的副本集
rs.printreplicationinfo()       # 从主数据库的角度打印副本集状态的报告
rs.printslavereplicationinfo()  # 从辅助节点的角度打印副本集状态的报告
rs.reconfig()                   # 通过应用新的副本集配置对象重新配置副本集。
rs.remove()                     # 从副本集中删除成员。
rs.slaveok()                    # 设置slaveok当前连接的属性。已过时。使用readpref()和mongo.setreadpref()设置读取首选项。
rs.status()                     # 副本集状态
rs.stepdown()                   # 导致当前的初选成为强制选举的次要。
rs.syncfrom()                   # 设置此副本集成员将同步的成员,覆盖默认同步目标选择逻辑。


## cluster cmd
sh.getbalancerstate()           # 当前是否启用了平衡器
sh.status()                     # 分片群集的状态
sh.startbalancer()              # 启用平衡器并等待平衡启动。
sh.stopbalancer()               # 禁用平衡器并等待任何正在进行的平衡完成

sh.addshard()              # 添加一个分片,以分片集群。

sh.disablebalancing()      # 禁用分片数据库中单个集合的平衡。不影响分片集群中其他集合的平衡。
sh.enablebalancing()       # 如果先前已禁用,则激活分片收集平衡器进程sh.disablebalancing()。
sh.disableautosplit()      # 禁用分片群集的自动分割
sh.enableautosplit()       # 为分片群集启用自动分割
sh.enablesharding()        # 在特定数据库上启用分片

sh.isbalancerrunning()     # 平衡器进程当前是否正在迁移块。
sh.movechunk()             # 迁移一个块的分片集群

sh.setbalancerstate()      # 启用或禁用在分片之间迁移块的平衡器。
sh.shardcollection()       # 集合启用分片
sh.splitat()               # 使用分片键的特定值作为分割点将现有块分成两个块。
sh.splitfind()             # 将包含与查询匹配的文档的现有块划分为两个近似相等的块。


# 重命名集合,但不能是分片集合。
db.admincommand({renamecollection:"product_info.prod_inf",to:"product_info.prod_info"}) 

# 刷新所有数据库及其集合的缓存
db.admincommand("flushrouterconfig")

# 删除当前数据库
db.dropdatabase()

 

 备份恢复参考: 

# database dump
nohup ./mongodump -u root -p 123456 --authenticationdatabase admin -h testdb01:27019 -d a005003 -o /data/dump/ --gzip &

# 不指定集合,则dump所有集合各自独立文件,指定集合则只dump指定集合

# dump specific collection
nohup ./mongodump -u root -p 123456 --authenticationdatabase admin -h testdb01:27019 -d a005001 --collection prod_info -o /data/dump/ --gzip &
## 有gzip选项 体积小很多(缩小近9倍),速度稍慢。无gzip体积巨大,速度稍快。
## dump 的速度比export 要快很多。

nohup ./mongodump -u root -p 123456 --authenticationdatabase admin -h testdb01:27019 -d b002001_otp --collection prod_dup -o /data/dump/ --gzip &
# 结果:total documents 65.9gb + total index 272.8mb -->  prod_dup.bson.gz  7,757,486kb
# time: start: 2019-09-06t09:33:37.205 --> end: 2019-09-06t10:02:09.789 约29分钟


# export collection to json file
mongoexport -h testdb01:27019 -u root -p 123456 --authenticationdatabase admin -d a005003 -c prod_ts --type=json -o /data/dump/prod_ts.csv

# export collection to csv file (must fields name)
mongoexport -h testdb01:27019 -u root -p 123456 --authenticationdatabase admin -d a005003 -c prod_ts -f _id,ts,from,via,refid,productname,moduleid,qr,opt3,opt4 --type=csv -o /data/dump/prod_ts.csv

# export limit 10000
mongoexport -h testdb01:27019 -u root -p 123456 --authenticationdatabase admin -d a005003 -c prod_info -f _id,moduleid,opt3,opt4,productname,qr,profiles,create_ts,profiles_ts --type=csv -o /data/dump/prod_info.csv --limit 10000

# export limit 50000
mongoexport -h testdb01:27019 -u root -p 123456 --authenticationdatabase admin -d a005003 -c prod_info --type=json -o /data/dump/prod_info_50000.json


# 对比 ----------------------------------------------------
prod_info: 9701027rows, documents 796.4gb + index 1.2gb 
prod_ts :  9701026rows, documents 2.1gb + 414.5mb
mongodump begin: 2019-09-05t14:53:33.146
mongodump end :  2019-09-05t22:30:03.238
gz size:  prod_info.bson.gz  134,373,320kb, 
          prod_ts.bson.gz    207,306kb

mongoexport: limit 5m rows, to prod_info_5000000.json 
begin: 2019-09-05t14:46:38.179
end :  2019-09-05t23:26:38.106
file size:  98,530,274kb



#---------------------------------------------------------------------
# 查看bson文件内容
bsondump --pretty /data/dump/a005003nogz/prod_ts.bson 

# 从prod_dup.bson.gz文件恢复 
nohup mongorestore -u root -p 123456 --authenticationdatabase admin -h testdb01:27019 -d a005003 --collection prod_dup --gzip /data/dump/b002001_otp/prod_dup.bson.gz &
# start_time: 2019-09-06t11:12:09.363  --> 100%_time: 2019-09-06t11:23:55.005 --> restore indexes to end: 2019-09-06t11:37:56.806
# 约26分钟 比备份稍快 重建索引花费较多时间

## 问题: 恢复到内存满时,即出错崩溃. 原因是配置文件中cachesizegb过大,应该为物理内存的50% 
sudo ./mongorestore -u root -p 123456 --authenticationdatabase admin -h localhost:27111 -d a001001 --gzip /data/mongobak/a005003/prod_info.bson.gz 
./mongorestore  -u root -p 123456 --authenticationdatabase admin -h localhost:27111 -d a001001 --gzip /data/mongobak/b002001_otp/prod_dup.bson.gz

# 指定每个集合并发运行的插入工作器数 4
./mongorestore  -u root -p 123456 --authenticationdatabase admin -h localhost:27111 -d a001001 --gzip /data/mongobak/b002001_otp/prod_dup.bson.gz --numinsertionworkerspercollection 4
# 本次恢复prod_dup.bson.gz 大小:7757486kb, 所用时间: 17:00:17 reading metadata --> 17:08:53 restoring indexes --> 17:14:52 done  最终表大小:doc 65.9 gb + index 181.9mb,  文档数:1,599,995
# 目标主机:2c 4g  mongodb4.0.10 单机,  cachesizegb 2 ,