Redis replica 설치
. 요즘 캐시로 메모리 디비를 많이 사용 하다 보니 이것저것 알아보다 Redis를 설치하기로 했다.
간단하게 Redis replica 설치에 대한 기록을 남긴다.
우선 설치에 필요한 package를 설치 해 준다.
$ sudo yum install gcc gcc-c++ wget -y

Redis를 다운로드 받는다 최신버전은 아래 사이트에서 받을수 있다.
다운로드 주소 : https://redis.io/download
Redis
*Download Stable releases liberally follow the usual major.minor.patch semantic versioning schema. *Other versions Old (6.0) Redis 6.0 introduces SSL, the new RESP3 protocol, ACLs, client side caching, diskless replicas, I/O threads, faster RDB loading, ne
redis.io
. Download (2021.07.11 일 기준 ver 6.2)
$ wget http://download.redis.io/redis-stable.tar.gz
or
$ curl -O -L wget http://download.redis.io/redis-stable.tar.gz
설치전에 서비스 구성에 필요한 디렉토리들을 생성해준다. (필요에 따라 디렉토리를 구성해 주면됨)
디렉토리구조
redis/
├── bin --> redis 운영에 필요한 command link 파일 위치
├── conf --> redis 운영에 필요한 config 파일
├── dump --> db파일 위치
├── logs --> redis 로그 파일
├── tmp --> 임시파일 공간
└── var
└── run --> pid 파일
mkdir -p /home/dragonfog/server/redis/dump
mkdir -p /home/dragonfog/server/redis/logs
mkdir -p /home/dragonfog/server/redis/var
mkdir -p /home/dragonfog/server/redis/var/run
mkdir -p /home/dragonfog/server/redis/bin
mkdir -p /home/dragonfog/server/redis/conf
mkdir -p /home/dragonfog/server/redis/tmp
다운로드 받은 파일을 압축 해제 후 적당한 위치로 mv 한다. 그리고 make로 컴파일 진행
$ tar xvfz redis-stable.tar.gz
$ mv redis-stable /home/dragonfog/server/redis/redis-server
$ cd /home/dragonfog/server/redis/redis-server
$ make
정상적으로 컴파일이 완료되면 아래와 같은 메세지를 볼수 있습니다.
"Hint: It's a good idea to run 'make test' ;)

컴파일이 정상적으로 진행되셨으면 해당 위치의 ./src 이하에 redis 관련 binary 파일들이 생성됩니다.
이제 컴파일하여 생성된 파일들에 대하여 아까 생성해둥 디렉토리에 link 파일을 생성해줍니다.
#링크 생성
$ cd /home/dragonfog/server/redis/bin/
$ ln -sf /home/dragonfog/server/redis/redis-server/src/redis-cli redis-cli
$ ln -sf /home/dragonfog/server/redis/redis-server/src/redis-server redis-server
$ ln -sf /home/dragonfog/server/redis/redis-server/src/redis-trib.rb redis-trib.rb
$ ln -sf /home/dragonfog/server/redis/redis-server/src/redis-benchmark redis-benchmark
$ ln -sf /home/dragonfog/server/redis/redis-server/src/redis-sentinel redis-sentinel

