专栏首页运维经验分享mongodb 3.4 集群搭建升级版 五台集群 原

mongodb 3.4 集群搭建升级版 五台集群 原

mongodb 3.4 集群搭建升级版 五台集群

最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进。如果大家不熟悉什么是分片、副本集、仲裁者的话请先移步查看上一篇文章:mongodb 3.4 集群搭建:分片+副本集

和前一个版本相比,改动点有:

  • 配置文件采用yaml方式来配置
  • 生产中取消了仲裁者的角色,因为仲裁者也不会存储数据,只是起到选举的作用,线上为了保证数据安全,每份数据都会配置两个副本集,也就是每份数据存储了三份。
  • 优化配置,采用五台集群
  • 使用非root账户搭建mongodb集群。

环境准备

系统系统 centos6.9 五台服务器:192.168.0.31/32/33/34/35 安装包: mongodb-linux-x86_64-3.4.6.tgz

服务器规划

服务器31

服务器32

服务器33

服务器34

服务器35

mongos server

mongos server

config server

config server

config server

shard1 server

shard2 server

shard3 server

shard4 server

shard5 server

shard5 server

shard1 server

shard2 server

shard3 server

shard4 server

shard4 server

shard5 server

shard1 server

shard2 server

shard3 server

端口分配:

  1. mongos:20000
  2. config:21000
  3. shard1:27001
  4. shard2:27002
  5. shard3:27003
  6. shard4:27004
  7. shard5:27005

权限分配:

登录root账户,将安装目录和数据目录权限分配给日常操作(youknow)账户

  1. chown -R youknow:youknow /usr/local/
  2. chown -R youknow:youknow /data

mongodb安装

1、下载

下载 mongodb 3.4.6 安装包

  1. curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.6.tgz
  1. #解压
  2. tar -xzvf mongodb-linux-x86_64-3.4.6.tgz -C /usr/local/
  3. #改名
  4. mv mongodb-linux-x86_64-3.4.6 mongodb

2、创建相关目录

根据服务器的规范,分别在对应的服务器上建立conf、mongos、config、shard1、shard2、shard3、shard4、shard5等目录,因为mongos不存储数据,只需要建立日志文件目录即可。

  1. mkdir -p /usr/local/mongodb/conf
  2. mkdir -p /data/mongos/log
  3. mkdir -p /data/config/data
  4. mkdir -p /data/config/log
  5. mkdir -p /data/shard1/data
  6. mkdir -p /data/shard1/log
  7. mkdir -p /data/shard2/data
  8. mkdir -p /data/shard2/log
  9. mkdir -p /data/shard3/data
  10. mkdir -p /data/shard3/log
  11. mkdir -p /data/shard4/data
  12. mkdir -p /data/shard4/log
  13. mkdir -p /data/shard5/data
  14. mkdir -p /data/shard5/log

3、环境变量

为了后续方便操作,配置mongodb的环境变量,需要切到root用户下面

  1. vim /etc/profile
  2. # 内容
  3. export MONGODB_HOME=/usr/local/mongodb
  4. export PATH=$MONGODB_HOME/bin:$PATH
  5. # 使立即生效,在安装用户下(youknow)执行
  6. source /etc/profile

查看mongodb版本信息mongod -v 输出版本信息表明配置环境变量成功

集群配置

1、config server配置服务器

在服务器33、34、35上配置以下内容:

添加配置文件:

添加配置文件

  1. vi /usr/local/mongodb/conf/config.conf
  2. ## content
  3. systemLog:
  4. destination: file
  5. logAppend: true
  6. path: /data/config/log/config.log
  7. # Where and how to store data.
  8. storage:
  9. dbPath: /data/config/data
  10. journal:
  11. enabled: true
  12. # how the process runs
  13. processManagement:
  14. fork: true
  15. pidFilePath: /data/config/log/configsrv.pid
  16. # network interfaces
  17. net:
  18. port: 21000
  19. bindIp: 192.168.0.33
  20. #operationProfiling:
  21. replication:
  22. replSetName: config
  23. sharding:
  24. clusterRole: configsvr

启动三台服务器的config server

  1. numactl --interleave=all mongod --config /usr/local/mongodb/conf/config.conf

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

  1. #连接
  2. mongo 192.168.0.33:21000
  3. #config变量
  4. config = {
  5. ... _id : "config",
  6. ... members : [
  7. ... {_id : 0, host : "192.168.0.33:21000" },
  8. ... {_id : 1, host : "192.168.0.34:21000" },
  9. ... {_id : 2, host : "192.168.0.35:21000" }
  10. ... ]
  11. ... }
  12. #初始化副本集
  13. rs.initiate(config)
  14. #查看分区状态
  15. rs.status();

