mongo 副本集部署

这篇具有很好参考价值的文章主要介绍了mongo 副本集部署。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当前我们使用docker-compose 的方式部署mongodb 副本集。当然,最佳还是使用kubernetes进行mongodb副本集的部署。

环境准备

1.安装docker,docker-compose

生成keyFile

  • MongoDB使用keyFile认证,副本集中的每个MongoDB实例使用内容作为认证其他成员的共享密码。mongodb实例只有拥有正确的keyfile才可以加入副本集
  • keyFile的内容必须是6到1024个字符的长度,且副本集所有成员的keyFile内容必须相同。 这是MongoDB官方推荐keyFile的生成方式:
openssl rand -base64 756 > mongodb.key
chown 999:999 mongodb.key

docker-compose.yaml

这是一份docker-compose.yaml示例。其中需要提前在节点上创建对应的/data/mongo/data/mongo(i)目录;docker-compose.yaml需要与mongodb.key文件在同一目录下。

version: '3.3'


services:
  mongodb1:
    image: mongo:4.4.8
    volumes:
      - /data/mongo/data/mongo1:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
     - MONGO_INITDB_ROOT_USERNAME=root
     - MONGO_INITDB_ROOT_PASSWORD=admin
    container_name: mongodb1
    ports:
      - 37017:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@


  mongodb2:
    image: mongo:4.4.8
    volumes:
      - /data/mongo/data/mongo2:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=admin
    container_name: mongodb2
    ports:
      - 37018:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@


  mongodb3:
    image: mongo:4.4.8
    volumes:
      - /data/mongo/data/mongo3:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=admin
    container_name: mongodb3
    ports:
      - 37019:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

创建mongo 集群

切换到docker-compose.yaml文件所在目录,执行以下启动命令:

docker-compose up -d

预期结果:

[root@test01 mongo]# docker ps | grep mongo
97af9e11c66d   mongo:4.4.8   "bash -c 'chmod 400 …"   About an hour ago   Up About an hour   0.0.0.0:37019->27017/tcp, :::37019->27017/tcp   mongodb3
63ee9801d66f   mongo:4.4.8   "bash -c 'chmod 400 …"   About an hour ago   Up About an hour   0.0.0.0:37017->27017/tcp, :::37017->27017/tcp   mongodb1
9c15ed7476ba   mongo:4.4.8   "bash -c 'chmod 400 …"   About an hour ago   Up About an hour   0.0.0.0:37018->27017/tcp, :::37018->27017/tcp   mongodb2

此时,三个mongo实例已经运行起来了,接下来我们需要将这三个mongo实例配置为一个集群。

mongo集群初始化

连接集群

通过命令docker exec -it mongodb1 /bin/bash进入容器进行配置

进入集群后,执行 mongo -u root -p admin 连接集群,连接成功后如下所示:

root@63ee9801d66f:/# mongo -u root -p admin
MongoDB shell version v4.4.8
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c69a9e0b-e52e-4224-bc81-3f2d09060434") }
MongoDB server version: 4.4.8
---
The server generated these startup warnings when booting: 
        2022-03-08T07:13:51.708+00:00: You are running on a NUMA machine. We suggest launching mongod like this to avoid performance problems: numactl --interleave=all mongod [other options]
        2022-03-08T07:13:51.708+00:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
---
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).


        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.


        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

初始化副本集

在没有初始化副本集的集群中,执行rs.status();命令会得到以下结果:

> rs.status()
{
	"ok" : 0,
	"errmsg" : "command replSetGetStatus requires authentication",
	"code" : 13,
	"codeName" : "Unauthorized"
}

根据mongo服务的地址进行集群初始化:

> rs.initiate({ _id: "mongos", members: [  
   { _id : 0, host : "10.81.138.205:37017" },  
   { _id : 1, host : "10.81.138.205:37018" },  
   { _id : 2, host : "10.81.138.205:37019" },
 ]});

其中 “mongos”是在docker-compose.yaml文件中指定的副本集名称,可根据实际情况修改。

host 后面紧跟着的是刚刚部署的三台mongo的地址(hostIP + port),端口号为docker-compose.yaml中映射的端口号,可根据服务器上的端口使用情况进行调整。

预期结果:

{ "ok" : 1 }

初始化完成后执行rs.status(); 此时命令行中会输出以下文本:

mongos:SECONDARY> rs.status();
{
	"set" : "mongos",
	"date" : ISODate("2022-03-08T06:37:31.168Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"syncSourceHost" : "",
	"syncSourceId" : -1,
 ... ...
	"members" : [
		{
			"_id" : 0,
			"name" : "10.81.138.205:37017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 32,
			"optime" : {
				"ts" : Timestamp(1646721451, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2022-03-08T06:37:31Z"),
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "Could not find member to sync from",
			"electionTime" : Timestamp(1646721450, 1),
			"electionDate" : ISODate("2022-03-08T06:37:30Z"),
			"configVersion" : 1,
			"configTerm" : 1,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
... ...

到这里集群的部署就完成了。

连接集群

你需要知道的

MongoDB复制集里Primary节点是不固定的,当遇到复制集轮转升级、Primary宕机、网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换。

总而言之,MongoDB复制集里Primary节点是不固定的,不固定的,不固定的,重要的事情说3遍。

当连接复制集时,如果直接指定Primary的地址来连接,当时可能可以正确读写数据的,但一旦复制集发生主备切换,你连接的Primary会降级为Secondary,你将无法继续执行写操作,这将严重影响到你的线上服务。

所以生产环境千万不要直连Primary,千万不要直连Primary,千万不要直连Primary

正确的连接方式

要正确连接复制集,需要先了解下MongoDB的Connection String URI,所有官方的driver都支持以Connection String的方式来连接MongoDB。

下面就是Connection String包含的主要内容

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
  • mongodb:// 前缀,代表这是一个Connection String
  • username:password 如果启用了鉴权,需要指定用户密码
  • hostX:portX 复制集成员的ip:port信息,多个成员以逗号分割
  • /database 鉴权时,用户帐号所属的数据库
  • ?options 指定额外的连接选项

以205上的mongo副本集为例,正确的连接方式如下:文章来源地址https://www.toymoban.com/news/detail-497281.html

mongodb://root:admin@10.81.138.205:37017,10.81.138.205:37018,10.81.138.205:37019/?replicaSet=mongos&readPreference=primary

到了这里,关于mongo 副本集部署的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用docker、docker-compose部署微服务

    这里已经在docker安装并启动好了Redis、nacos,配置好了“ruoyi-gateway-prod.yml”文件。 注意如果配置文件中有Redis、MySQL、nacos这些的连接信息,需要把IP地址改为服务器的公网地址或者内网地址,不会连接不到。 我这里以微服务版若依的网关服务为例,上传到指定目录。 官方文档

    2024年02月10日
    浏览(38)
  • 【Docker】(七)使用docker-compose一键部署环境

    本系列文章记录了从0开始学习Docker的过程,Docker系列历史文章: (一)基本概念与安装使用 (二)如何使用Docker发布一个SpringBoot服务 (三)使用registry远程镜像仓库管理镜像 (四)使用volume持久化Docker容器中的Redis数据 (五)使用bind mounts修改Docker容器中的Nginx配置 (六)

    2024年02月08日
    浏览(38)
  • 使用 docker-compose 部署 Jenkins

    注:我是在虚拟机(Ubuntu)上部署了 docker-compose,然后才使用 docker-compose 部署 Jenkins! 关于如何在 Ubuntu 部署 docker-compose,可以看我其它的文章。 docker_jenkins_compose 目录下创建 docker-compose.yml 文件: 进入 docker-compose.yml 文件: 按下键盘上的 i ,进入可以编写的模式。 将下面的

    2024年02月17日
    浏览(38)
  • docker部署(使用docker-compose)手把手教程

    docker-compose.yml 文件内容  安装成功后,运行 docker ps 出现如下报错  表示未启动docker,运行下列语句即可 安装完成后,运行 赋予权限即可 在服务器上单独新建文件夹名为ruoyi-admin dockerfile文件如下  执行如下命令 这就构建出本地的镜像了。   依次再构建出ruoyi/ruoyi-xxl-job-adm

    2024年02月01日
    浏览(42)
  • 使用docker-compose 部署 MySQL(所有版本通用)

    我这里使用的是MySQL8.0.18,可以自行选择需要的版本。 这里需要给MySQL做点自定义的配置,比如时区字符编码等。 以交互式命令进入容器,也可以使用navicat等客户端连接,使用Docker安装MySQL会给root用户开启远程访问。 使用MySQL自带客户端连接工具连接 PS:如果远程连接不上可

    2024年02月04日
    浏览(45)
  • Docker部署RocketMQ5.x (单机部署+配置参数详解+不使用docker-compose直接部署)

    官网地址:https://rocketmq.apache.org/ 镜像地址: https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本,部署流程不会有太大改变。 NameServer是一个简单的 Topic 路由注册中心,支持 Topic、Broker 的动态注册与发现,几乎无状态节点

    2024年02月06日
    浏览(72)
  • 【微服务部署】一、使用docker-compose部署Jenkins、SonarQube、PostgreSQL

    一、安装 1、编写docker-compose部署Postgres、SonarQube、Jenkins的yml文件jenkins-compose.yml Postgres:作为SonarQube的数据库存储 SonarQube:代码质量检查 Jenkins:jenkins/jenkins:lts镜像,jenkinsci/blueocean镜像缺少node运行时环境,导致node无法运行。 关键配置说明( 宿主机 : Docker容器): /data/doc

    2024年02月09日
    浏览(36)
  • web3:使用Docker-compose方式部署blockscout

    最近做的项目,需要blockscout来部署一个区块链浏览器,至于blockscout是什么,咱们稍后出一篇文章专门介绍下,本次就先介绍一下如何使用Docker-compose方式部署blockscout,以及过程中遇到的种种坑

    2024年02月12日
    浏览(44)
  • [云原生1. ] 使用Docker-compose一键部署Wordpress平台

    docker-compose 是实现在单机上对容器集群编排管理的工具。 docker-compose 是基于python开发的,能运行docker的平台,都能用docker-compose编排管理容器。 本质就是在 yaml格式 的 docker-compose配置模板文件 里定义多个容器的启动参数和依赖关系,并使用 docker-compose 根据这个模板文件的配

    2024年02月07日
    浏览(36)
  • 使用docker-compose部署RocketMQ5.x 单机部署+配置参数详解

    提前先拉取需要的镜像文件,避免后面部署的时候出现镜像拉取失败的问题。 镜像地址: https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本,部署流程不会有太大改变。 拉取最新版即可 这里使用compose v2版本 1、下载(使

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包