구성 계획

IP Master 포터 Slave 포트
192.168.0.21 6379 6380
192.168.0.22 6379 6380
192.168.0.23 6379 6380

Redis 설치

192.168.0.21 ~ 23 공통

# 관련 패키지 설치 
sudo apt install -y gcc make pkg-config libjemalloc-dev libjemalloc2 tcl libssl-dev libsystemd-dev
# redis 설치 
wget http://download.redis.io/releases/redis-7.2.6.tar.gz
tar xvzf redis-7.2.6.tar.gz 
cd redis-7.2.6
cd deps
make hiredis jemalloc linenoise lua
cd ..
make USE_SYSTEMD=yes
make test 
make install PREFIX=/home/kalva/redis_6379
make install PREFIX=/home/kalva/redis_6380
cp redis.conf /home/kalva/redis_6379/redis_6379.conf 
cp redis.conf /home/kalva/redis_6380/redis_6380.conf 

# 로그 디렉토리 생성  
mkdir /home/kalva/redis_6379/logs
mkdir /home/kalva/redis_6380/logs

# 모든 접속 허용
sed -i 's/^bind 127\.0\.0\.1 -::1$/bind 0.0.0.0/' /home/kalva/redis_6379/redis_6379.conf
sed -i 's/^bind 127\.0\.0\.1 -::1$/bind 0.0.0.0/' /home/kalva/redis_6380/redis_6380.conf 

# 데몬으로 구동  
sed -i 's/^daemonize no$/daemonize yes/' /home/kalva/redis_6379/redis_6379.conf
sed -i 's/^daemonize no$/daemonize yes/' /home/kalva/redis_6380/redis_6380.conf

# 보호모드 중지 
sed -i 's/^protected-mode yes$/protected-mode no/' /home/kalva/redis_6379/redis_6379.conf
sed -i 's/^protected-mode yes$/protected-mode no/' /home/kalva/redis_6380/redis_6380.conf

# redis_6380 의 포트 변경
sed -i 's/^port 6379$/port 6380/' /home/kalva/redis_6380/redis_6380.conf

sed -i 's|^pidfile /var/run/redis_6379\.pid$|pidfile /home/kalva/redis_6379/redis_6379.pid|' /home/kalva/redis_6379/redis_6379.conf
sed -i 's|^pidfile /var/run/redis_6380.pid$|pidfile /home/kalva/redis_6380/redis_6380.pid|' /home/kalva/redis_6380/redis_6380.conf

sed -i 's|^logfile ""$|logfile /home/kalva/redis_6379/logs/redis_6379.log|' /home/kalva/redis_6379/redis_6379.conf
sed -i 's|^logfile ""$|logfile /home/kalva/redis_6380/logs/redis_6380.log|' /home/kalva/redis_6380/redis_6380.conf

sed -i.bak 's|^dir \./$|dir /home/kalva/redis_6379/|' /home/kalva/redis_6379/redis_6379.conf
sed -i.bak 's|^dir \./$|dir /home/kalva/redis_6380/|' /home/kalva/redis_6380/redis_6380.conf

# 패스워드 설정 
sed -i 's|^# masterauth <master-password>$|masterauth mypasswd|' /home/kalva/redis_6379/redis_6379.conf
sed -i 's|^# masterauth <master-password>$|masterauth mypasswd|' /home/kalva/redis_6380/redis_6380.conf

sed -i 's|^# requirepass foobared$|requirepass mypasswd|' /home/kalva/redis_6379/redis_6379.conf
sed -i 's|^# requirepass foobared$|requirepass mypasswd|' /home/kalva/redis_6380/redis_6380.conf

# 클러스터 관련 설정 
sed -i 's|^# cluster-enabled yes$|cluster-enabled yes|' /home/kalva/redis_6379/redis_6379.conf
sed -i 's|^# cluster-enabled yes$|cluster-enabled yes|' /home/kalva/redis_6380/redis_6380.conf
sed -i 's|^# cluster-config-file nodes-6379.conf$|cluster-config-file nodes-6379.conf|' /home/kalva/redis_6379/redis_6379.conf
sed -i 's|^# cluster-config-file nodes-6379.conf$|cluster-config-file nodes-6380.conf|' /home/kalva/redis_6380/redis_6380.conf
sed -i 's|^# cluster-node-timeout 15000$|cluster-node-timeout 3000|' /home/kalva/redis_6379/redis_6379.conf
sed -i 's|^# cluster-node-timeout 15000$|cluster-node-timeout 3000|' /home/kalva/redis_6380/redis_6380.conf

# 클러스터 구동 
/home/kalva/redis_6379/bin/redis-server /home/kalva/redis_6379/redis_6379.conf
/home/kalva/redis_6380/bin/redis-server /home/kalva/redis_6380/redis_6380.conf

# redis 6379, 6380 노드가 떠있는지 확인 
ps -ef | grep redis

클러스터에 master 노드 추가

  • 노드중 한대에서 실행
    /home/kalva/redis_6379/bin/redis-cli -a mypasswd --cluster create 192.168.0.21:6379 192.168.0.22:6379 192.168.0.23:6379
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    >>> Performing hash slots allocation on 3 nodes...
    Master[0] -> Slots 0 - 5460
    Master[1] -> Slots 5461 - 10922
    Master[2] -> Slots 10923 - 16383
    M: ec4ef88dab3114407e2dd51e5e2d306d471a53a5 192.168.0.21:6379
     slots:[0-5460] (5461 slots) master
    M: a31c6591e47d73b7f71312747ae1e1d162990226 192.168.0.22:6379
     slots:[5461-10922] (5462 slots) master
    M: 433a817cf1fef7bd32b009739af468091f496e39 192.168.0.23:6379
     slots:[10923-16383] (5461 slots) master
    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.0.21:6379)
    M: ec4ef88dab3114407e2dd51e5e2d306d471a53a5 192.168.0.21:6379
     slots:[0-5460] (5461 slots) master
    M: a31c6591e47d73b7f71312747ae1e1d162990226 192.168.0.22:6379
     slots:[5461-10922] (5462 slots) master
    M: 433a817cf1fef7bd32b009739af468091f496e39 192.168.0.23:6379
     slots:[10923-16383] (5461 slots) master
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    

192.168.0.21의 Master log 확인

tail -n 3 /home/kalva/redis_6379/logs/redis_6379.log
1430:M 30 Nov 2024 07:33:03.750 * configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
1430:M 30 Nov 2024 07:36:24.762 * IP address for this node updated to 192.168.0.21
1430:M 30 Nov 2024 07:36:25.066 * Cluster state changed: ok

192.168.0.22의 Master log 확인

tail -n 3 /home/kalva/redis_6379/logs/redis_6379.log
1564:M 30 Nov 2024 07:36:24.692 * configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH
1564:M 30 Nov 2024 07:36:24.861 * IP address for this node updated to 192.168.0.22
1564:M 30 Nov 2024 07:36:27.675 * Cluster state changed: ok

192.168.0.23의 Master log 확인

tail -n 3 /home/kalva/redis_6379/logs/redis_6379.log
1354:M 30 Nov 2024 07:36:24.692 * configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH
1354:M 30 Nov 2024 07:36:24.860 * IP address for this node updated to 192.168.0.23
1354:M 30 Nov 2024 07:36:27.679 * Cluster state changed: ok


