常用命令

  1. db 查看当前路径
  2. use 切换库,没有库的时候自动创建
  3. show tables; 查看当前库的表
  4. db.stats() 查看库的状态
  5. --命令种类
  6. 数据库对象(库(database),表(collection),行(document))
  7. db.help(); 查询db下的所有命令帮助
  8. --表的操作(集合)
  9. > db.createCollection('1')
  10. > db.createCollection('2')
  11. > show collections
  12. > db.getCollectionNames()
  13. --行的操作
  14. #插入
  15. > db.stu.insert({id:101,name:"zhangsan",age:20,gender:"n"})
  16. > db.stu.insert({a:"b",c:"d"})
  17. > db.stu.insert({a:1,c:2})
  18. #查询
  19. > db.stu.find().pretty()
  20. > db.stu.findOne() #查询第一条
  21. > db.stu.count() #查询总行数
  22. > db.stu.remove({}) #删除记录中所有的记录,也可以按条件删
  23. > db.stu.distinct("name") #查询去掉当前集合中某列的重复数据
  24. #删除
  25. > use app
  26. > db.log.drop()
  27. #重命名
  28. > db.test.renameCollection("test1")
  29. #for循环批量插入
  30. for(i=1;i<10001;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"data":new Date()})}
  31. #查看集合存储信息
  32. > db.log.stats()
  33. > db.log.totalSize() #集合中索引+数据压缩存储之后的大小
  34. > db.log.dataSize() #集合中数据的原始大小
  35. > db.log.totalIndexSize() #集合中索引数据的原始大小
  36. > db.log.storageSize() #集合中数据压缩存储的大小

复制集(relication set)

rs.help()

  1. 至少三个节点,1主两从,主宕机后会内部自动投票选取新的主节点,并自动切换
  2. 从库默认是不让读写的,需要rs.slaveOk()

mongodb命令及集群 - 图1

mongodb命令及集群 - 图2

搭建测试环境

  1. #多实例目录配置
  2. mkdir -p /mongodb/280{17,18,19,20}/conf /mongodb/280{17,18,19,20}/data /mongodb/280{17,18,19,20}/log
  3. #多实例配置文件模板(四台机器都配置,注意路径和端口)
  4. cat > /mongodb/28017/conf/mongod.conf << EOF
  5. systemLog:
  6. destination: file
  7. path: /mongodb/28017/log/mongodb.log
  8. logAppend: true
  9. storage:
  10. journal:
  11. enabled: true
  12. dbPath: /mongodb/28017/data
  13. directoryPerDB: true
  14. #engine: wiredTiger
  15. wiredTiger: #具备事务的引擎
  16. engineConfig:
  17. cacheSizeGB: 1 #缓冲区大小
  18. directoryForIndexes: true
  19. collectionConfig:
  20. blockCompressor: zlib
  21. indexConfig:
  22. prefixCompression: true
  23. processManagement:
  24. fork: true
  25. net:
  26. bindIp: 127.0.0.1
  27. port: 28017
  28. replication: #日志
  29. oplogSizeMB: 2048 #日志表大小
  30. replSetName: my_repl #复制集名
  31. EOF
  32. #启动
  33. mongod -f /mongodb/28017/config/mongo.conf
  34. mongod -f /mongodb/28018/config/mongo.conf
  35. mongod -f /mongodb/28019/config/mongo.conf
  36. mongod -f /mongodb/28020/config/mongo.conf

配置普通复制集

rs必须要三个节点才能建立,因为要投票选举主节点

一主两从的方式比较耗资源,所以一般都是一主一从一arbiter来搭建(arbiter只用来选举)

  1. #一主两从,从库普通从库
  2. mogo --port 28017 admin
  3. #设置rs配置参数
  4. config = {_id:"my_repl",members:[
  5. {_id:0,host:"127.0.0.1:28017"},
  6. {_id:1,host:"127.0.0.1:28018"},
  7. {_id:2,host:"127.0.0.1:28019"}]
  8. }
  9. #构建
  10. rs.initiate(config)
  11. #查询复制集状态
  12. rs.status()
  13. #一主一从一arbiter配置参数
  14. config = {_id:"my_repl",members:[
  15. {_id:0,host:"127.0.0.1:28017"},
  16. {_id:1,host:"127.0.0.1:28018"},
  17. {_id:2,host:"127.0.0.1:28019","arbiterOnly":true}]
  18. }

管理复制集

  1. #查询
  2. rs.status() //查看整体复制集状态
  3. rs.isMster() //查看谁是master主节点
  4. rs.conf() //查看复制集配置信息
  5. #添加删除
  6. rs.remove("127.0.0.1:28017") #删除一个节点
  7. rs.add("127.0.0.1:28017") #添加一个节点
  8. rs.addArb(“127.0.0.1:28017”) #添加一个arbiter节点

分片集群(sharding cluster)

