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 -g
flag. 할 수도 . 또한 Run-rs를 목록에 표시할 수 있습니다.package.json
devDependencies입니다.
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 클러스터를 제공하므로 응용 프로그램을 실행/테스트할 수 있습니다.
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
'it-source' 카테고리의 다른 글
무엇을 탐지할 수 있습니까?NET Framework 버전 및 서비스 팩이 설치되어 있습니까? (0) | 2023.05.01 |
---|---|
Bash 배열에서 요소 제거 (0) | 2023.04.26 |
C#의 여러 줄 문자열 리터럴 (0) | 2023.04.26 |
Git에 푸시 중 오류 코드 403을 반환합니다. HTTP 요청 실패 (0) | 2023.04.26 |
에뮬레이터 오류:이 AVD의 구성에 커널 파일이 없습니다. (0) | 2023.04.26 |