其中,"_id" : "configs"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的ip和port

这样配置服务器就配置好了

2、配置分片、副本集

配置第一个分片副本集

在服务器 31、32、33上面做以下配置

配置文件

  1. vi /usr/local/mongodb/conf/shard1.conf
  2. #配置文件内容
  3. # where to write logging data.
  4. systemLog:
  5. destination: file
  6. logAppend: true
  7. path: /data/shard1/log/shard1.log
  8. # Where and how to store data.
  9. storage:
  10. dbPath: /data/shard1/data
  11. journal:
  12. enabled: true
  13. wiredTiger:
  14. engineConfig:
  15. cacheSizeGB: 20
  16. # how the process runs
  17. processManagement:
  18. fork: true
  19. pidFilePath: /data/shard1/log/shard1.pid
  20. # network interfaces
  21. net:
  22. port: 27001
  23. bindIp: 192.168.0.33
  24. #operationProfiling:
  25. replication:
  26. replSetName: shard1
  27. sharding:
  28. clusterRole: shardsvr

启动三台服务器的shard1 server

  1. numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard1.conf

登陆任意一台服务器,初始化副本集

  1. mongo 192.168.0.31:27001
  2. #使用admin数据库
  3. use admin
  4. #定义副本集配置
  5. config = {
  6. ... _id : "shard1",
  7. ... members : [
  8. ... {_id : 0, host : "192.168.0.31:27001" },
  9. ... {_id : 1, host : "192.168.0.32:27001" },
  10. ... {_id : 2, host : "192.168.0.33:27001" }
  11. ... ]
  12. ... }
  13. #初始化副本集配置
  14. rs.initiate(config);
  15. #查看分区状态
  16. rs.status();

配置第二个分片副本集

在服务器32、33、34上面做以下配置

配置文件

  1. vi /usr/local/mongodb/conf/shard2.conf
  2. #配置文件内容
  3. # where to write logging data.
  4. systemLog:
  5. destination: file
  6. logAppend: true
  7. path: /data/shard2/log/shard2.log
  8. # Where and how to store data.
  9. storage:
  10. dbPath: /data/shard2/data
  11. journal:
  12. enabled: true
  13. wiredTiger:
  14. engineConfig:
  15. cacheSizeGB: 20
  16. # how the process runs
  17. processManagement:
  18. fork: true
  19. pidFilePath: /data/shard2/log/shard2.pid
  20. # network interfaces
  21. net:
  22. port: 27002
  23. bindIp: 192.168.0.33
  24. #operationProfiling:
  25. replication:
  26. replSetName: shard2
  27. sharding:
  28. clusterRole: shardsvr

启动三台服务器的shard2 server

  1. numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard2.conf

登陆任意一台服务器,初始化副本集

  1. mongo 192.168.0.32:27002
  2. #使用admin数据库
  3. use admin
  4. #定义副本集配置
  5. config = {
  6. ... _id : "shard2",
  7. ... members : [
  8. ... {_id : 0, host : "192.168.0.32:27002" },
  9. ... {_id : 1, host : "192.168.0.33:27002" },
  10. ... {_id : 2, host : "192.168.0.34:27002" }
  11. ... ]
  12. ... }
  13. #初始化副本集配置
  14. rs.initiate(config);
  15. #查看分区状态
  16. rs.status();

配置第三个分片副本集

在服务器33、34、35上面做以下配置

配置文件

  1. vi /usr/local/mongodb/conf/shard3.conf
  2. #配置文件内容
  3. # where to write logging data.
  4. systemLog:
  5. destination: file
  6. logAppend: true
  7. path: /data/shard3/log/shard3.log
  8. # Where and how to store data.
  9. storage:
  10. dbPath: /data/shard3/data
  11. journal:
  12. enabled: true
  13. wiredTiger:
  14. engineConfig:
  15. cacheSizeGB: 20
  16. # how the process runs
  17. processManagement:
  18. fork: true
  19. pidFilePath: /data/shard3/log/shard3.pid
  20. # network interfaces
  21. net:
  22. port: 27003
  23. bindIp: 192.168.0.33
  24. #operationProfiling:
  25. replication:
  26. replSetName: shard3
  27. sharding:
  28. clusterRole: shardsvr

