CentOS7mongodb6副本集安装部署

mongodb 6.0.4社区版
CentOS7
正常的副本集需要三台主机,一主两从或者一主一从一仲裁,集群可以实现高可用,主节点宕机之后通过选举产生新的主节点。我只有两台主机,根据实际的需求,我要部署的是一主一从,不进行选举,部署过程大致相同,以作参考。
除了第8点和第9点,主从两个节点都需要进行同样的操作,建议先主后从
除了第8点和第9点,主从两个节点都需要进行同样的操作,建议先主后从
除了第8点和第9点,主从两个节点都需要进行同样的操作,建议先主后从
社区版下载地址,根据需求选择版本
https://www.mongodb.com/try/download/community
在这里插入图片描述
mongo shell地址https://www.mongodb.com/try/download/shell

  1. 检查系统配置
    系统推荐配置,详细见:
    https://www.mongodb.com/docs/manual/administration/production-notes/
    UNIXulimit设置,详细见:
    https://www.mongodb.com/docs/manual/reference/ulimit/
    主要检查如下:
  • 内存
    从 MongoDB 3.4 开始,默认的 WiredTiger 内部缓存大小是以下两者中较大的一个:
    (RAM - 1 GB) 的 50%,或256MB。
    总共有 4GB RAM 的系统,,将使用0.5 * (4 GB - 1 GB) = 1.5 GB
    总共有 1.25 GB RAM 的系统,将使用0.5 * (1.25 GB - 1 GB) = 128 MB < 256 MB
  • 时钟同步
    MongoDB组件保留逻辑时钟以支持依赖于时间的操作
  • 内核以及文件系统
    使用WiredTiger 存储引擎,强烈建议对数据承载节点使用 XFS,以避免使用 EXT4 和 WiredTiger 时可能出现的性能问题。
    如果使用 XFS 文件系统,请至少使用 2.6.25Linux 内核版本。
    如果使用 EXT4 文件系统,请至少使用 2.6.28Linux 内核版本。
    在 Red Hat Enterprise Linux 和 CentOS 上,至少使用 2.6.18-194Linux 内核版本。
  1. 安装前准备
  • 系统C库
[root@zzx ~]# yum update glibc
  • 关闭SELinux
[root@zzx ~]# setenforce 0
[root@zzx ~]# vi /etc/selinux/config
SELINUX=disabled
  • 关闭防火墙或开放需要的业务端口
[root@zzx ~]# systemctl stop firewalld
[root@zzx ~]# systemctl disable firewalld
  • 设置参数
[root@zzx ~]# sysctl -w vm.max_map_count=262144
[root@zzx ~]# sysctl -w vm.swappiness=0
[root@zzx ~]# vi /etc/sysctl.conf
vm.swappiness = 0
vm.max_map_count = 262144
[root@zzx ~]# sysctl -p
  • 透明巨页设置
[root@zzx ~]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
[root@zzx ~]# echo "never" >  /sys/kernel/mm/transparent_hugepage/defrag
  • ulimit
[root@zzx ~]# vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65535
[root@zzx ~]# reboot
  • 通用环境
[root@zzx ~]# yum -y install make gcc gcc-c++ openssl openssl-devel openssh-clients wget curl tcpdump bind-utils lrzsz nc screen sysstat iotop htop lsof vim ntp unzip patch parted
  • 安装所需的依赖项(官网要求)
[root@zzx ~]# yum install -y libcurl openssl xz-libs
  • 创建用户并切换用户
[root@zzx ~]# useradd mongo
[root@zzx ~]# passwd mongo
[root@zzx ~]# su - mongo
  1. 开始安装:
  • 上传并解压tar包
[mongo@zzx ~]$ tar -zxvf mongodb-linux-x86_64-rhel70-6.0.4.tgz
  • 解压后创建相关目录及文件