이제 운영을 위하여 OS parameter를 권장 설정에 맞추어 수정해줍니다.
# vi /etc/rc.local (추가)
## Redis Setting
echo never > /sys/kernel/mm/transparent_hugepage/enabled
# vi /etc/security/limits.conf --> 아래추가
dragonfog soft nofile 65536
dragonfog hard nofile 65536
dragonfog soft nproc 131072
dragonfog hard nproc 131072
vi /etc/sysctl.conf --> 아래추가
#redis
vm.overcommit_memory = 1
net.core.somaxconn = 65535
위 내용 적용후 reboot (# sysctl -p 명령어를 실행해줘도 됨)
바로적용 하고자 하면 아래와 같이 실행
# sysctl vm.overcommit_memory=1
Redis Config 설정
Master 172.30.1.11 7001
Slave 172.30.1.11 7002
Sentinel 172.30.1.11 27001
우선 아래 컨피그를 아래 위치에 생성해준다.
$ cd ~/server/redis/conf
$ vi redis_7001.conf
$ vi redis_7002.conf
$ vi sentinel_27001.conf
컨피그는 하단 내용 참고 해서 입력해준다.
.bash_profile의 아래 부분에 path(/home/dragonfog/server/redis/bin)를 추가 해준다.
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/dragonfog/server/redis/bin
path 추가후 설정을 적용해 준다.
$ source .bash_profile
여기까지 완료되었으면 각 Redis (Master/slave), Sentinel을 기동한다.
기동은 아래와 같이 진행하면됩니다.
.Redis기동
redis-server ./{설정파일}
$ redis-server ~/server/redis/conf/redis_7001.conf
$ redis-server ~/server/redis/conf/redis_7002.conf
Sentinel기동
$ redis-sentinel ~/server/redis/conf/sentinel_27001.conf
Redis 접속후 체크
$ redis-cli -p 7001 (Master) - role:master / slave : 172.30.1.11:7002
127.0.0.1:7001> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.30.1.11,port=7002,state=online,offset=5987,lag=1
master_failover_state:no-failover
master_replid:0ad1e369fe3ed56107a505eab561322ec12919b2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:6126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:6126
redis-cli -p 7002 (SLAVE) - role:slave / master : 172.30.1.11:7001
127.0.0.1:7002> info replication
# Replication
role:slave
master_host:172.30.1.11
master_port:7001
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:14648
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:0ad1e369fe3ed56107a505eab561322ec12919b2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14648
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14648
Sentinel
$ redis-cli -p 27001
127.0.0.1:27001> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=redis_7001,status=ok,address=172.30.1.11:7001,slaves=1,sentinels=1
failover TEST (Master 를 죽였을때 Slave로 넘어가는지 본다.)
$ redis-cli -p 7001 shutdown (master shutdown)
$ redis-cli -p 7002 info replication
:role이 master로 변경된것을 볼수 있다.
redis-cli -p 7002 info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:c09a90760f216211064584e93f9675d0ae363c1e
master_replid2:0ad1e369fe3ed56107a505eab561322ec12919b2
master_repl_offset:29657
second_repl_offset:27550
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:29657
$ redis-server ~/server/redis/conf/redis_7001.conf
:7001 redis를 기동하고 보면 아래와 같이 기존 마스터인 7001 redis가 slave로 붙어 있는것을 볼수 있다.
redis-cli -p 7002 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=172.30.1.11,port=7001,state=online,offset=33725,lag=0
master_failover_state:no-failover
master_replid:c09a90760f216211064584e93f9675d0ae363c1e
master_replid2:0ad1e369fe3ed56107a505eab561322ec12919b2
master_repl_offset:33864
second_repl_offset:27550
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:33864
1. Master (7001 포트)
protected-mode no
port 7001
tcp-backlog 511
timeout 0
tcp-keepalive 0
daemonize yes
supervised no
pidfile "/home/dragonfog/server/redis/var/run/redis_7001.pid"
loglevel notice
logfile "/home/dragonfog/server/redis/logs/redis_7001.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump_7001.rdb"
dir "/home/dragonfog/server/redis/dump"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly_7001.aof"
appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
maxmemory 1gb
Slave 설정 (7002 포트)
protected-mode no
port 7002
tcp-backlog 511
timeout 0
tcp-keepalive 0
daemonize yes
supervised no
pidfile "/home/dragonfog/server/redis/var/run/redis_7002.pid"
loglevel notice
logfile "/home/dragonfog/server/redis/logs/redis_7002.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump_7002.rdb"
dir "/home/dragonfog/server/redis/dump"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly_7002.aof"
appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
maxmemory 1gb
slaveof 172.30.1.11 7001
Sentinel (27001포트)
port 27001
dir "/home/dragonfog/server/redis/tmp"
daemonize yes
logfile "/home/dragonfog/server/redis/logs/sentinel_27001.log"
pidfile "/home/dragonfog/server/redis/var/run/sentinel_27001.pid"
sentinel monitor redis_7001 172.30.1.11 7001 1
sentinel down-after-milliseconds redis_7001 3000
sentinel parallel-syncs redis_7001 1
sentinel failover-timeout redis_7001 10000
systemd script 설정
vi /usr/lib/systemd/system/redis_7001.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=dragonfog
Group=dragonfog
Type=forking
ExecStart=/home/dragonfog/server/redis/bin/redis-server /home/dragonfog/server/redis/conf/redis_7001.conf
ExecStop=/home/dragonfog/server/redis/bin/redis-cli -p 7001 shutdown
[Install]
WantedBy=multi-user.target
vi /usr/lib/systemd/system/redis_7002.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=dragonfog
Group=dragonfog
Type=forking
ExecStart=/home/dragonfog/server/redis/bin/redis-server /home/dragonfog/server/redis/conf/redis_7002.conf
ExecStop=/home/dragonfog/server/redis/bin/redis-cli -p 7002 shutdown
[Install]
WantedBy=multi-user.target
vi /usr/lib/systemd/system/sentinel_27001.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=dragonfog
Group=dragonfog
Type=forking
ExecStart=/home/dragonfog/server/redis/bin/redis-sentinel /home/dragonfog/server/redis/conf/sentinel_27001.conf
ExecStop=/home/dragonfog/server/redis/bin/redis-cli -p 27001 shutdown
[Install]
WantedBy=multi-user.target
운영으로 사용하실 경우에는 Redis Persistence 옵션을 disabled 하고 사용해주세요
'DB > MemoryDB' 카테고리의 다른 글
| REDIS KEY 체크 하기 (0) | 2023.05.11 |
|---|---|
| REDIS TTL 없는키 확인 하기 (0) | 2023.05.11 |
| redis 보안 [rename-command] (0) | 2023.01.13 |
| Redis 백업 스크립트 (0) | 2022.03.04 |
| Memcached 설치 하기 (0) | 2021.07.09 |