启动三台服务器的shard3 server

  1. numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard3.conf

登陆任意一台服务器,初始化副本集

  1. mongo 192.168.0.33:27003
  2. #使用admin数据库
  3. use admin
  4. #定义副本集配置
  5. config = {
  6. ... _id : "shard3",
  7. ... members : [
  8. ... {_id : 0, host : "192.168.0.33:27003" },
  9. ... {_id : 1, host : "192.168.0.34:27003" },
  10. ... {_id : 2, host : "192.168.0.35:27003" }
  11. ... ]
  12. ... }
  13. #初始化副本集配置
  14. rs.initiate(config);
  15. #查看分区状态
  16. rs.status();

配置第四个分片副本集

在服务器34、35、31上面做以下配置

配置文件

  1. vi /usr/local/mongodb/conf/shard4.conf
  2. #配置文件内容
  3. # where to write logging data.
  4. systemLog:
  5. destination: file
  6. logAppend: true
  7. path: /data/shard4/log/shard4.log
  8. # Where and how to store data.
  9. storage:
  10. dbPath: /data/shard4/data
  11. journal:
  12. enabled: true
  13. wiredTiger:
  14. engineConfig:
  15. cacheSizeGB: 20
  16. # how the process runs
  17. processManagement:
  18. fork: true
  19. pidFilePath: /data/shard4/log/shard4.pid
  20. # network interfaces
  21. net:
  22. port: 27004
  23. bindIp: 192.168.0.35
  24. #operationProfiling:
  25. replication:
  26. replSetName: shard4
  27. sharding:
  28. clusterRole: shardsvr

启动三台服务器的shard4 server

  1. numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard4.conf

登陆任意一台服务器,初始化副本集

  1. mongo 192.168.0.34:27004
  2. #使用admin数据库
  3. use admin
  4. #定义副本集配置
  5. config = {
  6. ... _id : "shard4",
  7. ... members : [
  8. ... {_id : 0, host : "192.168.0.34:27004" },
  9. ... {_id : 1, host : "192.168.0.35:27004" },
  10. ... {_id : 2, host : "192.168.0.31:27004" }
  11. ... ]
  12. ... }
  13. #初始化副本集配置
  14. rs.initiate(config);
  15. #查看分区状态
  16. rs.status();

配置第五个分片副本集

在服务器35、31、32上面做以下配置

配置文件

  1. vi /usr/local/mongodb/conf/shard5.conf
  2. #配置文件内容
  3. # where to write logging data.
  4. systemLog:
  5. destination: file
  6. logAppend: true
  7. path: /data/shard5/log/shard5.log
  8. # Where and how to store data.
  9. storage:
  10. dbPath: /data/shard5/data
  11. journal:
  12. enabled: true
  13. wiredTiger:
  14. engineConfig:
  15. cacheSizeGB: 20
  16. # how the process runs
  17. processManagement:
  18. fork: true
  19. pidFilePath: /data/shard5/log/shard5.pid
  20. # network interfaces
  21. net:
  22. port: 27005
  23. bindIp: 192.168.0.35
  24. #operationProfiling:
  25. replication:
  26. replSetName: shard5
  27. sharding:
  28. clusterRole: shardsvr

启动三台服务器的shard5 server

  1. numactl --interleave=all mongod --config /usr/local/mongodb/conf/shard5.conf

登陆任意一台服务器,初始化副本集

  1. mongo 192.168.0.35:27005
  2. #使用admin数据库
  3. use admin
  4. #定义副本集配置
  5. config = {
  6. ... _id : "shard5",
  7. ... members : [
  8. ... {_id : 0, host : "192.168.0.35:27005" },
  9. ... {_id : 1, host : "192.168.0.31:27005" },
  10. ... {_id : 2, host : "192.168.0.32:27005" }
  11. ... ]
  12. ... }
  13. #初始化副本集配置
  14. rs.initiate(config);
  15. #查看分区状态
  16. rs.status();

至此,五个分片和副本集搭建完毕

3、配置路由服务器 mongos

以下配置在服务器31、32上执行