[mongo@zzx ~]$ mv mongodb-linux-x86_64-rhel70-6.0.4 ~/mongodb
[mongo@zzx ~]$ mkdir -p ~/mongodb/{data,log,conf}
[mongo@zzx ~]$ touch ~/mongodb/conf/mongodb.conf
[mongo@zzx ~]$ touch ~/mongodb/log/mongodb.log
  • mongodb配置文件
    此时mongodb未建立用户无法进行验证,所以注释掉security段,还未进行副本集初始化,注释掉replication段。之后再放开。
    bindIp为绑定的IP,比如写192.168.13.13,就只能从此ip进行访问。
[mongo@zzx ~]$ vi ~/mongodb/conf/mongodb.conf
systemLog:
  #MongoDB发送所有日志输出的目标指定为文件
  destination: file
  #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
  path: "/home/mongo/mongodb/log/mongodb.log"
  #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾>。
  logAppend: true
  logRotate: rename
storage:
  #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
  dbPath: "/home/mongo/mongodb/data"
  # mongodb数据库的存储引擎,wiredTiger存储引擎(3.2开始默认使用)
  engine: "wiredTiger"
  journal:
  #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
    enabled: true
processManagement:
  #启用在后台运行mongos或mongod进程的守护进程模式。
  fork: true
  pidFilePath: "/home/mongo/mongodb/conf/mongod.pid"
net:
  #服务实例绑定的IP,默认是localhost
  bindIp: 0.0.0.0
  #绑定的端口,默认是27017
  port: 27017
  # mongod/mongos进程允许的最大连接数
  maxIncomingConnections: 50000
#security:
  # MondoDB认证功能
  #authorization: enabled
  #keyFile: /home/mongo/mongodb/conf/mongo.key
#setParameter:
  # 本地主机绕过身份验证
  #enableLocalhostAuthBypass: false
#replication:
  #副本集的名称
  #replSetName: zzx
  • 启动数据库
    如果有提示报错,大概率是文件路径不对,检查一下
[mongo@zzx ~]$ ~/mongodb/bin/mongod -f ~/mongodb/conf/mongodb.conf
about to fork child process, waiting until server is ready for connections.	
forked process: 1204
child process started successfully, parent exiting
  1. 安装mongodb shell
    mongodb shell是字符界面的连接工具,现在的版本不自带工具了,需要自行下载
[root@zzx ~]# rpm -ivh mongodb-mongosh-1.7.1.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:mongodb-mongosh-1.7.1-1.el8      ################################# [100%]
  1. 设置用户名和密码
    第一次进入时会有很多提示信息
  • 推荐用云上的相关服务,我们使用db.disableFreeMonitoring()关闭
  • 强烈建议使用XFS
  • 未使用auth验证,我们稍后会开启
  • mongo会匿名发送数据,我们使用disableTelemetry()关闭
  • 也会有系统参数需要调整的信息,自行百度解决
[mongo@zzx ~]$ mongosh
进入之后先建立root用户,之后关闭一些提示信息,解决一下需要解决的报错
> use admin
> db.createUser({user:"root",pwd:"zzxcool",roles:[{role:"root",db:"admin"}]})
禁用匿名发送数据
> disableTelemetry()
禁用云监控提醒
> db.disableFreeMonitoring()
> db.system.users.find()
> exit
  1. 编写启动与停止mongodb脚本
echo "/home/mongo/mongodb/bin/mongod -f /home/mongo/mongodb/conf/mongodb.conf" >> start.sh
chmod +x start.sh
echo "/home/mongo/mongodb/bin/mongod --shutdown -f /home/mongo/mongodb/conf/mongodb.conf" >> stop.sh
chmod +x stop.sh
  1. 关闭服务之后,修改集群配置文件,启动服务
[mongo@zzx ~]$ sh ~/stop.sh
[mongo@zzx ~]$ vi ~/mongodb/conf/mongodb.conf
去掉这两行注释,开启副本集,验证模块暂时不管
(因为我实验的时候开了验证之后集群通信出现问题了,为了保准还是集群没问题之后再开)
replication:
  #副本集的名称
  replSetName: zzx
