[과제] Redis 자동 설치 스크립트 작성하기

hwwwa·2023년 2월 7일
0
post-custom-banner

Redis 자동 설치 스크립트 작성

  • 앞선 redis 설치 과제의 절차대로 자동으로 Redis를 설치할 수 있는 쉘 스크립트 작성
  • redis-cli 입력시 자동으로 접속할 수 있는 alias 추가
sh install_redis 7.0.8
  1. Redis 설치 버전: 7.0.8
    2. 설치 버전을 변수로 받기
  • 참고) NHN Cloud에서 인스턴스 생성 시 사용자 스크립트 기능을 사용하여 작성한 스크립트 테스트 가능
    • https://docs.nhncloud.com/ko/Compute/Instance/ko/console-guide/#\_11
    • 인스턴스 생성 후 실행할 스크립트를 지정 가능
    • 인스턴스의 첫 번째 부팅이 완료된 후 네트워크 설정 등 초기화 과정이 끝나고 난 뒤에 스크립트가 실행됨
    • 공식 이미지에 내장된 cloud-init (Linux)과 같은 자동화 도구에 의해서 실행됨
    • root 사용자 권한으로 실행됨
    • 사용자 스크립트의 첫 번째 줄은 반드시 #!으로 시작해야 함
    • 스크립트에서 표준 출력/에러 장치로 출력한 로그는 /var/log/cloud-init-output.log에서 확인 가능

개발 환경

  • NHN Cloud
  • CentOS 7.9
  • MySQL 8.0.32
  • Redis 7.0.8

Redis 자동 설치 스크립트

  • bash 지정 및 필요한 라이브러리 설치
#!/usr/bin/env bash


# 압축파일 다운로드를 위해 wget 설치
sudo yum -y install wget

# redis dependency library 설치
# - 컴파일 관련 파이브러리 설치
sudo yum -y install gcc make gcc-c++ clang
# - python3 설치
sudo yum -y install python3
# - jemalloc 설치
sudo yum -y install epel-release
sudo yum -y install varnish
  • 버전 입력 여부 확인
# command line argument의 수가 1이 아닌 경우 종료
if [ $# -ne 1 ]
then
    echo "Usage: sh $0 version"
    exit 1
fi
  • 압축파일 다운로드 및 오류 확인
    • 잘못 입력한 경우 wget 실행 시 오류가 발생하므로 오류 여부 체크
# command line argument로 입력받은 다운로드할 mysql의 버전
version=$1

# 다운로드할 redis 파일 이름
filename=redis-$version

# 압축파일을 다운로드 할 경로 지정
cd /home/centos

# 지정한 버전의 redis 압축 파일 다운로드하고 로그 저장
wget -a wget-log https://download.redis.io/releases/$filename.tar.gz

# 다운로드가 정상적으로 수행되었는지 확인
error=`tail -3 wget-log | grep ERROR`
rm wget-log

# 오류 발생 시 오류 메세지를 출력하고 종료
if [ -n "${error}" ]; then
    echo "${error}"
    exit 1
fi
  • redis 설치
# 압축 풀기
tar xvf $filename.tar.gz

# 압축 파일 제거
rm $filename.tar.gz

# redis 디렉토리 내부로 이동
cd $filename

# redis/deps 디렉토리 내부의 의존성 파일을 컴파일
cd deps
make *
cd ..

# redis 컴파일
make
  • config 설정
    • 설정 없이 redis를 구동하였을 때 WARNNING이 출력되었던 내용도 WARNNING이 발생하지 않도록 함께 설정하였음
# redis 서버를 background로 실행하도록 설정
sed -i 's/daemonize no/daemonize yes/g' redis.conf

# redis 서버 메세지를 로그 파일로 저장하기
sed -i 's/logfile ""/logfile '$filename'/redis.log/g' redis.conf

# maxclients 설정값 변경
sed -i '/# maxclients 10000/a\maxclients 4064' redis.conf

# tcp backlog 설정값 변경
sudo sed -i '$anet.core.somaxconn = 4096' /etc/sysctl.conf
sudo sysctl net.core.somaxconn=4096

# memory overcommit 설정 변경
sudo sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf
sudo sysctl vm.overcommit_memory=1

# PATH 설정
sudo sed -i '$aPATH="$PATH:/home/centos/'$filename'/src"' /etc/profile
source /etc/profile
  • redis 실행
# redis server 실행
$filename/src/redis-server $filename/redis.conf

# redis client 실행
$filename/src/redis-cli

결과

  • 인스턴스에서 직접 스크립트를 실행한 경우

    ...

  • NHN Cloud 사용자 스크립트를 사용한 경우


피드백 및 추가구현 고려사항 정리

  • 충돌 방지를 위해 설치 전에 이전에 설치된 DB를 지운 후에 설치하도록 수정하면 좋을 것 같다.
  • 실수로 이미 설치되어 운영중인 인스턴스에 또 설치해버리면 이전의 DB에 장애 발생
    • 이미 설치되어있는 경우 정말 재설치할건지 다시 한번 확인해주는 로직을 추가하면 좋다.
  • 설치 시에 해당 인스턴스의 OS 정보 등을 확인하여 분기 처리를 통해 다르게 설치 작업을 수행하도록 구현하면 좋을 것 같다.
  • 파라미터를 입력하지 않는다면 최신 버전을 설치하도록하는 기능을 추가하는 것도 좋을 것 같다.
  • wget에서 spider 옵션을 사용하면 다운로드를 시도하지 않고 링크가 잘못되었는지 확인 가능하다.
post-custom-banner

0개의 댓글