经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
【最佳实践】高可用mongodb集群(1分片+3副本):规划及部署
来源:cnblogs  作者:likingzi  时间:2023/10/11 16:11:33  对本文有异议

结合我们的生产需求,本次详细整理了最新版本 MonogoDB 7.0 集群的规划及部署过程,具有较大的参考价值,基本可照搬使用。
适应数据规模为T级的场景,由于设计了分片支撑,后续如有大数据量需求,可分片横向扩展。

■■■ 分片集群规划

■ Configure hostname、hosts file、ip address

  1. vim /etc/hosts
  2. 7.7.7.11 node1
  3. 7.7.7.12 node2
  4. 7.7.7.13 node3

注:规划、实施、运维均采用host解析的方式判定各个节点,因此需确保该配置文件需正确解析node1、node2、node3.

■ 节点的角色及端口分配

  1. ┌────node1────┬────node2────┬────node3────┬port─┐
  2. mongos servermongos servermongos server20000
  3. ├─────────────┼─────────────┼─────────────┼─────┤
  4. config serverconfig serverconfig server21000
  5. │(Primary) │(Secondary) │(Secondary)
  6. ├─────────────┼─────────────┼─────────────┼─────┤
  7. shard server1shard server1shard server127001
  8. │(Primary) │(Secondary) │(Secondary)
  9. └─────────────┴─────────────┴─────────────┴─────┘

■■■ Pre-task preparation

■ 依赖包

  1. yum install -y libcurl openssl [3.6.23]
  2. yum install -y xz-libs [6.0.0另需]

■ 用户及用户组

  1. groupadd mongod
  2. groupadd mongodb
  3. useradd -g mongod -G mongodb mongod
  4. echo "passwd"|passwd mongod --stdin

■ mongodb 下载、安装

