-
Nodejs에서 mongoDB, mongoose Version UpgrademongoDB 2022. 3. 9. 22:04
이유
legacy system에서 mongoDB version 3.2.11을 replica set으로 사용중인데 현재 몽고는 version 5까지 나왔는데 더 늦게전에 version upgrade를 할 필요를 느꼈다.
방법 서치
mongoDB 공식 문서를 보니 version을 올리기 위해서는 바로 직전의 버전에서 하나하나 올려야만 했다. 이 때, mongoose version이 호환되는지도 확인이 필요했다.
적용
하나하나 version up을 하면서 특이사항을 기록하고자 한다.
mongoose를 사용하기에 mongoose version 호환 정보를 참고해야 한다.
Mongoose v6.2.7: MongoDB Version Compatibility (mongoosejs.com)
Mongoose v6.2.7: MongoDB Version Compatibility
Mongoose relies on the MongoDB Node.js Driver to talk to MongoDB. You can refer to this table for up-to-date information as to which version of the MongoDB driver supports which version of MongoDB. Below are the semver ranges representing which versions of
mongoosejs.com
- MongoDB Server 2.4.x: mongoose ^3.8 or 4.x
- MongoDB Server 2.6.x: mongoose ^3.8.8 or 4.x
- MongoDB Server 3.0.x: mongoose ^3.8.22, 4.x, or 5.x
- MongoDB Server 3.2.x: mongoose ^4.3.0 or 5.x
- MongoDB Server 3.4.x: mongoose ^4.7.3 or 5.x
- MongoDB Server 3.6.x: mongoose 5.x
- MongoDB Server 4.0.x: mongoose ^5.2.0 or 6.x
- MongoDB Server 4.2.x: mongoose ^5.7.0 or 6.x
- MongoDB Server 4.4.x: mongoose ^5.10.0 or 6.x
- MongoDB Server 5.x: mongoose ^6.0.0
MongoDB replica set Version Up방식은 매우 심플하고 모든 버전에 대해 동일하다.
- replicaSet의 secondary, arbiter를 먼저 version up 한 뒤 재실행한다. (primary DB에서 rs.status()로 확인하면 버전이 올라간 후에도 정상 동작함을 확인할 수 있다.)
- primary DB를 stepDown()으로 secondary로 변경한다. (이 때, 다른 secondary가 primary로 변경된다.)
- 원래 primary 였던 DB를 version up 한다.
- 올린 버전에 맞는 feature를 enable한다.
모두 위와 같이 version up이 가능하고 문서 링크는 아래를 참조하면 된다.
1. mongodb v3.2 to v3.4: https://docs.mongodb.com/manual/release-notes/3.4-upgrade-replica-set/#upgrade-process
Upgrade a Replica Set to 3.4 — MongoDB Manual
Docs Home → MongoDB ManualStarting in version 3.4.21, MongoDB 3.4-series removes support for Ubuntu 16.04 POWER/PPC64LE.For earlier MongoDB Enterprise versions that support Ubuntu 16.04 POWER/PPC64LE:Due to a lock elision bug present in older versions of
docs.mongodb.com
특이사항
- 약 2~3분간 db접속이 안되다가 컨테이너를 모두 재실행하니까 됨
- db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } ) 커맨드로 feature를 enable해 줘야지만 다음 version up을 진행할 수 있음.
변경사항
- Aggregate command에 cursor option이 명시적으로 필요하다.
- Collection 및 index 생성 시 정의되지 않은 key/value를 사용할 경우 invalid 처리한다. (기존에 생성한건 상관 없음)
- db name에 "$"를 사용할 수 없다.(이미 있었을 경우 drop 시켜야 한다.)
- Upsert command 수행 시 $in query를 equality statement로 취급한다.
2. Mongodb v3.4 to v3.6: https://docs.mongodb.com/manual/release-notes/3.6-upgrade-replica-set/#upgrade-process
Upgrade a Replica Set to 3.6 — MongoDB Manual
Docs Home → MongoDB ManualMongoDB 3.6 is not tested on APFS, the new filesystem in macOS 10.13 and may encounter errors.Starting in MongoDB 3.6.13, MongoDB 3.6-series removes support for Ubuntu 16.04 PPCLE.For earlier MongoDB Enterprise versions that sup
docs.mongodb.com
특이사항
- 약 몇분 db접속이안돼서 컨테이너를 모두 재실행하니까 됨 -> 다음 버전 올릴때 바로 재실행해 보고 확인 필요
- 3.6부터 커서 옵션이 추가되면서 안된다고 뜸 -> mongoose 버전을 올리니 상관없이 됨 (5.3.1로 올림)
- Model.aggregate({},{})를 ([{},{}])와 같이 배열로 변경하라고 뜸 변경했더니 별 다른 문제 없이 동작하는 듯 리그레션 테스트로 확인이 필요
- db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } ) 커맨드로 feature를 enable해 줘야지만 다음 version up을 진행할 수 있음.
변경사항
- Array type querying이 array<Array<T>>가 아닌 Array<T>를 검색 (기존에는 array에 nested된 array가 있어야 array type으로 간주했음)
- Array를 포함한 field를 sorting할 때 array 또한 sorting한다. 이 떄문에 Multikey index로 index된 array에서 query plan은 blocking SORT stage를 포함한다.
- Sort가 query predicate를 무시한다.
- 복수의 key를 추가하는 경우 key를 알파벳 순으로 정렬하여 추가하도록 변경됨
- $pop operator param을 -1 or 1만 허용
- $pushAll operator 삭제
3.Mongodb v3.6 to v4.0: https://docs.mongodb.com/manual/release-notes/4.0-upgrade-replica-set/#upgrade-process
Upgrade a Replica Set to 3.6 — MongoDB Manual
Docs Home → MongoDB ManualMongoDB 3.6 is not tested on APFS, the new filesystem in macOS 10.13 and may encounter errors.Starting in MongoDB 3.6.13, MongoDB 3.6-series removes support for Ubuntu 16.04 PPCLE.For earlier MongoDB Enterprise versions that sup
docs.mongodb.com
특이사항
- 기존에 db를 재실행했는데 이건 그냥 안하고 컨테이너만 올려도 자동으로 연결이 됨.
- 4.0에서는 mongoose와 이상하게 호환이 제대로 안되는 듯 싶었다. 몇몇 api에대해 warning이 떳지만 기존에 사용하던 crud가 큰 이상이 없어서 목표는 5.0까지 올리는 거기에 스킵하였다.
- MongoDB Server 4.0.x: mongoose ^5.2.0 or 6.x 에 맞게 5.2.0, 5.2.1, 6.0.1 세가지 버전으로 변경하며 해 보았는데 같은 warning이 발생하였다.
- db.adminCommand( { setFeatureCompatibilityVersion: "4.0" } ) 커맨드로 feature를 enable해 줘야지만 다음 version up을 진행할 수 있음.
4. Mongodb v4.0 to v4.2: https://docs.mongodb.com/manual/release-notes/4.2-upgrade-replica-set/#upgrade-process
Upgrade a Replica Set to 4.0 — MongoDB Manual
Docs Home → MongoDB ManualMongoDB 4.0 may lose data during unclean shutdowns on macOS 10.12.x, 10.13.x, and 10.14.0. This issue was fixed by Apple in macOS 10.14.1.For details, see WT-4018.Before you attempt any upgrade, please familiarize yourself with
docs.mongodb.com
특이사항
- 4.0에서는 mongoose와 이상하게 호환이 제대로 안되는 듯한 문제가 mongoose버전을 올리니 해결되었다. 이 버전부터는 mongoose 최신 버전을 사용하였다.
- db.adminCommand( { setFeatureCompatibilityVersion: "4.2" } ) 커맨드로 feature를 enable해 줘야지만 다음 version up을 진행할 수 있음.
변경사항
- group command 삭제
- aggregation w/ $group stage로 대체
- RepairDatabase command 삭제
- Retryable write default
- 정의되지 않은 option으로 count command시 에러 발생
5. Mongodb v4.2 to v4.4: https://docs.mongodb.com/manual/release-notes/4.4-upgrade-replica-set/#upgrade-process
Upgrade a Replica Set to 4.2 — MongoDB Manual
Docs Home → MongoDB ManualBefore you attempt any upgrade, please familiarize yourself with the content of this document.If you need guidance on upgrading to 4.2, MongoDB offers major version upgrade services to help ensure a smooth transition without int
docs.mongodb.com
특이사항
- db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } ) 커맨드로 feature를 enable해 줘야지만 다음 version up을 진행할 수 있음.
- 다른 특이사항 없음
변경사항
- Find 계열 command 의 project관련 변경
- $elemMatch가 적용된 필드가 마지막 순서에 위치
- Nested document의 array에 $slice 적용 시 이 nested document의 다른 field를 return 하지 않음
- Embedded document와 그 field를 동시에 projection하면 에러 발생 ex) {name: 1, "name.firstName": 1} -> error
- array field에 대해 $slice와 embeded field projection을 동시에 수행할 수 없음
- Empty field name projection 불가 ex){"":1}
- 동일한 값을 가진 field가 존재할 경우 sort consistency가 보장되지 않음
6. Mongodb v4.4 to v5.0: https://docs.mongodb.com/manual/release-notes/5.0-upgrade-replica-set/#upgrade-process
Upgrade a Replica Set to 4.4 — MongoDB Manual
Docs Home → MongoDB ManualWhen upgrading a MongoDB 4.2-series deployment containing MongoDB 3.0 metadata to a 4.4-series deployment, you must upgrade to MongoDB 4.4.1 or later. You cannot successfully upgrade a deployment containing MongoDB 3.0 metadata
docs.mongodb.com
특이사항
- db.adminCommand( { setFeatureCompatibilityVersion: "5.0" } ) 커맨드로 feature를 enable해 줘야지만 다음 version up을 진행할 수 있음.
- 기존 버전들은 downgrade를 지원하지 않았는데 5.0 version부터 downgrade를 지원한다.
변경사항
- 대부분의 command에서 parameter validation 강화
- Db.collection.save 삭제 (insertOne, insertMany로 대체)
- Shell 대체: mongo -> mongosh
결론
거의 무중단 상태로 DB Version을 up 시킬 수 있을것 같아 기쁘다.
이제 버전을 올리는 방법은 확인했으니 dev 서버에 적용해보고 특이사항을 확인한 후 실제 server에 적용할 예정이다.
적용 후
아무런 문제 없이 적용을 할 수 있을 줄 알았는데 nodejs에서 mongo-queue module이 문제가 되어서 이를 해결해야 하는 사태가 벌어졌다. 3년 전 published 후 더 이상 진행하고 있지 않아 모듈을 변경해야 할 듯 싶다. ㅜㅜ
-> mongo-message-queue라는 module이 있는데 적용해 보도록 하겠다.
'mongoDB' 카테고리의 다른 글
MongoDB Time Series Collection - 3 (0) 2022.03.25 MongoDB Time Series Collection - 2 (0) 2022.03.25 MongoDB Time Series Collection - 1 (0) 2022.03.25 MongoDB란 (2) 2022.03.24 local 환경에서 Mongodb replicaset 설정하기 (0) 2021.04.11