centos 7에 redis 5 설치 테스트
테스트를 위해 한 머신에 여러대 설치를 위해 컴파일 설치
* Hardware requirements
https://docs.redislabs.com/latest/rs/administering/designing-production/hardware-requirements/
* system tuning
# 메모리 overcommit 사용 설정
> sudo sysctl vm.overcommit_memory=1
> echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
> sudo sysctl -a | grep vm.overcommit_memory
# THP (Transparent Huge Pages) disable
> echo never | sudo tee -a /sys/kernel/mm/transparent_hugepage/enabled
# tcp backlog 설정 (established 상태 소켓을 위한 큐 사이즈)
> sudo sysctl -w net.core.somaxconn=4096
> echo "net.core.somaxconn=4096" | sudo tee -a /etc/sysctl.conf
> sudo sysctl -a | grep net.core.somaxconn
# tcp backlog 설정 (syn_received 상태 소켓을 위한 큐 사이즈)
> sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096
> echo "net.ipv4.tcp_max_syn_backlog=4096" | sudo tee -a /etc/sysctl.conf
> sudo sysctl -a | grep net.ipv4.tcp_max_syn_backlog
# ulimit 설정
# 설정 확인
# ulimit -a
# 임시 설정
> sudo sh -c "ulimit -f unlimited && exec su $LOGNAME" # file size
> sudo sh -c "ulimit -t unlimited && exec su $LOGNAME" # cpu time
> sudo sh -c "ulimit -v unlimited && exec su $LOGNAME" # virtual memory
> sudo sh -c "ulimit -l unlimited && exec su $LOGNAME" # locked-in-memory size
> sudo sh -c "ulimit -n 64000 && exec su $LOGNAME" # open files
> sudo sh -c "ulimit -m unlimited && exec su $LOGNAME" # memory size
> sudo sh -c "ulimit -u 64000 && exec su $LOGNAME" # processes/threads
# 영구 설정
> sudo vi /etc/security/limits.conf
* soft fsize unlimited
* hard fsize unlimited
* soft cpu unlimited
* hard cpu unlimited
* soft as unlimited
* hard as unlimited
* soft memlock unlimited
* hard memlock unlimited
* soft nofile 64000
* hard nofile 64000
* soft rss unlimited
* hard rss unlimited
* soft nproc 64000
* hard nproc 64000
# 참고
https://www.linode.com/docs/databases/redis/install-and-configure-redis-on-centos-7/
http://redisgate.jp/redis/configuration/redis_start.php
* redis 컴파일 바이너리 준비
1. 컴파일에 필요한 패키지 설치
> sudo yum -y install epel-release
> sudo yum -y update
> sudo yum -y groupinstall "Development Tools"
> sudo yum -y install varnish
2. redis 컴파일
# 소스 다운로드
> cd /home/user/redis
> wget http://download.redis.io/releases/redis-5.0.5.tar.gz
> tar xvfz redis-5.0.5.tar.gz
> cd redis-5.0.5
# 의존성 모듈 컴파일
> cd deps
> make hiredis jemalloc linenoise lua
> cd ..
# redis 컴파일 (src 폴더에 바이너리 생성)
> make
3. 바이너리 준비
# 실행파일 디렉토리 생성
> mkdir -p /home/user1/redis/bin
# 실행파일, 설정 파일 복사
> find /home/user1/redis/redis-5.0.5/src -perm /a+x -type f ! -name '*.*' | xargs -i cp {} /home/user1/redis/redis/
## 복사된 파일
redis-benchmark redis-check-rdb redis-sentinel redis-check-aof redis-cli redis-server
> cp /home/user1/redis/redis-5.0.5/*.conf /home/user1/redis/redis/
## 복사된 파일
redis.conf sentinel.conf
# PATH 추가
> vi ~/.bashrc
export PATH=/home/user1/redis/redis:$PATH
참고. 서비스 설치
# /usr/local/bin 에 실행파일 복사
> make install
# 서비스 등록
> cd utils
> sudo ./install_server.sh
* replica replication (master - slave) 구성
- 구성 : master - slave1 -slave2
- 특징 :
slave는 기본 설정(replica-read-only yes) 이므로 master 가 다운된 경우
다른 master를 선출하지 않으므로 데이터를 쓸 수 없다.
- 참고.
- 암호 설정을 원한다면 masterauth와 reququirepass 에 암호 설정
- rdb 저장 경로는 working directory이며 따로 설정 할 수 없음 (이름 변경 가능)
- 설정
1. master.conf
bind 0.0.0.0
port 6000
dbfilename dump_master.rdb
logfile "/home/user1/redis/conf/log_master1.log"
2. slave1.conf (read-only)
bind 0.0.0.0
port 6001
replicaof 127.0.0.1 6000
dbfilename dump_slave1.rdb
logfile "/home/user1/redis/conf/log_slave1.log"
3. slave2.conf (read-only)
bind 0.0.0.0
port 6002
replicaof 127.0.0.1 6000
dbfilename dump_slave2.rdb
logfile "/home/user1/redis/conf/log_slave2.log"
- 실행 (run.sh)
nohup redis-server ./master.conf 1> /dev/null 2>&1 &
nohup redis-server ./slave1.conf 1> /dev/null 2>&1 &
nohup redis-server ./slave2.conf 1> /dev/null 2>&1 &
- 구성 확인
redis-cli 접속 후 info replication 명령
> redis-cli -p 6000
127.0.0.1:6000> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6001,state=online,offset=252,lag=1
slave1:ip=127.0.0.1,port=6002,state=online,offset=252,lag=1
master_replid:47d871226b0ac6fa9e9dacb5e32cf2ee40d5296e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:252
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:252
- 테스트 - 복제
# master - 데이터 입력
[user1@localhost conf]$ redis-cli -p 6000
127.0.0.1:6000> set test-key test-data
OK
# slave1, slave2 - 데이터 확인
[user1@localhost conf]$ redis-cli -p 6001
127.0.0.1:6001> get test-key
"test-data"
127.0.0.1:6001> exit
[user1@localhost conf]$ redis-cli -p 6002
127.0.0.1:6002> get test-key
"test-data"
127.0.0.1:6002> exit
- 종료 (stop.sh)
redis-cli -p 6000 <<EOF
shutdown
EOF
redis-cli -p 6001 <<EOF
shutdown
EOF
redis-cli -p 6002 <<EOF
shutdown
EOF
* sentinel (HA : High Availability) 구성
master 장애시 새로운 master 선출하여 동작할 수 있도록 홀수 개의 sentinel 구성
- 구성
master - slave1 - slave2 (이전 설치 사용)
sentinel1 - sentinel2 - sentinel3
- 참고
sentinel 이 3대인 경우 quorum(정족수)을 2대로 설정하면
master 장애시 sentinal 2대가 장애라 판단해야 fail over가 진행된다.
- 설정
0. 주요 설정
# master ip, port, quorum 설정
sentinel monitor mymaster 127.0.0.1 6000 2
# master 접속을 위한 암호
sentinel auth-pass mymaster 암호
# master 장애 판단 시간
sentinel down-after-milliseconds mymaster 30000
# 해당 시간 내에 fail over 작업이 끝나면 master 승격 작업 진행
sentinel failover-timeout mymaster 180000
# 1인 경우 slave 한대씩 master와 동기화 작업 진행
sentinel parallel-syncs mymaster 1
1. sentinel1.conf
bind 0.0.0.0
port 7001
logfile "/home/user1/redis/conf/log_sentinel1.log"
sentinel monitor mymaster 127.0.0.1 6000 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
2. sentinel2.conf
bind 0.0.0.0
port 7002
logfile "/home/user1/redis/conf/log_sentinel2.log"
sentinel monitor mymaster 127.0.0.1 6000 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
3. sentinel3.conf
bind 0.0.0.0
port 7003
logfile "/home/user1/redis/conf/log_sentinel3.log"
sentinel monitor mymaster 127.0.0.1 6000 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
- 실행
nohup redis-sentinel ./sentinel1.conf 1> /dev/null 2>&1 &
nohup redis-sentinel ./sentinel2.conf 1> /dev/null 2>&1 &
nohup redis-sentinel ./sentinel3.conf 1> /dev/null 2>&1 &
- 테스트
1. master 종료
2. slave1 접속 후 master 변경 확인 (slave1 이 master가 됨)
> redis-cli -p 6001
info replication
3. slave1 종료
4. slave2 접속 후 master 변경 확인 (slave2 이 master가 됨)
> redis-cli -p 6002
info replication
5. slave2 접속 후 데이터 쓰기 확인 (기존 master가 다시 master가 됨)
set test-key hihi
get test_key
6. master, slave1 실행 및 master 정상 여부 확인
- 종료
netstat -tlnp | awk '/:7001 */ {split($NF,a,"/"); print a[1]}' | xargs kill -9
netstat -tlnp | awk '/:7002 */ {split($NF,a,"/"); print a[1]}' | xargs kill -9
netstat -tlnp | awk '/:7003 */ {split($NF,a,"/"); print a[1]}' | xargs kill -9
* 테스트 시 참고 사항
1. slave가 master 가 되는 과정을 확인하기 위해 내리는 과정에서 설정 파일(conf)이 redis 에 의해 설정이 변경됨. (slaveof나 master 주소가 변경됨)
2. master 1개, slave 1개, sentinel 1개, quorum 1 설정시
master 다운시 slave는 master로 승격되지 않음.
sentinel 3개 quorum2 설정시 승격됨.
* 참고. redis 메모리로만 사용하기 (파일 쓰기 미사용)
redis.conf 에서 아래 사항 주석처리
(http://redisgate.kr/redis/configuration/param_save.php)
save 900 1
save 300 10
save 60 10000
'DB' 카테고리의 다른 글
[filebeat] 설치 및 로그 설정 (1) | 2019.10.01 |
---|---|
mysql 5.7 설치 (0) | 2019.09.27 |
[redis] 명령어 (0) | 2019.08.02 |
[redis] cluster(shard) 방법 - redis 5 on centos 7 (0) | 2019.07.29 |
[mongodb] shard cluster 구성 (0) | 2019.07.18 |
[mongodb] replica set(cluster) PSS 구성 (0) | 2019.07.17 |
[mongodb] replica set(cluster) PSA 구성 (0) | 2019.07.17 |
[mysql] insert loop 더미 데이터 넣기 (0) | 2019.01.25 |