# 클러스터에 slave 노드 추가
- 노드중 한대에서 실행 
```shell 
/home/kalva/redis_6379/bin/redis-cli -a mypasswd --cluster add-node 192.168.0.21:6380 192.168.0.21:6379 --cluster-slave
/home/kalva/redis_6379/bin/redis-cli -a mypasswd --cluster add-node 192.168.0.22:6380 192.168.0.22:6379 --cluster-slave
/home/kalva/redis_6379/bin/redis-cli -a mypasswd --cluster add-node 192.168.0.23:6380 192.168.0.23:6379 --cluster-slave

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Adding node 192.168.0.21:6380 to cluster 192.168.0.21:6379
>>> Performing Cluster Check (using node 192.168.0.21:6379)
M: ec4ef88dab3114407e2dd51e5e2d306d471a53a5 192.168.0.21:6379
   slots:[0-5460] (5461 slots) master
M: a31c6591e47d73b7f71312747ae1e1d162990226 192.168.0.22:6379
   slots:[5461-10922] (5462 slots) master
M: 433a817cf1fef7bd32b009739af468091f496e39 192.168.0.23:6379
   slots:[10923-16383] (5461 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Automatically selected master 192.168.0.21:6379
>>> Send CLUSTER MEET to node 192.168.0.21:6380 to make it join the cluster.
Waiting for the cluster to join
.
>>> Configure node as replica of 192.168.0.21:6379.
[OK] New node added correctly.

# 192.168.0.21의 Master log 확인 
tail -n 11 /home/kalva/redis_6379/logs/redis_6379.log 
1430:M 30 Nov 2024 07:40:32.116 * Replica 192.168.0.21:6380 asks for synchronization
1430:M 30 Nov 2024 07:40:32.116 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '8fcc2bae37559b5542d2ff5a022f892afc2a25b8', my replication IDs are '99a275c14e36bc06e269cd6144c27978ce33175b' and '0000000000000000000000000000000000000000')
1430:M 30 Nov 2024 07:40:32.116 * Replication backlog created, my new replication IDs are 'e90468779cd2154eadd9d78d26918c06ba9e7bef' and '0000000000000000000000000000000000000000'
1430:M 30 Nov 2024 07:40:32.116 * Delay next BGSAVE for diskless SYNC
1430:M 30 Nov 2024 07:40:37.628 * Starting BGSAVE for SYNC with target: replicas sockets
1430:M 30 Nov 2024 07:40:37.628 * Background RDB transfer started by pid 1596
1596:C 30 Nov 2024 07:40:37.631 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
1430:M 30 Nov 2024 07:40:37.631 * Diskless rdb transfer, done reading from pipe, 1 replicas still up.
1430:M 30 Nov 2024 07:40:37.635 * Background RDB transfer terminated with success
1430:M 30 Nov 2024 07:40:37.636 * Streamed RDB transfer with replica 192.168.0.21:6380 succeeded (socket). Waiting for REPLCONF ACK from replica to enable streaming
1430:M 30 Nov 2024 07:40:37.636 * Synchronization with replica 192.168.0.21:6380 succeeded

# 192.168.0.21의 Slave  log 확인 
tail -n 16 /home/kalva/redis_6380/logs/redis_6380.log 
1432:S 30 Nov 2024 07:40:32.115 * Connecting to MASTER 192.168.0.21:6379
1432:S 30 Nov 2024 07:40:32.115 * MASTER <-> REPLICA sync started
1432:S 30 Nov 2024 07:40:32.115 * Cluster state changed: ok
1432:S 30 Nov 2024 07:40:32.115 * Non blocking connect for SYNC fired the event.
1432:S 30 Nov 2024 07:40:32.115 * Master replied to PING, replication can continue...
1432:S 30 Nov 2024 07:40:32.116 * Trying a partial resynchronization (request 8fcc2bae37559b5542d2ff5a022f892afc2a25b8:1).
1432:S 30 Nov 2024 07:40:37.628 * Full resync from master: e90468779cd2154eadd9d78d26918c06ba9e7bef:14
1432:S 30 Nov 2024 07:40:37.630 * MASTER <-> REPLICA sync: receiving streamed RDB from master with EOF to disk
1432:S 30 Nov 2024 07:40:37.630 * Discarding previously cached master state.
1432:S 30 Nov 2024 07:40:37.630 * MASTER <-> REPLICA sync: Flushing old data
1432:S 30 Nov 2024 07:40:37.630 * MASTER <-> REPLICA sync: Loading DB in memory
1432:S 30 Nov 2024 07:40:37.635 * Loading RDB produced by version 7.2.6
1432:S 30 Nov 2024 07:40:37.635 * RDB age 0 seconds
1432:S 30 Nov 2024 07:40:37.635 * RDB memory usage when created 1.74 Mb
1432:S 30 Nov 2024 07:40:37.635 * Done loading RDB, keys loaded: 0, keys expired: 0.
1432:S 30 Nov 2024 07:40:37.635 * MASTER <-> REPLICA sync: Finished with success

# 192.168.0.22의 Master log 확인 
tail -n 11 /home/kalva/redis_6379/logs/redis_6379.log 
1564:M 30 Nov 2024 07:40:51.541 * Replica 192.168.0.22:6380 asks for synchronization
1564:M 30 Nov 2024 07:40:51.541 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '437e582b5fe52fb6ce63b96e6d9cd8980767bb5e', my replication IDs are '9def95aadae68ad27af0691868bfc2273e37a815' and '0000000000000000000000000000000000000000')
1564:M 30 Nov 2024 07:40:51.541 * Replication backlog created, my new replication IDs are '19cf246e6a39a1c0f4c60c43cec6b9d72c97c73d' and '0000000000000000000000000000000000000000'
1564:M 30 Nov 2024 07:40:51.541 * Delay next BGSAVE for diskless SYNC
1564:M 30 Nov 2024 07:40:56.989 * Starting BGSAVE for SYNC with target: replicas sockets
1564:M 30 Nov 2024 07:40:56.990 * Background RDB transfer started by pid 1606
1606:C 30 Nov 2024 07:40:56.991 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
1564:M 30 Nov 2024 07:40:56.991 * Diskless rdb transfer, done reading from pipe, 1 replicas still up.
1564:M 30 Nov 2024 07:40:56.996 * Background RDB transfer terminated with success
1564:M 30 Nov 2024 07:40:56.996 * Streamed RDB transfer with replica 192.168.0.22:6380 succeeded (socket). Waiting for REPLCONF ACK from replica to enable streaming
1564:M 30 Nov 2024 07:40:56.996 * Synchronization with replica 192.168.0.22:6380 succeeded

# 192.168.0.22의 Slave  log 확인 
kalva@kalva:~$ tail -n 16 /home/kalva/redis_6380/logs/redis_6380.log 
1447:S 30 Nov 2024 07:40:51.540 * Connecting to MASTER 192.168.0.22:6379
1447:S 30 Nov 2024 07:40:51.540 * MASTER <-> REPLICA sync started
1447:S 30 Nov 2024 07:40:51.540 * Cluster state changed: ok
1447:S 30 Nov 2024 07:40:51.540 * Non blocking connect for SYNC fired the event.
1447:S 30 Nov 2024 07:40:51.541 * Master replied to PING, replication can continue...
1447:S 30 Nov 2024 07:40:51.541 * Trying a partial resynchronization (request 437e582b5fe52fb6ce63b96e6d9cd8980767bb5e:1).
1447:S 30 Nov 2024 07:40:56.990 * Full resync from master: 19cf246e6a39a1c0f4c60c43cec6b9d72c97c73d:14
1447:S 30 Nov 2024 07:40:56.990 * MASTER <-> REPLICA sync: receiving streamed RDB from master with EOF to disk
1447:S 30 Nov 2024 07:40:56.990 * Discarding previously cached master state.
1447:S 30 Nov 2024 07:40:56.991 * MASTER <-> REPLICA sync: Flushing old data
1447:S 30 Nov 2024 07:40:56.991 * MASTER <-> REPLICA sync: Loading DB in memory
1447:S 30 Nov 2024 07:40:56.995 * Loading RDB produced by version 7.2.6
1447:S 30 Nov 2024 07:40:56.995 * RDB age 0 seconds
1447:S 30 Nov 2024 07:40:56.995 * RDB memory usage when created 1.77 Mb
1447:S 30 Nov 2024 07:40:56.995 * Done loading RDB, keys loaded: 0, keys expired: 0.
1447:S 30 Nov 2024 07:40:56.995 * MASTER <-> REPLICA sync: Finished with success

# 192.168.0.23의 Master log 확인 
tail -n 11 /home/kalva/redis_6379/logs/redis_6379.log 
1354:M 30 Nov 2024 07:40:56.420 * Replica 192.168.0.23:6380 asks for synchronization
1354:M 30 Nov 2024 07:40:56.420 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for '5f36e0ff7abcdd458cdaa5c7638ba46f7d1a5ff1', my replication IDs are 'ee75400b0f5f357dd5778f49a5b1c93cbd418b1a' and '0000000000000000000000000000000000000000')
1354:M 30 Nov 2024 07:40:56.420 * Replication backlog created, my new replication IDs are '4f7a1b0917ba1aa9f59a1f312c7ac22d1857dfd6' and '0000000000000000000000000000000000000000'
1354:M 30 Nov 2024 07:40:56.420 * Delay next BGSAVE for diskless SYNC
1354:M 30 Nov 2024 07:41:01.901 * Starting BGSAVE for SYNC with target: replicas sockets
1354:M 30 Nov 2024 07:41:01.901 * Background RDB transfer started by pid 1399
1399:C 30 Nov 2024 07:41:01.902 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
1354:M 30 Nov 2024 07:41:01.902 * Diskless rdb transfer, done reading from pipe, 1 replicas still up.
1354:M 30 Nov 2024 07:41:01.907 * Background RDB transfer terminated with success
1354:M 30 Nov 2024 07:41:01.907 * Streamed RDB transfer with replica 192.168.0.23:6380 succeeded (socket). Waiting for REPLCONF ACK from replica to enable streaming
1354:M 30 Nov 2024 07:41:01.907 * Synchronization with replica 192.168.0.23:6380 succeeded

# 192.168.0.23의 Slave  log 확인 
kalva@kalva:~$ tail -n 16 /home/kalva/redis_6380/logs/redis_6380.log 
1227:S 30 Nov 2024 07:40:56.419 * Connecting to MASTER 192.168.0.23:6379
1227:S 30 Nov 2024 07:40:56.419 * MASTER <-> REPLICA sync started
1227:S 30 Nov 2024 07:40:56.419 * Cluster state changed: ok
1227:S 30 Nov 2024 07:40:56.419 * Non blocking connect for SYNC fired the event.
1227:S 30 Nov 2024 07:40:56.420 * Master replied to PING, replication can continue...
1227:S 30 Nov 2024 07:40:56.420 * Trying a partial resynchronization (request 5f36e0ff7abcdd458cdaa5c7638ba46f7d1a5ff1:1).
1227:S 30 Nov 2024 07:41:01.901 * Full resync from master: 4f7a1b0917ba1aa9f59a1f312c7ac22d1857dfd6:14
1227:S 30 Nov 2024 07:41:01.902 * MASTER <-> REPLICA sync: receiving streamed RDB from master with EOF to disk
1227:S 30 Nov 2024 07:41:01.902 * Discarding previously cached master state.
1227:S 30 Nov 2024 07:41:01.902 * MASTER <-> REPLICA sync: Flushing old data
1227:S 30 Nov 2024 07:41:01.902 * MASTER <-> REPLICA sync: Loading DB in memory
1227:S 30 Nov 2024 07:41:01.906 * Loading RDB produced by version 7.2.6
1227:S 30 Nov 2024 07:41:01.906 * RDB age 0 seconds
1227:S 30 Nov 2024 07:41:01.906 * RDB memory usage when created 1.77 Mb
1227:S 30 Nov 2024 07:41:01.906 * Done loading RDB, keys loaded: 0, keys expired: 0.
1227:S 30 Nov 2024 07:41:01.906 * MASTER <-> REPLICA sync: Finished with success

클러스터 정보 확인

kalva@kalva:~$ /home/kalva/redis_6379/bin/redis-cli
127.0.0.1:6379> auth mypasswd
OK
127.0.0.1:6379> 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:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:4036
cluster_stats_messages_pong_sent:4057
cluster_stats_messages_sent:8093
cluster_stats_messages_ping_received:4054
cluster_stats_messages_pong_received:4036
cluster_stats_messages_meet_received:3
cluster_stats_messages_received:8093
total_cluster_links_buffer_limit_exceeded:0
127.0.0.1:6379> cluster nodes
db37ced5fdd81a8638abc40dbd87055c22f69544 192.168.0.21:6380@16380 slave ec4ef88dab3114407e2dd51e5e2d306d471a53a5 0 1732953623040 1 connected
59ba65b01e657c1ab74b3502f2382cda995dbacd 192.168.0.22:6380@16380 slave a31c6591e47d73b7f71312747ae1e1d162990226 0 1732953622538 2 connected
a31c6591e47d73b7f71312747ae1e1d162990226 192.168.0.22:6379@16379 master - 0 1732953622036 2 connected 5461-10922
ec4ef88dab3114407e2dd51e5e2d306d471a53a5 192.168.0.21:6379@16379 myself,master - 0 1732953622000 1 connected 0-5460
3a63fdc4ef504b77b8120c369288baf34a393b0e 192.168.0.23:6380@16380 slave 433a817cf1fef7bd32b009739af468091f496e39 0 1732953622538 3 connected
433a817cf1fef7bd32b009739af468091f496e39 192.168.0.23:6379@16379 master - 0 1732953623040 3 connected 10923-16383

'Redis' 카테고리의 다른 글

복제 구성, sentinel  (0) 2024.11.27
Redis 관리  (0) 2024.11.27
WSL2 + Rocky Linux 8 + Redis 7.2 설치  (0) 2023.12.10

구성 계획

  • 192.168.0.11 redis, sentinel
  • 192.168.0.12 redis, sentinel
  • 192.168.0.13 redis, sentinel
  • redis 포트 : 6379
  • sentinel 포트 : 26379

redis 설치, 설정

192.168.0.11 ~ 192.168.0.13 공통

# 관련 패키지 설치 
sudo apt install -y gcc make pkg-config libjemalloc-dev libjemalloc2 tcl libssl-dev libsystemd-dev
# redis 설치 
wget http://download.redis.io/releases/redis-7.2.4.tar.gz
tar xvzf redis-7.2.4.tar.gz 
cd redis-7.2.4
cd deps
make hiredis jemalloc linenoise lua
cd ..
make USE_SYSTEMD=yes
make test 
make install PREFIX=/home/kalva/redis_6379

# 설정 파일 복사
cp redis.conf /home/kalva/redis_6379/redis_6379.conf
cp sentinel.conf /home/kalva/redis_6379/sentinel_26379.conf

# 로그 디렉토리 생성 
cd /home/kalva/redis_6379
mkdir logs

192.168.0.11 redis 설정, 구동

vi /home/kalva/redis_6379/redis_6379.conf
# 모두 접속 허용
bind 0.0.0.0
# 백그라운드로 동작
daemonize yes
# pid파일 위치
pidfile "/home/kalva/redis_6379/redis_6379.pid"
# log파일 위치
logfile "/home/kalva/redis_6379/logs/redis_6379.log"
# rdb 파일 디렉토리 
dir /home/kalva/redis-7.2.4/
# 슬레이브가 마스터 서버와 통신하기 위한 패스워드 
masterauth mypass
# redis 클라이언트가 redis 와 통신하기 위한 패스워드 
requirepass mypass
appendonly yes
appendfsync everysec

# Redis 구동 
/home/kalva/redis_6379/bin/redis-server /home/kalva/redis_6379/redis_6379.conf

192.168.0.12, 192.168.0.13 redis 설정, 구동

vi /home/kalva/redis_6379/redis_6379.conf
# 모두 접속 허용
bind 0.0.0.0
# 백그라운드로 동작
daemonize yes
# pid파일 위치
logfile "/home/kalva/redis_6379/logs/redis_6379.log"
# log파일 위치
pidfile "/home/kalva/redis_6379/redis_6379.pid"
# rdb 파일 디렉토리 
dir /home/kalva/redis-7.2.4/
# 슬레이브가 마스터 서버와 통신하기 위한 패스워드 
masterauth mypass
# redis 클라이언트가 redis 와 통신하기 위한 패스워드 
requirepass mypass
appendonly yes
appendfsync everysec

# 복제 마스터 서버 정보 
replicaof 192.168.0.11 6379

# Redis 구동 
/home/kalva/redis_6379/bin/redis-server /home/kalva/redis_6379/redis_6379.conf

sentinel 설정

192.168.0.11 ~ 192.168.0.13 redis 설정, 구동

vi /home/kalva/redis_6379/sentinel_26379.conf
# 백그라운드로 동작
daemonize yes
# pid파일 위치
pidfile "/home/kalva/redis_6379/sentinel_26379.pid"
# log파일 위치
logfile "/home/kalva/redis_6379/logs/sentinel_26379.log"
# 모니터링 대상 master정보, 쿼럼설정 
sentinel monitor mymaster 192.168.0.11 6379 2
# master비번
sentinel auth-pass mymaster mypass
# master 다운판정 시간 6초
sentinel down-after-milliseconds mymaster 6000
# failover 완료되어야 하는 시간
sentinel failover-timeout mymaster 180000

# sentinel 구동 
/home/kalva/redis_6379/bin/redis-sentinel /home/kalva/redis_6379/sentinel_26379.conf

구동 테스트

복제 정보, 센티널 정보 확인

# 복제 정보 확인 
kalva@kalva:~$ /home/kalva/redis_6379/bin/redis-cli -h 192.168.0.11 
192.168.0.11:6379> auth mypass
OK
192.168.0.11:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.12,port=6379,state=online,offset=406,lag=0
slave1:ip=192.168.0.13,port=6379,state=online,offset=406,lag=0
master_failover_state:no-failover
master_replid:bd536db1af0fc367cce17cb5bede06e52ac778e3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:406
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:406
192.168.0.11:6379> 

# 센티널 노드 확인
# slaves=2,sentinels=3 가 맞는지 확인 
kalva@kalva:~$ /home/kalva/redis_6379/bin/redis-cli -h 192.168.0.11 -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.0.11:6379,slaves=2,sentinels=3

master 노드 확인

kalva@kalva:~$ /home/kalva/redis_6379/bin/redis-cli -h 192.168.0.11 -p 26379  sentinel get-master-addr-by-name mymaster
1) "192.168.0.11"
2) "6379"

Failover 테스트

# 192.168.0.13 서버 우선순위 50으로 설정
# replica-priority 값이 낮을수록 우선순위기 높다. 
kalva@kalva:~$ /home/kalva/redis_6379/bin/redis-cli
127.0.0.1:6379> auth mypass
OK
127.0.0.1:6379> CONFIG SET replica-priority 50
OK

# FAILOVER
kalva@kalva:~$ /home/kalva/redis_6379/bin/redis-cli -h 192.168.0.11 -p 26379 
192.168.0.11:26379> SENTINEL FAILOVER mymaster
OK

# 마스터 노드 확인 
192.168.0.11:26379> SENTINEL GET-MASTER-ADDR-BY-NAME mymaster
1) "192.168.0.13"
2) "6379"

# 192.168.0.13 에서 확인 
kalva@kalva:~/redis_6379$ /home/kalva/redis_6379/bin/redis-cli 
127.0.0.1:6379> auth mypass
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.0.12,port=6379,state=online,offset=554510,lag=0
slave1:ip=192.168.0.11,port=6379,state=online,offset=554510,lag=0
master_failover_state:no-failover
master_replid:ef914c9e01ccbc78289a259f66c5894b4818e248
master_replid2:bd536db1af0fc367cce17cb5bede06e52ac778e3
master_repl_offset:554649
second_repl_offset:453815
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:554635


kalva@kalva:~$ /home/kalva/redis_6379/bin/redis-cli -h 192.168.0.11 -p 26379 
192.168.0.11:26379> SENTINEL SENTINELS mymaster
1)  1) "name"
    2) "93275507e9835dc182df09356d8fe829715b3eae"
    3) "ip"
    4) "192.168.0.12"
    5) "port"
    6) "26379"
    7) "runid"
    8) "93275507e9835dc182df09356d8fe829715b3eae"
    9) "flags"
   10) "sentinel"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "270"
   19) "last-ping-reply"
   20) "270"
   21) "down-after-milliseconds"
   22) "6000"
   23) "last-hello-message"
   24) "1868"
   25) "voted-leader"
   26) "?"
   27) "voted-leader-epoch"
   28) "0"
2)  1) "name"
    2) "c4c59fc8e54187cd99f926a677f3e4a9bf88c68b"
    3) "ip"
    4) "192.168.0.13"
    5) "port"
    6) "26379"
    7) "runid"
    8) "c4c59fc8e54187cd99f926a677f3e4a9bf88c68b"
    9) "flags"
   10) "sentinel"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "0"
   17) "last-ok-ping-reply"
   18) "270"
   19) "last-ping-reply"
   20) "270"
   21) "down-after-milliseconds"
   22) "6000"
   23) "last-hello-message"
   24) "233"
   25) "voted-leader"
   26) "?"
   27) "voted-leader-epoch"
   28) "0"

'Redis' 카테고리의 다른 글

클러스터 구성  (0) 2024.12.01
Redis 관리  (0) 2024.11.27
WSL2 + Rocky Linux 8 + Redis 7.2 설치  (0) 2023.12.10
  • Redis 의 대표적 특징

    • Single threaded
    • 한번에 하나의 명령어만 실행 가능
    • 처리시간이 긴 명령어를 실생하면 그뒤에 있는 명령어들은 전부 대기
      • 전체 키를 불러오는 Keys명령어 처리가 오래 걸림
      • Keys 명령어 실행시 뒤의 Get/Set 명령어들은 대기로 타임아웃 또는 실패 할수도 있음
  • Redis 서버의 메메로 한계 도달시

    • 메모리 한계 maxmemory 로 설정
    • maxmemory 까지 메모리 사용시 maxmemory policy 에 따라 추가 메모리 확보
  • maxmemory policy 설정값 (메모리 확보 정책)

    • noeviction
      • 기존 데이터 삭제안함
      • 메모리 부족시 OOM(Out Of Memory) 오류 반환후 새로운 데이터 삭제
    • allkeys-lru
      • LRU(Least Recently Used) 페이지 교체 알고리즘으로 데이터 삭제
    • volatile-lru
      • expire set을 가진 것중 LRU로 삭제
    • allkeys-random
      • 램덤으로 데이터 삭제
    • volatile-random
      • expire set을 가진것 중 랜덤으로 데이터 삭제
    • volatile-ttl
      • expire set을 가진것 중 TTL(Time To Live) 값이 짧은것부터 삭제
    • allkeys-lfu
      • 가장 적게 액세스한 키 제거
    • volatile-lfu
      • expire set을 가진것 중 가장 적게 액세스한 키부터 제거
  • eviction

    • maxmemory 초과로 데이터가 지워지는것
    • redis-cli 에서 INFO 명령어 실행시 evicted_keys 수치로 eviction 발생 여부 확인 가능
    • evicted_keys
      • evicted된 키들의 count 로 크면 클루록 많은 데이터가 메모리에서 삭제된것임
  • maxmemory 설정 예외

    • 쓰기 요청 처리시 COW(Copy On Write) 방식으로 작동
    • 쓰기 요청은 OS는 fork()를 통해 자식 프로세스를 생성함
    • fork() 시에 가상 메모리 주소를 할당받지만 물리 메모리 블록을 공유함
    • 쓰기 작업 시작시 수정할 메모리 페이지 복사후 쓰기 작업 진행
      • 추가 메모리 필요
    • fork 시 복사할 사이즈만큼 free memory 필요
  • /porc/sys/vm/overcommit_memory 값 1로 설정 필요

    • overcommit_memory=0
      • OS는 주어진 메모리량보다 크게 할당 불가
      • fork()시에 OS가 충분한 메모리가 없다고 판단해서 에러 발생
    • overcommit_memory=1
      • OS에게 over 해서 메모리 할당가능하게 설정
      • maxmemory에 도달시 policy 에 따라 처리됨
  • used_memory_rss

    • redis 의 memory 수치중 주요 모니터링 항목
    • 데이터를 포함해서 redis 가 실제로 사용하고 있는 메모리 크기
    • 실제로 사용하고 있는 used_memory 보다 클수 있음
      • OS가 메모리 할당시 page 사이즈의 배수만큼 할당하기 때문
      • page size = 4096 일때, 요청 메모리 사이즈가 10이라도 OS는 4096만큼 할당함, 이를 Pragmentation (파편화) 현상이라고함

'Redis' 카테고리의 다른 글

클러스터 구성  (0) 2024.12.01
복제 구성, sentinel  (0) 2024.11.27
WSL2 + Rocky Linux 8 + Redis 7.2 설치  (0) 2023.12.10

요즘 Hyper-v 로 레디스, 센티널 구성 테스트를 하고 있어서 

VM 가져오기를 많이 하다보니 파워셀 스크립트를 만들어봤다. 

#  VM 명 
$NewVMName = "redis01"
# 원본 VM 경로 및 설정
$OriginalVmcxPath = "E:\Hyper-V Backup\Ubuntu22.04\Virtual Machines\4E839D3E-9F4F-4006-963B-329D8EE20E41.vmcx"

# 새 VM 구성
$NewVMConfigFolder = "E:\Hyper-V\"
$NewVMPath = "E:\Hyper-V\$NewVMName"
$NewVMVHDPath = "E:\Hyper-V\$NewVMName\Virtual Hard Disks\"

# 가상 머신 구성 폴더 생성
New-Item -ItemType Directory -Force -Path $NewVMPath

Import-VM -Path "$OriginalVmcxPath" `
		  -Copy -GenerateNewId `
		  -VirtualMachinePath "$NewVMPath" `
		  -SmartPagingFilePath "$NewVMPath" `
		  -SnapshotFilePath "$NewVMPath" `
		  -VhdDestinationPath "$NewVMVHDPath"