官方所有介质均从这个入口下载:
https://www.mongodb.com/try/download

  1. #20230911 最新版本,选择合适的平台介质
  2. wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-7.0.1.tgz
  3. wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.1.tgz
  4. mkdir -p /u01
  5. KDR=/u01
  6. cd ${KDR}
  7. TGZ=mongodb-linux-x86_64-rhel70-7.0.1
  8. #cp_unzip_chown_ln:
  9. cp /u01/nfs/MongoDB/${TGZ}.tgz .
  10. tar zxvf ${TGZ}.tgz
  11. chown -R mongod:mongod ${TGZ}
  12. ln -s ${KDR}/${TGZ}/bin/* /usr/local/bin/

■ database-tools 下载、安装

6.0版本开始,将数据库相关的工具单独管理,以利于实时升级、发布
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel70-x86_64-100.8.0.tgz
wget https://fastdl.mongodb.org/tools/db/mongodb-database-tools-rhel80-x86_64-100.8.0.tgz

  1. KDR=/u01
  2. cd ${KDR}
  3. TGZ=mongodb-database-tools-rhel70-x86_64-100.8.0
  4. 【后续步骤同上】
  5. #cp_unzip_chown_ln:

■ mongosh 下载、安装

https://downloads.mongodb.com/compass/mongosh-2.0.0-linux-x64.tgz

  1. KDR=/u01
  2. cd ${KDR}
  3. #TGZ=mongosh-1.10.6-linux-x64
  4. TGZ=mongosh-2.0.0-linux-x64
  5. 【后续步骤同上】
  6. #cp_unzip_chown_ln:

■ chronyd

配置时间同步

■ selinux

关闭selinux

■ firewalld

配置防火墙,确保放行这几个端口

  1. firewall-cmd --add-port=20000/tcp --permanent
  2. firewall-cmd --add-port=21000/tcp --permanent
  3. firewall-cmd --add-port=27001-27003/tcp --permanent
  4. firewall-cmd --reload

■ 3个节点创建mongodb数据库文件目录

  1. MongoDir=/u01/mongodb
  2. mkdir -p ${MongoDir}
  3. chown -R mongod:mongod ${MongoDir}
  4. cat >> /etc/profile << EOF
  5. export MongoDir=${MongoDir}
  6. EOF

■ 以下均用mongod用户操作

  1. su - mongod
  2. echo ${MongoDir}

■ 3个节点均建立6个目录:conf、mongos、config、shard1、shard2、shard3

  1. mkdir -p ${MongoDir}/conf
  2. mkdir -p ${MongoDir}/mongos/log
  3. mkdir -p ${MongoDir}/config/data
  4. mkdir -p ${MongoDir}/config/log
  5. mkdir -p ${MongoDir}/shard1/data
  6. mkdir -p ${MongoDir}/shard1/log
  7. mkdir -p ${MongoDir}/shard2/data
  8. mkdir -p ${MongoDir}/shard2/log
  9. mkdir -p ${MongoDir}/shard3/data
  10. mkdir -p ${MongoDir}/shard3/log

■ 检查目录结构

  1. tree ${MongoDir} -L 2 --dirsfirst
  2. ├── conf
  3.    ├── config.conf
  4.    ├── mongos.conf
  5.    ├── shard1.conf
  6.    ├── shard2.conf
  7.    └── shard3.conf
  8. ├── config
  9.    ├── data
  10.    └── log
  11. ├── mongos
  12.    └── log
  13. ├── shard1
  14.    ├── data
  15.    └── log
  16. ├── shard2
  17.    ├── data
  18.    └── log
  19. └── shard3
  20.    ├── data
  21.    └── log

■■■ config server

mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功

■ 配置文件

【3个节点执行】

  1. cat > ${MongoDir}/conf/config.conf << EOF
  2. processManagement:
  3. fork: true
  4. pidFilePath: ${MongoDir}/config/log/configsvr.pid
  5. net:
  6. bindIpAll: true
  7. port: 21000
  8. ipv6: true
  9. maxIncomingConnections: 20000
  10. storage:
  11. dbPath: ${MongoDir}/config/data
  12. wiredTiger:
  13. engineConfig:
  14. cacheSizeGB: 1
  15. systemLog:
  16. destination: file
  17. path: ${MongoDir}/config/log/configsvr.log
  18. logAppend: true
  19. sharding:
  20. clusterRole: configsvr
  21. replication:
  22. replSetName: configs
  23. setParameter:
  24. connPoolMaxConnsPerHost: 20000
  25. EOF

■ 启动3个 config server

  1. mongod -f ${MongoDir}/conf/config.conf

■ 登录任意一台配置服务器,初始化配置副本集

  1. mongosh node1:21000
  2. 定义config变量:
  3. config = {_id: "configs", members: [
  4. {_id: 0, host: "node1:21000"},
  5. {_id: 1, host: "node2:21000"},
  6. {_id: 2, host: "node3:21000"} ]
  7. }
  8. 其中,_id: "configs"应与配置文件中的配置一致,"members" 中的 "host" 为三个节点的 ip port
  9. 初始化副本集:
  10. rs.initiate(config)
  11. 查看此时状态:
  12. rs.status()

■■■ shard server

■ shard server1

【3个节点执行】
【注意】如果数据量并不大,分片需求不明显,可以先只创建shard server1,另外的分片2、分片3先不创建,后续根据实际需求可随时创建。

  1. cat > ${MongoDir}/conf/shard1.conf << EOF
  2. processManagement:
  3. fork: true
  4. pidFilePath: ${MongoDir}/shard1/log/shard1.pid
  5. net:
  6. bindIpAll: true
  7. port: 27001
  8. ipv6: true
  9. maxIncomingConnections: 20000
  10. storage:
  11. dbPath: ${MongoDir}/shard1/data
  12. wiredTiger:
  13. engineConfig:
  14. cacheSizeGB: 5
  15. systemLog:
  16. destination: file
  17. path: ${MongoDir}/shard1/log/shard1.log
  18. logAppend: true
  19. sharding:
  20. clusterRole: shardsvr
  21. replication:
  22. replSetName: shard1
  23. security:
  24. keyFile: ${MongoDir}/conf/mongo.keyfile
  25. setParameter:
  26. connPoolMaxConnsPerHost: 20000
  27. maxNumActiveUserIndexBuilds: 6
  28. EOF

启动3个 shard1 server:
mongod -f ${MongoDir}/conf/shard1.conf

登陆任意节点,初始化副本集:
注:初始化副本集的操作不能在仲裁节点上执行!在哪个节点初始化,则哪个节点默认是副本集的主节点。

  1. mongosh --port 27001
  2. 使用admin数据库,定义副本集配置,"arbiterOnly":true 代表其为仲裁节点:
  3. use admin
  4. #模式选择 P/S/S
  5. config = {_id: "shard1", members: [
  6. {_id: 0, host: "node1:27001"},
  7. {_id: 1, host: "node2:27001"},
  8. {_id: 2, host: "node3:27001"}
  9. ]
  10. }
  11. #模式选择 P/S/A
  12. config = {_id: "shard1", members: [
  13. {_id: 0, host: "node1:27001"},
  14. {_id: 1, host: "node2:27001"},
  15. {_id: 2, host: "node3:27001", arbiterOnly:true}
  16. ]
  17. }
  18. rs.initiate(config);
  19. rs.status()

■ shard server2 【备用,暂不执行】

■ shard server3 【备用,暂不执行】

■■■ mongos server

【3个节点执行】
注:需先启动 config server 和 shard server, 后启动 mongos server (3个节点)

  1. cat > ${MongoDir}/conf/mongos.conf << EOF
  2. processManagement:
  3. fork: true
  4. pidFilePath: ${MongoDir}/mongos/log/mongos.pid
  5. net:
  6. bindIpAll: true
  7. port: 20000
  8. ipv6: true
  9. maxIncomingConnections: 20000
  10. systemLog:
  11. destination: file
  12. path: ${MongoDir}/mongos/log/mongos.log
  13. logAppend: true
  14. sharding:
  15. configDB: configs/node1:21000,node2:21000,node3:21000
  16. EOF

启动3个 mongos server:
mongos -f ${MongoDir}/conf/mongos.conf

■■■ 启用分片机制

以上配置过程可见,mongos server 只有 configsvr 配置信息,并无 shardsvr 的信息,因此还需设置使分片可用,否则是无法使用分片的,就是说:shardsvr 无法直接操作,只能通过 mongos server 启用分片机制后,才能操作
问题:如果只有一个分片,还需要设置吗?答案是:需要,原因见上。

■ 3.6.23 / 7.0.0

登陆任一 mongos server, 使用 admin 数据库,串联路由服务器与分配副本集:

  1. mongosh node1:20000
  2. use admin
  3. sh.addShard("shard1/node1:27001,node2:27001,node3:27001")
  4. 查看集群状态:
  5. sh.status()
  6. sh.removeShard("shard2")

■■■ 使用分片机制

暂不涉及,后续可视需要再配置。

■■■ 用户权限配置

对于搭建好的mongodb分片集群,为了安全,需启动安全认证,使用账号密码登录。
默认的mongodb是不设置认证的。只要ip和端口正确就能连接,这样是很不安全的。
mongodb官网声称,为了能保障mongodb的安全可以做以下几个步骤:
1、使用新的端口,默认的27017端口如果一旦知道了ip就能连接上,不太安全
2、设置mongodb的网络环境,最好将mongodb部署到公司服务器内网,这样外网是访问不到的。公司内部访问使用vpn等
3、开启安全认证。认证要同时设置服务器之间的内部认证方式,同时要设置客户端连接到集群的账号密码认证方式
以下详细描述如何配置安全认证。

■ node1 创建副本集认证的key文件

用openssl生成密码文件,然后使用chmod来更改文件权限,仅为文件所有者提供读取权限

  1. cd ${MongoDir}/conf
  2. openssl rand -out mongo.keyfile -base64 90
  3. chmod 600 mongo.keyfile
  4. ll mongo.keyfile
  5. -r-------- 1 mongod mongod 122 Aug 4 08:33 mongo.keyfile

提示:所有副本集节点都必须要用同一份keyfile,一般是在一台机器上生成,然后拷贝到其他机器上,且必须有读的权限,否则将来会报错:
permissions on ${MongoDir}/conf/mongo.keyfile are too open

■ node1 修改配置文件指定keyfile

编辑配置文件,添加如下内容:

  1. for FILE in ${MongoDir}/conf/{config,shard1,mongos}.conf
  2. do
  3. cat >> ${FILE} << EOF
  4. security:
  5. keyFile: /u01/mongodb/conf/mongo.keyfile
  6. EOF
  7. done

■ node1 将修改后的配置文件和key文件拷贝到 node2、node3

  1. scp ${MongoDir}/conf/{config.conf,shard[1-3].conf,mongos.conf,mongo.keyfile} node2:${MongoDir}/conf
  2. scp ${MongoDir}/conf/{config.conf,shard[1-3].conf,mongos.conf,mongo.keyfile} node3:${MongoDir}/conf

■ 重新启动节点

依次启动配置节点、分片节点、路由节点

■ 创建帐号和认证

客户端mongosh,通过localhost或127.0.0.1登录任意一个mongos路由,可以执行创建操作
提示:此时相当于一个后门,只能在 admin 下添加用户
提示:通过mongos添加的账号信息,只会保存到配置节点的服务中,具体的数据节点不保存账号信息,因此分片中的账号信息不涉及到同步问题
建议:先创建超管用户和普通用户,然后再开启安全配置

创建管理员帐号:

  1. use admin
  2. db.createUser({user: "admin", pwd: "passwd!2#", roles: ["root"]})
  3. db.createUser({user: "inspur", pwd: "passwd!2#", roles: ["userAdminAnyDatabase"]})
  4. db.dropUser("inspur")
  5. 鉴权操作:
  6. db.auth("admin", "passwd!2#")
  7. db.auth("inspur", "passwd!2#")

创建一个普通权限帐号:

  1. use testdb
  2. db.createUser({user: "liking", pwd: "passwd!2#", roles: ["readWrite"]})
  3. db.auth("liking", "passwd!2#")

■ 用管理员帐号可查看整体的分片情况

  1. use admin
  2. db.auth("admin", "passwd!2#")
  3. sh.status()

■ 用普通帐号访问数据

  1. use testdb
  2. db.auth("liking", "passwd!2#")

■ 客户端连接多个mongos的标准格式

  1. mongosh mongodb://'admin':'passwd%212%23'@node1:20000,node2:20000,node3:20000/testdb?authSource=admin

原文链接:https://www.cnblogs.com/likingzi/p/17756486.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号