ทำ Failover ให้กับ redis cluster

จากโพสต์ที่ผ่านมาเรื่องการติดตั้ง redis cluster นั้น มันก็ทำงานเป็น cluster ใน mode master-master กันอยู่แหล่ะ แต่คราวนี้ปัญหามันเกิดเวลา instance หนึ่งถ้ามัน down ลงไป มันทำให้ทั้ง cluster ใช้งานไม่ได้เลย redis ก็จะใช้งานไม่ได้ตามไปด้วย

การแก้ไขนั้นคือเราต้องทำ instance ที่เป็น replica ขึ้นมาให้กับ master แต่ละตัว ซึ่งถ้าหาก master ตัวใดตัวหนึ่งได้ down ไป ตัว replica (slave) ก็จะ promote ตัวเองขึ้นมาเป็น master แทนอัตโนมัติครับ หรือเรียกอีกอย่างหนึ่งว่าการ failover

Failover success

มาเริ่มกันเลยดีกว่า (ต่อจากโพสต์เดิมนะ การติดตั้ง redis cluster)

ทำการสร้าง instance ใหม่ขึ้นมา

[shell]
for i in {7379..7381}
do
mkdir /etc/redis/redis-$i/
cat >> /etc/redis/redis-$i/redis.conf << END
port $i
cluster-enabled yes
cluster-config-file /etc/redis/redis-$i/nodes.conf
cluster-node-timeout 5000
appendonly yes
END
done
[/shell]

ทำการ start redis-server ที่ได้สร้างเมื่อกี้ ขึ้นมา

[shell]
for i in {7379..7381}
do
redis-server /etc/redis/redis-$i/redis.conf &
done
[/shell]

Join redis-server ที่ได้สร้างขึ้นมาใหม่นี้ เข้า cluster เดิมที่มีอยู่แล้ว

[shell]
for i in {7379..7381}
do
redis-trib.rb add-node 127.0.0.1:$i 127.0.0.1:6379
done
[/shell]

 เสร็จแล้ว เข้าไปจัดการทำ replica ระหว่าง instance โดยผมจะโยงในลักษณะนี้นะครับ
 chart
ตรวจสอบสถานะของ Cluster

[shell]
redis-cli -p 6379
127.0.0.1:6379> cluster nodes
[/shell]

ก็จะเห็น node ที่เพิ่มเข้ามาดังลักษณะนี้
2bd09849437a295377c2e6ae80050e1563b868b0 127.0.0.1:7379 master - 0 1439428336565 4 connected
569a16572c5e78921633239d3925fd5554cdb3c1 127.0.0.1:7381 master - 0 1439428336057 0 connected
5ad713ae1a2553639c9c81d116e1021af7c273c1 127.0.0.1:6381 master - 0 1439428337068 3 connected 10923-16383
3e3cfd2c4609c77dd6f63e9654b1e417fb4c8223 127.0.0.1:7380 master - 0 1439428335051 5 connected
13f160661910bcd7a641bba7a5bf03f356966cf4 127.0.0.1:6379 myself,master - 0 0 1 connected 0-5460
82da99ca89e693120f4e368843d094d6ea587091 127.0.0.1:6380 master - 0 1439428336057 2 connected 5461-10922
เข้าไปจัดการ instance 7379

[shell]
redis-cli -p
127.0.0.1:7979> cluster replicate 82da99ca89e693120f4e368843d094d6ea587091
[/shell]

จะได้ output ขึ้นมาในลักษณะนี้

 

