mongo副本集本地部署

介绍

前言:

mongodb 因为高性能、高可用性、支持分片等特性,作为非关系型数据库被大家广泛使用。其高可用性主要是体现在 mongodb 的副本集上面(可以简单理解为一主多从的集群),本篇文章主要从副本集介绍、docker搭建副本集、副本集读写数据这三个方面来带大家认识下 mongodb 副本集。

mongodb 副本集介绍

mongodb 副本集(Replica Set)包括主节点(primary)跟副本节点(Secondaries)。
主节点只能有一个,所有的写操作请求都在主节点上面处理。副本节点可以有多个,通过同步主节点的操作日志(oplog)来备份主节点数据。
在主节点挂掉后,有选举权限的副本节点会自动发起选举,并从中选举出新的主节点。副本节点可以通过配置指定其具体的属性,比如选举、隐藏、延迟同步等,最多可以有50个副本节点,但只能有7个副本节点能参与选举。虽然副本节点不能处理写操作,但可以处理读请求。搭建一个副本集集群最少需要三个节点:一个主节点,两个备份节点,如果三个节点分布合理,基本可以保证线上数据99.9%安全。如果只有一个主节点,一个副本节点,且没有资源拿来当第二个副本节点,那就可以起一个仲裁者节点(arbiter),不存数据,只用来选举用。当主节点挂掉后,那么两个副本节点会进行选举,从中选举出一个新的主节点。
对于副本集成员属性,特别需要说明下这几个:priority、hidden、slaveDelay、tags、votes。

  • priority
    对于副本节点,可以通过该属性来增大或者减小该节点被选举成为主节点的可能性,取值范围为0-1000(如果是arbiters,则取值只有0或者1),数据越大,成为主节点的可能性越大,如果被配置为0,那么他就不能被选举成为主节点,而且也不能主动发起选举。
  • hidden
    隐藏节点会从主节点同步数据,但对客户端不可见,在mongo shell 执行 db.isMaster() 方法也不会展示该节点,隐藏节点必须Priority为0,即不可以被选举成为主节点。但是如果有配置选举权限的话,可以参与选举。
  • slaveDelay
    延迟同步即延迟从主节点同步数据,比如延迟时间配置的1小时,现在时间是 09:52,那么延迟节点中只同步到主节点 08:52 之前的数据。另外需要注意延迟节点必须是隐藏节点,且Priority为0。
  • tags
    支持对副本集成员打标签,在查询数据时会用到,比如找到对应标签的副本节点,然后从该节点读取数据,这点也非常有用,可以根据标签对节点分类,查询数据时不同服务的客户端指定其对应的标签的节点,对某个标签的节点数量进行增加或减少,也不怕会影响到使用其他标签的服务。
  • votes
    节点是否有权限参与选举,最大可以配置7个副本节点参与选举。

副本集的搭建

下载MongoDB镜像

首先,你需要从Docker Hub或其他Docker镜像仓库下载MongoDB的镜像。这里假设你使用的是MongoDB 4.4.0版本。

docker pull mongo:4.4.0

创建数据目录

在宿主机上创建用于存储MongoDB数据的目录。这些目录将被映射到Docker容器的/data/db目录。

mkdir -p /home/docker/mongodb/data1  
mkdir -p /home/docker/mongodb/data2  
# 如果有更多副本集成员,可以继续创建更多目录

启动MongoDB容器实例

启动多个MongoDB容器实例,每个实例都映射到不同的宿主机端口和数据目录。同时,通过–replSet参数指定副本集的名称。

docker run -d --name mongo1 -p 27017:27017 -v /home/docker/mongodb/data1:/data/db mongo:4.4.0 --replSet rs0  
docker run -d --name mongo2 -p 27018:27017 -v /home/docker/mongodb/data2:/data/db mongo:4.4.0 --replSet rs0  
# 如果有更多副本集成员,继续启动更多容器

注意:在上面的命令中,rs0是副本集的名称,你可以根据需要更改它。

初始化副本集

选择其中一个MongoDB容器实例作为主节点(primary),并初始化副本集。通常,你可以通过连接到MongoDB的admin数据库,并使用rs.initiate()命令来初始化副本集。 首先,你需要进入MongoDB容器实例的shell环境。假设你使用mongo1作为主节点:

docker exec -it mongo1 mongo admin

然后,在MongoDB shell中执行以下命令初始化副本集:

rs.initiate({  _id: "rs0",  members: [  { _id: 0, host: "localhost:27017" },  { _id: 1, host: "localhost:27018" }  // 如果有更多副本集成员,继续添加  ]  
})

注意:在上面的命令中,_id是副本集的名称,members数组包含了副本集成员的地址信息。由于MongoDB容器实例运行在Docker中,所以你需要使用容器内部的地址(在这个例子中是localhost)和端口(这里是27017和27018)。但在实际的生产环境中,你可能需要使用容器的服务名称或Docker网络的IP地址。

添加副本集成员

如果在初始化副本集时没有包含所有成员,你可以通过rs.add()命令添加它们。但是,在上面的步骤中,我们已经在rs.initiate()命令中包含了所有成员,所以这一步可能是可选的。

验证副本集状态

使用rs.status()命令来查看副本集的状态,确认所有成员都已正确加入并处于正确的角色(如主节点、从节点等)。

docker-compose部署

配置文件

  • 生成key文件
openssl rand -base64 20 > keyfile
chmod 400 keyfile
  • 配置文件
# mongod.conf# 指定存储数据文件的目录
storage:dbPath: /data/db# 指定日志文件的位置和日志等级
systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.log# 网络配置
# net:
#   bindIp: 0.0.0.0# 设置复制集的名称
replication:replSetName: rs0# 安全性和认证配置
#security:
#  authorization: enabled
  • 存储文件和日志文件
D:\SF\DOCKER\mongo\data1
D:\SF\DOCKER\mongo\data2
D:\SF\DOCKER\mongo\data3
D:\SF\DOCKER\mongo\logs1
D:\SF\DOCKER\mongo\logs2
D:\SF\DOCKER\mongo\logs3

容器配置文件

docker-compose.yml 是 Docker Compose 使用的配置文件,用于定义和运行多容器的 Docker 应用程序。在 docker-compose.yml 文件中,你可以定义应用程序的服务(containers)、网络、卷和其他 Docker 特性。

  • version: ‘3’ 指定了 Compose 文件的版本。
  • services 定义了应用程序的服务。在这个例子中,有两个服务:web 和 db。
  • web 服务:
    • 使用当前目录下的 Dockerfile 构建镜像(通过 build: . 指定)。
    • 映射主机上的 5000 端口到容器的 5000 端口(通过 ports 指定)。
    • 依赖于 db 服务(通过 depends_on 指定)。
    • 设置环境变量 DATABASE_URL(通过 environment 指定)。
  • db 服务:
    • 使用官方的 postgres:13 镜像。
    • 设置环境变量 POSTGRES_USER、POSTGRES_PASSWORD 和 - - POSTGRES_DB(通过 environment 指定)。
    • 挂载一个卷 db_data 到容器的 /var/lib/postgresql/data 目录(通过 - volumes 指定)。
  • volumes 定义了卷,其中 db_data 卷被 db 服务使用。

可以使用 Docker Compose 命令(如 docker-compose up)来启动、停止和重启这个多容器的应用程序。

version: '3.7'services:mongo-primary:image: mongo:latestports:- "27017:27017"volumes:- D:\SF\DOCKER\mongo\config\mongod.conf:/etc/mongod.conf- D:\SF\DOCKER\mongo\config\mongodb.key:/etc/mongodb.key- D:\SF\DOCKER\mongo\data1:/data/db- D:\SF\DOCKER\mongo\logs1:/var/log/mongodbenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: 123456command: mongod --replSet rs0 --dbpath /data/db  --keyFile /etc/mongodb.key --config /etc/mongod.confentrypoint:- bash- -c- |chmod 400 /etc/mongodb.keychown 999:999 /etc/mongodb.keyexec docker-entrypoint.sh $$@mongo-secondary1:image: mongo:latestports:- "27018:27017"volumes:- D:\SF\DOCKER\mongo\config\mongod.conf:/etc/mongod.conf- D:\SF\DOCKER\mongo\config\mongodb.key:/etc/mongodb.key- D:\SF\DOCKER\mongo\data2:/data/db- D:\SF\DOCKER\mongo\logs2:/var/log/mongodbdepends_on:- mongo-primaryenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: 123456command: mongod --replSet rs0 --dbpath /data/db  --keyFile /etc/mongodb.key --config /etc/mongod.conf entrypoint:- bash- -c- |chmod 400 /etc/mongodb.keychown 999:999 /etc/mongodb.keyexec docker-entrypoint.sh $$@mongo-secondary2:image: mongo:latestports:- "27019:27017"volumes:- D:\SF\DOCKER\mongo\config\mongod.conf:/etc/mongod.conf- D:\SF\DOCKER\mongo\config\mongodb.key:/etc/mongodb.key- D:\SF\DOCKER\mongo\data3:/data/db- D:\SF\DOCKER\mongo\logs3:/var/log/mongodbdepends_on:- mongo-primaryenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: 123456command: mongod --replSet rs0 --dbpath /data/db  --keyFile /etc/mongodb.key --config /etc/mongod.conf  entrypoint:- bash- -c- |chmod 400 /etc/mongodb.keychown 999:999 /etc/mongodb.keyexec docker-entrypoint.sh $$@

容器启动

# 进入docker-compose.yml 文件所在目录
# 启动部署
docker-compose up -d
# 暂停删除
docker-compose down

mongo用户、权限、分片配置

  • 进入一个容器
docker exec -it mongo /bin/mongosh
//或
docker exec -it mongodb bash
  • 用户创建
// 登录mongo
mongo admin -u admin -p 123456     -u 后面的是创建容器指定的账号   -p 后面跟的是创建容器指定的密码
// 使用 admin数据库
use admin  
// 创建一个用户
创建一个用户,赋予用户root权限 
db.createUser({user:"root",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]}
);
//尝试使用上面创建的用户信息进行连接。
db.auth('root', '123456');
// 配置副本集
rs.initiate({_id: "rs0",members: [{ _id: 0, host: "192.168.1.12:27017" },{ _id: 1, host: "192.168.1.12:27018" },{ _id: 2, host: "192.168.1.12:27019" }]});
// 移除副本集
host.docker.internal
rs.remove("host.docker.internal:27017")
// 添加副本集
rs.add("192.168.1.12:27017")  // 切换节点查看同步状态
rs.printReplicationInfo()// 查看副本集配置信息
rs.conf()// 查看副本集运行状态
rs.status()// 节点权重设置// 主节点设置 docker exec --user mongodb -it mongo1 bashmongosh -u root -p mongodb@evescncfg = rs.conf()// 修改权重cfg.members[0].priority=5cfg.members[1].priority=3
// 从新配置
rs.reconfig(cfg)

