Lettuce Configuration

클러스터 내 노드의 IP, Port를 지정해서 접속한다. 어떤 노드를 지정해서 접속해도 접속에 성공하면 cluster nodes 명령을 실행해서 클러스터 내 모든 노드의 정보를 lettuce가 가지고 있다.  노드는 하나만 지정해도 되지만, 그 노드가 다운되었을 경우에 대비해서 여러 노드를 지정한다. 복제(replica) 노드를 지정해도 된다.

 

  • enablePeriodicRefresh(): 지정한 시간마다 클러스터 구성 정보를 가져와서 업데이트한다. 노드가 추가/삭제되었거나, 노드 다운으로 역할 변경(마스터 -> 복제(replica)), 슬롯이 이동했을 경우 등 클러스터 구성 정보가 변경되었을 경우 최신 정보로 업데이트해야 한다. 노드가 많을 경우 너무 짧은 시간을 지정하면 refresh 부하가 발생할 수 있다.
  • enableAllAdaptiveRefreshTriggers : 문제가 되는 Operation 발생시 커넥션을 갱신시켜주는 트리거 발생시킴
  • setReadFrom(ReadFrom.SLAVE): 이렇게 설정하면 get 같은 조회 명령은 복제(replica) 노드에서 실행된다.  마스터/복제(replica)간 부하 분산(Load-Balancing)을 할 수 있다.
MASTER - Default 값. master 에서 읽어 옴
MASTER_PREFERRED - master 에서 읽지만 사용 할 수 없는 경우에만 Slave 에서 읽음
SLAVE - Slave 에서만 읽음
SLAVE_PREFERRED - Slave 에서 읽고 불가능 할 때 master 에서 읽음
NEAREST - 가까운 노드에서 읽도록 설정
  • autoReconnect(): ConnectionWatchdog이 노드 다운을 감지하면 연결을 시도한다. Default는 true이다. enablePeriodicRefresh()와 중복되는 경향이 있다.
  • validateClusterNodeMembership : 클러스터 노드에 연결 전 유효한 노드인지 확인

참고) Spring boot에서 lettuce debug : logging.level.io.lettuce.core.protocol=DEBUG

 

관련 로그

로드밸런서 혹은 지정된 노드에 연결시 1분간격으로 노드에 연결을 시도하고 클러스터 정보를 가져옴

2022-01-27 03:45:42.986 DEBUG 1 --- [llEventLoop-4-1] i.l.core.protocol.RedisStateMachine      : Decoded LatencyMeteredCommand [type=CLUSTER, output=StatusOutput [output=f0464738f9fdff9a87258a6a533f8decab266edb 10.244.3.34:6379@16379 master - 0 1643255141000 1 connected 0-5460
1a5698df7f60fda63576fba615377db15ae86035 10.244.3.36:6379@16379 master - 0 1643255142520 3 connected 10923-16383
256b286b4b2574eddb8e232e053bebf828f1a881 10.244.3.39:6379@16379 slave 220a82de5edc5b2ded3da2c9b32ad7369d65d874 0 1643255142722 2 connected
220a82de5edc5b2ded3da2c9b32ad7369d65d874 10.244.3.35:6379@16379 myself,master - 0 1643255141000 2 connected 5461-10922
31e11fa54da223702d523636d223897072ffd064 10.244.3.38:6379@16379 slave f0464738f9fdff9a87258a6a533f8decab266edb 0 1643255142000 1 connected
b4a3eb4efffec439ba91003a10ffbdcd52742804 10.244.3.37:6379@16379 slave 1a5698df7f60fda63576fba615377db15ae86035 0 1643255142000 3 connected
, error='null'], commandType=io.lettuce.core.cluster.topology.TimedAsyncCommand], empty stack: true

- http://redisgate.kr/redis/clients/lettuce_cluster.php

'빅데이터 > Redis Cluster' 카테고리의 다른 글

Redis Configuration  (0) 2022.02.08
Redis 주요 명령어  (0) 2022.02.08
Redis Cluster 장애 복구  (0) 2022.02.08
Redis Cluster Overview  (0) 2022.02.08

Redis Cluster 구성

- Slave를 1개 가지고 있는 Master 노드 3개. 즉, Master 노드 3개, Slave 노드 3개

- redis.conf 정보

port 6379
cluster-require-full-coverage yes
cluster-enabled yes
cluster-config-file /data/nodes.conf
cluster-node-timeout 5000 # 약 5~6초 후에 failed 확인
appendonly yes
appendfilename appendonly.aof
dbfilename dump.rdb
logfile /data/log.log

 

Master 노드를 kill 했을 때

Slave 노드가 Master로 승격, 기존 Master가 재시작되면 Slave로 전환됨.

