데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [이것이 레디스다 #2] 레디스 설치(Cluster mode)

      krisjey 24.01.09
      5,044 16 0
      DEVOTEE 요약
      본 블고그에서는 레디스 클러스터의 설정 방법을 다룹니다. 레디스 클러스터는 보통 마스터 노드 3개와 각 마스터 복제를 위한 슬레이브 노드 3개로 이루어진 6개의 노드로 구성되며, 필요에 따라 노드 수를 추가로 늘릴 수 있습니다. 본 포스팅에서는 6개의 노드를 만들어 각 노드에 설정을 진행하고, 각 노드별 설정 파일을 생성한 후 각 노드를 실행하고, 마지막으로 클러스터를 구성하는 과정을 설명하였습니다.
      DEVOTEE 추천 블로그

      레디스 Cluster 구성

      이전 포스팅에서는 단일모드와 Master-Slave 모드 설치 방법을 살펴봤습니다.

      이번 포스팅에서는 이전 포스팅에서 다루지 않았던 클러스터 모드 설치를 해보고 데이터를 조회해보도록 하겠습니다.


      이전 포스팅에서 사용한 환경과 파일 구성은 동일합니다.

      설치 전에 이전에 살펴본 그림을 다시 한번 살펴보죠.

      image.png

      위 그림처럼 레디스 클러스는 보통 6개의 노드로 구성합니다.

      조금더 정확하게 이야기하면 Master 노드 3개와 복제를 위한 Slave 노드 3개로 이루어 집니다.

      6노드는 클러스터를 구성하기 위한 최소 개수이며 원한다면 노드의 개수를 증가시킬 수 있습니다.

      기본 6개 노드에서 Master, Slave 노드 2개씩 추가할 수 있습니다.

      Master 노드를 추가하려면 2개씩 추가하고 Slave 노드를 추가하려면 3개씩 추가해야 합니다.


      이 포스팅에서는 최소 구성인 6개 노드를 사용하여 구성해보겠습니다.

      먼저 6개 노드를 실행하기 위한 6개의 폴더를 만들고 이전에 사용한 Redis 실행파일과 설정 파일을 복사해줍니다.

      [vagrant@localhost redis-cluster]$ mkdir node1 node2 node3 node4 node5 node6
      [vagrant@localhost redis-cluster]$ cp ../install/redis-6.2.12/bin/* node1/
      [vagrant@localhost redis-cluster]$ cp ../install/redis-6.2.12/bin/* node2/
      [vagrant@localhost redis-cluster]$ cp ../install/redis-6.2.12/bin/* node3/
      [vagrant@localhost redis-cluster]$ cp ../install/redis-6.2.12/bin/* node4/
      [vagrant@localhost redis-cluster]$ cp ../install/redis-6.2.12/bin/* node5/
      [vagrant@localhost redis-cluster]$ cp ../install/redis-6.2.12/bin/* node6/

      파일 복사가 완료되었으면 각 노드별 설정을 진행해보도록 합시다.


      첫 번째 포스팅에서 확인한 것처럼 현재 가상머신의 아이피를 확인해줍니다.

      [vagrant@localhost cluster]$ ifconfig | grep inet
              inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
              inet6 fe80::5054:ff:fe4d:77d3  prefixlen 64  scopeid 0x20<link>
              inet 192.168.56.105  netmask 255.255.255.0  broadcast 192.168.56.255
              inet6 fe80::a00:27ff:fee1:472f  prefixlen 64  scopeid 0x20<link>
              inet 127.0.0.1  netmask 255.0.0.0
              inet6 ::1  prefixlen 128  scopeid 0x10<host>
              inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255

      가상머신을 재시작했더니 아이피가 변경되었네요.

      그러면 192.168.56.105 아이피를 사용하여 레디스 클러스터를 구성해보도록 하겠습니다.

      앞서 복사한 파일의 목록을 출력해보면 다음과 같습니다.

      redis-cluster/
      ├── node1
      │   ├── redis-cli
      │   ├── redis.conf
      │   └── redis-server
      ├── node2
      │   ├── redis-cli
      │   ├── redis.conf
      │   └── redis-server
      ├── node3
      │   ├── redis-cli
      │   ├── redis.conf
      │   └── redis-server
      ├── node4
      │   ├── redis-cli
      │   ├── redis.conf
      │   └── redis-server
      ├── node5
      │   ├── redis-cli
      │   ├── redis.conf
      │   └── redis-server
      └── node6
          ├── redis-cli
          ├── redis.conf
          └── redis-server

      클러스터를 구성하기 위해 각 node1~node6 폴더에 존재하는 redis.conf 파일을 수정해줍니다.

      개별 파일을 vi로 열어서 작업하는것은 우리의 귀차니즘이 허락하지 않으므로 필요한 내용만 포함한 파일을 간단하게 만들어봅시다.

      먼저 redis-cluster 폴더로 이동하여 아래 명령을 입력해주면 각 노드별로 17001~17006까지의 포트를 설정한 파일이 만들어집니다.

      [vagrant@localhost redis-cluster]$ echo bind 192.168.56.105 > node1/redis.conf
      [vagrant@localhost redis-cluster]$ echo port 17001 >> node1/redis.conf
      [vagrant@localhost redis-cluster]$ echo cluster-enabled yes >> node1/redis.conf
      [vagrant@localhost redis-cluster]$ echo bind 192.168.56.105 > node2/redis.conf
      [vagrant@localhost redis-cluster]$ echo port 17002 >> node2/redis.conf
      [vagrant@localhost redis-cluster]$ echo cluster-enabled yes >> node2/redis.conf
      [vagrant@localhost redis-cluster]$ echo bind 192.168.56.105 > node3/redis.conf
      [vagrant@localhost redis-cluster]$ echo port 17003 >> node3/redis.conf
      [vagrant@localhost redis-cluster]$ echo cluster-enabled yes >> node3/redis.conf
      [vagrant@localhost redis-cluster]$ echo bind 192.168.56.105 > node4/redis.conf
      [vagrant@localhost redis-cluster]$ echo port 17004 >> node4/redis.conf
      [vagrant@localhost redis-cluster]$ echo cluster-enabled yes >> node4/redis.conf
      [vagrant@localhost redis-cluster]$ echo bind 192.168.56.105 > node5/redis.conf
      [vagrant@localhost redis-cluster]$ echo port 17005 >> node5/redis.conf
      [vagrant@localhost redis-cluster]$ echo cluster-enabled yes >> node5/redis.conf
      [vagrant@localhost redis-cluster]$ echo bind 192.168.56.105 > node6/redis.conf
      [vagrant@localhost redis-cluster]$ echo port 17006 >> node6/redis.conf
      [vagrant@localhost redis-cluster]$ echo cluster-enabled yes >> node6/redis.conf

      이제 설정이 완료되었습니다. Redis를 실행시켜봅시다.

      [vagrant@localhost redis-cluster]$ cd node1;./redis-server redis.conf &
      [vagrant@localhost redis-cluster]$ cd ../node2;./redis-server redis.conf &
      [vagrant@localhost redis-cluster]$ cd ../node3;./redis-server redis.conf &
      [vagrant@localhost redis-cluster]$ cd ../node4;./redis-server redis.conf &
      [vagrant@localhost redis-cluster]$ cd ../node5;./redis-server redis.conf &
      [vagrant@localhost redis-cluster]$ cd ../node6;./redis-server redis.conf &
      [1] 15751
      15751:C 08 Jan 2024 05:56:44.922 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
      15751:C 08 Jan 2024 05:56:44.922 # Redis version=6.2.14, bits=64, commit=00000000, modified=0, pid=15751, just started
      15751:C 08 Jan 2024 05:56:44.922 # Configuration loaded
      15751:M 08 Jan 2024 05:56:44.922 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
      15751:M 08 Jan 2024 05:56:44.922 # Server can't set maximum open files to 10032 because of OS error: Operation not permitted.
      15751:M 08 Jan 2024 05:56:44.922 # Current maximum open files is 4096. maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase 'ulimit -n'.
      15751:M 08 Jan 2024 05:56:44.922 * monotonic clock: POSIX clock_gettime
      15751:M 08 Jan 2024 05:56:44.923 * Node configuration loaded, I'm 458dd86a0487395786e53a260cfd395263a896b8
                      _._                                                  
                 _.-``__ ''-._                                             
            _.-``    `.  `_.  ''-._           Redis 6.2.14 (00000000/0) 64 bit
        .-`` .-```.  ```\/    _.,_ ''-._                                  
       (    '      ,       .-`  | `,    )     Running in cluster mode
       |`-._`-...-` __...-.``-._|'` _.-'|     Port: 17001
       |    `-._   `._    /     _.-'    |     PID: 15751
        `-._    `-._  `-./  _.-'    _.-'                                   
       |`-._`-._    `-.__.-'    _.-'_.-'|                                  
       |    `-._`-._        _.-'_.-'    |           https://redis.io       
        `-._    `-._`-.__.-'_.-'    _.-'                                   
       |`-._`-._    `-.__.-'    _.-'_.-'|                                  
       |    `-._`-._        _.-'_.-'    |                                  
        `-._    `-._`-.__.-'_.-'    _.-'                                   
      ...
      ...
      ...

      명령을 실행하면 6개 레디스 인스턴스가 실행되고 각각의 로그가 출력됩니다.

      프로세스가 정상인지 확인하기 위해 아래와 같이 프로세스 확인 명령을 실행해봅시다.

      [vagrant@localhost node6]$ ps -ef | grep redis
      vagrant  16684  7038  0 06:18 pts/3    00:00:03 ./redis-server 192.168.56.105:17001 [cluster]
      vagrant  16691  7038  0 06:18 pts/3    00:00:03 ./redis-server 192.168.56.105:17002 [cluster]
      vagrant  16704  7038  0 06:18 pts/3    00:00:03 ./redis-server 192.168.56.105:17003 [cluster]
      vagrant  16713  7038  0 06:18 pts/3    00:00:03 ./redis-server 192.168.56.105:17004 [cluster]
      vagrant  16728  7038  0 06:18 pts/3    00:00:03 ./redis-server 192.168.56.105:17005 [cluster]
      vagrant  16739  7038  0 06:18 pts/3    00:00:03 ./redis-server 192.168.56.105:17006 [cluster]
      vagrant  17633 16821  0 07:16 pts/4    00:00:00 grep --color=auto redis

      6개의 레디스가 잘 기동되었습니다.

      프로세스만 기동되었을 뿐 아직 클러스터 모드가 정상화되지는 않았습니다.

      클러스터의 상태 확인을 위해서 17001 포트로 기동중인 레디스 서버에 redis-cli 명령으로 접속해보겠습니다.

      [vagrant@localhost node6]$ ./redis-cli -h 192.168.56.105 -p 17001
      192.168.56.105:17001>

      redis-cli 명령을 통해 Redis에 접속이 완료되면 위와 같이 Redis 명령어를 전송할 수 있는 환경으로 변경됩니다. 이제 클러스터 상태를 확인해봅시다.

      192.168.56.105:17001> cluster info
      cluster_state:fail
      cluster_slots_assigned:0
      cluster_slots_ok:0
      cluster_slots_pfail:0
      cluster_slots_fail:0
      cluster_known_nodes:1
      cluster_size:0
      cluster_current_epoch:0
      cluster_my_epoch:0
      cluster_stats_messages_sent:0
      cluster_stats_messages_received:0

      명령의 첫 번째 결과인 "cluster_state:fail"을 보면 현재 레디스 클러스터는 정상적이지 않습니다.

      이제 클러스터를 정상화 시켜봅시다.

      레디스 클러스터는 포스팅의 첫 그림처럼 3개의 마스터와 3개의 slave로 구성됩니다.

      해당 구성은 redis-cli 명령의 cluster 서브 명령을 통해서 활성화 할 수 있습니다.

      명령은 다음과 같습니다.

      [vagrant@localhost node6]$ ./redis-cli --cluster create 192.168.56.105:17001 192.168.56.105:17002 192.168.56.105:17003 192.168.56.105:17004 192.168.56.105:17005 192.168.56.105:17006 --cluster-replicas 1

      위 명령을 입력하면 다음과 같이 클러스터 구성 정보를 출력하고 이대로 구성할 것인지 묻습니다.

      이때 프롬프트에 yes를 입력하면 해당 상태로 클러스터가 구성됩니다. 이 명령이 완료되면 비로소 Redis 클러스터가 정상 구성된것입니다.

      다음으로 클러스터 상태를 확인하는 명령을 통해서 클러스터의 구성을 살펴보도록 합시다.

      >>> Performing hash slots allocation on 6 nodes...
      Master[0] -> Slots 0 - 5460
      Master[1] -> Slots 5461 - 10922
      Master[2] -> Slots 10923 - 16383
      Adding replica 192.168.56.105:17005 to 192.168.56.105:17001
      Adding replica 192.168.56.105:17006 to 192.168.56.105:17002
      Adding replica 192.168.56.105:17004 to 192.168.56.105:17003
      >>> Trying to optimize slaves allocation for anti-affinity
      [WARNING] Some slaves are in the same host as their master
      M: c2fb0c6f74ed72b03223f92d355f3eba5df06ee6 192.168.56.105:17001
         slots:[0-5460] (5461 slots) master
      M: 09f527b69005fc599007f5d3745574d709df6bee 192.168.56.105:17002
         slots:[5461-10922] (5462 slots) master
      M: 5777ea33f95f7bfe72d73cf1bf355ef1565f7076 192.168.56.105:17003
         slots:[10923-16383] (5461 slots) master
      S: a7da865782656a483c1d8cdb7a93e268d2d5e1f6 192.168.56.105:17004
         replicates 5777ea33f95f7bfe72d73cf1bf355ef1565f7076
      S: 62e3349322f19607ce9d72166a72c180dd641c71 192.168.56.105:17005
         replicates c2fb0c6f74ed72b03223f92d355f3eba5df06ee6
      S: 61de2fc77efc52326897ad69ccf47cb8093357ea 192.168.56.105:17006
         replicates 09f527b69005fc599007f5d3745574d709df6bee
      Can I set the above configuration? (type 'yes' to accept): yes
      >>> Nodes configuration updated
      >>> Assign a different config epoch to each node
      >>> Sending CLUSTER MEET messages to join the cluster
      Waiting for the cluster to join
      ...
      >>> Performing Cluster Check (using node 192.168.56.105:17001)
      M: c2fb0c6f74ed72b03223f92d355f3eba5df06ee6 192.168.56.105:17001
         slots:[0-5460] (5461 slots) master
         1 additional replica(s)
      S: 62e3349322f19607ce9d72166a72c180dd641c71 192.168.56.105:17005
         slots: (0 slots) slave
         replicates c2fb0c6f74ed72b03223f92d355f3eba5df06ee6
      M: 5777ea33f95f7bfe72d73cf1bf355ef1565f7076 192.168.56.105:17003
         slots:[10923-16383] (5461 slots) master
         1 additional replica(s)
      M: 09f527b69005fc599007f5d3745574d709df6bee 192.168.56.105:17002
         slots:[5461-10922] (5462 slots) master
         1 additional replica(s)
      S: a7da865782656a483c1d8cdb7a93e268d2d5e1f6 192.168.56.105:17004
         slots: (0 slots) slave
         replicates 5777ea33f95f7bfe72d73cf1bf355ef1565f7076
      S: 61de2fc77efc52326897ad69ccf47cb8093357ea 192.168.56.105:17006
         slots: (0 slots) slave
         replicates 09f527b69005fc599007f5d3745574d709df6bee
      [OK] All nodes agree about slots configuration.
      >>> Check for open slots...
      >>> Check slots coverage...
      [OK] All 16384 slots covered.

      레디스는 명령어를 통해서 레디스 클러스터 상태정보를 출력합니다.

      각 명령은 cluster info와 cluster nodes입니다.

      각각의 명령을 입력하여 클러스터 상태를 확인해 봅시다.

      [vagrant@localhost node6]$ ./redis-cli -h 192.168.56.105 -p 17001 
      192.168.56.105:17001> cluster info
      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:6
      cluster_my_epoch:1
      cluster_stats_messages_ping_sent:276
      cluster_stats_messages_pong_sent:292
      cluster_stats_messages_sent:568
      cluster_stats_messages_ping_received:287
      cluster_stats_messages_pong_received:276
      cluster_stats_messages_meet_received:5
      cluster_stats_messages_received:568

      현재 접속된 17001 포트에서 동작중인 redis는 "cluster_state:ok"를 출력하고 있으며 현재 클러스터 모드로 동작 중입니다.

      개별 노드의 상태를 확인했으니 cluster nodes 명령을 사용하여 전체 클러스터 노드의 상태를 확인해봅시다.

      192.168.56.105:17001> cluster nodes
      62e3349322f19607ce9d72166a72c180dd641c71 192.168.56.105:17005@27005 slave c2fb0c6f74ed72b03223f92d355f3eba5df06ee6 0 1704695505000 1 connected
      5777ea33f95f7bfe72d73cf1bf355ef1565f7076 192.168.56.105:17003@27003 master - 0 1704695505817 3 connected 10923-16383
      09f527b69005fc599007f5d3745574d709df6bee 192.168.56.105:17002@27002 master - 0 1704695505000 2 connected 5461-10922
      a7da865782656a483c1d8cdb7a93e268d2d5e1f6 192.168.56.105:17004@27004 slave 5777ea33f95f7bfe72d73cf1bf355ef1565f7076 0 1704695504000 3 connected
      c2fb0c6f74ed72b03223f92d355f3eba5df06ee6 192.168.56.105:17001@27001 myself,master - 0 1704695506000 1 connected 0-5460
      61de2fc77efc52326897ad69ccf47cb8093357ea 192.168.56.105:17006@27006 slave 09f527b69005fc599007f5d3745574d709df6bee 0 1704695506842 2 connected

      cluster nodes 명령은 위와 같이 전체 클러스터 노드가 동작중인 상태를 나타냅니다.

      각 노드의 상태는 master, slave 그리고 현재 처리 중인 해시의 범위를 포함하여 출력합니다.

      이제 레디스 클러스터 구축이 완료되었네요.

      간단하게 데이터를 입력하고 조회해 봅시다.

      먼저 redis-cli 명령으로 17001 레디스 서버에 접속하여 hello world를 입력해 보겠습니다.

      [vagrant@localhost node6]$ ./redis-cli -h 192.168.56.105 -p 17001 
      192.168.56.105:17001> set hello world
      OK
      192.168.56.105:17001> 

      set 명령은 레디스에 데이터를 입력하는 명령입니다. 위 명령을 살펴보면 hello키에 world라는 값을 저장하는 예제입니다. 명령은 정상 실행되었고 응답은 OK가 나왔습니다.


      이제 입력된 데이터를 확인해보도록 하겠습니다.

      192.168.56.105:17001> get hello
      "world"

      get 명령은 레디스에 저장된 특정 키의 값을 조회하는 명령입니다. 앞서 저장한 hello 키의 데이터를 조회하였으며 결과는 world가 출력되었습니다.

      이번에는 다른 키로 데이터를 저장해 보겠습니다.

      192.168.56.105:17001> set hello2 world
      (error) MOVED 7486 192.168.56.105:17002

      앞의 hello 키를 사용한 데이터 입력과 다르게 오류 메시지가 출력되었습니다.

      오류 메시지는 hello2 키는 17002포트에서 동작하는 서버에 저장되어야 한다는 의미입니다.

      위 오류를 피하기 위한 방법은 2가지 입니다.

      첫 번째 방법은 redis-cli를 실행할 때 17002 포트로 접속하여 데이터를 저장하는 방법입니다.

      [vagrant@localhost node6]$ ./redis-cli -h 192.168.56.105 -p 17002
      192.168.56.105:17002> set hello2 world
      OK
      192.168.56.105:17002> get hello2
      "world"
      192.168.56.105:17002> get hello
      (error) MOVED 866 192.168.56.105:17001

      포트를 변경하여 접속한 후 hello2 키에 데이터 저장 명령을 수행한 결과는 정상입니다.

      하지만 다시 hello키에 저장된 데이터를 조회하니 오류가 발생합니다.

      조금만 더 생각해보면 키가 바뀔때 마다 에러 메시지를 보고 서버에 다시 접속해야 한다는건 뭔가 말이 안되는것 같습니다.


      redis-cli 명령은 -c 옵션을 통해 위와 같이 서버간 이동을 자동화해줍니다.

      [vagrant@localhost node6]$ ./redis-cli -h 192.168.56.105 -p 17002 -c
      192.168.56.105:17002> get hello2
      "world"
      192.168.56.105:17002> get hello
      -> Redirected to slot [866] located at 192.168.56.105:17001
      "world"

      레디스 클러스터에 간단한 데이터 저장과 조회를 살펴보았습니다.


      다음 포스팅에서는 레디스의 성능을 측정하는 방법을 살펴보도록 하겠습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      krisjey 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기