จากโพสต์ที่ผ่านมาเรื่องการติดตั้ง redis cluster นั้น มันก็ทำงานเป็น cluster ใน mode master-master กันอยู่แหล่ะ แต่คราวนี้ปัญหามันเกิดเวลา instance หนึ่งถ้ามัน down ลงไป มันทำให้ทั้ง cluster ใช้งานไม่ได้เลย redis ก็จะใช้งานไม่ได้ตามไปด้วย
การแก้ไขนั้นคือเราต้องทำ instance ที่เป็น replica ขึ้นมาให้กับ master แต่ละตัว ซึ่งถ้าหาก master ตัวใดตัวหนึ่งได้ down ไป ตัว replica (slave) ก็จะ promote ตัวเองขึ้นมาเป็น master แทนอัตโนมัติครับ หรือเรียกอีกอย่างหนึ่งว่าการ failover
มาเริ่มกันเลยดีกว่า (ต่อจากโพสต์เดิมนะ การติดตั้ง 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]
[shell]
redis-cli -p 6379
127.0.0.1:6379> cluster nodes
[/shell]
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
[shell]
redis-cli -p
127.0.0.1:7979> cluster replicate 82da99ca89e693120f4e368843d094d6ea587091
[/shell]
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
[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]
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