sh.help()

  1. 10个实例:398017-38027
  2. 需要两组shard节点,一组config节点(不能有arbiter)和一个mongos节点

mongodb命令及集群 - 图3

搭建两组rs的环境

  1. #多实例目录创建
  2. mkdir -p /mongodb/380{21,22,23,24,25,26}/conf /mongodb/380{21,22,23,24,25,26}/log /mongodb/380{21,22,23,24,25,26}/data
  3. #多实例配置文件
  4. --sh1
  5. cat > /mongodb/38021/conf/mongodb.conf <<EOF
  6. systemLog:
  7. destination: file
  8. path: /mongodb/38021/log/mongodb.log
  9. logAppend: true
  10. storage:
  11. journal:
  12. enabled: true
  13. dbPath: /mongodb/38021/data
  14. directoryPerDB: true
  15. #engine: wiredTiger
  16. wiredTiger:
  17. engineConfig:
  18. cacheSizeGB: 1
  19. directoryForIndexes: true
  20. collectionConfig:
  21. blockCompressor: zlib
  22. indexConfig:
  23. prefixCompression: true
  24. net:
  25. bindIp: 172.16.0.7,127.0.0.1
  26. port: 38021
  27. replication:
  28. oplogSizeMB: 2048
  29. replSetName: sh1
  30. sharding:
  31. clusterRole: shardsvr
  32. processManagement:
  33. fork: true
  34. EOF
  35. cp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/
  36. cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/
  37. sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -i
  38. sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i
  39. --sh2
  40. cat > /mongodb/38024/conf/mongodb.conf <<EOF
  41. systemLog:
  42. destination: file
  43. path: /mongodb/38024/log/mongodb.log
  44. logAppend: true
  45. storage:
  46. journal:
  47. enabled: true
  48. dbPath: /mongodb/38024/data
  49. directoryPerDB: true
  50. wiredTiger:
  51. engineConfig:
  52. cacheSizeGB: 1
  53. directoryForIndexes: true
  54. collectionConfig:
  55. blockCompressor: zlib
  56. indexConfig:
  57. prefixCompression: true
  58. net:
  59. bindIp: 172.16.0.7,127.0.0.1
  60. port: 38024
  61. replication:
  62. oplogSizeMB: 2048
  63. replSetName: sh2
  64. sharding:
  65. clusterRole: shardsvr
  66. processManagement:
  67. fork: true
  68. EOF
  69. cp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/
  70. cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/
  71. sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -i
  72. sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i
  73. #启动
  74. mongod -f /mongodb/38021/conf/mongodb.conf
  75. mongod -f /mongodb/38022/conf/mongodb.conf
  76. mongod -f /mongodb/38023/conf/mongodb.conf
  77. mongod -f /mongodb/38024/conf/mongodb.conf
  78. mongod -f /mongodb/38025/conf/mongodb.conf
  79. mongod -f /mongodb/38026/conf/mongodb.conf

配置两组rs的节点

  1. mongo --port 38021 admin
  2. #第一组rs的配置参数
  3. config = {_id: 'sh1', members: [
  4. {_id: 0, host: '172.16.0.7:38021'},
  5. {_id: 1, host: '172.16.0.7:38022'},
  6. {_id: 2, host: '172.16.0.7:38023',"arbiterOnly":true}]
  7. }
  8. #第一组启动
  9. rs.initiate(config)
  10. mongo --port 38024
  11. #第二组的rs配置参数
  12. config = {_id: 'sh2', members: [
  13. {_id: 0, host: '172.16.0.7:38024'},
  14. {_id: 1, host: '172.16.0.7:38025'},
  15. {_id: 2, host: '172.16.0.7:38026',"arbiterOnly":true}]
  16. }
  17. #第二组启动
  18. rs.initiate(config)

配置config节点

  1. mkdir -p /mongodb/380{18,19,20}/conf /mongodb/380{18,19,20}/log /mongodb/380{18,19,20}/data
  2. #修改配置文件
  3. cat > /mongodb/38018/conf/mongodb.conf <<EOF
  4. systemLog:
  5. destination: file
  6. path: /mongodb/38018/log/mongodb.conf
  7. logAppend: true
  8. storage:
  9. journal:
  10. enabled: true
  11. dbPath: /mongodb/38018/data
  12. directoryPerDB: true
  13. #engine: wiredTiger
  14. wiredTiger:
  15. engineConfig:
  16. cacheSizeGB: 1
  17. directoryForIndexes: true
  18. collectionConfig:
  19. blockCompressor: zlib
  20. indexConfig:
  21. prefixCompression: true
  22. net:
  23. bindIp: 172.16.0.7,127.0.0.1
  24. port: 38018
  25. replication:
  26. oplogSizeMB: 2048
  27. replSetName: configReplSet
  28. sharding:
  29. clusterRole: configsvr
  30. processManagement:
  31. fork: true
  32. EOF
  33. #配置启动文件
  34. cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/
  35. cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/
  36. sed -i 's#38018#38019#g' /mongodb/38019/conf/mongodb.conf
  37. sed -i 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf
  38. mongod -f /mongodb/38018/conf/mongodb.conf
  39. mongod -f /mongodb/38019/conf/mongodb.conf
  40. mongod -f /mongodb/38020/conf/mongodb.conf
  41. mongo --port 38018 admin
  42. config = {_id: 'configReplSet', members: [
  43. {_id: 0, host: '172.16.0.7:38018'},
  44. {_id: 1, host: '172.16.0.7:38019'},
  45. {_id: 2, host: '172.16.0.7:38020'}]
  46. }
  47. rs.initiate(config)
  48. 注:configserver 可以是一个节点,官方建议复制集。configserver不能有arbiter
  49. 新版本中,要求必须是复制集。
  50. 注:mongodb 3.4之后,虽然要求config serverreplica set,但是不支持arbiter

