it-source

Mongodb v4.0 트랜잭션, MongoError:트랜잭션 번호는 복제본 집합 구성원 또는 몽고에서만 허용됩니다.

criticalcode 2023. 4. 26. 23:26
반응형

Mongodb v4.0 트랜잭션, MongoError:트랜잭션 번호는 복제본 집합 구성원 또는 몽고에서만 허용됩니다.

는 설했습다를 설치했습니다MongoDB v4.0그것의 가장 놀라운 기능을 위해 Nodejs에서의 거래.mongodb드라이버로서 3.1.

트랜잭션 세션을 사용하려고 할 때 다음 오류가 발생했습니다.

MongoError: Transaction numbers are only allowed on a replica set member or mongos.

그것은 무엇이고 어떻게 없앨 수 있습니까?

Transactions의심할 여지 없이 가장 흥미로운 새로운 기능입니다.MongoDB 4.0그러나 안타깝게도 MongoDB를 설치하고 실행하기 위한 대부분의 도구는 복제본 세트가 아닌 독립 실행형 서버를 시작합니다.독립 실행형 서버에서 세션을 시작하려고 하면 이 오류가 발생합니다.

트랜잭션을 사용하려면 MongoDB 복제본 세트가 필요하며, 개발을 위해 복제본 세트를 로컬로 시작하는 것이 필요합니다.더 뉴run-rs npm module복제본 세트를 쉽게 시작할 수 있습니다.세트를 . 의 복제본세시데필요다한니은입. run-rs버전의른바올는을 .MongoDB널 위해서.

는 run-rs 다음제외고부없종습다니이속성는외하에을▁run를 제외하고는 외부 이 없습니다.Node.js그리고.npm은 요없습다니를 가질 가 없습니다.Docker,homebrew,APT,Python아니 심지어는MongoDB설치된.

글로설치다를rs를 합니다.npm's -gflag. 할 수도 . 또한 Run-rs를 목록에 표시할 수 있습니다.package.jsondevDependencies입니다.

npm install run-rs -g

그런 다음 --version 플래그를 사용하여 run-rs를 실행합니다.Run-rs가 MongoDB v4.0.0을 다운로드합니다.기존 MongoDB 설치를 덮어쓰지 않으므로 걱정하지 마십시오.

run-rs -v 4.0.0 --shell

그런 다음 연결 문자열에서 를 사용합니다.

자세한 내용은 여기에서 확인할 수 있습니다.

솔루션을 받았는데, MongoDB 구성 파일 안에 있는 3줄 구성입니다.

MongoDB 아틀라스에서 전환하여 myCent에 MongoDB v 4.4.0 설치 후WHM을 사용하는 OS 7 VPS, 저도 그 문제에 직면했습니다.

그자리의 run-rs솔루션은 제게 적합하지 않지만, 다음 단계에 따라 타사 툴 없이 이 문제를 해결할 수 있었습니다.

다끄를 mongod.

하고 MongoDB 셸을 입력하는 입니다.mongo합니다.

db.shutdownServer()

MongoDB 서버를 사용할 수 없습니다.종료 프로세스가 너무 오래 걸렸고 다음 명령으로 프로세스를 종료했습니다.

systemctl stop -f mongod

만약 당신이 죽였다면mongod이 실행할 것입니다.mongod --dbpath /var/db --repair

var/db데이터베이스 디렉토리를 가리켜야 합니다.

replicaSet 구성을 설정합니다.

에서는 replicaSet settings /etc/mongod.conf 일파, 다을찾다니습을 .replication다음 행을 추가해야 합니다.

replication:
   oplogSizeMB: <int>
   replSetName: <string>
   enableMajorityReadConcern: <boolean>

을 사용합니다.replSetName값을 입력합니다.

이러한 설정의 예:

   oplogSizeMB: 2000
   replSetName: rs0
   enableMajorityReadConcern: false

연결 문자열 URL을 추가합니다.

replSetName " " 에 합니다.&replicaSet=--YourReplicationSetName--

만약 당신이 그 이름을 사용했다면rs0 쿼리에 연결 URL을 .replicaSet=rs0

몽고드를 다시 켜다

명령을 합니다.systemctl start mongod

replicaSet 데이터베이스에 액세스

하고 MongoDB 를 합니다.mongo합니다.rs.initiate()이제 replicaSet 데이터베이스에 있어야 합니다.