[mongo@zzx ~]$ sh ~/start.sh

校验root用户

[mongo@zzx ~]$ mongosh
> use admin
> db.auth("root","zzxcool")
> show dbs
admin   180.00 KiB
config   60.00 KiB
local    72.00 KiB
> exit
  1. 集群初始化
    !!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!进入主节点初始化集群!!!!!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!
[mongo@zzx ~]$ mongosh
> rs.initiate({_id:'mdbA',members:[{_id:0,host:'192.168.111.111:27017'}]})
{ "ok" : 1 }
zzx [direct: primary] admin>
  • “ok”的值为1,说明创建成功。
  • 命令行提示符发生变化,变成了一个从节点角色,此时默认不能读写。稍等片刻,回车,变成主节点。
  • 这里的host值需要填写IP地址,可以直接执行rs.initiate(),会生成默认配置,IP处默认是主机名,无法进行解析的话会影响集群通信
    查看副本集的配置内容的命令(结果不演示了,文章最后有完整版)
> rs.conf()
  • “_id” :副本集的配置数据存储的主键值,默认就是副本集的名字
  • “members” :副本集成员数组,此时只有一个: host: ‘192.168.111.111:27017’,该成员不
    是仲裁节点: arbiterOnly: false ,优先级(权重值):priority: 1,
  • “settings” :副本集的参数配置。
    查看当前集群状态(结果不演示了,文章最后有完整版)
rs.status()

在这里插入图片描述

  • “set” : 副本集的名字
  • “State” : 1:说明状态正常
  • “members” :副本集成员数组,此时只有一个:name: ‘192.168.111.111:27017’ ,该成员的
    角色是 stateStr: ‘PRIMARY’, 该节点是健康的: health: 1 。
  1. 添加从节点
    !!!在主节点添加从节点,将其他成员加入到副本集,命令如下:
> rs.add( { host: "192.168.111.112:27017", priority: 0, votes: 0 } )
  • 添加从节点时,设置节点的priority和votes都是0,也就说它们并没有选主的权限。这是因为,从节点初始化和同步数据需要一段时间,如果刚好在此时发生选主,如果这些还在同步初始化的节点有投票权,就会有可能无法选主成功。因此我们开始时将这些新加的node设置无投票权,等到初始化完成,节点变成secondary,再将priority和votes修改为预期值
  • 删除节点用rs.remove(“192.168.111.112:27017”)
  • 修改主机信息用
    zzx [direct: primary] admin> cfg.members[1].host=“192.168.111.113:27017”
    zzx [direct: primary] admin> rs.reconfig(cfg)
  • 我只有两台主机,只想做主从集群,不想让服务地址变化,只有主节点提供服务,如果有需要请参考大神的文章

成功后查看集群状态,没问题之后可以登录从节点看看命令提示符是否变化。

zzx [direct: secondary] test> 
  1. 关闭服务,添加验证配置,启动服务
    先修改配置
[mongo@zzx ~]$ sh ~/stop.sh
[mongo@zzx ~]$ vi ~/mongodb/conf/mongodb.conf
去掉这几行注释
security:
  # MondoDB认证功能
  authorization: enabled
  keyFile: /home/mongo/mongodb/conf/mongo.key
setParameter:
  # 本地主机禁止绕过身份验证
  enableLocalhostAuthBypass: false

添加集群验证文件
正常单机部署不需要keyFile文件,只需要auth参数
副本集服务器,开启auth参数的同时,必须指定keyfile参数,节点之间的通讯基于该keyfile,key长度必须在6到1024个字符之间,最好为3的倍数,不能含有非法字符。
若开启auth参数不配置keyFile,在启动mongo时会报错:“BadValue: security.keyFile is required when authorization is enabled with replica sets”

