centos 7에 redis 5 설치 테스트

테스트를 위해 한 머신에 여러대 설치를 위해 컴파일 설치


conf.tar.gz





* 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://blog.naver.com/PostView.nhn?blogId=theswice&logNo=221413242954&parentCategoryNo=&categoryNo=15&viewDate=&isShowPopularPosts=true&from=search

http://redisgate.jp/redis/configuration/redis_start.php

https://knight76.tistory.com/entry/redis-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%84%A4%EC%A0%95-%EA%B4%80%EB%A0%A8-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EC%BD%94%EB%93%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%98%A4%EB%B2%84%EC%BB%A4%EB%B0%8B-THP






* 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