환경구성
Node |
정보 |
Node1 |
172.20.43.22 |
Node2 |
172.20.43.121 |
Node3 |
172.20.43.122 |
노드 구성도
클러스터 노드 |
마스터정보 |
슬레이드정보 |
Node1 |
172.20.43.22(6379) |
172.20.43.121(6379) |
Node2 | 172.20.43.121(6380) |
172.20.43.122(6380) |
Node3 |
172.20.43.122(6381) |
172.20.43.22(6381) |
클러스터 환경 구성 (/etc/redis/6379.conf)
명령어 |
내용 |
설정 값 |
appendonly |
레디스는 주 기억 장소가 메인 메모리(RAM)이다. 따라서 서버 이상 시(비정상 종료, OS 이상 상황 발생, 서버 전원 끊김 등) 저장한 모든 데이터가 날아가게 된다. 이를 방지하기 위한 기능 중 하나가 Appendonly이다. Appendonly를 yes로 설정하면 레디스 서버에 데이터가 입력/수정/삭제될 때 마다 디스크에 쓴다. |
yes |
cluster-enabled |
해당 노드 클러스터 지원 활성화 여부 |
yes |
cluster-config-file |
클러스터 환경설정 파일 |
nodes.conf |
cluster-node-timeout |
클러스터 노드 제한 시간은 노드에 연결할 수 있어야합니다. (ms) |
5000 |
cluster-require-full-coverage |
YES일 경우 슬레이브가 없는 마스터 노드 중 어느 하나라도 다운되면 클러스터가 다운 발생 NO일 경우 슬레이브가 없는 마스터 노드가 다운되더라도 클러스터는 다운되지 않고 살아있다. 다운된 노드의 슬롯은 에러가 나지만 다른 노드의 슬롯에는 데이터가 정상적으로 입력/수정/삭제/조회된다. 과반수 이상 노드 살아 있을경우에 정상적인 서비스가 된다. |
yes/no 선택사항 |
Redis 클러스트 구성 하기
1. redis-trib.rb 이용하여 구성하기
- 필수 라이브러리 설치(Ruby 파일 실행을 위한) - Ruby / Gem 설치 진행이 필요하다
a. yum install ruby
yum install rubygems
redis-3.2.0.gem 파일 설치 (U:\DB개발팀\92.유틸자료\MySQL설치파일\Redis)
gem install redis-3.2.0.gem
redis-trib.rb을 이용하여 구성 (특정 노드에서)
Master 노드만 구성하기 (3 노드)
cd /dbsource/redis/src
./redis-trib.rb create 172.20.43.22:6379 172.20.43.121:6380 172.20.43.122:6381
Master-Slave 노드 구성하기 (3 노드 , 각 1개씩 슬레이브)
cd /dbsource/redis/src
./redis-trib.rb create --replicas 1 172.20.43.22:6379 172.20.43.121:6380 172.20.43.122:6381 172.20.43.121:6379 172.20.43.122:6380 172.20.43.22:6381
특이사항
redis-trib가 클러스터 구성을 잘 할 하려고 하지만, 완벽하지 않아서 위와 같은 상황이 발생할 수 있으므로, 세밀한 구성을 위해서는 클러스터 명령으로 직접 구성하는 것이 좋은 방법이다. (http://www.redisgate.com/redis/cluster/redis-trib.php)
메뉴얼 이용하여 구성하기
클러스터 묶기
cd /dbsource/redis/src
./redis-cli -p 6379 cluster meet 172.20.43.121 6380
./redis-cli -p 6379 cluster meet 172.20.43.122 6381
./redis-cli -p 6379 cluster meet 172.20.43.22 6381
./redis-cli -p 6379 cluster meet 172.20.43.121 6379
./redis-cli -p 6379 cluster meet 172.20.43.122 6380
클러스터 노드 확인
./redis-cli -p 6379 cluster nodes
클러스터 Slave 설정
./redis-cli -p 6379 cluster nodes (172.20.43.22) -> Port 6381 Node ID 확인
./redis-cli -p 6381 cluster replicate e5aacf095fd92a18e890a963eda9f88efd2893a9 (172.20.43.22 )
./redis-cli -p 6380 cluster nodes (172.20.43.121) -> Port 6379 Node ID 확인
./redis-cli -p 6379 cluster replicate 8429711154080c20e15472638caf0310f505d266 (172.20.43.121)
./redis-cli -p 6381 cluster nodes (172.20.43.122) -> Port 6380 Node ID 확인
./redis-cli -p 6380 cluster replicate 2921b9eba53550ab8c6cc310eca8b2e4a3c05680 (172.20.43.122)
클러스터 Slot 설정 (마스터 노드에서 설정)
./redis-cli -p 6379 cluster addslots {0..5461} --> (172.20.43.22)
./redis-cli -p 6380 cluster addslots {5462..10922} --> (172.20.43.121)
./redis-cli -p 6381 cluster addslots {10923..16383} --> (172.20.43.122)
클러스터 Slot 설정 확인
트러블 슈팅
'Gem original_require' : no such file to load – redis (LoadError) 발생 시
에러 내용 :
/usr/lib/ruby/site_ruby/1.8/rubygems/core_ext/kernel_require.rb:55:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/core_ext/kernel_require.rb:55:in `require'
from src/redis-trib.rb:25
해결 방법 :
gem install redis-3.2.0.gem
DB에 데이터가 있으면 클러스터를 생성하지 못하고 종료한다. (http://www.redisgate.com/redis/cluster/redis-trib.php)
클러스터를 생성할 노드는 AOF 나 RDB로 부터 데이터를 읽어들이면 안된다.
Cluster mode로 시작한 레디스는 클러스터가 구성되지 않은 상태에서는 set 명령같은 데이터를 입력/수정/삭제/조회하는 명령을 수행할 수 없다.
하지만 Flushdb 또는 flushall 명령은 실행가능하다.
이 명령을 실행해서 데이터를 모두 삭제했어도 클러스터는 구성되지 않는다.
처음부터 데이터를 읽어 들이지 않는 방법이 가장 좋다.
redis-trib.rb : ERR Slot 7185 is already busy (Redis:CommandError) 이와 같은 오류 발생 시
에러 내용 : 해당 Slot이 이미 할당되어서 발생하는 에러 내용
해결 방법 :
127.0.0.1:6379> FLUSHALL
127.0.0.1:6379> CLUSTER RESET
* 강제 Master <-> Slave 변경 : Slave에서 cluster failover takeover
* - 초기화 -
172.20.43.22
rm -rf /var/redis/6379/*
rm -rf /var/redis/6381/*
172.20.43.121
rm -rf /var/redis/6379/*
rm -rf /var/redis/6380/*
172.20.43.122
rm -rf /var/redis/6380/*
rm -rf /var/redis/6381/*
*클러스터 Slot 방식은 key에 CRC16 function을 적용해 나오는 값을 16384로 나누어 분배
참조 : http://www.redisgate.com/redis/cluster/cluster_introduction.php
* Cluster-enabled = yes 일 경우, -C 옵션 없이 접근 시 Data Insert 불가
* 각 로컬 노드에 동일한 데이터가 존재 한 상태로 클러스터 구성을 할 경우, 추가 구성하는 노드는 슬레이브 노드로 구성이 적용이 된다.
데이터가 존재한 상태로 클러스터 구성 시
클러스터 MEET / REPLICATE 은 정상적으로 구성이 되나, 슬롯 구성이 되지 않습니다.
에러 메시지 : (error) ERR Slot 4271 is already bysy
기존 데이터가 존재한 상태에서는 클러스터 구성이 정상적으로 되지 않습니다.
슬롯 구성에 맞게 CRC16 함수를 통한 값을 넣는것도 테스트가 필요할 듯
* PHP 커넥션 스크립트 (참조 : https://github.com/phpredis/phpredis/blob/feature/redis_cluster/cluster.markdown#readme)
<?php
$redis_cluster = new RedisCluster(Null, Array('호스트:포트','호스트:포트',....));
?>
예제
<?php
$redis_cluster = new RedisCluster(Null, Array('172.20.43.22:6379','172.20.43.121:6380','172.20.43.122:6381'));
$redis_cluster -> set("key1","22333");
echo $redis_cluster -> get("key1");
?>
* Local -> Local 노드로 Key 마이그레이션
Migrate 명령어 이용
MIGRATE host port key destination-db timeout [COPY] [REPLACE]
예제
migrate 172.20.43.122 6380 mkey1 0 1000 COPY
172.20.43.122 -> 도착지 호스트
8380 -> 도착지 포트
mkey1 -> Key명
0 -> 도착지DB
1000 -> 타임아웃
COPY / REPLACE -> 복사 / 이동
Local -> Cluster / Rdb -> Local/Cluster Key 마이그레이션 (https://github.com/vipshop/redis-migrate-tool)
* AOF / RDB 파일 이동만으로도 Data Sync 가능
하지만, 테스트 1.4G AOF파일로 복구 테스트 진행 시, 정상적인 결과 도출 실패
에러로그 확인 결과
DB Saved on disk
DB loaded from append only file: 151.585 seconds
The server is now ready to accept connections on port XXXX
정상적으로 Data Load로 확인 되나, 정상적인 데이터 확인 불가
에러로그 확인 결과 지연 및 메모리 사용 이슈로
redis 서비스 중지
echo never > /sys/kernel/mm/transparent_gugepage/enabled 실행
RDB파일 삭제
redis 서비스 시작
이제 VM의 overcommit_memory 설정관련 이슈 발생 – 메모리 증설후 재 확인 필요
'Linux' 카테고리의 다른 글
mongodb 설치 (1) | 2017.08.30 |
---|---|
[3-3] Replication & Sentinel 구성 (0) | 2016.10.26 |
[3-1] redis 설치 (0) | 2016.10.26 |
리눅스 unixODBC FreeTDS 설치 (MSSQL) (0) | 2015.12.02 |
VIrtualBox ova 복원 후 eth0 찾지 못하는 경우 (0) | 2015.11.26 |