본문 바로가기
DBMS

Redis Cluster 리샤딩으로 데이터 조정하기 - Resharding

by developer's warehouse 2024. 5. 31.

이전까지 레디스 클러스터를 설치하고 간단한 application을 작성해 보았습니다. 그럼 이제 리샤딩을 통해 데이터를 재배치할 준비가 되었습니다.

리샤딩을 하는 동안 example.rb 프로그램을 계속 실행하여 프로그램 실행에 어떤 영향이 있는지 확인하는것이 좋습니다. 만약 데이터가 하나도 없다면 리샤딩을 수행하더라도 아무 일도 발생하지 않을 수 있습니다.

또한, 리샤딩 중에 좀 더 심각한 쓰기 부하가 발생하도록 sleep을 제거할 수도 있습니다.

Redis Cluster 데이터 조정하기 ( reshard )

리샤딩(resharding)

리샤딩이란?

리샤딩은 기본적으로 해시 슬롯을 한 노드 집합에서 다른 노드 집합으로 이동하는 것을 의미합니다. 이 말의 의미는 해시 슬롯에 해당하는 데이터가 이동한다는 의미입니다.

참고로, Redis는 16384개의 hash 슬롯을 가지고 데이터를 관리합니다.

리샤딩을 하는 것은 클러스터 생성과 마찬가지로 redis-cli 유틸리티를 사용하여 수행됩니다.

※ 연관 글 보기
Redis Cluster 쓰려면 어떤걸 설치 해야하지? - Redis OSS와 Stack의 차이 및 라이선스 그리고 Cluster는?
Redis Cluster 리눅스에 설치하고 테스트 하기
Redis Cluster 예제 app (ruby, python)
Redis Cluster 리샤딩으로 데이터 조정하기 - Resharding

대화형으로 리샤딩 명령 수행하기

다음 명령을 통해서 redis cluster의 데이터를 재배치 할 수 있습니다.

redis-cli --cluster reshard 127.0.0.1:30001

 

redis-cli에서 하나의 노드만 지정하면 redis-cli가 다른 노드를 자동으로 찾습니다.

현재 redis-cli는 관리자의 명령을 통해서만 리샤딩할 수 있으며, 이 노드에서 다른 노드로 슬롯의 5%를 이동하라고 명령할 수가 없습니다.

그러므로, redis-cli로 reshard 명령을 수행하면 먼저 얼마나 많은 슬롯을 리샤딩 하고 싶은가를 redis-cli에서 사용자(레디스 관리자)로 부터 입력 받습니다. 즉, 이동할 슬롯 개수를 입력받습니다.

다음은 실제 reshard 명령을 수행한 결과입니다.

 

% ./redis-cli --cluster reshard 127.0.0.1:30001
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: c642cf6f5b90f7866c88f311166299b640d0c4f1 127.0.0.1:30001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 2fd36b04128b8f171ec6016380b3b2643b0b9f1e 127.0.0.1:30005
slots: (0 slots) slave
replicates c642cf6f5b90f7866c88f311166299b640d0c4f1
S: 6cc537b7ba8442a5129b0dfd0089e56e8ae08639 127.0.0.1:30004
slots: (0 slots) slave
replicates a164a5b8ce13ad30a9ab52313655bb5e025a4f34
S: 0e8d678ac74631603c1f0b3b398bd73f5143d22a 127.0.0.1:30006
slots: (0 slots) slave
replicates 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
M: 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: a164a5b8ce13ad30a9ab52313655bb5e025a4f34 127.0.0.1:30003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)?

 

그런 다음 redis-cli는 리샤딩의 대상, 즉 해시 슬롯을 받을 노드가 무엇인지 알아야 합니다. redis-cli는 첫번째 마스터 노드, 즉 127.0.0.1:30001을 사용해서 접속 하겠지만 인스턴스의 노드 ID를 지정해야 합니다.

 

Redis에서 노드 ID는 이전 포스팅에서 클러스터를 생성할때 redis-cli를 통해 리스트로 출력되었습니다. 하지만, 필요한 경우 아래 명령으로 언제든지 노드의 ID를 찾을 수 있습니다.

 

아래와 같이 cluster nodes 명령을 통해 redis cluster의 노드 ID를 확인할 수 있습니다.

% redis-cli -p 30001 cluster nodes
c642cf6f5b90f7866c88f311166299b640d0c4f1 127.0.0.1:30001@40001 myself,master - 0 1717057264000 1 connected 0-5460
2fd36b04128b8f171ec6016380b3b2643b0b9f1e 127.0.0.1:30005@40005 slave c642cf6f5b90f7866c88f311166299b640d0c4f1 0 1717057264127 1 connected
6cc537b7ba8442a5129b0dfd0089e56e8ae08639 127.0.0.1:30004@40004 slave a164a5b8ce13ad30a9ab52313655bb5e025a4f34 0 1717057264000 3 connected
0e8d678ac74631603c1f0b3b398bd73f5143d22a 127.0.0.1:30006@40006 slave 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd 0 1717057264329 2 connected
8854bd1bce789d8d6b0c6887ac5e26c69ae898fd 127.0.0.1:30002@40002 master - 0 1717057264127 2 connected 5461-10922
a164a5b8ce13ad30a9ab52313655bb5e025a4f34 127.0.0.1:30003@40003 master - 0 1717057264027 3 connected 10923-16383

 

redis-cli의 reshard 명령은 다음과 같이 대화형(인터렉티브)으로 명령의 부가적인 옵션을 입력 받고 있습니다.

