mongo 副本集部署

news/2025/2/4 5:57:00/

当前我们使用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)**目录,需要与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

http://www.ppmy.cn/news/469687.html

相关文章

耳朵疼痛, 导致整个脸都疼痛并且张不开嘴 , 因为张嘴的时候耳后的肌肉疼痛---外耳道炎

近期亲身经历了这种疾病, 经过就诊查明 , 基本原因是因为外耳道损伤引起的伤口细菌感染 , 造成外耳道炎 , 用头孢 连续3天, 外加耳道使用氧氟沙星滴耳液 , 和酒精碘伏棉球消毒 每日三次 , 三天…

UE5下载完打开就崩溃,和用的A卡有关吗

显卡AMD XR 6600XT 内存16G,刚下载完打开就提示GPU崩溃或D3D设备已移除,创建了TdrDelay和TdrDdiDelay两个新注册表的方法不行,卸载Bridge插件也没有用。 崩溃报错:Fatal error: [File:D:\build\UE5\Sync\Engine\Source\Runtime\D3D12RHI\Priv…

RK系列(RK3568) USB hub SD卡热插拔支持

SOC:RK3568 kernel版本:4-19 平台:Android12 问题:GL852L是一款经常用于读卡器的芯片,目前项目上的sd卡由GL862L进行扩展,发现热插拔的时候系统没有反应不支持,查看内核配置也没有这个功能。于是一直研究解决这个问题。 后来发现在应用层可以输入命令打开关闭重新扫描USB…

耳油适合带入耳式耳机吗,试试这几款不入耳的骨传导耳机

骨传导耳机相对于普通耳机,是一种将声音通过人体的颅骨、骨迷路、内耳淋巴液振动膜、听神经等途径传递给听觉中枢,从而使人产生不一样的听觉感受。相比于传统耳机,骨传导耳机不用塞住耳朵,不会对耳膜产生损害等,更适合…

对耳朵伤害最小的耳机类型,盘点几款对耳道有保护的骨传导耳机

相信在大家的认知中,入耳式的耳机在佩戴的过程中是需要将耳机头塞入耳道内部,在这种情况下耳朵就会肿胀,同时也会有着极其不舒适的佩戴体验,甚至会产生中耳炎等疾病的发生,然而前几年发布的骨传导耳机,就无…

气传导耳机是不是智商税?气传导耳机靠谱吗?

先上结论,气传导耳机不是智商税,非常靠谱。 初中物理就曾教过,声音的传播是需要介质的,有气体、固体、液体三种,在正常的环境条件下,声音是通过两种传播途径来实现的,一是通过空气传播,另一种则…

骨感传导蓝牙耳机怎么样,骨感传导耳机对于我们耳道是否有保护

在现在数码产品普及生活的时代,耳机也成为了我们每天的标准,以往佩戴的都是入耳式的耳机,但长时间佩戴下会出现耳朵疼痛,严重的更会导致听力障碍的问题发生,针对这一现象,一种新型的骨感传导耳机来到了我们…

骨感传导蓝牙耳机怎么样,骨感传导耳机对于我们耳道有保护吗

人们对于自身健康越来越重视,更多的人意识到传统耳机对于我们耳道的危害,纷纷加入了新型的骨感传导耳机阵容中,但还是存在不少对于骨传导耳机保持顾虑的小伙伴们,认为骨感传导对于耳道还是有损害,那么今天小编就和大家…