Docker: Cara Membuat Replikasi MongoDB Menggunakan Docker Compose
Belajar Linux ID - Pada tutorial kali ini kami akan memberikan anda cara bagaimana membuat replikasi pada database MongoDB.
Replikasi adalah proses membuat banyak salinan dari data yang sama untuk meningkatkan ketersediaan dan stabilitas. Secara teknis, jika sebuah node mati, kita dapat meneruskan permintaan yang masuk ke node lain sambil membuat yang sebelumnya hidup kembali. Replikasi mencegah kehilangan data karena Anda selalu memiliki salinan data di suatu tempat; itu bisa di server fisik yang sama atau didistribusikan di banyak wilayah.
Di MongoDB, Kumpulan replika adalah sekelompok proses mongod
yang mempertahankan kumpulan data yang sama. Mengikuti struktur tertentu di mana kita memiliki node
pertama yang disebut primary
yang menerima data, dan data tersebut disinkronkan ke node
yang lain atau disebut node secondary
dan untuk gambarannya sebagai berikut:
Jika kita lihat dari diagram diatas terdapat 3 container dengan pembagian sebagai berikut:
- 1 container sebagai primary run di port 27021
- 2 container sebagai secondary run di port 27022 dan 27023
Sebelum mengikut tutorial ini pastikan Anda sudah mempelajari tentang docker-compose
karena pada tutorial kali ini kami akan menggunakan docker-compose
untuk automasi proses pembuatan replikasi MongoDB.
Baca Juga :
Tahapan Pertama
Silakan membuat direktori untuk menyimpan file docker compose dan beberapa file bash script, seperti berikut ini:
1
2
3
4
5
6
7
8
root@hamim-lab-belajarlinux:~/project-mongodb# tree
.
├── docker-compose.yml
├── rs-init.sh
└── startdb.sh
0 directories, 3 files
root@hamim-lab-belajarlinux:~/project-mongodb#
Keterangan:
- file
docker-compose.yml
: Digunakan untuk automasi proses pembuatan container mongodb - file
rs-init.sh
: Di dalam file ini terdapat script untuk terhubung (connect) ke mongodb, konfigurasiset replica
dan keluar (exit). - file
startdb.sh
: Digunakan untuk menjalankan proses daridocker-compose
danrs-init.sh
.
Berikut isi dari ke tiga file tersebut
docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: '3.8'
services:
mongo1:
container_name: mongo1
image: mongo:4.4
volumes:
- ~/mongors/data1:/data/db
- ./rs-init.sh:/scripts/rs-init.sh
networks:
- mongors-network
ports:
- 27021:27017
links:
- mongo2
- mongo3
restart: always
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
mongo2:
container_name: mongo2
image: mongo:4.4
volumes:
- ~/mongors/data2:/data/db
networks:
- mongors-network
ports:
- 27022:27017
restart: always
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
mongo3:
container_name: mongo3
image: mongo:4.4
volumes:
- ~/mongors/data3:/data/db
networks:
- mongors-network
ports:
- 27023:27017
restart: always
entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "dbrs" ]
networks:
mongors-network:
driver: bridge
rs-init.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
mongo <<EOF
var config = {
"_id": "dbrs",
"version": 1,
"members": [
{
"_id": 1,
"host": "mongo1:27017",
"priority": 3
},
{
"_id": 2,
"host": "mongo2:27017",
"priority": 2
},
{
"_id": 3,
"host": "mongo3:27017",
"priority": 1
}
]
};
rs.initiate(config, { force: true });
rs.status();
EOF
startdb.sh
1
2
3
4
5
6
7
#!/bin/bash
docker-compose up -d
sleep 5
docker exec mongo1 /scripts/rs-init.sh
Jika sudah silakan berikan hak akses untuk dapat di eksekusi ke dua file .sh
tersebut seperti berikut:
1
2
root@hamim-lab-belajarlinux:~/project-mongodb# chmod +x rs-init.sh
root@hamim-lab-belajarlinux:~/project-mongodb# chmod +x startdb.sh
Tahapan Kedua
Pada tahan pertama kita sudah membuat dan mendefinikan semua file yang kita butuhkan, pada tahap ini kita dapat menjalankan file startdb.sh
untuk membuat atau deploy mongodb replikasi menggunakan docker-compose
seperti berikut ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
root@hamim-lab-belajarlinux:~/project-mongodb# ./startdb.sh
Creating network "project-mongodb_mongors-network" with driver "bridge"
Pulling mongo2 (mongo:4.4)...
4.4: Pulling from library/mongo
846c0b181fff: Already exists
ef773e84b43a: Already exists
2bfad1efb664: Already exists
84e59a6d63c9: Already exists
d2f00ac700e0: Already exists
19acbee5313d: Pull complete
0c1fec70349e: Pull complete
0e2e0a09be10: Pull complete
f6d2edc3edd9: Pull complete
Digest: sha256:1fd5dbccbe349fe6eeb58f2327044aa9392f80ee5ea1f9317ed3a10591c14f07
Status: Downloaded newer image for mongo:4.4
Creating mongo3 ... done
Creating mongo2 ... done
Creating mongo1 ... done
MongoDB shell version v4.4.18
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("79601716-e518-4ad6-9afc-8ee109d6a263") }
MongoDB server version: 4.4.18
{
"operationTime" : Timestamp(1673247963, 1),
"ok" : 0,
"errmsg" : "already initialized",
"code" : 23,
"codeName" : "AlreadyInitialized",
"$clusterTime" : {
"clusterTime" : Timestamp(1673247963, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
{
"set" : "dbrs",
"date" : ISODate("2023-01-09T07:59:03.884Z"),
"myState" : 2,
"term" : NumberLong(2),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 3,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(0, 0),
"t" : NumberLong(-1)
},
"lastCommittedWallTime" : ISODate("1970-01-01T00:00:00Z"),
"appliedOpTime" : {
"ts" : Timestamp(1673247963, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1673247963, 1),
"t" : NumberLong(1)
},
"lastAppliedWallTime" : ISODate("2023-01-09T07:06:03.594Z"),
"lastDurableWallTime" : ISODate("2023-01-09T07:06:03.594Z")
},
"lastStableRecoveryTimestamp" : Timestamp(1673247963, 1),
"members" : [
{
"_id" : 1,
"name" : "mongo1:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 5,
"optime" : {
"ts" : Timestamp(1673247963, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-01-09T07:06:03Z"),
"lastAppliedWallTime" : ISODate("2023-01-09T07:06:03.594Z"),
"lastDurableWallTime" : ISODate("2023-01-09T07:06:03.594Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "mongo2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3,
"optime" : {
"ts" : Timestamp(1673247963, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1673247963, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-01-09T07:06:03Z"),
"optimeDurableDate" : ISODate("2023-01-09T07:06:03Z"),
"lastAppliedWallTime" : ISODate("2023-01-09T07:06:03.594Z"),
"lastDurableWallTime" : ISODate("2023-01-09T07:06:03.594Z"),
"lastHeartbeat" : ISODate("2023-01-09T07:59:03.675Z"),
"lastHeartbeatRecv" : ISODate("2023-01-09T07:59:03.859Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
},
{
"_id" : 3,
"name" : "mongo3:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3,
"optime" : {
"ts" : Timestamp(1673247963, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1673247963, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2023-01-09T07:06:03Z"),
"optimeDurableDate" : ISODate("2023-01-09T07:06:03Z"),
"lastAppliedWallTime" : ISODate("2023-01-09T07:06:03.594Z"),
"lastDurableWallTime" : ISODate("2023-01-09T07:06:03.594Z"),
"lastHeartbeat" : ISODate("2023-01-09T07:59:03.674Z"),
"lastHeartbeatRecv" : ISODate("2023-01-09T07:59:03.724Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 1
}
],
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1673247963, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1673247963, 1)
}
bye
root@hamim-lab-belajarlinux:~/project-mongodb#
Keterangan:
- Dari proses diatas kita dapat melihat, pertama kali yaitu membuat
network
khusus untukmongodb replica set
1
Creating network "project-mongodb_mongors-network" with driver "bridge"
- Kemudian mengunduh images mongoDB sesuai versi yang sudah di tentukan di
docker-compose
yaitu versi4.4
1
2
3
4
5
6
7
8
9
10
11
12
13
Pulling mongo2 (mongo:4.4)...
4.4: Pulling from library/mongo
846c0b181fff: Already exists
ef773e84b43a: Already exists
2bfad1efb664: Already exists
84e59a6d63c9: Already exists
d2f00ac700e0: Already exists
19acbee5313d: Pull complete
0c1fec70349e: Pull complete
0e2e0a09be10: Pull complete
f6d2edc3edd9: Pull complete
Digest: sha256:1fd5dbccbe349fe6eeb58f2327044aa9392f80ee5ea1f9317ed3a10591c14f07
Status: Downloaded newer image for mongo:4.4
- Membuat container mongoDB dengan nama container
mongo1, mongo2, mongo3
1
2
3
4
Creating mongo3 ... done
Creating mongo2 ... done
Creating mongo1 ... done
MongoDB shell version v4.4.18
- Terhubung ke container mongodb dan mengatur replica set mongodb.
Tahapan Ketiga
Tahapan selanjutnya yaitu memastikan ke tiga container mongo1, mongo2, mongo3
sudah running dan mencoba login untuk memastikan apakah benar mongo1
di set sebagai primary
dan mongo2 & mongo3
sebagai secondary
sebagai berikut:
- Cek container menggunakan perintah
docker ps
1
2
3
4
5
6
root@hamim-lab-belajarlinux:~/project-mongodb# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ca6fac826de mongo:4.4 "/usr/bin/mongod --b…" 9 minutes ago Up 9 minutes 0.0.0.0:27021->27017/tcp, :::27021->27017/tcp mongo1
be12e68e31b7 mongo:4.4 "/usr/bin/mongod --b…" 9 minutes ago Up 9 minutes 0.0.0.0:27022->27017/tcp, :::27022->27017/tcp mongo2
a4b50ef775c5 mongo:4.4 "/usr/bin/mongod --b…" 9 minutes ago Up 9 minutes 0.0.0.0:27023->27017/tcp, :::27023->27017/tcp mongo3
root@hamim-lab-belajarlinux:~/project-mongodb#
- Verifikasi container mongoDB menggunakan perintah
1
2
3
root@hamim-lab-belajarlinux:~/project-mongodb# docker exec -it mongo1 mongo
root@hamim-lab-belajarlinux:~/project-mongodb# docker exec -it mongo2 mongo
root@hamim-lab-belajarlinux:~/project-mongodb# docker exec -it mongo2 mongo
mongo1
(Primary)
mongo2
(Secondary)
mongo3
(Secondary)
Sampai disini Anda sudah berhasil membuat Replikasi MongoDB menggunakan docker-composer
.
Selamat mencoba 😁