[mongo@zzx ~]$ openssl rand -base64 90 -out /home/mongo/mongodb/conf/mongo.key
[mongo@zzx ~]$ chmod 600 /home/mongo/mongodb/conf/mongo.key

把此文件直接复制到从节点主机,不能粘贴内容,需要复制文件
启动服务

[mongo@zzx ~]$ sh ~/start.sh

查看集群状态(完整结果)

[mongo@zzx ~]$ mongosh 
Current Mongosh Log ID: *
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.7.1
Using MongoDB:          6.0.4
Using Mongosh:          1.7.1

For mongosh info see: https://docs.mongodb.com/mongodb-shell/

zzx [direct: primary] test> rs.conf()          ##这步可以看到没有通过验证无法查询数据
MongoServerError: command replSetGetConfig requires authentication
zzx [direct: primary] test> use admin
switched to db admin
zzx [direct: primary] admin> db.auth("root","zzxcool")
{ ok: 1 }
ygxy [direct: primary] admin> rs.conf()
{
  _id: 'zzx',
  version: 2,
  term: 2,
  members: [
    {
      _id: 0,
      host: '192.168.111.111:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long("0"),
      votes: 1
    },
    {
      _id: 1,
      host: '192.168.111.112:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 0,
      tags: {},
      secondaryDelaySecs: Long("0"),
      votes: 0
    }
  ],
  protocolVersion: Long("1"),
  writeConcernMajorityJournalDefault: true,
  settings: {
    chainingAllowed: true,
    heartbeatIntervalMillis: 2000,
    heartbeatTimeoutSecs: 10,
    electionTimeoutMillis: 10000,
    catchUpTimeoutMillis: -1,
    catchUpTakeoverDelayMillis: 30000,
    getLastErrorModes: {},
    getLastErrorDefaults: { w: 1, wtimeout: 0 },
    replicaSetId: ObjectId("63ed8aec2caa00e8f420c795")
  }
}
ygxy [direct: primary] admin> rs.status()
{
  set: 'zzx',
  date: ISODate("2023-02-16T08:58:33.396Z"),
  myState: 1,
  term: Long("2"),
  syncSourceHost: '',
  syncSourceId: -1,
  heartbeatIntervalMillis: Long("2000"),
  majorityVoteCount: 1,
  writeMajorityCount: 1,
  votingMembersCount: 1,
  writableVotingMembersCount: 1,
  optimes: {
    lastCommittedOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
    lastCommittedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
    readConcernMajorityOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
    appliedOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
    durableOpTime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
    lastAppliedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
    lastDurableWallTime: ISODate("2023-02-16T08:58:31.859Z")
  },
  lastStableRecoveryTimestamp: Timestamp({ t: 1676537851, i: 1 }),
  electionCandidateMetrics: {
    lastElectionReason: 'electionTimeout',
    lastElectionDate: ISODate("2023-02-16T03:29:41.206Z"),
    electionTerm: Long("2"),
    lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 0, i: 0 }), t: Long("-1") },
    lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1676517921, i: 1 }), t: Long("1") },
    numVotesNeeded: 1,
    priorityAtElection: 1,
    electionTimeoutMillis: Long("10000"),
    numCatchUpOps: Long("0"),
    newTermStartDate: ISODate("2023-02-16T03:29:41.213Z"),
    wMajorityWriteAvailabilityDate: ISODate("2023-02-16T03:29:41.236Z")
  },
  members: [
    {
      _id: 0,
      name: '192.168.111.111:27017',
      health: 1,
      state: 1,
      stateStr: 'PRIMARY',
      uptime: 19745,
      optime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
      optimeDate: ISODate("2023-02-16T08:58:31.000Z"),
      lastAppliedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
      lastDurableWallTime: ISODate("2023-02-16T08:58:31.859Z"),
      syncSourceHost: '',
      syncSourceId: -1,
      infoMessage: '',
      electionTime: Timestamp({ t: 1676518181, i: 1 }),
      electionDate: ISODate("2023-02-16T03:29:41.000Z"),
      configVersion: 2,
      configTerm: 2,
      self: true,
      lastHeartbeatMessage: ''
    },
    {
      _id: 1,
      name: '192.168.111.112:27017',
      health: 1,
      state: 2,
      stateStr: 'SECONDARY',
      uptime: 19724,
      optime: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
      optimeDurable: { ts: Timestamp({ t: 1676537911, i: 1 }), t: Long("2") },
      optimeDate: ISODate("2023-02-16T08:58:31.000Z"),
      optimeDurableDate: ISODate("2023-02-16T08:58:31.000Z"),
      lastAppliedWallTime: ISODate("2023-02-16T08:58:31.859Z"),
      lastDurableWallTime: ISODate("2023-02-16T08:58:31.859Z"),
      lastHeartbeat: ISODate("2023-02-16T08:58:32.289Z"),
      lastHeartbeatRecv: ISODate("2023-02-16T08:58:32.027Z"),
      pingMs: Long("0"),
      lastHeartbeatMessage: '',
      syncSourceHost: '192.168.111.111:27017',
      syncSourceId: 0,
      infoMessage: '',
      configVersion: 2,
      configTerm: 2
    }
  ],
  ok: 1,
  '$clusterTime': {
    clusterTime: Timestamp({ t: 1676537911, i: 1 }),
    signature: {
      hash: Binary(Buffer.from("128984a71cc21015dc29e8392926d40a16835fce", "hex"), 0),
      keyId: Long("7200564125452206086")
    }
  },
  operationTime: Timestamp({ t: 1676537911, i: 1 })
}