Rename-VM "Ubuntu22.04" -NewName "$NewVMName"

# 검사점 생성
Checkpoint-VM -Name "$NewVMName" -SnapshotName "Checkpoint-$(Get-Date -Format 'yyyyMMdd-HHmmss')"

 

'Dev' 카테고리의 다른 글

Hyper-v 백업 복사해서 복원하기  (0) 2024.01.15
WSL2 postman 설치  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26

Hyper-V 이런 저런 테스트를 하다보면 백업본을 복원하는 경우가 많은데 Powershell 을 이용하면 쉽고 빠르게 VM 복원이 가능하다.

 

Hyper-V 백업

 

 

Powershell 로 E:\Hyper-V\RedisCluster01 ~ E:\Hyper-V\RedisCluster06 으로 복원한다. 

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster01' -VirtualMachinePath 'E:\Hyper-V\RedisCluster01'
Rename-VM "Ubuntu22" -NewName "RedisCluster01"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster02' -VirtualMachinePath 'E:\Hyper-V\RedisCluster02'
Rename-VM "Ubuntu22" -NewName "RedisCluster02"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster03' -VirtualMachinePath 'E:\Hyper-V\RedisCluster03'
Rename-VM "Ubuntu22" -NewName "RedisCluster03"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster04' -VirtualMachinePath 'E:\Hyper-V\RedisCluster04'
Rename-VM "Ubuntu22" -NewName "RedisCluster04"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster05' -VirtualMachinePath 'E:\Hyper-V\RedisCluster05'
Rename-VM "Ubuntu22" -NewName "RedisCluster05"

