Ubuntu 上安装 MongoDB 并启用事务的完整流程

本流程以 Ubuntu 20.04/22.04 为例,安装 MongoDB 7.0,并将其配置为 单节点副本集(Replica Set)以满足事务要求。

阶段一:安装 MongoDB 服务器

1. 导入 MongoDB 公钥

sudo apt update
sudo apt install gnupg curl -y
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
   sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg \
   --dearmor

 

2. 创建 MongoDB List 文件

为 APT 添加 MongoDB 仓库源(请根据您的 Ubuntu 版本选择对应的 URL):

# Ubuntu 22.04 (Jammy)
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# Ubuntu 20.04 (Focal)
# echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

 

3. 安装 MongoDB Packages

sudo apt update
sudo apt install -y mongodb-org

 

阶段二:配置副本集和外部访问

MongoDB 的配置文件通常是 /etc/mongod.conf。我们必须修改此文件以启用远程访问和副本集功能。

1. 编辑配置文件

使用 sudo 权限编辑配置文件:

# /etc/mongod.conf
net:
  port: 33816            # 【修改点 1】确认端口号是您希望使用的 (例如 33816)
  bindIp: 0.0.0.0        # 【修改点 2】VITAL: 监听所有 IP 地址,允许外部连接

 

3. 添加副本集配置 (Replication)

在文件的末尾添加 replication 配置块,指定副本集的名称(例如 rs0)。

# /etc/mongod.conf
replication:
  replSetName: rs0       # 【修改点 3】设置副本集名称,这是启用事务的关键

 

4. 重启 MongoDB 服务

保存并关闭文件后,使用 systemctl 重启服务以应用更改:

sudo systemctl daemon-reload
sudo systemctl restart mongod

 

阶段三:初始化单节点副本集 (启用事务)

尽管服务器已启动副本集模式,但它尚未被“初始化”。初始化是使节点具备 PRIMARY 状态的关键一步。

1. 连接到 MongoDB Shell

使用您在配置文件中指定的端口连接到本地 MongoDB:

# 如果使用 33816 端口
mongosh --port 33816

 

2. 初始化副本集

在 Shell 中执行以下命令,将当前节点配置为单成员副本集的主节点:

rs.initiate()

 

3. 验证状态

等待几秒钟后,运行 rs.status()

rs.status()

✅ 成功标志: 在输出中,您应该看到 stateStr 字段显示为 PRIMARY

JavaScript
 
// Shell 提示符也应变为:
rs0 [primary] > 

 

阶段四:应用程序连接和事务测试

现在您的 MongoDB 环境已经支持事务,您可以使用 PyMongo 客户端进行连接。

1. 确保连接 URI 正确

使用您宿主机的 IP 地址(例如 127.0.0.1)、正确的端口和 replicaSet=rs0 参数进行连接。

from pymongo import MongoClient

client = MongoClient("mongodb://127.0.0.1:33816/?replicaSet=rs0")

try:
    with client.start_session() as session:
        # 在 with session.start_transaction(): 块中的操作将是原子性的
        with session.start_transaction():
            client.test.tx_test.insert_one({"ok": 1, "test": "tx_working"}, session=session)
            print("事务操作成功提交!")
except Exception as e:
    print(f"事务执行失败: {e}")

 

 

 

posted on 2025-12-16 11:27  星河赵  阅读(1)  评论(0)    收藏  举报

导航