1:S 28 Jan 05:06:51.393 # Connection with master lost.
1:S 28 Jan 05:06:51.393 * Caching the disconnected master state.
1:S 28 Jan 05:06:51.672 * Connecting to MASTER 10.244.0.196:6379
1:S 28 Jan 05:06:51.673 * MASTER <-> SLAVE sync started
1:S 28 Jan 05:06:57.068 * FAIL message received from 1819c808fc29701676fde27691b5f57de297dfd8 about f1124d4c5e1bae7eae1107bc4fc2d9543132aeb3
1:S 28 Jan 05:06:57.069 # Cluster state changed: fail
1:S 28 Jan 05:06:57.092 # Start of election delayed for 916 milliseconds (rank #0, offset 720).
1:S 28 Jan 05:06:58.095 # Starting a failover election for epoch 7.
1:S 28 Jan 05:06:58.099 # Failover election won: I'm the new master.
1:S 28 Jan 05:06:58.099 # configEpoch set to 7 after successful failover
1:M 28 Jan 05:06:58.099 # Setting secondary replication ID to 951fb8aac85409a8fc5dad74b059262134613f5d, valid up to offset: 721. New replication ID is dc7af59ee82d9622a4097f458eab4df13a8e8b15
1:M 28 Jan 05:06:58.099 * Discarding previously cached master state.
1:M 28 Jan 05:06:58.100 # Cluster state changed: ok

 

다른 master 노드의 로그 확인

1:M 28 Jan 05:06:57.068 * Marking node f1124d4c5e1bae7eae1107bc4fc2d9543132aeb3 as failing (quorum reached).
1:M 28 Jan 05:06:57.068 # Cluster state changed: fail
1:M 28 Jan 05:06:58.097 # Failover auth granted to 8c67f0954711e074afd1fb34ebb7cc24c6cc73e0 for epoch 7
1:M 28 Jan 05:06:58.102 # Cluster state changed: ok

 

다른 slave 노드의 로그 확인

1:S 28 Jan 05:06:57.068 * FAIL message received from 1819c808fc29701676fde27691b5f57de297dfd8 about f1124d4c5e1bae7eae1107bc4fc2d9543132aeb3
1:S 28 Jan 05:06:57.068 # Cluster state changed: fail
1:S 28 Jan 05:06:58.102 # Cluster state changed: ok

 

마스터 노드가 kill 되었을 경우 (spring boot)lettuce client 로그

2022-01-27 05:01:02.909 DEBUG 1 --- [llEventLoop-4-1] i.l.core.protocol.ConnectionWatchdog     : Cannot reconnect to [10.244.3.34:6379]: finishConnect(..) failed: Host is unreachable: /10.244.3.34:6379

io.netty.channel.AbstractChannel$AnnotatedConnectException: finishConnect(..) failed: Host is unreachable: /10.244.3.34:6379
Caused by: java.net.ConnectException: finishConnect(..) failed: Host is unreachable
	at io.netty.channel.unix.Errors.throwConnectException(Errors.java:124) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.channel.unix.Socket.finishConnect(Socket.java:251) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.doFinishConnect(AbstractEpollChannel.java:672) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.finishConnect(AbstractEpollChannel.java:649) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe.epollOutReady(AbstractEpollChannel.java:529) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:465) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:378) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-all-4.1.52.Final.jar!/:4.1.52.Final]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_212]

 

토폴로지 구성이 업데이트 되지 않으면 레디스 클러스터가 복구 되었음에도 접속할 수 없다.

 

반드시 토폴로지 구성을 리프레시 하는 설정을 클라이언트(lettuce)에 작성해야한다.

 

 

참고로 Slave 노드를 kill 했을 경우 클라이언트 혹은 클러스터에 영향을 미치는 것이 없다.

 

이전 마스터였던 노드가 재시작한 경우

이전 슬레이드 노드가 마스터 노드로 승격되고, 승격된 마스터 노드의 슬레이브가 된다.

 

다른 master/slave 노드 로그

1:M 28 Jan 05:10:12.299 # Address updated for node f1124d4c5e1bae7eae1107bc4fc2d9543132aeb3, now 10.244.0.208:6379
1:M 28 Jan 05:10:12.370 * Clear FAIL state for node f1124d4c5e1bae7eae1107bc4fc2d9543132aeb3: master without slots is reachable again.

 


출처

- k8s configmap : https://stackoverflow.com/questions/58602949/redis-cluster-in-kubernetes-doesnt-write-nodes-conf-file

- https://blog.actorsfit.com/a?ID=01700-6f44e1d7-7ebc-4c13-bd14-d6a8cddd7e52 

- http://redisgate.kr/redis/cluster/cluster_failover.php

- http://redisgate.kr/redis/cluster/cluster-node-timeout.php

'빅데이터 > Redis Cluster' 카테고리의 다른 글

Redis Configuration  (0) 2022.02.08
Redis 주요 명령어  (0) 2022.02.08
Lettuce Configuration(RedisTemplate)  (0) 2022.02.08
Redis Cluster Overview  (0) 2022.02.08