Import-VM -Path 'E:\Hyper-V Backup\Ubuntu22\Virtual Machines\3C3B46B0-F4B4-46FE-B13C-0B401A735DA9.vmcx' -Copy -GenerateNewId -VhdDestinationPath 'E:\Hyper-V\RedisCluster06' -VirtualMachinePath 'E:\Hyper-V\RedisCluster06'
Rename-VM "Ubuntu22" -NewName "RedisCluster06"

 

 

 

 

'Dev' 카테고리의 다른 글

Hyper-v VM 가져오기 (복사)  (0) 2024.11.21
WSL2 postman 설치  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (2)  (0) 2023.07.01
Vue 컨포넌트 - 데이터 바인딩 (1)  (0) 2023.06.27
Vue 컴포넌트  (0) 2023.06.26

WSL2 에 Rocky Linux 8 설치

PS E:\Hyper-V> wsl --import Redis72 E:\Hyper-V\Redis72 E:\Hyper-V\Rocky-8-Container-Base.latest.x86_64.tar.xz --version 2


PS E:\Hyper-V> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         2
  Redis72         Stopped         2
  PostgreSQL14    Stopped         2

PS E:\Hyper-V> wsl -d Redis72

Redis 7.2 설치

-- 저장소 설치 
[root@RT-PC Hyper-V]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
[root@RT-PC Hyper-V]# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