代码DEMO

from pymongo import MongoClient
from datetime import datetime, timedelta def find_paged_data(collection, page_num, page_size):start = (page_num -1) * page_sizeend = start + page_size# 设置时间范围start_time = datetime(2023, 10, 1, 0,0,0)end_time = datetime(2023, 10, 31, 23, 59, 59, 999999)# 查询时间范围内的文档query = {"time": {"$gte": start_time, "$lte": end_time}}result = collection.find(query).skip(start).limit(page_size)return resultif __name__=="__main__":loc_client = MongoClient('mongodb://root:123456@localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0&authSource=admin')loc_db = loc_client['wfg']loc_col = loc_db['wfgInfoCollection'] page_num = 1data = find_paged_data(collection=collection, page_num=page_num, page_size=100000)for d in datas:print(d["_id"])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

blender渲染时导致cpu高负载的可能因素

Blender 在进行渲染时(尤其是在使用 Cycles 渲染引擎时)通常会导致 CPU 高负载的原因主要有以下几个: 渲染计算:Blender 的 Cycles 渲染引擎是一种基于光线追踪的渲染引擎,它通过追踪光线在场景中的传播来生成图像。这…

基于SSM的“口腔护理网站”的设计与实现(源码+数据库+文档)

基于SSM的“口腔护理网站”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 首页 用户注册页面 医生信息查看模块 口腔护理预约模块 后台首页面…

分享如何通过定时任务调用lighthouse前端测试脚本+在持续集成测试中调用lighthouse前端测试脚本

最近写了个小工具来优化lighthouse在实际工作中的使用,具体实现了:通过定时任务调用前端测试脚本在持续集成测试中调用前端测试脚本。由于在公司中已经应用,所以就不能提供源码了,这里简单说一下实现思路,希望可以帮助…

Java 循环结构 - for, while 及 do...while

Java 循环结构 - for, while 及 do…while 顺序结构的程序语句只能被执行一次。 如果您想要同样的操作执行多次,就需要使用循环结构。 Java中有三种主要的循环结构: while 循环 do…while 循环 for 循环 在 Java5 中引入了一种主要用于数组的增强型 f…

前端面试题日常练-day04 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 下列哪个 CSS 单位可以根据用户的首选字体大小进行调整&#xff1f; A) pxB) emC) remD) vw2. HTML5 中的<video>元素用于什么&#xff1f; A) 播放音频文件B) 嵌入外部网页内容C) 显示图…

Debezium日常分享系列之:Debezium 2.7.0.Alpha2发布

Debezium日常分享系列之&#xff1a;Debezium 2.7.0.Alpha2发布 新功能和改进1.Oracle ROW_ID 包含在更改事件中2.带有 JDBC 接收器的 PostreSQL 数组3.Oracle 使用自定义模式名称刷新表4.使用 JWT/seed 进行 NATS 身份验证5.Oracle 大量表查询过滤器 新功能和改进 1.Oracle R…

OUC图书馆电脑开启无线网络,连接手机热点,解决联网但无法访问网络的问题

OUC图书馆电脑连手机热点 前言手动脚本&#xff08;暂未测试&#xff09;注意 前言 【中国海洋大学】OUC图书馆电脑默认只能有线连校园网&#xff0c;这让没有校园网的人很是头疼&#xff08;手机流量太多了&#xff0c;根本用不完&#xff0c;需要大流量卡的可以私信我&#…