Redis Cluster 특징

Scale out

적절한 성능의 머신을 추가해서 전체적인 성능을 향상시킴.

Data Sharding

대량의 데이터를 처리하기 위해 여러 개의 DBMS에 분할하는 형태

Fully Connected Mesh Topology

단일 장애점이 없는 토폴로지. Slave 노드를 포함한 모든 노드가 서로를 확인하고 정보를 주고 받는다. 즉, 모든 노드가 클러스터 구성 정보(슬롯 할당 정보)를 가지고 있다. 클라이언트는 어느 노드든지 접속해서 클러스터 구성정보(슬롯 할당 정보)를 가져와서 보유하며, 입력되는 키에 따라 해당 노드에 접속해서 처리한다. 과반수 이상의 노드(예를들면 Master 노드 3개중 2개 또는 Slave 1개, Master노드 1개씩 있는 구성에서 Master 노드와 Slave 노드 쌍으로 다운)가 다운되면 레디스 클러스터는 멈춘다.

Hash Sharding

Key에 해시 함수(CRC16 function)를 적용해서 노드를 할당. 노드 추가, 삭제 시 레디스 클러스터 전체를 중지할 필요 없고, 키 이동 시에만 해당 키에 대해서만 잠시 멈출 수 있다. 16384(0~16383)의 슬롯을 사용하며 이를 노드에 할당한다.

장애조치(failover)

한 마스터 다운시 다른 마스터들이 장애조치를 진행하여 별도의 센티넬이 필요하지 않음.

 

 

Redis Sentinel과 비교하자면

Redis Sentinel은 마스터와 커뮤니케이션 해야하고, 데이터 사이즈가 커지면 스케일 업을 해야한다.

Redis Cluster는 모든 노드에 접속 가능(데이터 샤딩), 스케일 아웃이 가능하며, Slave 노드 활용가능하다.


출처

- http://redisgate.kr/redis/cluster/cluster_introduction.php

'빅데이터 > Redis Cluster' 카테고리의 다른 글

Redis Configuration  (0) 2022.02.08
Redis 주요 명령어  (0) 2022.02.08
Lettuce Configuration(RedisTemplate)  (0) 2022.02.08
Redis Cluster 장애 복구  (0) 2022.02.08

개발 환경이 변경되거나 솔루션을 판매할때 플랫폼에 필요한 시스템 데이터를 세팅해야 될 경우가 있다. 이를 위해 필요한 내용에 대해서 간단히 살펴보겠다.

 

Contents

- Workbench를 활용하여 MySQL 5.7에 저장된 데이터를 export & import 하는 방법

- 마스터 유저생성 및 권한할당

- 스카마 이름을 변경하는 방법

 

How to Export 

  1. Data Export to Self-Contained File
  2. Advanced Options → set-gtid-purged → OFF 설정

 

3. Export!

4. View를 사용한다면 xxx.sql을 열고, DEFINER의 계정을 확인하자. Import 하고자하는 계정으로 설정!

/*!50013 DEFINER=admin@% SQL SECURITY DEFINER */

 

Import

  1. Import from Self-Contained File
  2. Default Target Schema : 데이터베이스가 생성되어 있지않다면 생성하자.
  3. Import!

 

 


마스터 유저 생성 및 권한 할당

mysql> SHOW GRANTS for master_username; # 권한 확인

 

mysql> CREATE USER 'new_master_user'@'%' IDENTIFIED BY 'password'; # 새로운 마스터 유저 생성, 외부에서의 접근을 허용

mysql> GRANT ALL PRIVILEGES ON schema_name.* TO 'new_master_user'@'%' IDENTIFIED BY 'password'; # 모든 원격지에서의 schema_name 스키마의 모든 테이블에 대해서 new_aster_user 유저에게 모든 권한을 부여

 


스키마 이름 변경

RENAMTE TABLE Statement

RENAME TABLE
    tbl_name TO new_tbl_name
    [, tbl_name2 TO new_tbl_name2] ...

 

todos -> self_todolist 예시

RENAME TABLE todos.company TO self_todolist.company,
			 todos.todo TO self_todolist.todo,
             todos.todo_has_ref TO self_todolist.todo_has_ref,
             todos.user TO self_todolist.user,
             todos.user_auth TO self_todolist.user_auth,
             todos.user_grp TO self_todolist.user_grp,
             todos.user_role TO self_todolist.user_role,
             todos.user_role_has_user_auth TO self_todolist.user_role_has_user_auth

출처

- https://dev.mysql.com/doc/refman/5.6/en/rename-table.html

- https://www.quora.com/How-can-I-rename-a-schema-with-MySQL-Workbench-using-MySQL-5-6

- https://nickjoit.tistory.com/144

- https://aws.amazon.com/ko/premiumsupport/knowledge-center/duplicate-master-user-mysql/

+ Recent posts