注意:先启动配置服务器和分片服务器,后启动路由实例

  1. vi /usr/local/mongodb/conf/mongos.conf
  2. systemLog:
  3. destination: file
  4. logAppend: true
  5. path: /data/mongos/log/mongos.log
  6. processManagement:
  7. fork: true
  8. # pidFilePath: /usr/local/mongodb/mongos.pid
  9. # network interfaces
  10. net:
  11. port: 20000
  12. bindIp: 192.168.0.31
  13. #监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
  14. sharding:
  15. configDB: configs/192.168.0.33:21000,192.168.0.34:21000,192.168.0.35:21000

启动二台服务器的mongos server

  1. mongos --config /usr/local/mongodb/conf/mongos.conf

4、启用分片

目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。

登陆任意一台mongos

  1. mongo 192.168.0.31:20000
  2. #使用admin数据库
  3. use admin
  4. #串联路由服务器与分配副本集
  5. sh.addShard("shard1/192.168.0.31:27001,192.168.0.32:27001,192.168.0.33:27001")
  6. sh.addShard("shard2/192.168.0.32:27002,192.168.0.33:27002,192.168.0.34:27002")
  7. sh.addShard("shard3/192.168.0.33:27003,192.168.0.34:27003,192.168.0.35:27003")
  8. sh.addShard("shard4/192.168.0.34:27004,192.168.0.35:27004,192.168.0.31:27004")
  9. sh.addShard("shard5/192.168.0.35:27005,192.168.0.31:27005,192.168.0.32:27005")
  10. #查看集群状态
  11. sh.status()

这样mongodb的五台集群搭建就已经完成了,后期如何优化和运营请查看下一篇文章。

错误

rs.initiate报错

执行 rs.initiate(config); 报错:

  1. rs.initiate(config);
  2. {
  3. "ok" : 0,
  4. "errmsg" : "No host described in new configuration 1 for replica set shard1 maps to this node",
  5. "code" : 93,
  6. "codeName" : "InvalidReplicaSetConfig"
  7. }

最后发现是自己的一个端口号写错了。

启动mongos报错

启动mongos的时候报错:

  1. about to fork child process, waiting until server is ready for connections.
  2. forked process: 1436
  3. ERROR: child process failed, exited with error number 1

这个问题卡了我们半天,找了很多的资料,不是说清理lock文件,就是说清理log文件总无解,最后看到这个网站的提示

ERROR: child process failed, exited with error number 1

去掉了配置文件中 --fork,才将真正的错误日志打印了出来,是我们的配置文件中的路径写错了,本来是log写成了logs

原来:path: /data/logs/mongos.log

改为:path: /data/log/mongos.log

成功

为了方便大家拿取配置文件,我在github上面放置了一份:mongodb-five-cluster-conf

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • redis客户端连接(error) NOAUTH Authentication required

    redis客户端连接成功,但是操作报异常——(error) NOAUTH Authentication required  错误的含义是说你没有认证,说明没有...

    拓荒者
  • mongo自动备份脚本与恢复

    二、新建MongoDB数据库备份脚本(/data/mongodb_bak/MongoDB_bak.sh) 脚本如下:

    拓荒者
  • CentOS7下Tomcat启动慢的原因及解决方案

      在一次CentOS 7系统中安装Tomcat,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的。Tocmat的...

    拓荒者
  • 专家为你揭秘网络安全的5个认识误区

    对于网络安全,经常会有人有这样或者那样的误区,Wired杂志的专栏作家PeterSinger和AllanFriedman最近总结了网络安全常见的5个误区: 误区...

    安恒信息
  • 程序猿的日常——Java基础之clone、序列化、字符串、数组

    其实Java还有很多其他的基础知识,在日常工作技术撕逼中也是经常被讨论的问题。 深克隆与浅克隆 在Java中创建对象有两种方式: 一种是new操作符,它创...

    用户1154259
  • 冷门机强制root

    拥有twrp的可以直接卡刷magisk(但是冷门机根本就没有人适配第三方rec,也没有第三方ROM)比自我的金立s10c

    用户1444933
  • leetcode 25 Reverse Nodes in k-Group

    @坤的
  • 98-简单的TCP客户端

    凯茜的老爸
  • 关于知识蒸馏,这三篇论文详解不可错过

    导语:继《从Hinton开山之作开始,谈知识蒸馏的最新进展》之后,作者对知识蒸馏相关重要进行了更加全面的总结。在上一篇文章中主要介绍了attention tra...

    AI科技大本营
  • 附001.kubectl介绍及使用

    kubectl控制Kubernetes集群管理器,使用Kubernetes命令行工具kubectl在Kubernetes上部署和管理应用程序。使用kubectl...

    木二

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动