-- redis 모듈 검색 
[root@RT-PC Hyper-V]# dnf module list redis
Rocky Linux 8 - AppStream
Name                 Stream                  Profiles                  Summary
redis                5 [d]                   common [d]                Redis persistent key-value database
redis                6                       common [d]                Redis persistent key-value database

Remi's Modular repository for Enterprise Linux 8 - x86_64
Name                 Stream                  Profiles                  Summary
redis                remi-5.0                common [d]                Redis persistent key-value database
redis                remi-6.0                common [d]                Redis persistent key-value database
redis                remi-6.2                common [d]                Redis persistent key-value database
redis                remi-7.0                common [d]                Redis persistent key-value database
redis                remi-7.2                common [d]                Redis persistent key-value database

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

-- 7.2 버전 설치 
[root@RT-PC Hyper-V]# dnf module reset redis
[root@RT-PC Hyper-V]# dnf module install redis:remi-7.2

-- redis 서비스 사용 설정 
[root@RT-PC ~]# systemctl enable redis
Created symlink /etc/systemd/system/multi-user.target.wants/redis.service → /usr/lib/systemd/system/redis.service.

-- redis 서비스 시작 
[root@RT-PC ~]# systemctl start redis
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

-- systemctl 사용 설정 
[root@RT-PC ~]# echo "[boot]
systemd=true" | tee /etc/wsl.conf

-- Redis72 를 재기동한다. 
[root@RT-PC ~]# exit
logout

PS E:\Hyper-V> wsl -t Redis72
작업을 완료했습니다.

PS E:\Hyper-V> wsl -d Redis72

-- redis 서비스 상태확인 
[root@RT-PC Hyper-V]# systemctl status redis
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/redis.service.d
           └─limit.conf
   Active: active (running) since Sat 2023-12-09 12:21:56 KST; 53s ago
 Main PID: 49 (redis-server)
   Status: "Ready to accept connections"
    Tasks: 5 (limit: 26213)
   Memory: 11.8M
   CGroup: /system.slice/redis.service
           └─49 /usr/bin/redis-server 127.0.0.1:6379

Dec 09 12:21:56 RT-PC systemd[1]: Starting Redis persistent key-value database...
Dec 09 12:21:56 RT-PC systemd[1]: Started Redis persistent key-value database.

-- redis 접속 
[root@RT-PC Hyper-V]# redis-cli
127.0.0.1:6379>

'Redis' 카테고리의 다른 글

클러스터 구성  (0) 2024.12.01
복제 구성, sentinel  (0) 2024.11.27
Redis 관리  (0) 2024.11.27

테스트를 위해서 wsl2 사용 설정 필요

wsl 에 rocky linux 8 설치

-- wsl 에 Rocky Linux 8 설치 
PS C:\Users\kalva> wsl --import PostgreSQL14 E:\Hyper-V\PostgreSQL14 E:\Hyper-V\Rocky-8-Container-Base.latest.x86_64.tar.xz --version 2
가져오기가 진행 중입니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.
작업을 완료했습니다.

-- 설치된 Rocky Linux 8 설치
PS C:\Users\kalva> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-22.04    Stopped         2
  PostgreSQL14    Stopped         2

-- 설치된 Rocky Linux 8 접속
PS C:\Users\kalva> wsl -d PostgreSQL14

-- 리눅스 버전 확인
[root@RT-PC kalva]# cat /etc/redhat-release
Rocky Linux release 8.8 (Green Obsidian)

-- 시스템 정보 확인
[root@RT-PC kalva]# uname -a
Linux RT-PC 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

-- sudo passwd 설치 
[root@RT-PC kalva]# dnf install -y sudo passwd

-- postgres 유저 추가, 패스워드 변경 
[root@RT-PC kalva]# useradd postgres
[root@RT-PC kalva]# passwd postgres
Changing password for user postgres.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

-- postgres 유저가 sudo 를 사용할 수 있게 추가 
[root@RT-PC kalva]# visudo
# %wheel        ALL=(ALL)       NOPASSWD: ALL 아래에 postgres 유저 추가 
postgres        ALL=(ALL)       NOPASSWD: ALL

[root@RT-PC kalva]# su - postgres
[postgres@RT-PC ~]$ sudo -i
[root@RT-PC ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@RT-PC ~]# exit
logout

-- systemd 사용 설정 
[postgres@RT-PC ~]$ echo "[boot]
systemd=true" | sudo tee /etc/wsl.conf
[boot]
systemd=true

-- systemd procps 설치 
[postgres@RT-PC ~]$ sudo dnf install -y systemd procps

-- OS 로케일 확인 
[postgres@RT-PC ~]$ locale -a
C
C.utf8
POSIX

-- glibc-locale-source 설치 
[postgres@RT-PC ~]$ sudo dnf install -y glibc-locale-source

-- ko_KR.utf8 locale 생성 
[postgres@RT-PC ~]$ sudo localedef -f UTF-8 -i ko_KR ko_KR.utf8

-- locale 설정 .bash_profile 파일에 LANG 설정 추가 
[postgres@RT-PC ~]$ vi .bash_profile 
export LANG=ko_KR.utf8

[postgres@RT-PC ~]$ exit
logout
[root@RT-PC ~]# exit
logout

