经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
Mongodb分片 学习小结
来源:cnblogs  作者:枫若雪  时间:2019/9/16 9:11:20  对本文有异议

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

教程建议看官方文档:https://docs.mongodb.com/manual/ 

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

环境准备,安装,不再多述,如有问题查:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

4核8G, CentOS7.6    Mongodb4.2

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

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

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

  1. # ------------------------------------ cluster -------------------------
  2. # 单机使用不同端口的方式(测试环境)
  3. cd /data/
  4. tar zxf mongodb-linux-x86_64-rhel70-4.2.0.tgz
  5. mv mongodb-linux-x86_64-rhel70-4.2.0 mongo4.2.0
  6. cd mongo4.2.0/
  7. # 准备好数据/日志/PID/配置文件 目录
  8. mkdir -p shard conf logs pid
  9. cd shard
  10. mkdir -p rs00 rs01 rs02 rs10 rs11 rs12
  11. chown -R mongodb:mongodb /data
  12. # 然后切换成mongodb用户操作。

 

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

  1. systemLog:
  2. path: /data/mongo4.2.0/logs/conf1.log
  3. logAppend: true
  4. logRotate: rename
  5. destination: file
  6. operationProfiling:
  7. mode: slowOp
  8. slowOpThresholdMs: 300
  9. slowOpSampleRate: 1.0
  10. storage:
  11. dbPath: /data/mongo4.2.0/shard/conf1
  12. journal:
  13. enabled: true
  14. directoryPerDB: true
  15. engine: wiredTiger
  16. wiredTiger:
  17. engineConfig:
  18. cacheSizeGB: 2
  19. directoryForIndexes: true
  20. processManagement:
  21. fork: true
  22. pidFilePath: /data/mongo4.2.0/pid/conf1.pid
  23. net:
  24. port: 27100
  25. bindIpAll: true
  26. maxIncomingConnections: 16384
  27. security:
  28. keyFile: /data/mongo4.2.0/conf/ms.key
  29. authorization: enabled
  30. replication:
  31. oplogSizeMB: 4096
  32. replSetName: conf
  33. sharding:
  34. clusterRole: configsvr
  1. 可以使用2个以上节点组成config Server,注意配置文件中要区分不同路径及端口,统一复制集名称。
    security 节中提到的 key 文件,单机环境下所有节点可以使用同一个。多机环境下则要保持内容一致。注意权限设成 600
    操作:
  1. #------- config server
  2. # 配置文件 先不启用安全, 注释掉以下三行,为了设置replset账号。
  3. #security:
  4. # keyFile: /data/mongo4.2.0/conf/conf1.key
  5. # authorization: enabled

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

 

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

  1. systemLog:
  2. path: /data/mongo4.2.0/logs/rs00.log
  3. logAppend: true
  4. logRotate: rename
  5. destination: file
  6. operationProfiling:
  7. mode: slowOp
  8. slowOpThresholdMs: 300
  9. slowOpSampleRate: 1.0
  10. storage:
  11. dbPath: /data/mongo4.2.0/shard/rs00
  12. journal:
  13. enabled: true
  14. directoryPerDB: true
  15. engine: wiredTiger
  16. wiredTiger:
  17. engineConfig:
  18. cacheSizeGB: 3.5
  19. directoryForIndexes: true
  20. processManagement:
  21. fork: true
  22. pidFilePath: /data/mongo4.2.0/pid/rs00.pid
  23. net:
  24. port: 27000
  25. bindIpAll: true
  26. maxIncomingConnections: 16384
  27. security:
  28. keyFile: /data/mongo4.2.0/conf/ms.key
  29. authorization: enabled
  30. replication:
  31. oplogSizeMB: 3300
  32. replSetName: rs0
  33. sharding:
  34. clusterRole: shardsvr
  1. 2个复制集各配置了3个节点,rs0 三个,rs1 三个。 注意配置文件中要区分不同路径及端口,统一复制集名称。
  1. 准备好6个节点的配置文件后,继续操作:
  1. #------- shard server 差不多,仅配置文件稍有不同,先不启用安全。启动服务:
  2. sudo ./mongod -f /data/mongo4.2.0/conf/rs00.conf
  3. sudo ./mongod -f /data/mongo4.2.0/conf/rs01.conf
  4. sudo ./mongod -f /data/mongo4.2.0/conf/rs02.conf
  5. sudo ./mongod -f /data/mongo4.2.0/conf/rs10.conf
  6. sudo ./mongod -f /data/mongo4.2.0/conf/rs11.conf
  7. sudo ./mongod -f /data/mongo4.2.0/conf/rs12.conf

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


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

 

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

 

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

  1. systemLog:
  2. path: /data/mongo4.2.0/logs/mongos.log
  3. logAppend: true
  4. logRotate: rename
  5. destination: file
  6. operationProfiling:
  7. # mode: slowOp
  8. slowOpThresholdMs: 300
  9. slowOpSampleRate: 1.0
  10. processManagement:
  11. fork: true
  12. pidFilePath: /data/mongo4.2.0/pid/mongos.pid
  13. net:
  14. port: 27019
  15. bindIpAll: true
  16. maxIncomingConnections: 51200
  17. security:
  18. keyFile: /data/mongo4.2.0/conf/ms.key
  19. sharding:
  20. configDB: conf/testdb01:27100,testdb01:27101