在Android设备丢失数据后恢复数据的4个方法

了解 Android 媒体存储 媒体存储是下载、查看、播放和流式传输视频文件、音频文件、图像和其他媒体文件时所需的过程。此服务无法从手机桌面访问&#xff0c;因此您需要按照以下步骤通过安卓手机访问此系统服务。 步骤1&#xff1a;导航到手机设置&#xff0c;然后转到应用程…

Flink中基于Chandy-Lamport算法的分布式快照实现详解

Apache Flink利用了一种基于Chandy-Lamport分布式快照算法的变体——异步屏障快照&#xff08;Asynchronous Barrier Snapshotting, ABS&#xff09;来实现其强大的容错机制。Chandy-Lamport算法最初由K.M. Chandy和Leslie Lamport于1985年提出&#xff0c;是一种用于分布式系统…

linux shell脚本追踪与调试命令之sh

linux shell脚本在执行之前,大家就怕出问题,该如何调试呢?我们有没有办法不需要通过直接执行该脚本就判断是否有问题呢?当然有,那就是sh命令。 1.sh用法 sh [参数] shell.sh sh命令参数 参数说明-n不需要执行脚本,仅查询语法问题-v在执行脚本前,先将脚本的内容输出到…

初识鸿蒙之ArkTS基础

前言 学习一种应用程序开发&#xff0c;需要从这种程序的开发语言开始&#xff0c;比如说Android开发从入门到放弃&#xff0c;肯定是从Java基础或者是Kotlin语言基础开始学习的&#xff0c;IOS程序开发也肯定是从object-c开始学习的。鸿蒙软件开发也不例外&#xff0c;如果做…

【scikit-learn003】K近邻ML模型实战及经验总结(更新中)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章&#xff0c;作为较火的机器学习框架&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架K近邻&#xff08;K-Nearest Neighb…

机器学习(五) ----------集成学习(1)(集成学习思想+随机森林算法)

目录 1 核心思想 2 集成学习思想分类 2.1 Bagging&#xff08;Bootstrap aggregating&#xff09; 2.1.1 基本思想 2.1.2 特点 2.1.3 优点&#xff1a; 2.1.4 缺点&#xff1a; 2.2 Boosting&#xff08;Boosting Method&#xff09; 2.2.1 基本思想 2.2.2 特点 2.2.…

Vue3+TS实现将html或富文本编辑器转为Word并下载

说明&#xff1a;我用的富文本编辑器是wangEditor&#xff1a; wangEditor官网 安装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --save yarn add wangeditor/editor-for-vuenext # 或者 npm install wangeditor/editor-for-vuenext --save yarn add …

Git版本控制工具的原理及应用详解(二)

本系列文章简介&#xff1a; 随着软件开发的复杂性不断增加&#xff0c;版本控制成为了开发团队中不可或缺的工具之一。在过去的几十年里&#xff0c;版本控制工具经历了各种发展和演变&#xff0c;其中Git无疑是目前最受欢迎和广泛应用的版本控制工具之一。 Git的出现为开发者…

金万维动态域名小助手怎么用?

金万维动态域名小助手是一个域名检测工具&#xff0c;使用此工具可以进行检测域名解析是否正确、清除DNS缓存、修改DNS服务器地址及寻找在线客服&#xff08;仅支持付费用户&#xff09;等操作。对不懂网络的用户是一个很好的检测域名的工具&#xff0c;下面我就讲解一下金万维…

Java聚合项目打包运行笔记

聚合项目创建 略 聚合项目打包配置 父工程 pom文件添加 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>…

[初学者来练]用html+css+javascript个人博客作业需求

文章目录 项目概述项目需求页面设计主页文章列表页文章详情页用户交互额外功能&#xff08;可选&#xff09; 技术要求提交要求评分标准文件代码格式提示HTML 页面结构CSS 样式设计JavaScript 交互功能 项目概述 这个项目旨在通过使用HTML、CSS和JavaScript创建一个简单而功能…

【贪心算法】【Python实现】最优装载问题

文章目录 [toc]问题描述形式化描述 贪心算法贪心选择性质最优子结构性质 Python实现时间复杂性 问题描述 有一批集装箱要装上一艘载重量为 c c c的轮船&#xff0c;其中集装箱 i i i的重量为 w i w_{i} wi​在装载体积不受限制的情况下&#xff0c;将尽可能多的集装箱装上轮船…

SSM学习路线推荐

文章目录 时间安排javawebjdbcspring5springMVCMyBatis 前两天有朋友问我ssm怎么学的&#xff0c;去翻了翻当时学完之后记的总结 友情提示&#xff1a;该文主要分享自己看过的b站免费视频评价&#xff0c;仅代表个人观点 时间安排 因为已经过去好久了&#xff0c;只能凭记忆想…