[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID?

 

저는 위의 노드들 중 myself로 표시된 cluster node에 hash slot을 이동하려고 합니다. 해당 노드의 ID인 "c642cf6f5b90f7866c88f311166299b640d0c4f1" 를 선택합니다.

 

이제는 다음과 같 어떤 노드에서 키를 가져올 것인지 묻는 메시지가 표시됩니다. 저는 다른 모든 마스터 노드에서 해시 슬롯을 가져가기 위해 "all"을 입력하겠습니다.

[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? c642cf6f5b90f7866c88f311166299b640d0c4f1
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:

 

최종 확인이 끝나면 redis-cli가 한 노드에서 다른 노드로 이동할 모든 슬롯에 대한 메시지가 표시되고, 실제 키가 한 쪽에서 다른 쪽으로 이동할 때마다 점이 인쇄됩니다.

[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000
What is the receiving node ID? c642cf6f5b90f7866c88f311166299b640d0c4f1
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: all

Ready to move 1000 slots.
Source nodes:
M: 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd 127.0.0.1:30002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
M: a164a5b8ce13ad30a9ab52313655bb5e025a4f34 127.0.0.1:30003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
Destination node:
M: c642cf6f5b90f7866c88f311166299b640d0c4f1 127.0.0.1:30001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
Resharding plan:
Moving slot 5461 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5462 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5463 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5464 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5465 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5466 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5467 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5468 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
Moving slot 5469 from 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
....
Moving slot 11409 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11410 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11411 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11412 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11413 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11414 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11415 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11416 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11417 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11418 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11419 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11420 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Moving slot 11421 from a164a5b8ce13ad30a9ab52313655bb5e025a4f34
Do you want to proceed with the proposed reshard plan (yes/no)? yes
Moving slot 5461 from 127.0.0.1:30002 to 127.0.0.1:30001:
Moving slot 5462 from 127.0.0.1:30002 to 127.0.0.1:30001:
Moving slot 5463 from 127.0.0.1:30002 to 127.0.0.1:30001:
Moving slot 5464 from 127.0.0.1:30002 to 127.0.0.1:30001:
Moving slot 5465 from 127.0.0.1:30002 to 127.0.0.1:30001:
Moving slot 5466 from 127.0.0.1:30002 to 127.0.0.1:30001:
Moving slot 5467 from 127.0.0.1:30002 to 127.0.0.1:30001:
...
Moving slot 11420 from 127.0.0.1:30003 to 127.0.0.1:30001:
Moving slot 11421 from 127.0.0.1:30003 to 127.0.0.1:30001:
~/redis/redis-stable/src

 

Reshard 작업이 진행되는 동안에는 예제 프로그램이 영향을 받지 않고 실행되는 것을 볼 수 있습니다. 원하는 경우 리샤드하는 동안 여러 번 중지했다가 다시 시작할 수 있습니다.

리샤딩이 끝나면 다음 명령어로 클러스터의 상태를 테스트할 수 있습니다.

redis-cli --cluster check 127.0.0.1:30001

 

다음은 제 장비에서 돌려본 결과입니다. 첫번째 마스터 노드에 1000개의 슬롯을 이동해서 6461 슬롯을 커버하고 있으며, 나머지가 각각 4961, 4962 개의 슬롯을 처리하고 있습니다.

% ./redis-cli --cluster check 127.0.0.1:30001
127.0.0.1:30001 (c642cf6f...) -> 1 keys | 6461 slots | 1 slaves.
127.0.0.1:30002 (8854bd1b...) -> 1 keys | 4961 slots | 1 slaves.
127.0.0.1:30003 (a164a5b8...) -> 2 keys | 4962 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:30001)
M: c642cf6f5b90f7866c88f311166299b640d0c4f1 127.0.0.1:30001
   slots:[0-5961],[10923-11421] (6461 slots) master
   1 additional replica(s)
S: 2fd36b04128b8f171ec6016380b3b2643b0b9f1e 127.0.0.1:30005
   slots: (0 slots) slave
   replicates c642cf6f5b90f7866c88f311166299b640d0c4f1
S: 6cc537b7ba8442a5129b0dfd0089e56e8ae08639 127.0.0.1:30004
   slots: (0 slots) slave
   replicates a164a5b8ce13ad30a9ab52313655bb5e025a4f34
S: 0e8d678ac74631603c1f0b3b398bd73f5143d22a 127.0.0.1:30006
   slots: (0 slots) slave
   replicates 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd
M: 8854bd1bce789d8d6b0c6887ac5e26c69ae898fd 127.0.0.1:30002
   slots:[5962-10922] (4961 slots) master
   1 additional replica(s)
M: a164a5b8ce13ad30a9ab52313655bb5e025a4f34 127.0.0.1:30003
   slots:[11422-16383] (4962 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

 

자동 Resharding

리샤딩은 대화형 방식으로 매개변수를 하나씩 입력할 필요 없이 하나의 명령으로 수행할 수 있습니다. 이는 다음과 같은 명령을 사용하여 가능합니다.

redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes

 

cluster-yes 옵션은 클러스터 관리자가 명령의 프롬프트에 자동으로 "예"라고 응답하도록 지시하여 비대화형 모드로 실행할 수 있도록 합니다. 이 옵션은 REDISCLI_CLUSTER_YES 환경 변수를 설정하여 활성화할 수도 있습니다.

 

자주 리샤딩할 가능성이 있는 경우 어느 정도 자동화를 구축할 수 있지만, 현재 redis-cli가 클러스터 노드 전반의 키 분포를 확인하고 필요에 따라 지능적으로 슬롯을 이동하여 클러스터의 균형을 자동으로 재조정할 수 있는 방법은 없습니다. 이 기능은 향후 추가될 예정입니다.

 

오늘은 이렇게 Redis에서 데이터를 재분배하는 리샤딩(resharding)에 대해서 알아보았습니다.

facebook twitter kakaoTalk kakaostory naver band shareLink