继续操作:

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

  4. # 连接mongos 并添加shard server
  5. ./mongo testdb01:27019
  6. > use admin
  7. > db.auth( "root","123456")
  8. >sh.addShard("rs0/testdb01:27000,testdb01:27001,testdb01:27002")
  9. >sh.addShard("rs1/testdb01:27010,testdb01:27011,testdb01:27012")
  10. # 查看集群状态
  11. > sh.status()
  12. # 另一个mongos不必再添加分片设置,因为是连接同一个config server,所以自动与前一个mongos相同
  13. # 如果需要更改密码:
  14. > db.changeUserPassword()
  15. ##### 如果要停止 mongos 服务, 必须localhost登录shell
  16. ./mongo localhost:27019
  17. use admin
  18. db.shutdownServer({timeoutSecs: 5}); # 5s shutdown

 

测试 以及 其它命令参考:

  1. # 测试 > 启用指定库分片 > 指定分片key > 插入测试数据
  2. ./mongo -u root -p 123456 --authenticationDatabase admin --port 27019
  3. > use admin
  4. #> db.runCommand({enablesharding:"testdb"}) # 库启用分片
  5. #> db.runCommand( { shardcollection : "testdb.users",key : {_id: 1} } )
  6. > sh.enableSharding("testdb")
  7. > sh.shardcollection("testdb.users",{_id: 1})
  8. > use testdb
  9. > for (let i=1; i<100000; i++){db.users.save({name:"user"+i,age:i+1})}
  10. #> db.runCommand( { shardcollection : "testdb.goods",key : {_id: 1} } )
  11. > sh.shardCollection("testdb.goods", { _id: 1 } )
  12. > use testdb
  13. > for (let i=1; i<100000; i++){db.goods.save({name:"goods"+i,price:i+1,weight:i+2,desc:"test goods"})}
  14. > db.goods.stats()
  15. # 查看集合是否分片:
  16. db.prod_info.stats().sharded
  17. ## replset cmd
  18. rs.add() # 将成员添加到副本集
  19. rs.addArb() # 将仲裁器添加到副本集
  20. rs.conf() # 返回副本集配置文档
  21. rs.initiate() # 初始化新的副本集
  22. rs.printReplicationInfo() # 从主数据库的角度打印副本集状态的报告
  23. rs.printSlaveReplicationInfo() # 从辅助节点的角度打印副本集状态的报告
  24. rs.reconfig() # 通过应用新的副本集配置对象重新配置副本集。
  25. rs.remove() # 从副本集中删除成员。
  26. rs.slaveOk() # 设置slaveOk当前连接的属性。已过时。使用readPref()和Mongo.setReadPref()设置读取首选项。
  27. rs.status() # 副本集状态
  28. rs.stepDown() # 导致当前的初选成为强制选举的次要。
  29. rs.syncFrom() # 设置此副本集成员将同步的成员,覆盖默认同步目标选择逻辑。
  30. ## cluster cmd
  31. sh.getBalancerState() # 当前是否启用了平衡器
  32. sh.status() # 分片群集的状态
  33. sh.startBalancer() # 启用平衡器并等待平衡启动。
  34. sh.stopBalancer() # 禁用平衡器并等待任何正在进行的平衡完成
  35. sh.addShard() # 添加一个分片,以分片集群。
  36. sh.disableBalancing() # 禁用分片数据库中单个集合的平衡。不影响分片集群中其他集合的平衡。
  37. sh.enableBalancing() # 如果先前已禁用,则激活分片收集平衡器进程sh.disableBalancing()。
  38. sh.disableAutoSplit() # 禁用分片群集的自动分割
  39. sh.enableAutoSplit() # 为分片群集启用自动分割
  40. sh.enableSharding() # 在特定数据库上启用分片
  41. sh.isBalancerRunning() # 平衡器进程当前是否正在迁移块。
  42. sh.moveChunk() # 迁移一个块的分片集群
  43. sh.setBalancerState() # 启用或禁用在分片之间迁移块的平衡器。
  44. sh.shardCollection() # 集合启用分片
  45. sh.splitAt() # 使用分片键的特定值作为分割点将现有块分成两个块。
  46. sh.splitFind() # 将包含与查询匹配的文档的现有块划分为两个近似相等的块。
  47. # 重命名集合,但不能是分片集合。
  48. db.adminCommand({renameCollection:"product_info.prod_inf",to:"product_info.prod_info"})
  49. # 刷新所有数据库及其集合的缓存
  50. db.adminCommand("flushRouterConfig")
  51. # 删除当前数据库
  52. db.dropDatabase()

 

 备份恢复参考: 

  1. # database dump
  2. nohup ./mongodump -u root -p 123456 --authenticationDatabase admin -h testdb01:27019 -d A005003 -o /data/dump/ --gzip &
  3. # 不指定集合,则dump所有集合各自独立文件,指定集合则只dump指定集合
  4. # dump specific collection
  5. nohup ./mongodump -u root -p 123456 --authenticationDatabase admin -h testdb01:27019 -d A005001 --collection prod_info -o /data/dump/ --gzip &
  6. ## 有gzip选项 体积小很多(缩小近9倍),速度稍慢。无gzip体积巨大,速度稍快。
  7. ## dump 的速度比export 要快很多。
  8. nohup ./mongodump -u root -p 123456 --authenticationDatabase admin -h testdb01:27019 -d B002001_otp --collection prod_dup -o /data/dump/ --gzip &
  9. # 结果:Total documents 65.9GB + Total index 272.8MB --> prod_dup.bson.gz 7,757,486KB
  10. # time: start: 2019-09-06T09:33:37.205 --> end: 2019-09-06T10:02:09.789 约29分钟
  11. # export collection to json file
  12. mongoexport -h testdb01:27019 -u root -p 123456 --authenticationDatabase admin -d A005003 -c prod_ts --type=json -o /data/dump/prod_ts.csv
  13. # export collection to csv file (must fields name)
  14. 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
  15. # export limit 10000
  16. 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
  17. # export limit 50000
  18. mongoexport -h testdb01:27019 -u root -p 123456 --authenticationDatabase admin -d A005003 -c prod_info --type=json -o /data/dump/prod_info_50000.json
  19. # 对比 ----------------------------------------------------
  20. prod_info: 9701027rows, documents 796.4GB + index 1.2GB
  21. prod_ts : 9701026rows, documents 2.1GB + 414.5MB
  22. mongodump begin: 2019-09-05T14:53:33.146
  23. mongodump end : 2019-09-05T22:30:03.238
  24. gz size: prod_info.bson.gz 134,373,320KB,
  25. prod_ts.bson.gz 207,306KB
  26. mongoexport: limit 5M rows, to prod_info_5000000.json
  27. begin: 2019-09-05T14:46:38.179
  28. end : 2019-09-05T23:26:38.106
  29. file size: 98,530,274KB
  30. #---------------------------------------------------------------------
  31. # 查看bson文件内容
  32. bsondump --pretty /data/dump/A005003nogz/prod_ts.bson
  33. # 从prod_dup.bson.gz文件恢复
  34. 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 &
  35. # 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
  36. # 约26分钟 比备份稍快 重建索引花费较多时间
  37. ## 问题: 恢复到内存满时,即出错崩溃. 原因是配置文件中cacheSizeGB过大,应该为物理内存的50%
  38. sudo ./mongorestore -u root -p 123456 --authenticationDatabase admin -h localhost:27111 -d A001001 --gzip /data/mongobak/A005003/prod_info.bson.gz
  39. ./mongorestore -u root -p 123456 --authenticationDatabase admin -h localhost:27111 -d A001001 --gzip /data/mongobak/B002001_otp/prod_dup.bson.gz
  40. # 指定每个集合并发运行的插入工作器数 4
  41. ./mongorestore -u root -p 123456 --authenticationDatabase admin -h localhost:27111 -d A001001 --gzip /data/mongobak/B002001_otp/prod_dup.bson.gz --numInsertionWorkersPerCollection 4
  42. # 本次恢复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
  43. # 目标主机:2c 4G mongodb4.0.10 单机, cacheSizeGB 2 ,

 

原文链接:http://www.cnblogs.com/frx9527/p/shard.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号