--PostgreSQL14 재기동 
PS C:\Users\kalva> wsl -t PostgreSQL14
작업을 완료했습니다.
PS C:\Users\kalva> wsl -d PostgreSQL14
[postgres@RT-PC ~]$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
[postgres@RT-PC ~]$ sudo dnf -qy module disable postgresql
[postgres@RT-PC ~]$ sudo dnf install -y postgresql14-server
[postgres@RT-PC ~]$ sudo /usr/pgsql-14/bin/postgresql-14-setup initdb
[postgres@RT-PC ~]$ sudo systemctl enable postgresql-14
[postgres@RT-PC ~]$ sudo systemctl start postgresql-14

[postgres@RT-PC ~]$ ps x
    PID TTY      STAT   TIME COMMAND
     34 ?        Ss     0:00 /usr/pgsql-14/bin/postmaster -D /var/lib/pgsql/14/data/
     38 ?        Ss     0:00 postgres: logger
     43 ?        Ss     0:00 postgres: checkpointer
     44 ?        Ss     0:00 postgres: background writer
     45 ?        Ss     0:00 postgres: walwriter
     46 ?        Ss     0:00 postgres: autovacuum launcher
     47 ?        Ss     0:00 postgres: stats collector
     48 ?        Ss     0:00 postgres: logical replication launcher
     91 pts/0    S      0:00 -bash
    180 pts/0    R+     0:00 ps x

[postgres@RT-PC ~]$ psql
psql (14.9)
Type "help" for help.

postgres=# select version();
                                                 version
---------------------------------------------------------------------------------------------------------
 PostgreSQL 14.9 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-18), 64-bit
(1 row)

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | ko_KR.utf8 | ko_KR.utf8 |
 template0 | postgres | UTF8     | ko_KR.utf8 | ko_KR.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | ko_KR.utf8 | ko_KR.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)

문뜩 상세 옵션이 궁금해서 정리

 

--apply-log-only
  - Redo Log 적용단계만 수행되고 다른 Cash Reecovery 단계는 무시된다. 
    로그만을 적용하고 데이터베이스를 실제로 복원하지 않는다. 
    Commit 되지 않은 트랜잭션의 롤백단계 방지용
  - 증분 백업시에 사용

--backup
  - --target-dir 에 지정한 디렉토리에 데이터베이스를 백업한다. 

--backup-lock-retry-count=
  - 메타데이터 락을 획득하려는 시도 횟수 

--backup-lock-timeout=
  - 메타데이터 락을 획득하려는 시도시의 제한 시간(초)

--binlog-info (OFF | ON | LOCKLESS | AUTO)
  - xtrabackup 이 binlog 로그 좌표를 검색하는 방법 지정 
  - OFF : binlog 정보 검색 없이 백업한다. 
          LOCK BINLOG FOR BACKUP 명령어 실행안함 
  - ON : binlog 정보 검색 활성화
         가능한 경우 LOCK BINLOG FOR BACKUP 명령어를 실행하여 binlog-lock의 공유 장금을 적용하여 일관성을 보장한다. 
  - LOCKLES : 락을 최소화하여 테이블 잠금없이 binlog 정보를 백업한다.
              LOCK BINLOG FOR BACKUP 명령어 실행안함 
              xtrabackup_binlog_info 파일 생성안함 
  - AUTO : 기본값 
           백업 대상서버의 have_backup_safe_binlog_info 서버 변수값에 따라 자동으로 ON, LOCKLESS로 전환된다. 
           have_backup_safe_binlog_info 변수가 나타내는 정보는 MySQL 서버의 현재 상태에 따라 동적으로 변경된다. 

--check-privileges
  - 백업을 수행하기전에 백업을 수행하기 위한 권한이 있는지 확인한다.

--close-files
  - xtrabackup은 테이블스페이스를 열때 일반적으로 DDL 작업을 올바르게 관리하기 위해 파일 핸들을 닫지 않는다. 
    테이블스페이스 수가 너무 많아 제한에 맞지 않을 경우 더 이상 액세스할 수 없으면 파일 핸들을 닫도록 이 옵션을 사용할 수 있다.
  - 옵션 사용시 일관성 없는 백업을 생성할 수 있다. (주의)

--compact
  - 보조 인덱스(Secondary Index) 페이지를 건너뛰어 백업 파일의 크기를 최적화하는 옵션이다. 
    주요 인덱스(primary index)는 백업 파일에 유지되지만, 보조 인덱스(Secondary Index)는 필요한 경우에만 유지되고 그렇지 않으면 생략된다. 

--compress
  - 지정된 압축 알고리즘을 사용하여 트랜잭션 로그 파일, 메타데이터 파일을 포함한 모든 출력 데이터를 압축한다.
  - quicklz 알고리즘만 지원하고 있다. 
    결과 파일은 qpress 아카이브 형식을 갖는다.
  - xtrabackup 에서 생성된 모든 \*.qp 파일은 기본적으로 단일 파일 qpress 아카이브이며 qpress 파일 아카이버로 추출하고 압축을 풀 수 있다. 

--compress-chunk-size=
  - 압축 스레드의 작업 버퍼 크기(바이트), 기본값 64K

--compress-threads=
  - 병렬 데이터 압축을 위해 사용하는 스레드 수 지정, 기본값 1 
  - 병력 압축(--compress-threads)은 병렬 백업 (--parallel)와 함께 사용할 수 있다. 
    ex) --parallel=4 --compress --compress-threads=2
        4개의 스레드로 병렬 압축 백업, 압축 스레드로 2개의 스레드를 사용한다. 

--copy-back
  - 백업된 데이터를 실제 데이터 디렉토리로 복원
  - 데이터 디렉토리에 비워져 있어야함
    데이터가 있을 경우 덮어쓰여질 수 있다. 
    
--core-file
  -  xtrabackup이 비정상 종료될 때 발생한 Core Dump를 저장하는 경로를 지정하는 옵션

--databases=
  - 백업 대상 데이터베이스 및 테이블 목록을 지정
  - "databasename1[.table_name1] databasename2[.table_name2] . . .". 형식으로 사용 

--databases-exclude=name
  - 백업시 제외할 데이터베이스명 지정
  - --databases 옵션보다 우선순위가 높다. 

--databases-file=
  - 백업대상 데이터베이스, 테이블의 파일 경로 지정 
  
--datadir=DIRECTORY
  - 백업할 MySQL 서버의 datadir 과 동일하게 지정
  - my.cnf 가 있을 경우 해당 디렉토리에서 읽어야됨 
    - 별도의 경로 지정시 별도로 지정해야됨 
  - --copy-back, --move-back 옵션과 같이 사용하면 xtrabackup 은 --datadir 디렉토리를 참조한다. 
  - 백업을 위해 datadir의 파일시스템 수준에서 READ 및 EXECUTE 권한이 필요함 

--debug-sleep-before-unlock
  - xtrabackup 테스트에서 사용되는 디버그 전용 옵션 
  
--decompress
  - --compress 옵션을 사용하여 백업받은 .qp 확장자의 파일의 압축 해제 
  - --parallel 옵션 사용시 여러 파일을 동시 처리 가능 
  - 압축해제를 위해 qpress 유틸티가 필요하며, 액세스할수 있는 경로에 있어함 
  - 압축 파일을 삭제하기 위해서는 --remove-original 옵션을 사용해야함 
    - xtrabackup 은 압축 파일을 자동으로 삭제 하지 않는다. 

--decrypt
  - --encrypt 옵션을 사용하여 백업한 백업에서 .xbcrypt 확장자 파일을 복호화한다.
  - --parallel 옵션 사용시 여러 파일을 동시 처리 가능 
  - 압축 파일을 삭제하기 위해서는 --remove-original 옵션을 사용해야함 
    - xtrabackup 은 압축 파일을 자동으로 삭제 하지 않는

--defaults-extra-file=[MY.CNF]
  - xtrabackup에서 MySQL 서버와의 통신에 필요한 추가 설정을 지정하는데 사용
  - ex) xtrabackup.cnf 파일에 아래와 같이 설정 
    [client]
    user=username
    password=password
    host=localhost
    port=3306
    - /path/to/xtrabackup.cnf 파일에 저장된 설정을 사용하여 MySQL 서버에 연결하여 백업을 처리한다. 
    xtrabackup --backup --defaults-extra-file=/path/to/xtrabackup.cnf --target-dir=/path/to/backup_directory


--defaults-file=[MY.CNF]
  - my.cnf 파일의 경로를 지정하여 해당 파일에 저장된 설정을 참조한다. 

--defaults-group=GROUP-NAME
  - my.cnf 파일에서 읽어야하는 그룹을 설정 
  - --default-group 옵션은 mysqld_multi 배포에서 사용한다.

