当前我们使用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.8volumes:- /data/mongo/data/mongo1:/data/db- ./mongodb.key:/data/mongodb.keyuser: rootenvironment:- MONGO_INITDB_ROOT_USERNAME=root- MONGO_INITDB_ROOT_PASSWORD=admincontainer_name: mongodb1ports:- 37017:27017command: mongod --replSet mongos --keyFile /data/mongodb.keyrestart: alwaysentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@mongodb2:image: mongo:4.4.8volumes:- /data/mongo/data/mongo2:/data/db- ./mongodb.key:/data/mongodb.keyuser: rootenvironment:- MONGO_INITDB_ROOT_USERNAME=root- MONGO_INITDB_ROOT_PASSWORD=admincontainer_name: mongodb2ports:- 37018:27017command: mongod --replSet mongos --keyFile /data/mongodb.keyrestart: alwaysentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec docker-entrypoint.sh $$@mongodb3:image: mongo:4.4.8volumes:- /data/mongo/data/mongo3:/data/db- ./mongodb.key:/data/mongodb.keyuser: rootenvironment:- MONGO_INITDB_ROOT_USERNAME=root- MONGO_INITDB_ROOT_PASSWORD=admincontainer_name: mongodb3ports:- 37019:27017command: mongod --replSet mongos --keyFile /data/mongodb.keyrestart: alwaysentrypoint:- bash- -c- |chmod 400 /data/mongodb.keychown 999:999 /data/mongodb.keyexec 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 displaymetrics 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 youand anyone you share the URL with. MongoDB may use this information to make productimprovements 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副本集为例,正确的连接方式如下:

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

mongo 副本集部署相关推荐

  1. Mongodb副本集部署(Centos7)

    服务器准备 准备三台服务器,以副本集集群方式部署Mongodb,假设服务器如下: 服务器 节点类型 IP地址 端口 Node1 Mongodb服务1(优先级最高,默认为主节点Master) 10.10 ...

  2. MongoDB副本集部署

    实验环境:准备三台服务器部署MongoDB副本集 1.MongoDB下载安装(三台服务器操作相同) cd /data/mongodbwget https://fastdl.mongodb.org/li ...

  3. Docker mongo副本集环境搭建

    1.MongoDB Docker 镜像安装 docker pull mongo 2.Docker容器创建 MongoDB Docker 容器创建有以下几个问题: 1- MongoDB 容器基本创建方法 ...

  4. MongoDB 3.2.7 for rhel6.4 副本集-分片集群部署

    今天,一同事反映,他安装部署mongodb副本集--分片集群,初始化分片时遇到问题:初始化分片必须使用主机名(也就是必须有相当于DNS服务的解析),这样以来,mongo副本集--分片集群就 会出现DN ...

  5. Mongodb本机部署副本集

    目录 知识储备 1.为什么我们需要搭建副本集模式呢? 2.副本集成员构架 应用目标 实践步骤 一.部署副本集 1. 创建数据目录 2. 启动副本集 3. 关闭MongoDB服务 4.登录mongod实 ...

  6. MongoDB副本集的部署与操作

    一.实验综述 1.实验目的及要求 (1)了解MongoDB副本集 (2)熟悉MongoDB副本集成员 (3)掌握MongoDB副本集部署 (4)掌握MongoDB副本集操作 (5)理解副本集机制 实验 ...

  7. Docker部署MongoDB副本集

    docker拉取mongo docker pull mongo 安装mongo单机版 docker run -itd --name mongo -p 27017:27017 mongo --authd ...

  8. linux下mongdb绑定ip,Linux下MongoDB安装及副本集配置 | 聂扬帆博客

    最近开始接触了MongoDB的安装配置,易部署.易使用,存储数据非常方便是它的特点. 0x00  副本集原理 MongDB副本集故障转移功能得益于它的选举机制.选举机制采用了Bully算法,可以很方便 ...

  9. 第38章:MongoDB-集群--Replica Sets(副本集)---多机的搭建

    ①机器环境 182.48.115.236    master-node(主节点) 182.48.115.237    slave-node1(从节点) 182.48.115.238    slave- ...

最新文章

  1. iOS 成员变量的作用范围
  2. mxnet优化器 SGD_GC
  3. 3ds Max绘制青花瓷茶壶
  4. 5界面怎么做窗帘拉动的效果_布艺窗帘款式有哪些?附2020年最新窗帘款式图!...
  5. Codeforces 987A. Infinity Gauntlet(手速题,map存一下输出即可)
  6. Mysql的“Limit”操作
  7. EXT2/EXT3/EXT4文件系统数据恢复工具开发计划
  8. 环回测试能够提供什么信息_VIAVI | 全面对比“真双向分析”与“环回测试”,结果一目了然!...
  9. DMAR(DMA remapping)与 IOMMU
  10. 压力大根源不在教育本身
  11. Ribbon界面制作
  12. 霍夫曼编码计算图片压缩率
  13. 张三思评博客:常见的并发网络服务程序设计方案
  14. gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!...
  15. 微信记录恢复助手官方版
  16. cmd.exe显示窗口大小和字体大小调整
  17. jq 获取input的光标,定位光标的位置
  18. 《电感元器件》的特性分析
  19. 合天网安实验室CTF-解密100-Funny Crypto
  20. 认识研发数字化管理(数字化研发管理)

热门文章

  1. nutch 1.15中crawl命令解析
  2. 【个人建站心得】wordpress页面真正静态化插件really static
  3. 【华为机试】互质问题
  4. Mac Hadoop2.6(CDH5.9.2)伪分布式集群安装
  5. linux 路由表管理,如何管理系统路由表
  6. 宝蓝自组网对讲机在自然灾害中起到什么作用?
  7. 骨子里,我选择相信自己
  8. java通过itext生成PDF,设置单元格cell的最大高度 以及 itext7初尝
  9. 人工智能时代即将到来
  10. 基于VS2017+OpenCV3.4.1的PC端摄像头卡通化和皮肤变换