, 파일 MongoDB를 합니다.docker-compose.yaml공식 MongoDB 도커 이미지 기반 솔루션:

version: '3.9'

services:
  mongodb:
    image: mongo:5
    command: --replSet rs0
    ports:
      - "28017:27017"
    environment:
      MONGO_INITDB_DATABASE: attachment-api-local-dev
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongo localhost:27017/admin --quiet
      interval: 2s
      timeout: 3s
      retries: 5

  mongo-init:
    image: mongo:5
    restart: "no"
    depends_on:
      mongodb:
        condition: service_healthy
    command: >
      mongo --host mongodb:27017 --eval
      '
      rs.initiate( {
         _id : "rs0",
         members: [
            { _id: 0, host: "localhost:27017" }
         ]
      })
      '

훨씬 쉬운 솔루션은 Bitnami MongoDB 이미지를 사용하는 것입니다.

services:
  mongodb:
    image: bitnami/mongodb:5.0
    ports:
      - "27017:27017"
    environment:
      MONGODB_REPLICA_SET_MODE: primary
      ALLOW_EMPTY_PASSWORD: 'yes'

도커를 이용한 현지 개발 가능한 솔루션

도커 파일 만들기

FROM mongo:4.4.7
RUN echo "rs.initiate();" > /docker-entrypoint-initdb.d/replica-init.js
CMD [ "--replSet", "rs" ]

이 도커 파일 작성

docker build ./ -t mongodb:4.7-replset

이 생성된 이미지 실행

docker run --name mongodb-replset -p 27017:27017 -d mongodb:4.7-replset

이 URI를 사용하여 데이터베이스에 연결

mongodb://localhost:27017/myDB

저는 최근에 같은 문제에 직면했습니다.저의 경우 로컬 개발 환경과 다른 버전의 원격 Mongo 서버에 연결하고 있기 때문입니다.

문제를 신속하게 해결하기 위해 연결 문자열에 다음 매개 변수를 추가했습니다.

?retryWrites=false

트랜잭션을 사용하려면 MongoDB 복제본 세트가 필요하며, 개발을 위해 복제본 세트를 로컬로 시작하는 것이 필요합니다.

당신은 할 수 .run-rs npm module제로 구성 MongoDB 러너.노드가 아닌 종속성이나 MongoDB도 없는 복제본 세트를 시작합니다.

또단순계만수있다니습들정에 .MongoDB Atlas제한된 리소스 MongoDB 클러스터를 제공하므로 응용 프로그램을 실행/테스트할 수 있습니다.

MongoDB 아틀라스

Linux 시스템에서 MongoDB를 실행하는 경우 서비스 파일 편집을 통해 연결 문자열을 업데이트하여 복제를 사용할 수 있습니다.

/usr/lib/mongod.service   or   /lib/systemd/system/mongod.service

다음과 같이 업데이트합니다.

ExecStart=/usr/bin/mongod --config "/etc/mongod.conf" --replSet rs0

--config "/etc/mongod.conf"과 MongoDB를 가리키고 .--replSet rs0 이름을 하고 있습니다.rs0

다시 시작합니다.

sudo systemctl daemon-reload     //<--To reload service units
sudo systemctl restart mongod    //<--To Restart MongoDB Server

그런 다음 터미널의 몽고드 인스턴스를 통해 복제를 시작합니다.

$ mongosh
$ rs.initiate()

저는 이 문제에 맞서 몇 주 동안 싸워왔습니다.제 결론을 말씀드리겠습니다.공유 클러스터에서 트랜잭션을 사용하려면 클러스터에서 MongoDB 4.2 이상을 실행해야 합니다.클러스터가 셰이딩되지 않은 경우 4.0부터 시작합니다.하위 종속성 mongodb NodeJS 드라이버로 사용하는 라이브러리를 사용하고 있었습니다.버전 3.3.x의 이 드라이버는 버전 4.0.4의 샤드 MongoDB 클러스터에서 실패합니다.솔루션은 클러스터를 4.2 버전으로 업데이트하는 것이었습니다.

src: https://www.bmc.com/blogs/mongodb-transactions/

작업대상에서 합니다.mongo:5.0.5-focal 이미지

도커 파일:

FROM mongo:5.0.5-focal AS rs-mongo

# Make MongoDB a replica set to support transactions. Based on https://stackoverflow.com/a/68621185/1952977
RUN apt-get update && apt-get install patch