配置mongos节点

  1. mkdir -p /mongodb/38017/conf /mongodb/38017/log
  2. #修改配置文件
  3. cat > /mongodb/38017/conf/mongos.conf <<EOF
  4. systemLog:
  5. destination: file
  6. path: /mongodb/38017/log/mongos.log
  7. logAppend: true
  8. net:
  9. bindIp: 172.16.0.7,127.0.0.1
  10. port: 38017
  11. sharding:
  12. configDB: configReplSet/172.16.0.7:38018,172.16.0.7:38019,172.16.0.7:38020
  13. processManagement:
  14. fork: true
  15. EOF
  16. #启动
  17. mongos -f /mongodb/38017/conf/mongos.conf

分片集群配置

  1. #连接到其中一个mongos
  2. mongo 172.16.0.7:38017/admin
  3. #添加分片
  4. db.runCommand( { addshard : "sh1/172.16.0.7:38021,172.16.0.7:38022,172.16.0.7:38023",name:"sh1"} )
  5. db.runCommand( { addshard : "sh2/172.16.0.7:38024,172.16.0.7:38025,172.16.0.7:38026",name:"sh2"} )
  6. #整体状态查看
  7. sh.status();
  8. #列出分片
  9. db.runCommand( { listshards : 1 } )

range分片

一个节点上限后才会使用下个节点

  1. --对test库下的vast大表进行range
  2. mongo --port 38017 admin
  3. #创建test库的range索引
  4. db.runCommand( { enablesharding : "test" } )
  5. #创建表索引
  6. use test
  7. db.vast.ensureIndex( { id: 1 } )
  8. #开启分片
  9. use admin
  10. db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
  11. 插入数据验证
  12. use test
  13. for(i=1;i<100000;i++){db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()});}
  14. #hash分片结果测试 sh1 和 sh2 验证
  15. mongo --port 38021 test
  16. db.vast.count();
  17. mongo --port 38024 test
  18. db.vast.count();

hash分片

均匀分布

  1. --对cao库下的vast大表进行hash
  2. mongo --port 38017 admin
  3. #创建cao库的哈希索引
  4. db.runCommand( { enablesharding : "cao" } )
  5. #创建表索引
  6. use cao
  7. db.vast.ensureIndex( { id: "hashed" } )
  8. #开启分片
  9. use admin
  10. sh.shardCollection( "cao.vast", { id: "hashed" } )
  11. #插入数据验证
  12. use cao
  13. for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
  14. #hash分片结果测试 sh1 和 sh2 验证
  15. mongo --port 38021 cao
  16. db.vast.count();
  17. mongo --port 38024 cao
  18. db.vast.count();

sharding cluster管理操作

  1. #mongos节点下 查询节点综合信息
  2. db.vast.count()
  3. 删除分片节点会立即触发blancer,所以生产不用
  4. #admin节点下,添加节点
  5. db.runCommand( { addshard : "sh2/10.0.0.51:38024,10.0.0.51:38025,10.0.0.51:38026",name:"shard2"} )

balancer操作

mongos的一个重要功能,自动巡查shard节点的chunk情况,自动做chunk迁移

  1. 什么时候工作:
  2. 1、自动运行,会检测系统不繁忙的时候做迁移
  3. 2、在做节点删除的时候,立即开始迁移工作
  4. 3balancer只能在预设定的时间窗口运行
  5. #备份的时候可以关闭blancer防止备份文件损坏,备份完再开启
  6. mongos> sh.stopBalancer()
  7. mongos> sh.startBalancer()
  8. #自定义进行的时间段
  9. use config
  10. sh.setBalancerState( true )
  11. db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )
  12. 查看:
  13. sh.status()
  14. --以下作为了解:
  15. 关闭某个集合的balance
  16. sh.disableBalancing("students.grades")
  17. 打开某个集合的balancer
  18. sh.enableBalancing("students.grades")
  19. 确定某个集合的balance是开启或者关闭
  20. db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;