当前位置: 首页 > article >正文

ubuntu下docker安装mongodb-支持单副本集

1.mogodb支持事务的前提

1) MongoDB 版本:确保 MongoDB 版本大于或等于 4.0,因为事务支持是在 4.0 版本中引入的。

2) 副本集配置:MongoDB 必须以副本集(Replica Set)模式运行,即使是单节点副本集(即只有一个 MongoDB 实例,但以副本集模式启动)。

2.安装docker

3.创建目录和文件

1) 宿主机-mongodb的数据存储目录

mkdir /mongo/data
chmod 777 /mongo/data

2) 宿主机-mongodb的配置文件目录

mkdir /mongo/conf
chmod 777 /mongo/conf

3) 宿主机-mongodb的密钥文件

cd /mongo
openssl rand -base64 756 > keyFile
chmod 400 keyFile  # 一定是400,不要赋权777
chown 999:999 keyFile

4) 在/mongo/conf目录下,生成配置文件mongod.conf

# 存储配置
storage:dbPath: /data/db                 # 数据库文件存储路径engine: wiredTiger              # 存储引擎(通常为 wiredTiger)wiredTiger:engineConfig:cacheSizeGB: 1               # WiredTiger 缓存大小(单位:GB)directoryForIndexes: true    # 是否为索引使用单独目录# 网络配置
net:port: 27017                      # MongoDB 监听端口bindIp: 0.0.0.0                  # 绑定 IP 地址(0.0.0.0 表示监听所有网络接口)# 安全配置
security:authorization: enabled           # 是否启用认证keyFile: /data/mongodb/keyFile  # 密钥文件路径(用于副本集或分片集群)# 副本集配置(如果使用副本集)
replication:replSetName: "rs0"               # 副本集名称

4.启动MongoDB容器

docker run -d --name mongo -p 27017:27017 \
-v /mongo/data:/data/db \
-v /mongo/conf/mongod.conf:/etc/mongod.conf \
-v /mongo/keyFile:/data/mongodb/keyFile \
mongo:latest  mongod --auth --bind_ip_all --config /etc/mongod.conf# -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456

       如果运行上述命令后,mongodb容器处于退出状态,请排查数据挂载目录权限、配置文件问题、keyFile文件问题、27017端口没有开放、容器占用系统太多资源导致系统资源不足等问题,可通过docker logs mongo查看具体原因。

5.查看mongodb存储引擎和发行版本

# 查看mongodb版本
db.version()
# 查看当前数据库的存储引擎(需要root角色用户)
db.serverStatus().storageEngine

6.初始化副本集和创建用户

# 进入MongoDB容器
docker exec -it mongo mongosh
# 初始化副本集
rs.initiate({_id: "rs0",members: [{ _id: 0, host: "172.12.112.102:27017" }]
})
# 创建管理员用户
use admin
db.createUser({user: 'admin', pwd: 'admin123456', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]})
# 创建root用户
db.createUser({user: "root",pwd: "123456",roles: [{ role: "root", db: "admin" }]
})
# 验证用户
db.auth("admin", "admin123456")
db.auth("root", "123456")

7. 创建集合

use biobank
db.createUser({user: "test", pwd: "123456", roles: [{role: "readWrite", db: "printing"}]})
exitdocker exec -it mongo mongosh
use biobank
db.auth("test", "123456")

8.Flask-MongoEngine使用事务

       在 MongoDB 中,事务是通过会话(Session)来管理的。Flask-MongoEngine 本身不直接提供事务管理,但可以通过 PyMongo 的会话功能来实现。

MONGODB_SETTINGS = {'db': 'biobank','host': 'mongodb://test:123456@172.12.112.102:27017/biobank?replicaSet=rs0'
}# 或者
MONGODB_SETTINGS = {'host': '172.12.112.102','port': 27017,'username': 'test','password': '123456','db': 'biobank','authSource': 'biobank',  # 指定身份验证数据库'replicaSet': 'rs0','connectTimeoutMS': 5000,  # 设置套接字超时时间(毫秒)。'socketTimeoutMS': 30000,  # 设置套接字超时时间(毫秒)。'serverSelectionTimeoutMS': 5000,  # 设置服务器选择超时时间(毫秒),当客户端尝试连接到 MongoDB 服务器时,如果在此时间内没有找到可用的服务器,将抛出异常。'retryWrites': True,  # 写重试'retryReads': True  # 读重试
}
from flask import Flask
from flask_mongoengine import MongoEngine
from pymongo import MongoClient, ASCENDING
from pymongo.errors import OperationFailureapp = Flask(__name__)# 配置 MongoDB 连接
app.config["MONGODB_SETTINGS"] = {'db': 'your_database_name','host': 'mongodb://localhost:27017/'
}db = MongoEngine(app)# 定义一个简单的模型
class MyModel(db.Document):name = db.StringField(required=True)value = db.IntField(required=True)@app.route('/transaction_example', methods=['GET'])
def transaction_example():# 获取 PyMongo 客户端client = MongoClient(app.config["MONGODB_SETTINGS"]['host'])session = client.start_session()try:with session.start_transaction():# 在事务中执行操作MyModel(name='example', value=1).save(session=session)# 可以在这里执行更多操作,它们将在同一个事务中# 如果任何操作失败,整个事务将回滚session.commit_transaction()return "Transaction committed successfully."except OperationFailure as e:# 如果事务失败,回滚session.abort_transaction()return f"Transaction aborted: {e}"finally:session.end_session()if __name__ == '__main__':app.run(debug=True)

http://www.lryc.cn/news/2386235.html

相关文章:

  • spring-boot-starter-data-redis应用详解
  • 5060显卡驱动PyCUDA开发环境搭建
  • redis搭建最小的集群,3主3从
  • 《帝国时代1》游戏秘籍
  • 【sylar-webserver】10 HTTP模块
  • 攻略生成模块
  • 海康NVR录像回放SDK原始流转FLV视频流:基于Java的流媒体转码(无需安装第三方插件ffmpeg)
  • 深入理解设计模式:工厂模式、单例模式
  • 运维Linux之Ansible详解学习(更新中)
  • 深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第三篇:Verilog实现I2C Master核
  • 网络世界的“变色龙“:动态IP如何重构你的数据旅程?
  • 进阶-自定义类型(结构体、位段、枚举、联合)
  • 5G 网络全场景注册方式深度解析:从信令交互到报文分析
  • ARM笔记-嵌入式系统基础
  • 一文讲透golang channel 的特点、原理及使用场景
  • upload-labs通关笔记-第19关文件上传之条件竞争
  • 第5章:任务间通信机制(IPC)全解析
  • CAPL自动化-诊断Demo工程
  • SVN被锁定解决svn is already locked
  • 【深度学习】1. 感知器,MLP, 梯度下降,激活函数,反向传播,链式法则
  • 云原生安全:网络协议TCP详解
  • 使用CentOS部署本地DeekSeek
  • Spring Boot与Eventuate Tram整合:构建可靠的事件驱动型分布式事务
  • Python:从脚本语言到工业级应用的传奇进化
  • 【排序算法】典型排序算法 Java实现
  • node.js如何实现双 Token + Cookie 存储 + 无感刷新机制
  • [DS]使用 Python 库中自带的数据集来实现上述 50 个数据分析和数据可视化程序的示例代码
  • 探索智能仓颉
  • Ubuntu 上开启 SSH 服务、禁用密码登录并仅允许密钥认证
  • LLMs之Qwen:《Qwen3 Technical Report》翻译与解读