ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Redis] 레디스 클러스터 구성 #cluster
    database/redis 2021. 2. 13. 00:09

     

    레디스 cluster


     redis.io의 cluster tutorial 과 아빠프로그래머 님의 포스팅을 참고하여 작성하였습니다.

     초보 개발자 입장에서 막혔던 점이나 의문점을 같이 적었습니다.

     

     레디스 

    cluster 기능에 대해 알아보고 직접 구성해 보겠습니다.

     



    환경구성


    • VMware Fusion - Player Version 12.1.0
    • CentOS 8.3
    • Redis 5.0.4

     

     

     

    Cluster 왜 사용하는가?


    Redis cluster을 통해 얻을 수 있는 이점은 다음과 같습니다.

      샤딩(Sharding)

    여러 노드 간에 데이터 세트를 자동으로 분할할 수 있는 기능

    샤딩은 "조각내다"라는 뜻으로 데이터베이스 저장기법 중 하나이다. 데이터를 파티셔닝하는 기술을 말한다.


      가용성

    노드의 하위 집합에서 장애가 발생하거나 클러스터의 나머지 부분과 통신할 수 없을 때 작업을 계속할 수 있는  기능입니다.

    즉, 실제적인 측면에서 일부 노드가 실패하거나 통신할 수 없을 때도 정상적으로 작동합니다. 그러나 더 큰 고장이 발생할 경우(예: 대부분의 마스터를 사용할 수 없는 경우) 클러스터 작동이 중지됩니다.

     

     

    (우아한테크세미나를 보다가 cluster 말고 다른 사용방법이 있었다. 센티널은 뭐지)

     

     

     

     

    클러스터 구성도


     3개 서버의 가상환경을 구축하고 아래와 같이 구조로 클러스터를 구성하겠습니다.

     

     

     서버 1에 문제가 생겨서 더 이상 통신이 되지 않는다면 자동으로 replica 노드 중 하나가 master가 되어 작업을 계속 할 수 있습니다. 서버 2에 연결된 replica가 서버1의 master가 되었다고 하겠습니다. 그런데 서버 2도 고장이 났습니다. 그래서 서버 2 에 있던 master 노드 2개가 서버 3으로 이동을 하게 됩니다. 서버 3이 3개의 master 노드가 되어 작업을 계속 할 수 있습니다.

     

    (서버 3도 고장나면 완전 고장)

     

     

     

     

    3개의 가상머신 설치


     레디스 설치 및 환경 구성하는 법을 모르시면 레디스 설치방법레디스 서버 인스턴스 생성하기 글을 참고해주세요.

     

    3개의 가상머신에 redis 인스턴스 3개씩 생성

     필자는 VMware에 3개의 가상머신을 설치하여 서버 1, 서버2, 서버 3을 구성했습니다.

     그리고 redis가 제공하는 utils를 이용해 3개의 서버에 포트번호 6300, 6301, 6302 의 레디스 인스턴스를 생성했습니다.

     

     

     

    가상머신 네트워크 어답터 변경


    각각의 가상머신과 통신하기 위해 설정을 변경합니다. 몽키스패너(?) 모양의 아이콘을 클릭하세요

     

    Settings > Network Adapter > Bridged Networking의 Autodetect 로 설정해줍니다.

    Bridge 는 각각의 가상머신이 공유기(혹은 이더넷)로부터 각각의 IP를 할당 받게됩니다. 쉽게 말하면 가상머신이지만 실제 서버컴퓨터 3개를 공유기에 연결하는 것과 동일하게 연결됩니다..

     

    이제 가상머신으로 돌아가 ifconfig 명령어를 통해 네트워크 연결을 확인합니다.

     

    $ ifconfig

    3개의 가상머신을 모두 동일하게 변경합니다.

     

     

     

    클러스터 설정 활성화 


    레디스 서버 인스턴스의 기본 설정은 cluster 를 구성하지 않도록 되어있습니다. 모든 서버의 레디스 인스턴스의 config 파일을 수정합니다.

    $ cd /etc/redis		//디렉토리 이동
    $ vim 6300.conf		//config 파일 수정

    4개의 설정을 수정합니다.

     

    1. appendonly yes

     >> AOF ( Append Only File ) 방식으로 명령이 파일에 기록되도록 합니다.

    주석처리 되어있습니다. 주석을 해제해주세요.

     

    2. cluster-enabeld yes

    >> 클러스터 사용여부

     

    3. cluster-config-file nodes.conf

    >> 클러스터 구성 내용을 저장하는 파일명입니다. cluster nodes 명령 실행 결과와 변경 정보가 들어갑니다.  레디스 서버 시작시 또는 클러스터 구성 내용 변경 시 실시간으로 업데이트됩니다.

     

    4.cluster-node-timeout 15000

    >> 클러스터 노드가 다운되었는지를 판단하는 시간입니다.  단위는 밀리초(ms)입니다. 3 ~ 5초 사이를 권장

     

    5. bind IP 수정하기

    >> 해당 레디스 서버 인스턴스에 접근을 허용할 자신의 IP를 나열합니다.

    (외부에서 접근 가능한 IP가 아닙니다.)

    다른 노드들도 동일하게 config 파일을 수정합니다.

     

     

     

    방화벽 해제


    가상 서버가 서로 통신하기 위해서는 방화벽에 접속 가능하도록 해야합니다. 두 가지 방법이 있습니다.

     

    1. 전체 방화벽 해제

    방화벽을 꺼버리는 것입니다. 추천하지는 않습니다.

    # systemctl stop firewalld.service 	//방화벽 정지
    # systemctl start firewalld.service	//방화벽 시작

     

    2. 특정IP를 특정 port에 접속 가능하도록 허용

     

    /etc/firewalld/zones/ 경로의 public.xml 에서 설정할 수 있습니다.

    # cd /etc/firewalld/zones/	//디렉터리 이동
    # gedit public.xml

     

    <rule family="ipv4">
      <source addres="[ip 주소]"/>
      <port port="[port 번호]" protocol="tcp"/>
      <accept/>
    </rule>

     

     

    마스터 클러스터 구성


     

    redis github

    레디스의 클러스터 명령어는 ruby로 작성되어 있습니다. 필요한 라이브러리를 다운로드 합니다.

    $ sudo yum install ruby ruby-devel rubygems rpm-build -y
    $ gem install redis

     

    redis-cli 명령어를 사용해 마스터 클러스터를 구성합니다.

    $ redis-cli --cluster create 10.2x.3xx.4x:6300 11.2x.3x.4xx:6300 12.2x.3xx.4x:6300 

     

     

     

     

    replica 노드 추가


    구성한 마스터 클러스터에 replica 노드를 추가하도록 하겠습니다.

    $ redis-cli --cluster add-node <replica ip:port> <마스터ip:port> --cluster-slave
    
    #예시
    $ redis-cli --cluster add-node 1xx.0.0.1:6301 2xx.0.0.1:6300 --cluster-slave
    $ redis-cli --cluster add-node 1xx.0.0.2:6301 2xx.0.0.1:6300 --cluster-slave
    $ redis-cli --cluster add-node 1xx.0.0.3:6301 2xx.0.0.1:6300 --cluster-slave

     

    모든 replica 노드를 적절하게 연결해줍니다. 이제 마스터 노드중 아무곳에 접속하여 클러스터가 정상적으로 이루어졌는지 확인합니다.

     

    $ redis-cli -c -h <ip adress> -p <port>
    
    $ cluster info
    $ cluster nodes

     

     

    이제 정상적으로 작동하는지 set/get 명령어를 통해 확인합니다.

     

     

     

     

     

    ※ (error) Moved 866  이슈

    redis에서 클러스터 명령을 내릴 때 -c 옵션이 없으면 수행하지 않습니다.

    # 클러스터 명령 실행할 수 없음
    $ redis-cli -h <ip adress> -p <port>
    
    # 클러스터 명령 실행을 위해 -c 옵션 필요함
    $ redis-cli -c -h <ip adress> -p <port>

     

     

     

    Post


    • 연관 포스트1
    • 연관 포스트2
    • 연관 포스트3

    References


     

     


    잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)

     

    댓글