리눅스
[draft] 우분투 24.04에서 Redis Cluster를 구성하는 방법
변군Dev
2025. 8. 31. 21:34
728x90
우분투 24.04에서 Redis Cluster를 구성하는 방법
구성 환경
서버 이름 | 아이피 주소 | 구분 | 비고 |
node1 | 192.168.10.101 | redis-server | Redis Port 6381, 6382, 6383 |
node2 | 192.168.10.102 | redis-server | Redis Port 6381, 6382, 6383 |
1. 필요 패키지 설치
sudo apt update
sudo apt install -y curl gnupg lsb-release
2. 커널/시스템 튜닝
Swap 비활성화
- Redis는 메모리 기반 DB라 swap이 발생하면 지연이 심해집니다.
sudo swapoff -a
Overcommit Memory
- Redis는 fork()로 RDB/AOF 스냅샷을 뜨는데, Linux 기본 overcommit_memory=0이면 fork 실패 가능성이 있습니다.
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Transparent Huge Pages (THP) 비활성화
- THP는 큰 페이지 메모리 할당 시 성능에 도움을 주지만, Redis에서는 성능 저하/지연을 유발합니다.
cat /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo "echo never > /sys/kernel/mm/transparent_hugepage/enabled" | sudo tee -a /etc/rc.local
sudo chmod +x /etc/rc.local
파일 디스크립터 제한
cat <<EOF | sudo tee -a /etc/security/limits.conf
* soft nproc unlimited
* hard nproc unlimited
* soft nofile 65536
* hard nofile 65536
EOF
TCP 커널 파라미터
- 네트워크 튜닝으로 동시 연결 안정성 강화
cat <<EOF | sudo tee -a /etc/sysctl.conf
# Redis kernel tuning
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=15
EOF
sudo sysctl -p
3-1. Redis Server 설치
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install -y redis-server
redis-server --version
Redis server v=8.2.1 sha=00000000:1 malloc=jemalloc-5.3.0 bits=64 build=a29002d62758b90f
sudo systemctl disable --now redis-server
3-2. Redis Server 설정
설정 디렉토리
sudo cp /etc/redis/redis.conf /etc/redis/redis-6381.conf
sudo cp /etc/redis/redis.conf /etc/redis/redis-6382.conf
sudo cp /etc/redis/redis.conf /etc/redis/redis-6383.conf
6381 포트 설정
sudo sed -i -e 's@^port .*@port 6381@' /etc/redis/redis-6381.conf
sudo sed -i -e 's@^dbfilename .*@dbfilename dump-6381.rdb@' /etc/redis/redis-6381.conf
sudo sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-6381.log@' /etc/redis/redis-6381.conf
sudo sed -i -e 's@^pidfile .*@pidfile /run/redis-6381/redis-server.pid@' /etc/redis/redis-6381.conf
6382 포트 설정
sudo sed -i -e 's@^port .*@port 6382@' /etc/redis/redis-6382.conf
sudo sed -i -e 's@^dbfilename .*@dbfilename dump-6382.rdb@' /etc/redis/redis-6382.conf
sudo sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-6382.log@' /etc/redis/redis-6382.conf
sudo sed -i -e 's@^pidfile .*@pidfile /run/redis-6382/redis-server.pid@' /etc/redis/redis-6382.conf
6383 포트 설정
sudo sed -i -e 's@^port .*@port 6383@' /etc/redis/redis-6383.conf
sudo sed -i -e 's@^dbfilename .*@dbfilename dump-6383.rdb@' /etc/redis/redis-6383.conf
sudo sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-6383.log@' /etc/redis/redis-6383.conf
sudo sed -i -e 's@^pidfile .*@pidfile /run/redis-6383/redis-server.pid@' /etc/redis/redis-6383.conf
3-3. Redis Server 서비스 등록(systemd)
템플릿 서비스 파일 생성
더보기
---
cat /usr/lib/systemd/system/redis-server@.service
# Templated service file for redis-server(1)
#
# Each instance of redis-server requires its own configuration file:
#
# $ cp /etc/redis/redis.conf /etc/redis/redis-myname.conf
# $ chown redis:redis /etc/redis/redis-myname.conf
#
# Ensure each instance is using their own database:
#
# $ sed -i -e 's@^dbfilename .*@dbfilename dump-myname.rdb@' /etc/redis/redis-myname.conf
#
# We then listen exlusively on UNIX sockets to avoid TCP port collisions:
#
# $ sed -i -e 's@^port .*@port 0@' /etc/redis/redis-myname.conf
# $ sed -i -e 's@^\(# \)\{0,1\}unixsocket .*@unixsocket /run/redis-myname/redis-server.sock@' /etc/redis/redis-myname.conf
#
# ... and ensure we are logging, etc. in a unique location:
#
# $ sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-myname.log@' /etc/redis/redis-myname.conf
# $ sed -i -e 's@^pidfile .*@pidfile /run/redis-myname/redis-server.pid@' /etc/redis/redis-myname.conf
#
# We can then start the service as follows, validating we are using our own
# configuration:
#
# $ systemctl start redis-server@myname.service
# $ redis-cli -s /run/redis-myname/redis-server.sock info | grep config_file
#
# -- Chris Lamb <lamby@debian.org> Mon, 09 Oct 2017 22:17:24 +0100
[Unit]
Description=Advanced key-value store (%I)
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)
[Service]
Type=notify
ExecStart=/usr/bin/redis-server /etc/redis/redis-%i.conf
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis-%i
RuntimeDirectoryMode=2755
UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/run/redis-%i
NoNewPrivileges=true
CapabilityBoundingSet=CAP_SYS_RESOURCE
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true
# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis
[Install]
WantedBy=multi-user.target
---
서비스 등록 및 실행
Redis Server 서비스 시작
sudo systemctl daemon-reload
인스턴스 실행
sudo systemctl status redis-server@6381.service
sudo systemctl status redis-server@6382.service
sudo systemctl status redis-server@6383.service
인스턴스 상태 확인
sudo systemctl status redis-server@6381.service
sudo systemctl status redis-server@6382.service
sudo systemctl status redis-server@6383.service
redis-cli -p 6381 info | grep config_file
redis-cli -p 6382 info | grep config_file
redis-cli -p 6383 info | grep config_file
sudo -u redis /usr/bin/redis-server /etc/redis/redis-6381.conf --loglevel debug
redis-cli -s /run/redis/6381/redis-server.sock info | grep config_file
sudo netstat -tulnp | grep -E '6381|6382|16381|16382'
728x90
4-1. Redis Cluster 생성
더보기
---
redis-cli 설치
sudo apt install -y redis-tools
---
클러스터 생성
export REDISCLI_AUTH=user_redis_password
redis-cli -p 6381 ping
redis-cli --cluster create \
192.168.50.101:6381 \
192.168.50.101:6382 \
192.168.50.101:6381 \
192.168.50.102:6382 \
192.168.50.102:6381 \
192.168.50.102:6382 \
--cluster-replicas 1
- --cluster-replicas 1 : 각 마스터당 1개의 슬레이브를 배치
- 명령 실행 시 확인 메시지에 yes 입력
4-2. 클러스터 상태 확인
redis-cli -c -p 6381 cluster nodes
Redis 서버 패키지 삭제
sudo apt purge -y redis-server redis-tools
5. 클러스터 상태 확인
클러스터 상태 확인
redis-cli --cluster check 192.168.0.231:6379
노드 정보 확인
redis-cli -h 192.168.0.231 -p 6379 cluster nodes
클러스터 정보 확인
redis-cli -h 192.168.0.231 -p 6379 cluster info
6. 테스트
클러스터 모드 동작 확인
redis-cli -c -h 192.168.0.232 -p 6381 set mykey1 "Hello, Redis Cluster!"
redis-cli -c -h 192.168.0.234 -p 6382 get mykey1
VIP 연결 확인
redis-cli -h 192.168.0.231 -p 6379 set mykey2 "Hello, Redis VIP!"
redis-cli -h 192.168.0.231 -p 6379 set mykey2
참고URL
- 변군이글루 : 우분투 24.04에 최신 버전의 Redis 서버를 설치하는 방법
- 변군이글루 : 우분투 24.04에서 rc.local을 활성화하는 방법
- 변군이글루 : 우분투에서 스왑 메모리를 비활성화하는 방법
728x90