mongomirror를 사용하여 AWS의 MongoDB에서 Atlas로 데이터 가져 오기
13988 단어 mongomirrormigrationMongoDBEC2AWS
관련
MongoDB Atlas의 LiveMigration을 사용할 때의 각서
AWS의 MongoDB를 Atlas로 LiveMigration
NLB에서 TLS 종단을 수행하고 Atlas의 LiveMigration 수행
경위
Atlas 제공 LiveMigration을 사용하면 오류가 발생하는 몇 번이있었습니다.
LiveMigration 측에서 에러가 발생하면 유저적으로는 블랙박스에서 Troubleshooting이나 채팅 지원에서는 해결책을 찾아낼 수 없었기 때문에, mongomirror 를 이용해 데이터를 임포트하기로 했다.
절차
mongomirror를 실행하는 인스턴스 준비
To avoid contention for network and CPU resources, do not run mongomirror on the same hosts that provide your replica set’s mongod instances.
mongomirror must have network access to the source replica set.
mongomirror must have network access to the target cluster.
mongomirror has approximately the same performance impact on your source replica set as a secondary:
For the initial sync stage, the load scales with the size of your data set.
Once an initial sync completes, the load scales with oplog gigabytes used per hour.
EC2의 DB 및 Atlas에 연결할 수 있는 곳이어야 함 = app 서버와 동일한 서브넷에 DB 서버와 동일한 사양으로 인스턴스 생성
mongomirror 설치
mkdir mongomirror_work
cd mongomirror_work
curl https://s3.amazonaws.com/mciuploads/mongomirror/binaries/linux/mongomirror-linux-x86_64-enterprise-amzn64-0.8.0.tgz -o mongomirror-linux-x86_64-enterprise-amzn64-0.8.0.tgz
tar -zxvf mongomirror-linux-x86_64-enterprise-amzn64-0.8.0.tgz
curl https://downloads.mongodb.org/linux/mongodb-shell-linux-x86_64-amazon-4.2.0.tgz -o mongodb-shell-linux-x86_64-amazon-4.2.0.tgz
tar -zxvf mongodb-shell-linux-x86_64-amazon-4.2.0.tgz
소스 측의 DB(EC2)에 마이그레이션용 사용자를 작성한다.
Set up MongoDB user in the source replica set
use admin
db.createUser(
{
user: "mySourceUser",
pwd: "mySourceP@$$word",
roles: [ "clusterMonitor", "readAnyDatabase" ]
}
)
Atlas 측에 AtlasAdmin 권한으로 사용자 만들기
Set up MongoDB user in the target Atlas cluster
여기에서 만든 사용자는
Save as temporary user
를 선택합니다.소통 확인
mongodb-linux-x86_64-amazon-4.2.0/bin/mongo "mongodb+srv://<Atlasのホスト>/admin" --username <Atlasに作成したユーザー>
mongomirror 시작
참조 htps //w w. s에서 멋지다. 네 t / 몽고 db / 몽고 db ぉ 또는 l-se t ぇ-2019-be stp 등 c 치세 s
nohup mongomirror-linux-x86_64-enterprise-amzn64-0.8.0/bin/mongomirror \
--host <srcのレプリカセット名>/srcのホスト1:27017,srcのホスト2:27017,srcのホスト3:27017 \
--username "<srcに作成した移行用のユーザー>" \
--password "<srcに作成した移行用のユーザーのパスワード>" \
--authenticationDatabase "admin" \
--destination "<Atlas上のレプリカセット名>/<Atlasクラスターのホスト1>:27017,<Atlasクラスターのホスト2>:27017,<Atlasクラスターのホスト3>:27017" \
--destinationUsername "<Atlas側に作成したユーザー>" \
--destinationPassword "<Atlas側に作成したユーザーのパスワード>" \
--httpStatusPort 8000 \
-j 16 > mongomirror.log 2>&1 &
이 때 Atlas의 복제본 세트 이름과 연결 정보를 확인하는 방법은
htps : // / cs. 아 tぁs. 몽고 db. 코 m / 이 m 포 rt / 몽고 미로 r / # 코 py ぇ- r 게 t c ぅ s r ho st
잘 읽으십시오.
연결정보가 잘못되면
2019-10-08T05:27:30.881+0000 Error initializing mongomirror: could not initialize destination connection: could not connect to server: server selection error: server selection timeout
current topology: Type: ReplicaSetNoPrimary
Servers:
같은 오류가 발생하고 mongomirror가 멈 춥니 다.
-j 옵션 정보
collection 복사본의 병렬도를 결정합니다.
numParallelCollections
--numParallelCollections , -j
Default: 4
The number of collections to copy and restore in parallel.
서포트에게 물었을 때,
we recommend this parameter to be in line with the number of CPU cores on the host machine hosting mongomirror.
라는 것이므로, CPU 사이즈에 맞춘다.
기본값은 4. 아마 LiveMigration도 뒤에서는 mongomirror를 4로 기동하고 있는 것이 아닐까 생각한다.
이번 16으로 하면, LiveMigration에서는 16h 걸려 있던 것이 6h 정도로 단축되었다.
mongomirror 로그를 읽는 방법
initializing ~ initial sync 로그
nohup: ignoring input
mongomirror version: 0.8.0
git version: a5cbb2d5babea8ed87191b31b12ffc6f3a3fa485
Go version: go1.12.4
os: linux
arch: amd64
compiler: gc
2019-10-08T05:31:42.724+0000 Initializing HTTP status service on port 8000
2019-10-08T05:31:42.801+0000 Attempting initial sync from: 10.0.1.17:27017
2019-10-08T05:31:43.015+0000 Creating collection <DB名>.<コレクション名AAA>
2019-10-08T05:31:43.015+0000 Creating collection <DB名>.<コレクション名BBB>
2019-10-08T05:31:43.078+0000 Copying documents to collection <DB名>.<コレクション名AAA>
2019-10-08T05:31:43.116+0000 Copying documents to collection <DB名>.<コレクション名BBB>
2019-10-08T05:31:46.015+0000 [........................] <DB名>.<コレクション名AAA> 39316/1033602 (3.8%)
2019-10-08T05:31:46.015+0000 [#.......................] <DB名>.<コレクション名BBB> 50015/1161614 (4.3%)
컬렉션마다의 진척이 인디게이터풍에 3초마다 출력된다.
여기서 J옵션으로 지정한 병렬도가 효과가 온다.
색인 복사
문서 복사가 끝나면 색인 작성이 시작됩니다.
2019-10-08T05:43:32.944+0000 Copied 11043565 documents to <DB名>.<コレクション名AAA>
2019-10-08T05:43:32.944+0000 [########################] <DB名>.<コレクション名AAA> 11043565/11043565 (100.0%)
2019-10-08T05:43:32.993+0000 Tailing the oplog on the source cluster starting at timestamp: {1570512697 1}
2019-10-08T05:43:32.994+0000 Oplog tailer has shut down. Oplog applier will exit.
2019-10-08T05:43:32.994+0000 Current lag until the end of initial sync: 0s
2019-10-08T05:43:33.032+0000 createIndexes for collection: `<DB名>.<コレクション名AAA>`, finished in 36.390104ms
2019-10-08T05:43:33.032+0000 createIndexes for collection: `<DB名>.<コレクション名BBB>`, finished in 36.834095ms
여기서 주의하고 싶은 것이,
createIndexes for collection
의 로그 출력은, index 구축 완료 후에 표시되므로, 큰 컬렉션으로 Index 작성 자체에 몇분 걸리는 것이 있는 경우, 로그의 출력이 멈추어 버린다.로그 출력이 없는 경우라도 mongomirror의 프로세스는 살아 있으므로 그럴 때는 http서버 기능(후술)으로 현재의 스테이터스를 확인할 수 있으므로 당황하지 않는다.
initial sync ~ oplog sync 로그
문서의 사본, Index의 구축이 끝나면, mongomirror는
oplog sync
상태에 있다.이 lag 시간이 0s인 경우에 컷오버할 수 있다.
2019-10-08T06:00:48.161+0000 Index builds completed.
2019-10-08T06:00:48.161+0000 Initial sync from 10.0.1.17:27017 completed at oplog timestamp: {{1570513407 1} {1570513407 1}}
2019-10-08T06:00:48.161+0000 Proceeding to tail oplog.
2019-10-08T06:00:48.174+0000 Current lag from source: 17m20s
2019-10-08T06:00:48.174+0000 Tailing the oplog on the source cluster starting at timestamp: {1570513407 1}
2019-10-08T06:00:58.185+0000 Current lag from source: 0s
2019-10-08T06:01:08.175+0000 Current lag from source: 0s
http 서버 기능으로 상태 확인
시작 옵션에서 지정한 --httpStatusPort 8000에 대해 GET 요청을 수행하면
mongomirror
프로세스의 현재 상태를 알 수 있습니다.
curl -X GET http://localhost:8000 | python -m json.tool
{
"details": {
"<DB名>.<コレクション名AAA>": {
"complete": true,
"createIndexes": 2
},
"<DB名>.<コレクション名AAA>": {
"complete": true,
"createIndexes": 4
},
....
},
"phase": "copying indexes",
"stage": "initial sync"
}
mongomirror 정지
ps aux | grep mongomirror
kill <pid>
2019-10-08T06:10:28.175+0000 Current lag from source: 0s
2019-10-08T06:10:38.175+0000 Current lag from source: 0s
2019-10-08T06:10:48.130+0000 signal 'terminated' received; attempting to shut down
2019-10-08T06:10:48.130+0000 Quitting...
2019-10-08T06:10:48.131+0000 Current lag from source: 0s
2019-10-08T06:10:49.130+0000 Timestamp file written to /home/ec2-user/mongomirror_work/mongomirror.timestamp.
이 때 작성된
mongomirror.timestamp
는 다음의 mongomirror
실행시에, bookmarkFile 옵션 로서 지정하는 것으로, 계속부터 실행할 수가 있다.--bookmarkFile
를 지정해 기동했을 때의 로그는 이하와 같은 출력이 된다.git version: a5cbb2d5babea8ed87191b31b12ffc6f3a3fa485
Go version: go1.12.4
os: linux
arch: amd64
compiler: gc
2019-10-10T01:51:16.723+0000 Initializing HTTP status service on port 8000
2019-10-10T01:51:16.791+0000 Read timestamp from bookmark file: {1570671675 1}
2019-10-10T01:51:16.791+0000 Proceeding to tail oplog.
2019-10-10T01:51:16.792+0000 Current lag from source: 10m0s
2019-10-10T01:51:16.792+0000 Tailing the oplog on the source cluster starting at timestamp: {1570671675 1}
2019-10-10T01:51:26.803+0000 Current lag from source: 0s
2019-10-10T01:51:36.793+0000 Current lag from source: 0s
Reference
이 문제에 관하여(mongomirror를 사용하여 AWS의 MongoDB에서 Atlas로 데이터 가져 오기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/georgeOsdDev@github/items/17a623dcc29bedf199b6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)