DB/Redis

[Redis] Redis cluster

Dev.Congsik 2024. 8. 26. 16:08
728x90

  • Redis 서버 3대 클러스터 구성을 통해 master-slave의 안정적인 형태의 구축을 목적으로 함
  • 데이터 파티셔닝 가능(샤딩)
  • 일부 노드가 실패하거나 통신이 불가한 상황에서도 정상적으로 운영 가능하다.

→ 마스터 노드가 모두 다운되는 극단적 상황을 제외하고, 노드의 하위 집합에서 장애 발생 또는 클러스터의 나머지 부분과 통신이 불가능할 때에도 지속적으로 운영 가능

  • 테스트 redis 서버 #1~#3 (192.168.59.134 ~ 136) 구축→ 마스터 (#1~#3:6379) / slave (#1~#3:6380)

Master #1 (6379) ==⇒ Slave #2 (6380)

Master #2 (6379) ==⇒ Slave #3 (6380)

Master #3 (6379) ==⇒ Slave #1 (6380)

 

  • redis.conf 수정 (마스터 서버 #1~#3 모두 진행)
cp /etc/redis.conf /etc/redis.conf.bak  //기존 redis.conf 백업

vi /etc/redis.conf


bind 192.168.59.134   //redis 서버 인스턴스로 사용할 자신의 IP

port 6379   //서버가 사용할 포트

pidfile /var/run/redis_6379.pid   //pid파일 경로

logfile /data/log/redis/redis.log   //redis log파일 경로

appendonly yes   //no -> yes 수정

cluster-enabled yes  //주석 해제, 클러스터 사용 여부

cluster-config-file nodes-6379.conf  //주석 해제, 클러스터 구성 저장

cluster-node-timeout 5000  //클러스터 노드 타임아웃 설정, milsec 단위 (3~5초 권장)

→ bind 서버주소 외 다른 config 값 동일하게 변경

 

  • redis_6380.conf 작성 (slave 서버 #1~#3 모두 진행)
cp /etc/redis.conf /etc/redis_6380.conf   //slave용 conf 작성

vi /etc/redis_6380.conf


bind 192.168.59.134

port 6380

pidfile /var/run/redis_6380.pid

logfile /data/log/redis_6380/redis_6380.log

dbfilename dump_6380.rdb

appendonly no

cluster-enabled yes

cluster-config-file nodes-6380.conf

cluster-node-timeout 5000

 

  • 최초 클러스터 구성
//최초 클러스터 구성 시, create [ip:port] [ip:port]...

redis-cli --cluster create 192.168.59.134:6379 192.168.59.135:6379 192.168.59.136:6379

 

  • 이미 클러스터가 구성된 상태에서 노드만 추가할 경우
redis-cli --cluster add-node 192.168.59.135:6380 192.168.59.134:6379 --cluster-slave  //slave 노드 추가 -> add-node [slave ip:port] [master ip:port]
redis-cli --cluster add-node 192.168.59.136:6380 192.168.59.135:6379 --cluster-slave  //slave 노드 추가
redis-cli --cluster add-node 192.168.59.134:6380 192.168.59.136:6379 --cluster-slave  //slave 노드 추가

 

  • 마스터 #1의 slave ⇒ #2 서버:6380

 

  • 마스터 #2의 slave ⇒ #3 서버:6380

 

 

  • 마스터 #3의 slave ⇒ #1 서버:6380

 

  • 클러스터 상태 확인
redis-cli -c -h 192.168.59.134 -p 6379   //-h [접속할 redis 서버 ip주소] -p [포트]

192.168.59.134:6379> cluster info   //redis 클러스터 정보 표시
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:10237
cluster_stats_messages_pong_sent:10300
cluster_stats_messages_sent:20537
cluster_stats_messages_ping_received:10295
cluster_stats_messages_pong_received:10235
cluster_stats_messages_meet_received:5
cluster_stats_messages_fail_received:2
cluster_stats_messages_received:20537



192.168.59.134:6379> cluster nodes   //redis 클러스터 노드 관계 정보
9def3780488f1f5be0cd1e8109732f7611e14109 192.168.59.136:6379@16379 master - 0 1709829676716 3 connected 10923-16383
bef05f879d76aefedf3069061cc5cb61dd280131 192.168.59.134:6380@16380 slave 9def3780488f1f5be0cd1e8109732f7611e14109 0 1709829677720 3 connected
41f09f21a58de8de4f64e2190b92678c7df573ed 192.168.59.135:6379@16379 master - 0 1709829677000 2 connected 5461-10922
fa1a2d9e3626f41f528af2e2dace0201959220b2 192.168.59.136:6380@16380 slave 41f09f21a58de8de4f64e2190b92678c7df573ed 0 1709829676513 2 connected
bf4abf48d5a43e1e7d785e726d349edb9cff193d 192.168.59.135:6380@16380 slave a6b101738e5f7eb39f314d5f762e64a3b0e9a735 0 1709829676512 1 connected
a6b101738e5f7eb39f314d5f762e64a3b0e9a735 192.168.59.134:6379@16379 myself,master - 0 1709829675000 1 connected 0-5460

 

 

  • 마스터 #1 서버 (slave = #2) redis 로그
vi /data/log/redis/redis.log

13156:C 07 Mar 2024 13:23:04.373 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13156:C 07 Mar 2024 13:23:04.373 # Redis version=6.0.4, bits=64, commit=00000000, modified=0, pid=13156, just started
13156:C 07 Mar 2024 13:23:04.373 # Configuration loaded
13156:C 07 Mar 2024 13:23:04.373 # WARNING supervised by systemd - you MUST set appropriate values for TimeoutStartSec and TimeoutStopSec in your service unit.
13156:M 07 Mar 2024 13:23:04.374 * No cluster configuration found, I'm a6b101738e5f7eb39f314d5f762e64a3b0e9a735
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.0.4 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in cluster mode   //클러스터 모드로 기동 시 표시
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 13156
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

13156:M 07 Mar 2024 13:23:04.374 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
13156:M 07 Mar 2024 13:23:04.374 # Server initialized
13156:M 07 Mar 2024 13:23:04.374 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
13156:M 07 Mar 2024 13:23:04.374 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
13156:M 07 Mar 2024 13:23:04.375 * Ready to accept connections
13156:M 07 Mar 2024 14:09:18.443 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
13156:M 07 Mar 2024 14:09:18.502 # IP address for this node updated to 192.168.59.134
13156:M 07 Mar 2024 14:09:23.397 # Cluster state changed: ok
13156:M 07 Mar 2024 16:27:11.728 * Replica 192.168.59.135:6380 asks for synchronization  //슬레이브 노드 동기화 요청 로그
13156:M 07 Mar 2024 16:27:11.728 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for 'd30a573e2b1f889962738e83007ff87b07524693', my replication IDs are '33dc620bf429dba06440a58fa4747f4abc926ee6' and '0000000000000000000000000000000000000000')
13156:M 07 Mar 2024 16:27:11.728 * Replication backlog created, my new replication IDs are '128bda128a4805c651c427199de76eaf719157a8' and '0000000000000000000000000000000000000000'
13156:M 07 Mar 2024 16:27:11.728 * Starting BGSAVE for SYNC with target: disk
13156:M 07 Mar 2024 16:27:11.729 * Background saving started by pid 13776
13776:C 07 Mar 2024 16:27:11.733 * DB saved on disk
13776:C 07 Mar 2024 16:27:11.736 * RDB: 0 MB of memory used by copy-on-write
13156:M 07 Mar 2024 16:27:11.820 * Background saving terminated with success
13156:M 07 Mar 2024 16:27:11.822 * Synchronization with replica 192.168.59.135:6380 succeeded  //슬레이브 노드 동기화 완료

 

  • slave #2 서버 (Master = #1) redis 로그
50046:C 07 Mar 2024 16:14:55.678 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
50046:C 07 Mar 2024 16:14:55.678 # Redis version=6.0.4, bits=64, commit=00000000, modified=0, pid=50046, just started
50046:C 07 Mar 2024 16:14:55.678 # Configuration loaded
50046:M 07 Mar 2024 16:14:55.678 * Increased maximum number of open files to 10032 (it was originally set to 1024).
50046:M 07 Mar 2024 16:14:55.679 * No cluster configuration found, I'm bf4abf48d5a43e1e7d785e726d349edb9cff193d
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 6.0.4 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in cluster mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6380
 |    `-._   `._    /     _.-'    |     PID: 50046
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

50046:M 07 Mar 2024 16:14:55.680 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
50046:M 07 Mar 2024 16:14:55.680 # Server initialized
50046:M 07 Mar 2024 16:14:55.680 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
50046:M 07 Mar 2024 16:14:55.680 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
50046:M 07 Mar 2024 16:14:55.680 * Ready to accept connections
50046:M 07 Mar 2024 16:27:06.982 # IP address for this node updated to 192.168.59.135
50046:S 07 Mar 2024 16:27:10.874 * Before turning into a replica, using my own master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
50046:S 07 Mar 2024 16:27:10.874 # Cluster state changed: ok
50046:S 07 Mar 2024 16:27:11.719 * Connecting to MASTER 192.168.59.134:6379   //마스터 #1 서버 연결시도
50046:S 07 Mar 2024 16:27:11.720 * MASTER <-> REPLICA sync started   //마스터-슬레이브 동기화 시작
50046:S 07 Mar 2024 16:27:11.722 * Non blocking connect for SYNC fired the event.
50046:S 07 Mar 2024 16:27:11.725 * Master replied to PING, replication can continue...
50046:S 07 Mar 2024 16:27:11.727 * Trying a partial resynchronization (request d30a573e2b1f889962738e83007ff87b07524693:1).
50046:S 07 Mar 2024 16:27:11.730 * Full resync from master: 128bda128a4805c651c427199de76eaf719157a8:0
50046:S 07 Mar 2024 16:27:11.730 * Discarding previously cached master state.   //기존 마스터 서버 데이터 초기화
50046:S 07 Mar 2024 16:27:11.820 * MASTER <-> REPLICA sync: receiving 175 bytes from master to disk
50046:S 07 Mar 2024 16:27:11.822 * MASTER <-> REPLICA sync: Flushing old data
50046:S 07 Mar 2024 16:27:11.822 * MASTER <-> REPLICA sync: Loading DB in memory
50046:S 07 Mar 2024 16:27:11.822 * Loading RDB produced by version 6.0.4
50046:S 07 Mar 2024 16:27:11.822 * RDB age 0 seconds
50046:S 07 Mar 2024 16:27:11.822 * RDB memory usage when created 2.49 Mb
50046:S 07 Mar 2024 16:27:11.822 * MASTER <-> REPLICA sync: Finished with success   //마스터-슬레이브 동기화 완료

 

 

 

728x90

'DB > Redis' 카테고리의 다른 글

Redis?  (0) 2024.08.26