--defaults-group-suffix=
  - my.cnf 파일에서 그룹 이름에 접미사를 추가하는 방식을 사용한다. 
    - concat(group, suffix)

--dump-innodb-buffer-pool
  - InnoDB 버퍼풀의 상태를 파일로 덤프하는데 사용 (기본 OFF)

--dump-innodb-buffer-pool-timeout
  - InnoDB 버퍼풀 덤프가 완료되었는지 확인하기 위해 innodb_buffer_pool_dump_status 값을 모니터링 해야하는 시간(초) (기본 10초)

--dump-innodb-buffer-pool-pct
  - InnoDB 버프풀을 덤프할때 사용할 버퍼풀의 비율 
  
--encrypt=ENCRYPTION_ALGORITHM
  - xtrabackup 으로 백업시 지정한 알고리즘으로 압축 

--encrypt-key=ENCRYPTION_KEY
  - --encrypt 옵션을 사용할때 지정한 ENCRYPTION_KEY를 사용하도록 설정 

--encrypt-key-file=ENCRYPTION_KEY_FILE
  - --encrypt 옵션을 사용할때 지정한 ENCRYPTION_KEY_FILE 에 저장된 암호화 키를 사용하도록 설정 

--encrypt-threads=
  - 병렬 암호화/복호화에 사용될 스레드수를 지정
  
--encrypt-chunk-size=
  - 암호호 스레드에 대한 작업 버퍼의 크기 지정(바이트 단위)
  - 암호화 사용시 xbcloud/xbstream 청크 크기를 조정하려면 --encrypt-chunk-size, --read-buffer-size 변수를 모두 조정해야한다. 

--export
  - 테이블을 내보내기 위한 파일을 만든다. 

--extra-lsndir=DIRECTORY
  - 백업시에 이 디렉토리에 xtrabackup_checkpoints, xtrabackup_info 파일의 복사본을 저장한다.

--force-non-empty-directories
  - --copy-back, --move-back 옵션 사용시 대상 디렉토리가 비어있지 않을 경우에도 처리한다.
  - xtrabackup 은 백업을 수생할때 타켓 디렉토리가 비어 있는지 확인하고 처리하는데 --force-non-empty-directories 옵션 지정시 디렉토리가 비어 있지 않아도 백업을 수행한다. 

--ftwrl-wait-timeout=SECONDS
  - xtrabackup 이 실행하기전에 FLUSH TABLES WITH READ LOCK을 차단하는 쿼리를 기다려야 하는 시간(초)를 지정한다. 
  - 제한 시간이 만료된 후에도 여전히 그러한 쿼리가 있는 경우 xtrabackup은 오류와 함께 종료된다. 
  - 기본값은 0이며, 이 경우 쿼리가 완료될 때까지 기다리지 않고 즉시 FLUSH TABLES WITH READ LOCK을 시작한다. 
  
--ftwrl-wait-threshold=SECONDS
  - FLUSH TABLES WITH READ LOCK를 차단하는 장기 실행 쿼리를 식별하기 위한 최소 임계값 (기본값 60초)
  - FLUSH TABLES WITH READ LOCK은 이러한 장기 실행 쿼리가 있을 경우 시작되지 않습니다. 
  - --ftwrl-wait-timeout이 0인 경우 이 옵션은 효과가 없습니다.
  - FLUSH TABLES WITH READ LOCK을 실행 하기 전에 –ftwrl-wait-timeout 설정 만큼 기다렸는데도 –-ftwrl-wait-threshold(기본값 60초)에 설정된 시간 보다 더 오래 실행되는 쿼리가 있으면 백업을 취소시켜 lock 대기로 인한 이슈를 최소화 시킨다.

--ftwrl-wait-query-type=all|update
  - 전역 잠금을 실행하기 전에 완료할 수 있는 쿼리 유형을 정의 
    - xtrabackup은 백업중에 데이터가 변경되지 않도록 전역 잠금을 건다. 
      실행 과정에서 명령문을 만나면 명령문이 완료될 때까지 기다렸다가 전역 잠금을 건다.
  - ALL : 전역 잠금을 실행하기 전에 모든 쿼리가 완료될 때까지 대기 (기본값)
  - SELECT : 전역 잠금을 실행하기 전에 SELECT 문이 완료될 때까지 대기
  - UPDATE : 전역 잠금을 실행하기 전에 UPDATE 문이 완료될 때까지 대기 

--galera-info
  - 백업시의 로컬 노드 상태를 포함하는 xtrabackup_galera_info 파일을 생성한다.
  - Percona XtraDB Cluster 백업할때 사용하는 옵션
  - 백업 잠금을 사용하여 백업을 하는 경우 아무런 효과가 없다. 

--generate-new-master-key
 - copy-back 작업을 할때 새 마스터 키를 생성한다.

--history=name
  - PERCONA_SCHEMA.xtrabackup_history 테이블에서 백업 기록을 추적하도록 하는 옵션 

--incremental
  - 증분 백업시 사용하는 옵션 
  - --incremental-lsn, --incremental-basedir 옵션 지정가능 
  - 두 옵션 모두 지정하지 않으면 백업 기본 디렉토리에 백업 

--incremental-basedir=DIRECTORY
  - 증분 백업시 기본 전체 백업이 저장되는 디렉토리 

--incremental-dir=DIRECTORY
  - 중분 백업시에 전체 백업과 증분 백업을 결합하여 새로운 전채 백업을 저장하는 디렉토리 

--incremental-force-scan
  - 증분 백업을 생성할 때 전체 변경된 페이지 비트맵 데이터를 사용할 수 있는 경우에도 백업에 사용할 인스턴스의 데이터 페이지에 대한 전체 스캔을 강제로 수행한다.

--incremental-history-name=name
  - 중분백업의 기반이 되는 PERCONA_SCHEMA.xtrabackup_history 테이블에 저장되는 백업 시리즈의 이름 지정 

--innodb-checksum-algorithm=name
  - InnoDB 가 페이지 체크섬을 계산하는데 사용하는 알고리즘
  - 사용가능한 알고리즘 
    - CRC32, INNODB, NONE, STRICT_CRC32, STRICT_INNODB, STRICT_NONE

--incremental-history-uuid=UUID
- 중분백업의 기반이 되는 PERCONA_SCHEMA.xtrabackup_history 테이블에 저장되는 백업 시리즈에 UUID 를 지정한다.

--incremental-lsn=LSN
  - 증분백업시에 --incremental-basedir을 지정하는 대신 LSN 을 지정 

--innodb-log-arch-dir=DIRECTORY
  - archived log 디렉토리를 지정 
  - --prepare 옵션과 함께 사용함 
  
--innodb-undo-directory=name
  - undo tablespace 의 경로 

--innodb-undo-tablespace=
  - 사용할 undo tablespace 수 
  
--keyring-file-data=FILENAME
  - 키랑 파일의 경로, --xtrabackup-plugin-dir 옵션과 같이 사용 

--kill-long-queries-timeout=
  - xtrabackup이 FLUSH TABLES WITH READ LOCK 을 시작하고 이를 차단하는 실행중인 쿼리를 종료하는 사이에 대기하는 시간(초) 
  - 기본값은 0초로 쿼리 종료를 하지 않는다. 
  - --kill-long-queries-timeout=60 60초동안 실행 중인 쿼리가 있으면 해당 쿼리를 중단하고 백업을 실행한다. 

--kill-long-query-type=select|all
  - FLUSH TABLES WITH READ LOCK을 차단하는 쿼리를 종료할때 대상 쿼리 유형 지정
  - 기본값 : select 

--lock-ddl
  - 백업시 서버에서 모든 DDL 작업을 차단 

--lock-ddl-per-table
  - xtrabackup이 복사를 시작하기 전과 백업이 완료될 때까지 각 테이블에 대한 DDL을 잠근다. 
  
--lock-ddl-timeout
  - 지정한 시간내에 LOCK TABLES FOR BACKUP 이 되지 않을 경우 백업을 중단한다. 

--log-bin[=name]
  - 로그 시퀀스의 기본 이름 

--log-copy-interval=
  - 로그 복사 스레드 확인 사이의 시간 간격을 밀리초 단위로 지정(기본값 1초)
  
--login-path=
  - 로그인 파일에서 이경로를 읽는다. 

--move-back
  - 백업의 모든 파일을 백업디렉토리에서 원래 위치로 이동