添加普通用户

> db.createUser({user:'zzx',pwd:'zzxcool',roles:[{role:'dbOwner',db:'zzxcool'}]})
> use admin
> db.system.users.find()
  1. 安装mongodb compass
    compass是mongo官方的可视化工具,感觉比navicat好用一些
    下载https://www.mongodb.com/try/download/compass
    安装之后填写主机信息即可连接

  2. MongoDB 备份方法
    https://www.mongodb.com/docs/manual/core/backups/

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
CentOS 7上安装MongoDB需要以下步骤: 1. 下载MongoDB安装包并解压。使用以下命令下载安装包: ``` wget https://downloads.mongodb.com/linux/mongodb-linux-x86_64-enterprise-rhel70-4.4.4.tgz ``` 解压安装包: ``` tar -zxvf mongodb-linux-x86_64-enterprise-rhel70-4.4.4.tgz ``` 2. 将解压后的文件夹移动到/usr/local/mongodb目录下: ``` mv mongodb-linux-x86_64-enterprise-rhel70-4.4.4 /usr/local/mongodb ``` 3. 配置系统变量。使用以下命令编辑/etc/profile文件: ``` vim /etc/profile ``` 在该文件中添加以下内容: ``` # set mongodb config export PATH=/usr/local/mongodb/bin:$PATH ``` 保存并退出编辑器。然后使用以下命令刷新配置: ``` source /etc/profile ``` 4. 配置MongoDB的配置文件。创建数据存放地址和日志存放地址: ``` mkdir /usr/local/mongodb/data/db mkdir /usr/local/mongodb/data/logs ``` 创建日志文件: ``` cd /usr/local/mongodb/data/logs touch mongodb.log ``` 回到MongoDB的主目录: ``` cd /usr/local/mongodb ``` 创建并编辑mongodb.conf文件: ``` vim mongodb.conf ``` 将配置文件的内容粘贴到文件中,并进行必要的修改。 5. 完成以上步骤后,您可以验证MongoDB安装是否成功。如果遇到问题,您可以尝试重启MongoDB: ``` ps -ef|grep mongodb kill -2 PID ``` 这样,您就成功地在CentOS 7上安装MongoDB。请注意,这只是MongoDB的基本安装步骤,如果您需要进一步的安全配置,可以参考引用中的内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值