Redis 간단한 사용 방법
레디스는 단일 인스턴스만(Stand Alone)으로도 충분히 운영이 가능하지만, 디스크에 비해 메모리 크기가 너무 작다. 그래서 물리 머신이 가진 메모리의 한계를 초과하는 데이터를 저장하고 싶거나, failover에 대한 처리를 통해 HA(고가용성)를 보장하려면 센티넬(Sentinel)이나 클러스터(Cluster) 등의 운영 모드를 선택해서 사용해야 한다. 먼저 간단하게 Redis를 어떻게 사용하는지 알아보자.
Stand Alone 모드
Stand Alone은 말 그대로 Redis를 단일 인스턴스로 동작시키는 방법이다.
Redis를 localhost:6379로 실행시키면 Redis Server는 정상적으로 구동된다. 그리고 Strings 자료구조로 데이터를 set/get 해보면 정상적으로 동작되는 것을 확인할 수 있다. Stand Alone은 이게 전부이다. 이는 로컬이나 dev 환경에서 사용하기에 적합하다. HA 기능이 없으므로 장애 상황시 수동 복구해야 한다.
$ redis-server
set / get 데이터 저장 및 조회
Master-Slave (Replication 기능)
실제 운영 환경에서는 Cache 인스턴스를 하나만 두는 것은 위험하다. 그래서 2개의 인스턴스로 Master-Slave 관계를 구축해야 한다.
- Master 127.0.0.1:6379
- Salve 127.0.0.1:6380
Repliaction은 단순한 복제 연결로 replicaof 명령어를 이용해 간단하게 복제 연결을 할 수 있다. Master에서 데이터 읽기/ 쓰기가 발생하면 비동기식으로 Slave에도 읽기/ 쓰기가 발생한다.
- 비동기 방식으로 복제하다보니 Replication Lag이 발생할 수 있다. A의 데이터가 변경되면 B 데이터도 변경하라고 처리하는 데 그 사이에 A와 B 데이터가 다른 순간을 말한다. Redis는 거의 발생안하는 것 같지만 부하에 따라서 꽤 큰 차이가 나는 경우도 있다.
Repliaction 설정 과정
- Slave에 replicaof 명령을 전달한다.
- 그러면 Slave는 Master에 sync 명령을 전달한다.
- Master는 현재 메모리 상태를 저장하기 위해 Fork를 실행한다.
- Fork한 프로세서는 현재 메모리 정보를 disk에 dump한다.
- 해당 정보를 Slave에 전달한다.
- Fork 이후의 데이터를 Slave에 계속해서 전달한다.
이제 Master와 Slave를 실행시켜 Replication 기능을 사용해보자.
Master, Slave 노드 실행
먼저 Master, Slave 노드를 각각 실행시켜준다.
$redis-server # master
$redis-server -port 6380 # slave
$redis-cli # master
$redis-cli -p 6380 # slave
Master, Slave 관계 설정
둘 다 정상적으로 구동되었으면 Slave 노드에서 Master 노드와 관계 설정 명령어를 입력한다.
127.0.0.1:6380> replicaof 127.0.0.1 6379
그러면 다음과 같이 연결된다.
Master에 데이터 넣고 Slave에서 조회하기 (Replication)
Replication 복제 기능이 정상적으로 동작하는 것을 확인할 수 있다.
문제점: Master 강제 종료 및 재연결 (수동 복구)
여기서 Master 노드를 강제로 종료하면 Slave에서는 계속해서 에러 로그가 발생한다. 다시 Master 노드를 구동시키면 Slave도 재연결된다.
이러한 상황이라면 아무리 데이터를 복사하여 저장하여 데이터 안전성을 높여준다고 해도 Master 노드가 언제 터질지 모르기 때문에 지속적으로 모니터링을 해줘야 한다는 단점이 있다. 그래서 제공되는 운영모드가 센티넬(Sentinel) 모드이다. 센티넬 모드에서는 Master 노드가 강제로 종료하면 Slave가 자동으로 Master로 선출되는 기능이 있어 더 유연한 환경을 제공해준다.
[Database] Redis 고가용성을 위한 Sentinel 모드 직접 다뤄보기
기본 명령어 메모
Redis 실행
$brew install redis #redis 설치
$redis-server #redis server 실행
$redis-cli #redis cli 접속하기
Redis 기본 명령어 정리
설명 | 명령어 | 비고 |
현재 모든 key-value 조회 | > keys * | |
특정 값이 포함된 모든 key 조회 | > keys *{pattern}* | |
key-value 추가하기 | > set {key} {value} | |
key에 저장된 value 가져오기 | > get {key} | |
현재 key-value에 값에 추가하기 | > append {key} {value} | |
여러 key-value 저장하기 | > mset {key1} {value1} {key2} {value2} | |
소멸시간 지정해서 key-value 추가하기 | > setex {key} {sec} {value} | sec는 초단위 |
특정 key-value 삭제하기 | > del {key} | 1: 성공, 0: 실패 |
타임아웃까지 남은 시간을 초단위로 반환 | > ttl {key} | |
타임아웃까지 남은 시간을 밀리 초단위로 반환 | > pttl {key} | |
key 이름 변경하기 1 | > rename {key} {chaneKey} | OK: 성공 |
key 이름 변경하기 2 | > renamenx {key} {chaneKey} | 1: 성공 |
모든 키-값 삭제 | > flushall | |
set 자료구조에 추가하기 | > sadd set:{setName} {value} | |
set 자료구조 출력하기 | > smembers set:{setName} | |
sortedSet 가중치 값 추가하기 | > zadd {sortedSetName} {가중치} {value} | |
sortedSet 출력하기 | > zrange {sortedSetName} 0 -1 | -1이면 뒤에서 부터 시작 |
참고
https://redis.io/docs/getting-started/installation/install-redis-on-mac-os/
https://redis.io/docs/manual/cli/
https://redis.io/docs/manual/replication/
https://coding-start.tistory.com/126
'Dot Database > Redis' 카테고리의 다른 글
싱글 쓰레드인 Redis가 빠른 이유: In-Memory, I/O Multiplexing (0) | 2023.01.24 |
---|---|
[DB] 데이터 분산 처리 방법에 대해 알아보자 (Sharding, Consistent Hashing, Redis Cluster 모드) (0) | 2022.04.27 |
[Spring/ Redis] Spring으로 ElasticCache for Redis 사용해보기 (0) | 2022.04.20 |
[Database] Redis 고가용성을 위한 Sentinel 모드 직접 다뤄보기 (0) | 2022.04.18 |
[Database] Redis에 대해 알아보자 (Redis 컬렉션, Sentinel, Cluster, 운영시 장애 포인트) (0) | 2022.04.14 |