# How to create scripts/docker-entrypoint.sh.patch
# 1. Download the original file:
#    wget https://github.com/docker-library/mongo/raw/master/5.0/docker-entrypoint.sh
#    ( wget https://github.com/docker-library/mongo/raw/b5c0cd58cb5626fee4d963ce05ba4d9026deb265/5.0/docker-entrypoint.sh )
# 2. Make a copy of it:
#    cp docker-entrypoint.sh docker-entrypoint-patched.sh
# 3. Add required modifications to docker-entrypoint-patched.sh
# 4. Create patch:
#    diff -u docker-entrypoint.sh docker-entrypoint-patched.sh > scripts/docker-entrypoint.sh.patch
# 5. Clean up:
#    rm docker-entrypoint.sh docker-entrypoint-patched.sh
COPY scripts/docker-entrypoint.sh.patch .
RUN patch /usr/local/bin/docker-entrypoint.sh docker-entrypoint.sh.patch
RUN mkdir -p /etc/mongo-key && chown mongodb:mongodb /etc/mongo-key

CMD ["--replSet", "rs", "--keyFile", "/etc/mongo-key/mongodb.key"]

scripts/docker-entrypoint.sh .dll:

--- docker-entrypoint.sh    2022-01-04 15:35:19.594435819 +0300
+++ docker-entrypoint-patched.sh    2022-01-06 10:16:26.285394681 +0300
@@ -288,6 +288,10 @@
    fi

    if [ -n "$shouldPerformInitdb" ]; then
+
+     openssl rand -base64 756 > /etc/mongo-key/mongodb.key
+    chmod 400 /etc/mongo-key/mongodb.key
+
        mongodHackedArgs=( "$@" )
        if _parse_config "$@"; then
            _mongod_hack_ensure_arg_val --config "$tempConfigFile" "${mongodHackedArgs[@]}"
@@ -408,7 +412,14 @@
        set -- "$@" --bind_ip_all
    fi

-   unset "${!MONGO_INITDB_@}"
+  echo 'Initiating replica set'
+  "$@" --logpath "/proc/$$/fd/1" --fork
+  echo 'rs.initiate({"_id":"rs","members":[{"_id":0,"host":"127.0.0.1:27017"}]});' | mongosh -u "$MONGO_INITDB_ROOT_USERNAME" -p "$MONGO_INITDB_ROOT_PASSWORD"
+  "$@" --logpath "/proc/$$/fd/1" --shutdown
+  echo 'Done initiating replica set'
+
+  unset "${!MONGO_INITDB_@}"
+
 fi

 rm -f "$jsonConfigFile" "$tempConfigFile"

도커-docker.yml:

version: '3.9'

services:
  mongo:
    image: rs-mongo:current
    restart: always
    env_file:
      - .env
    ports:
      - 127.0.0.1:27017:27017
    volumes:
      - mongo-db:/data/db
      - mongo-configdb:/data/configdb
      - mongo-key:/etc/mongo-key

volumes:
  mongo-db:
    driver: local
  mongo-configdb:
    driver: local
  mongo-key:
    driver: local

업데이트됨: 2022년 1월 6일

이 오류는 MongoDB 세션을 사용하고 있으며 시스템에 구성되어 있지 않기 때문입니다.

run-rs를 설치하려면 다음을 실행합니다.

npm install run-rs -g

실행:-

run-rs -v 4.0.0 --shell

다음 출력이 표시됩니다.MongoDB 4.0.0은 약 70MB이므로 잠시만 기다려 주십시오.

$ run-rs -v 4.0.0 --shell
Downloading MongoDB 4.0.0
Copied MongoDB 4.0.0 to '/home/node/lib/node_modules/run-rs/4.0.0'
Purging database...
Running '/home/node/lib/node_modules/run-rs/4.0.0/mongod'
Starting replica set...
Started replica set on "mongodb://localhost:27017,localhost:27018,localhost:27019"
Running mongo shell: /home/node/lib/node_modules/run-rs/4.0.0/mongo
rs:PRIMARY>

이제 로컬에서 MongoDB 4.0.0을 실행하는 복제본 세트가 있습니다.runs.status()를 실행하여 복제본 세트가 실행 중인지 확인합니다.

참고:- nodejs 버전은 $gte v3.1.0이어야 합니다.

언급URL : https://stackoverflow.com/questions/51461952/mongodb-v4-0-transaction-mongoerror-transaction-numbers-are-only-allowed-on-a

반응형