Merhaba,
Normal şartlarda MongoDB replica-set ile çalışırken virtual ip’ye ihtiyacımız yoktur. Daha önce MongoDB Kurulum Tipleri ve MongoDB ’de replica set ile çalışmak makalelerinde de anlattığımız gibi MongoDB ‘nin kendi client’i election (failover/switchover) işlemlerinde yeni primary sunucuyu otomatik olarak algıladığı için uygulama tarafında connection string güncellememize gerek kalmaz.
Ancak bazen bazı uygulamalar maalesef MongoDB ile çalışıyor olsalar bile connection string’e tek ip alabiliyor. Bu aslında MongoDB ile çalışan uygulamalar için yanlış bir durum diyebiliriz. Bu yüzden replica-set ile çalışırken MongoDB client’ın bu özelliklerini kullanamamış oluyoruz. Bu tarz durumlarda mecburen MongoDB üzerindeki failover/switchover işlemlerini yakalayacak bir tool’a ihtiyacımız oluyor. Bunlardan en basiti ise keepalived.
Aşağıdaki adımları izleyerek replica-set sunucuları üzerinde keepalived konfigürasyonu yaparak, belirlemiş olduğunuz virtual ip’nin sürekli primary node’da olmasını sağlayabilirsiniz. Bu sayede bir election anında uygulama katmanında ip güncellemesi yapmak zorunda kalmazsınız.
yum install keepalived -y
[root@mongodb1 keepalived]# cat ck_mongo_master.sh
#!/usr/bin/bash
ISMASTER=$(/usr/bin/mongo -host 127.0.0.1 --quiet --eval 'db.isMaster().ismaster')
if [ $ISMASTER == 'true' ]; then
exit 0
else
exit 1
fi
[root@mongodb1 keepalived]# cat keepalived.conf
# check mongodb is running
vrrp_script check_mongod {
script "/usr/bin/killall -0 mongod"
interval 2
fall 3
}
# check mongodb is master
vrrp_script check_mongod_ismaster {
script "/etc/keepalived/ck_mongo_master.sh"
interval 2
fall 3
}
vrrp_instance VI {
state MASTER
interface ens192
virtual_router_id 50
priority 100
advert_int 1
virtual_ipaddress {
10.10.0.30/24
}
track_script {
check_mongod
check_mongod_ismaster
}
}
Keepalived öncelikle MongoDB açık mı diye kontrol ediyor, eğer açık ise bizim yazdığımız sh’ı çalıştırıp sonucuna bakıyor, eğer 0 dönerse primary 1 dönerse secondary olduğunu anlıyor. 0 döndüğü zaman verdiğimiz virtual ip’yi sunucuya atıyor.
[root@mongodb1 keepalived]# systemctl start keepalived
[root@mongodb1 keepalived]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2021-07-07 13:05:24 +03; 5 days ago
Main PID: 91604 (keepalived)
Tasks: 2 (limit: 411966)
Memory: 2.1M
CGroup: /system.slice/keepalived.service
├─91604 /usr/sbin/keepalived -D
└─91605 /usr/sbin/keepalived -D
Jul 07 13:05:27 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:27 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:27 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:27 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:32 mongodb1 Keepalived_vrrp[91605]: (VI) Sending/queueing gratuitous ARPs on ens192 for 10.10.0.30
Jul 07 13:05:32 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:32 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:32 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:32 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
Jul 07 13:05:32 mongodb1 Keepalived_vrrp[91605]: Sending gratuitous ARP on ens192 for 10.10.0.30
[root@mongodb1 keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:01:02:0d brd ff:ff:ff:ff:ff:ff
inet 10.10.0.25/24 brd 10.10.0.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet 10.10.0.30/24 scope global secondary ens192
valid_lft forever preferred_lft forever
inet6 fe80::d700:b5c8:4b12:fbc0/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@mongodb2 ~]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2021-07-07 12:49:28 +03; 5 days ago
Main PID: 45282 (keepalived)
Tasks: 2 (limit: 411966)
Memory: 2.1M
CGroup: /system.slice/keepalived.service
├─45282 /usr/sbin/keepalived -D
└─45283 /usr/sbin/keepalived -D
Jul 07 12:49:28 mongodb2 Keepalived_vrrp[45283]: (VI) removing VIPs.
Jul 07 12:49:28 mongodb2 Keepalived_vrrp[45283]: VRRP sockpool: [ifindex( 2), family(IPv4), proto(112), fd(11,14)]
Jul 07 12:49:28 mongodb2 Keepalived_vrrp[45283]: VRRP_Script(check_mongod) succeeded
Jul 07 12:49:28 mongodb2 Keepalived_vrrp[45283]: Script `check_mongod_ismaster` now returning 1
Jul 07 12:49:28 mongodb2 Keepalived_vrrp[45283]: VRRP_Script(check_mongod_ismaster) failed (exited with status 1)
Jul 07 12:49:28 mongodb2 Keepalived_vrrp[45283]: (VI) Entering FAULT STATE
Jul 07 13:04:46 mongodb2 Keepalived_vrrp[45283]: Script `check_mongod` now returning 1
Jul 07 13:04:50 mongodb2 Keepalived_vrrp[45283]: VRRP_Script(check_mongod) failed (exited with status 1)
Jul 07 13:05:00 mongodb2 Keepalived_vrrp[45283]: Script `check_mongod` now returning 0
Jul 07 13:05:00 mongodb2 Keepalived_vrrp[45283]: VRRP_Script(check_mongod) succeeded