Nur Hamim
Nur Hamim Anak desa yang gemar berkomunitas, suka menulis dan mencari hal baru seputar Unix/Linux dan Cloud. Saat ini sedang menempuh pendidikan S1 TI di Unindra dan kebetulan bekerja di PT Biznet GIO Nusantara

Docker: Cara Membuat Replikasi MongoDB Menggunakan Docker Compose


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, konfigurasi set replica dan keluar (exit).
  • file startdb.sh : Digunakan untuk menjalankan proses dari docker-compose dan rs-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 untuk mongodb 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 versi 4.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 😁

comments powered by Disqus