本地K8s部署Prisma连接MongoDB报错:需以副本集运行
问题描述
在本地Kubernetes环境部署Prisma后,尝试通过其他Pod连接MongoDB时出现如下报错:
"Prisma需要执行事务,这要求你的MongoDB服务器以副本集模式运行。"
完整报错日志:
PrismaClientKnownRequestError: [be-auth] 对 `prisma.user.create()` 的调用无效,位置在 [be-auth] /usr/src/app/src/routes/signup.ts:38:36 [be-auth] [be-auth] 35 [be-auth] 36 const hashedPassword = await Password.toHash(password); [be-auth] 37 [be-auth] → 38 const user = await prisma.user.create( [be-auth] Prisma需要执行事务,这要求你的MongoDB服务器以副本集模式运行。 [be-auth] at zr.handleRequestError (/usr/src/app/node_modules/@prisma/client/runtime/library.js:122:8308) [be-auth] at zr.handleAndLogRequestError (/usr/src/app/node_modules/@prisma/client/runtime/library.js:122:7697) [be-auth] at zr.request (/usr/src/app/node_modules/@prisma/client/runtime/library.js:122:7307) { [be-auth] code: 'P2031', [be-auth] clientVersion: '5.0.0', [be-auth] meta: {} [be-auth] }
当前MongoDB的部署YAML:
apiVersion: apps/v1 kind: Deployment metadata: name: be-auth-mongo-depl spec: replicas: 1 selector: matchLabels: app: be-auth-mongo template: metadata: labels: app: be-auth-mongo spec: containers: - name: be-auth-mongo image: mongo --- apiVersion: v1 kind: Service metadata: name: be-auth-mongo-srv spec: selector: app: be-auth-mongo ports: - name: db protocol: TCP port: 27017 targetPort: 27017
解决方案
Prisma依赖MongoDB的事务能力,单实例MongoDB不支持该特性,必须配置为副本集。即使是本地测试环境,也需要把单实例MongoDB伪装成单节点副本集来满足要求。
修改后的MongoDB部署配置
apiVersion: apps/v1 kind: Deployment metadata: name: be-auth-mongo-depl spec: replicas: 1 selector: matchLabels: app: be-auth-mongo template: metadata: labels: app: be-auth-mongo spec: containers: - name: be-auth-mongo image: mongo # 启动时指定副本集参数 command: ["mongod"] args: ["--replSet", "rs0", "--bind_ip_all"] # 挂载初始化脚本,启动后自动初始化副本集 volumeMounts: - name: init-script mountPath: /docker-entrypoint-initdb.d volumes: - name: init-script configMap: name: mongo-init-config --- # 定义副本集初始化脚本的ConfigMap apiVersion: v1 kind: ConfigMap metadata: name: mongo-init-config data: init-replica-set.js: | rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "be-auth-mongo-srv:27017" } ] }) --- apiVersion: v1 kind: Service metadata: name: be-auth-mongo-srv spec: selector: app: be-auth-mongo ports: - name: db protocol: TCP port: 27017 targetPort: 27017
操作步骤
- 删除原有MongoDB部署和服务:
kubectl delete deployment be-auth-mongo-depl kubectl delete service be-auth-mongo-srv
- 应用修改后的配置文件:
kubectl apply -f <你的配置文件路径>
- 验证副本集状态:
等待Pod启动完成后,进入Mongo容器:
kubectl exec -it $(kubectl get pods -l app=be-auth-mongo -o jsonpath="{.items[0].metadata.name}") -- mongo
在Mongo Shell中执行以下命令,若返回"ok" : 1则说明副本集初始化成功:
rs.status()
- 更新Prisma连接字符串,指定副本集名称:
将连接字符串修改为:
mongodb://be-auth-mongo-srv:27017/你的数据库名称?replicaSet=rs0
内容的提问来源于stack exchange,提问作者Manel
相关产品推荐
相关产品推荐