OK
 127.0.0.1:7379> 1529:S 13 Aug 01:16:20.214 * Connecting to MASTER 127.0.0.1:6380
 1529:S 13 Aug 01:16:20.214 * MASTER <-> SLAVE sync started
 1529:S 13 Aug 01:16:20.214 * Non blocking connect for SYNC fired the event.
 1529:S 13 Aug 01:16:20.215 * Master replied to PING, replication can continue...
 1529:S 13 Aug 01:16:20.215 * Partial resynchronization not possible (no cached master)
 1487:M 13 Aug 01:16:20.215 * Slave asks for synchronization
 1487:M 13 Aug 01:16:20.215 * Full resync requested by slave.
 1487:M 13 Aug 01:16:20.216 * Starting BGSAVE for SYNC
 1487:M 13 Aug 01:16:20.216 * Background saving started by pid 2081
 1529:S 13 Aug 01:16:20.216 * Full resync from master: f5e238abd9bde1b0848de7f6428018972fa8a9e3:1
 2081:C 13 Aug 01:16:20.218 * DB saved on disk
 2081:C 13 Aug 01:16:20.219 * RDB: 0 MB of memory used by copy-on-write
 1487:M 13 Aug 01:16:20.313 * Background saving terminated with success
 1487:M 13 Aug 01:16:20.314 * Synchronization with slave succeeded
 1529:S 13 Aug 01:16:20.314 * MASTER <-> SLAVE sync: receiving 18 bytes from master
 1529:S 13 Aug 01:16:20.314 * MASTER <-> SLAVE sync: Flushing old data
 1529:S 13 Aug 01:16:20.314 * MASTER <-> SLAVE sync: Loading DB in memory
 1529:S 13 Aug 01:16:20.315 * MASTER <-> SLAVE sync: Finished with success
 1529:S 13 Aug 01:16:20.315 * Background append only file rewriting started by pid 2082
 1529:S 13 Aug 01:16:20.347 * AOF rewrite child asks to stop sending diffs.
 2082:C 13 Aug 01:16:20.347 * Parent agreed to stop sending diffs. Finalizing AOF...
 2082:C 13 Aug 01:16:20.347 * Concatenating 0.00 MB of AOF diff received from parent.
 2082:C 13 Aug 01:16:20.348 * SYNC append only file rewrite performed
 2082:C 13 Aug 01:16:20.348 * AOF rewrite: 0 MB of memory used by copy-on-write
 1529:S 13 Aug 01:16:20.414 * Background AOF rewrite terminated with success
 1529:S 13 Aug 01:16:20.415 * Redidual parent diff successfully flushed to the rewritten AOF (0.00 MB)
 1529:S 13 Aug 01:16:20.415 * Background AOF rewrite finished successfully

 

 

หลังจากนั้นก็จัดการกับ node ทีเหลือ

 

[shell]
redis-cli -p 7380
127.0.0.1:7380> cluster replicate 5ad713ae1a2553639c9c81d116e1021af7c273c1
[/shell]

[shell]
redis-cli -p 7381
127.0.0.1:7381> cluster replicate 13f160661910bcd7a641bba7a5bf03f356966cf4
[/shell]

ถ้าดูที่ cluster status จะเห็นได้ว่า
127.0.0.1:7381> cluster nodes
5ad713ae1a2553639c9c81d116e1021af7c273c1 127.0.0.1:6381 master - 0 1439428983104 3 connected 10923-16383
82da99ca89e693120f4e368843d094d6ea587091 127.0.0.1:6380 master - 0 1439428982602 2 connected 5461-10922
569a16572c5e78921633239d3925fd5554cdb3c1 :7381 myself,slave 13f160661910bcd7a641bba7a5bf03f356966cf4 0 0 0 connected
2bd09849437a295377c2e6ae80050e1563b868b0 127.0.0.1:7379 slave 82da99ca89e693120f4e368843d094d6ea587091 0 1439428981089 5 connected
3e3cfd2c4609c77dd6f63e9654b1e417fb4c8223 127.0.0.1:7380 slave 5ad713ae1a2553639c9c81d116e1021af7c273c1 0 1439428982099 5 connected
13f160661910bcd7a641bba7a5bf03f356966cf4 127.0.0.1:6379 master - 0 1439428983104 1 connected 0-5460
slave ได้ทำการเกาะกับ master ตามที่เราต้องการแล้ว
คราวนี้เวลาใช้งานหาก master down ลงไป slave ก็จะขึ้นมาเป็นอัตโนมัติครับ อาจจะมี error ให้เจอบ้างในช่วงสลับตัวเองขึ้นมาประมาณ 1-5 วินาทีหลังจากนั้นก็ใช้งานได้ปกติ หาก master กลับมา up ก็จะกลายเป็น slave แทนครับ
ball Written by:

Teerapat Khunpech Live, Tech, Beers, Bike, Cafe Racer, Docker, Devops, Eco-System