集群搭建

key生成

  • MongoDB使用keyfile认证,副本集中的每个mongod实例使用keyfile内容作为认证其他成员的共享密码。mongod实例只有拥有正确的keyfile才可以加入副本集。
  • keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。
  • 有一点要注意是的:在UNIX系统中,keyFile必须没有组权限或完全权限(也就是权限要设置成X00的形式)。Windows系统中,keyFile权限没有被检查。
  • 可以使用任意方法生成keyFile。例如,如下操作使用openssl生成复杂的随机的1024个字符串。然后使用chmod修改文件权限,只给文件拥有者提供读权限。

    1. # 400权限是要保证安全性,否则mongod启动会报错
    2. openssl rand -base64 756 > mongodb.key
    3. chmod 400 mongodb.key

    docker-compose

    1. version: '3.3'
    2. services:
    3. mongodb1:
    4. image: mongo:4.4
    5. volumes:
    6. - ./mongo1:/data/db
    7. - ./mongodb.key:/data/mongodb.key
    8. user: root
    9. environment:
    10. - MONGO_INITDB_ROOT_USERNAME=intbee
    11. - MONGO_INITDB_ROOT_PASSWORD=mongoPass
    12. - MONGO_INITDB_DATABASE=intbee
    13. container_name: mongodb1
    14. ports:
    15. - 37017:27017
    16. command: mongod --replSet mongos --keyFile /data/mongodb.key
    17. restart: always
    18. entrypoint:
    19. - bash
    20. - -c
    21. - |
    22. chmod 400 /data/mongodb.key
    23. chown 999:999 /data/mongodb.key
    24. exec docker-entrypoint.sh $$@
    25. mongodb2:
    26. image: mongo:4.4
    27. volumes:
    28. - ./mongo2:/data/db
    29. - ./mongodb.key:/data/mongodb.key
    30. user: root
    31. environment:
    32. - MONGO_INITDB_ROOT_USERNAME=intbee
    33. - MONGO_INITDB_ROOT_PASSWORD=mongoPass
    34. - MONGO_INITDB_DATABASE=intbee
    35. container_name: mongodb2
    36. ports:
    37. - 37018:27017
    38. command: mongod --replSet mongos --keyFile /data/mongodb.key
    39. restart: always
    40. entrypoint:
    41. - bash
    42. - -c
    43. - |
    44. chmod 400 /data/mongodb.key
    45. chown 999:999 /data/mongodb.key
    46. exec docker-entrypoint.sh $$@
    47. mongodb3:
    48. image: mongo:4.4
    49. volumes:
    50. - ./mongo3:/data/db
    51. - ./mongodb.key:/data/mongodb.key
    52. user: root
    53. environment:
    54. - MONGO_INITDB_ROOT_USERNAME=intbee
    55. - MONGO_INITDB_ROOT_PASSWORD=mongoPass
    56. - MONGO_INITDB_DATABASE=intbee
    57. container_name: mongodb3
    58. ports:
    59. - 37019:27017
    60. command: mongod --replSet mongos --keyFile /data/mongodb.key
    61. restart: always
    62. entrypoint:
    63. - bash
    64. - -c
    65. - |
    66. chmod 400 /data/mongodb.key
    67. chown 999:999 /data/mongodb.key
    68. exec docker-entrypoint.sh $$@
    69. mongodb-init:
    70. image: mongo:4.4
    71. depends_on:
    72. - mongodb1
    73. - mongodb2
    74. - mongodb3
    75. restart: on-failure:3
    76. command:
    77. - mongo
    78. - mongodb://intbee:mongoPass@10.0.2.69:37017/admin
    79. - --eval
    80. - 'rs.initiate({ _id: "mongos", members: [{_id:1,host:"10.0.2.69:37017"},{_id:2,host:"10.0.2.69:37018"},{_id:3,host:"10.0.2.69:37019"}]})'

    说明:

    chown 999:999 /data/mongodb.key 999用户是容器中的mongod用户,通过chown修改文件用户权限

启动集群

  1. # 集群启动
  2. docker-compose -f docker-compose-set.yml up -d
  3. # 进入任一容器
  4. docker exec -it mongodb1 /bin/bash
  5. # 登录
  6. mongo -u intbee -p mongoPass
  7. # 查看状态
  8. rs.status()
  9. # 初始化集群
  10. rs.initiate({_id: "mongos",
  11. members: [
  12. { _id : 0, host : "10.0.2.69:37017" },
  13. { _id : 1, host : "10.0.2.69:37018" },
  14. { _id : 2, host : "10.0.2.69:37019" }
  15. ]
  16. });

集群管理

节点管理

必须在PRIMARY节点上执行

  1. rs.remove("10.0.2.69:37018") #移除members
  2. rs.reconfig()
  3. rs.add({priority:0,votes:0,host:"10.0.2.69:37018"}) #添加members
  4. rs.reconfig()

数据备份与导入

必须开启ReplicaSet模式进行导入,否则子节点无法同步

  1. mongodump -h 192.168.56.201:37018 -u intbee -p mongoPass -o /backup/mongo
  2. # Primary节点
  3. mongorestore -h 192.168.56.201:37017 -u intbee -p mongoPass /backup/mongo
  4. # 相关参数:--drop --numParallelCollections=8 --numInsertionWorkersPerCollection=5000 --noIndexRestore

关键参数

writeConcern

{ w: , j: , wtimeout: } w:2 表示至少写入 2 个节点才返回。wtimeout 表示超时时间,还有一个参加 j 可以设置 true,false 表示是否是写入日志才返回