23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
이전 포스팅에서는 단일모드와 Master-Slave 모드 설치 방법을 살펴봤습니다.
이번 포스팅에서는 이전 포스팅에서 다루지 않았던 클러스터 모드 설치를 해보고 데이터를 조회해보도록 하겠습니다.
이전 포스팅에서 사용한 환경과 파일 구성은 동일합니다.
설치 전에 이전에 살펴본 그림을 다시 한번 살펴보죠.
위 그림처럼 레디스 클러스는 보통 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 redis6개의 레디스가 잘 기동되었습니다.
프로세스만 기동되었을 뿐 아직 클러스터 모드가 정상화되지는 않았습니다.
클러스터의 상태 확인을 위해서 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 connectedcluster 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"레디스 클러스터에 간단한 데이터 저장과 조회를 살펴보았습니다.
다음 포스팅에서는 레디스의 성능을 측정하는 방법을 살펴보도록 하겠습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.