--no-backup-locks
  - FLUSH TABLES WITH READ LOCK 대신 백업 잠금을 사용할지 여부를 설정 
  - 백업 잠금은 서버에서 지원해야 옵션이 적용됨 
  - 기본적으로 활성화되어 있어 --no-backup-locks를 사용하여 옵션을 비활성화한다. 

--no-defaults
  - xtrabackup이 MySQL 설정 파일 (예: my.cnf)의 기본값을 사용하지 않도록하는 옵션

--no-lock
  - InnoDB 테이블을 백업하는 동안 잠금을 설정하지 않도록 하는 옵션 
    - 백업중에 다른 트랜잭션이나 쿼리 실행가능 

--no-version-check
  - xtrabakcup --backup 시 자동 버전확인 비활성화

--open-files-limit=
  - 백업 작업 중에 열린 파일의 제한 설정
    - 백업 작업 중에 동시에 열 수 있는 InnoDB 데이터 파일의 수를 제한

--parallel=
  - 병렬 작업에 사용할 스레드 수 (기본값 1)

--password=PASSWORD
  - 데이터베이스에 연결할 때 사용할 비밀번호 

--prepare
  - 백업본으로 복구 수행 

--print-defaults
  - xtrabackup 실행 시 현재 설정값을 표시
  - xtrabackup이 어떤 설정값을 사용하는지 확인하고 디버깅할 때 유용함
 
--print-param
  - 데이터 파일을 원래 위치로 다시 복사하여 복원할 수 있는 매개 변수를 xtrabackup에서 출력한다. 

--read-buffer-size[=#]
  - 읽기 버퍼 크기 설정 (기본값 10MB)
  - 이 옵션으로 xbcloud/xbstream 청크 크기를 기본값인 10MB에서 조정가능 
  - 암호화를 사용할 때 xbcloud/xbstream 청크 크기를 조정하려면 --encrypt-chunk-size 변수와 --read-buffer-size 변수를 모두 조정해야함 

--rebuild-indexes
  - --prepare 시 로그 적용후 InnoDB 테이블에서 보조 인덱스를 재구축

--rebuild-threads=
  - 백업에서 인덱스를 재구성할 스레드 수를 정의. --prepare 및 --rebuild-index와 함께만 사용한다. 

--redo-log-version=
  - 백업의 redo log 파일의 버전 지정, --prepare 와 함께 사용 

--reencrypt-for-server-id=
  - 복제 복제본이나 Galera 노드와 같이 암호화된 백업을 가져온 서버 인스턴스와 다른 server_id로 서버 인스턴스를 시작할 수 있다.
  - xtrabackup이 새 server_id를 기반으로 ID를 가진 새 마스터 키를 생성하여 키링 파일에 저장한 후 테이블스페이스 헤더 내의 테이블스페이스 키를 다시 암호화한다. 

--remove-original
 - 복호화 및 압축 해제 후 .qp, .xbcrypt 및 .qp.xbcrypt 파일 삭제 

--rsync
  - rsync를 사용하여 InnoDB가 아닌 모든 파일을 복사한다. 
  - --stream과 함께 사용할 수 없다. 

--safe-slave-backup
  - FLUSH TABLES WITH READ LOCK 을 실행하기전에 replica SQL thread 를 중지하고 SHOW STATUS 의 Slave_open_temp_tables가 0이 될때까지 백업 시작을 대기한다. 
  - 열려 있는 임시 테이블이 없으면 백업이 수행되고, 열려 있는 임시 테이블이 없을 때까지 SQL 스레드가 시작되고 중지된다. 
  - --safe-slave-backup-timeout 초 후에 Slave_open_temp_tables가 0이 되지 않으면 백업이 실패한다.
  - 백업이 완료되면 replica SQL thread 가 다시 시작된다.
  - 이 옵션은 임시 테이블 복제를 처리하기 위해 구현되었으며 행 기반 복제에서는 필요하지 않다.
  
--safe-slave-backup-timeout=SECONDS
  - Slave_open_temp_tables가 0이 될 때까지 기다려야 하는 시간(초) (기본값 300초)
  
--secure-auth
  - 클라이언트가 이전(4.1.1 이전) 프로토콜을 사용하는 경우 서버에 대한 클라이언트 연결을 거부한다.
  - 기본적 활성화. 비활성화하려면 --skip-secure-auth 를 사용 

--server-id=
  - 백업 중인 서버 인스턴스

--server-public-key-path=name
  - PEM 형식의 public RSA 키 파일 경로

--skip-tables-compatibility-check
  - 엔진 호환성 경고를 비활성화 


--slave-info
  - 복제본 서버를 백업할때 유용한 옵션
  - 소스 서버의 binlog position 을 출력한다. 
  - xtrabackup_slave_info 파일에 CHANGE MASTER 명령으로 binlog position 을 기록한다. 
    - 백업으로 복제 서버를 시작하고 xtrabackup_slave_info 파일에 저장된 binlog position 으로 CHANGE MASTER 명령을 실행하여 이 소스에 대한 새 복제본을 설정할 수 있다. 

--ssl
  - ssl 연결을 활성화 한다. 

--ssl-ca
  - 신뢰할 수 있는 SSL CA 목록이 포함된 파일의 경로 지정 

--ssl-capath
  - PEM 형식의 신뢰할 수 있는 SSL CA 인증서가 포함된 디렉터리 경로지정 

--ssl-cert
  - PEM 형식의 X509 인증서가 포함된 파일의 경로지정 
  
--ssl-cipher
  - 연결 암호화에 사용할 수 있는 암호화 목록

--ssl-crl
  - 인증서 해지 목록이 포함된 파일의 경로

--ssl-crlpath
  - 인증서 해지 목록 파일이 포함된 디렉터리의 경로

--ssl-key
  - PEM 형식의 X509 키가 포함된 파일의 경로
  
--ssl-mode
  - ssl 모드 지정 

--ssl-verify-server-cert
  - 서버에 연결할 때 사용되는 호스트 이름에 대해 서버 인증서 일반 이름 값을 확인
  
--stats
  - xtrabackup이 지정된 데이터 파일을 스캔하고 인덱스 통계를 출력
  
--stream=name
  - 모든 백업 파일을 지정된 형식의 표준 출력으로 스트리밍. 현재 지원되는 형식은 xbstream, tar
  
--tables=name
  - 부분백업시사용 이름이 일치하는 테이블만 백업 

--tables-compatibility-check
  - 엔진 호환성 경고 활성화

--tables-exclude=name
  - 백업에서 제외할 테이블명

--tables-file=name
  - 백업 대상 테이블을 특정 파일에서 읽어올 때 사용, 파일명 지정 

--target-dir=DIRECTORY
  - 백업을 저장할 디렉토리 지정 
  - 디렉터리가 존재하지 않으면 디렉터리를 생성한다.
    - 디렉터리가 존재하고 비어 있으면 백업성공
    - 파일이 있을 경우 운영 체제 오류 17가 발생하고 백업 실패 
  - 백업을 수행하려면 --target-dir 값으로 제공하는 디렉터리에 대한 파일 시스템 수준의 READ, WRITE 및 EXECUTE 권한이 필요하다. 

--throttle=
  - 초당 복사되는 청크 수를 제한합니다. 청크 크기는 10MB
  - 대역폭을 10MB/s로 제한하려면 옵션을 1: --throttle=1로 설정한다. 

--tls-version=name
  - tls 버전 지정 (TLSv1, TLSv1.1, TLSv1.2)

--to-archived-lsn=LSN
  - 로그를 적용할 LSN을 지정, --prepare 옵션과 함께 사용 

--transition-key
  - 옵션 사용시 키링 볼트 서버에 엑세스 하지 않고도 백업 처리 가능
    -  xtrabackup은 지정된 암호문에서 AES 암호화 키를 가져와 백업 중인 테이블 공간의 테이블 공간 키를 암호화하는데 사용한다. 

--user=USERNAME
  - MySQL DB 계정 지정   

--version
  - xtrabackup 버전 출력 

--xtrabackup-plugin-dir=DIRNAME
  - 키링 플러그인이 포함된 디렉터리의 절대 경로

'MySQL' 카테고리의 다른 글

CPU 사용률 높은 Thread (세션) 확인  (0) 2022.10.05
lock session 찾기  (0) 2022.10.01
auto_increment 값 모니터링  (0) 2022.09.28
Query Cache  (0) 2022.09.24
Index Hint  (0) 2022.09.22

+ Recent posts