redis 사용시 주의점과 부가 기술

레디스 사용시 주의점과 부가기술

RDB기능

  • 레디스에서 디스크에 메모리 상태를 그대로 받아 저장(메모리스냅숏)하는 기능
  • 레디스 서버 장애요인 99.9%를 차지. 설정으로 끌 수 있음.
  • RDB 작업이 실패하면 ‘쓰기 거부’ 상태가 돼 추가 장애를 낼 수 있다.
  • 아마존 웹서비스 서버 기준 60GB짜리 메모리 서버 테스트시 RDB 작업에 10분 정도가 걸린다. 싱글쓰레드 문제를 겪지 않기 위해 ‘Fork()’라는 분기 기능을 쓸 수 있지만 이 경우 메모리를 2배로 사용, 용량부족에 따른 오류와 원인을 알수 없는 장애를 낼 수 있음.

AOF기능

  • AOF는 레디스 프로토콜로 통신한 내용들을 명령어, 키, 이름 등 형식 그대로 저장한다
  • AOF도 RDB와 같이 주의해야 함.

레디스 마스터 & 슬레이브 관리

  • 슬레이브는 마스터의 데이터 저장을 보조한다.
  • 마스터가 죽었다가 되살아날 때 자신의 정보를 모두 없애고 그 데이터를 그대로 베낀다.
  • 아무 데이터가 없는 마스터를 시스템에 연결하면 슬레이브에 남은 데이터를 마스터에 되살릴 수 없음.
  • 복구할 데이터를 가진 시스템에 ‘슬레이브오브노원’이라는 명령어로 그걸 마스터로 승격시켜야 함.
  • 메모리가 부족한 상태에서 슬레이브가 붙는다면 장애가 발생할 수 있음. 슬레이브가 마스터에 연결할 때, 설정과 상관없이 sync를 위한 RDB 생성하고 이것을 seed로 전송한 후 뒤의 차이를 sync함. write가 많은 서버라면 memory overflow발생.

레디스 인스턴스 갯수

  • Core 수나 메모리에 따라서 적절히 Redis 인스턴스를 여러 개 띄워주는 것 고려
  • N개의 인스턴스를 실행한다면 (Memory-(운영체제필요메모리))/(N+1) 정도의 규칙으로 적절히 나누어 주어 분산시도
  • 하나의 서버에서 하나의 인스턴스만 실행하면, 16G 메모리라면, 최악을 대비해서 7G 정도만 사용해야 하지만 여러 개의 인스턴스를 실행한다면 4G*3개 정도의 인스턴스를 운영고려

레디스센티넬

  • 마스터가 죽었다고 판단시 다른 슬레이브를 마스터로 승격하고 사용자측에 마스터가 바뀌었다는 알림을 보내는 도구
  • 살았는지 판단하는 단계(네트워크 단절, 주관적 다운, 객관적 다운)를 거쳐 페일오버를 수행
  • 완성도는?

레디스 부하분산

  • 트위터에서 만든 티웸프록시, 페이스북 메신저 시스템에 적용된 샤딩 시스템.

티웸프록시

  • 클라이언트에서 데이터가 들어오면 해싱값을 만들어 여러대의 레디스 서버에 나누어 줌.
  • 서버당 1개의 커넥션을 만들기 때문에 속도가 빠르고 보안상 안전하며 부하를 줄임.
  • 레디스센티넬과 묶어 고가용성(HA) 구성도 가능
  • 키 세트가 여러 서버로 분산돼 레디스 서버 전체 데이터를 다루던 명령어 효과가 반감되는 단점도 있다.

셀 아키텍처

  • 페이스북 메신저에 적용
  • 전체 인프라가 각각 독립된 하드웨어(HW)로 구성되는 셀로 나뉘는 것으로 장애를 분산시킬 수 있다.
  • 샤딩은 여러 데이터센터에 서비스를 나눠 운영하는 것이라 재해 발생에 따른 서비스 장애 범위를 줄일 수 있는 역할.
  • 셀 아키텍처의 단점으로 “독립적인 장비 인프라를 셀마다 풀세트로 갖춰야 하기 때문에 서비스 구성에 따른 비용 부담

참고:
- [http://www.zdnet.co.kr/news/news_view.asp?artice_id=20131119174125]
- [https://charsyam.wordpress.com/2013/11/17/%EC%9E%85-%EA%B0%9C%EB%B0%9C-%ED%95%9C-%EC%84%9C%EB%B2%84%EC%97%90-%ED%95%98%EB%82%98%EC%9D%98-redis%EB%A5%BC-%EB%9D%84%EC%9A%B0%EC%8B%9C%EB%82%98%EC%9A%94-%EC%95%84%EB%8B%88%EB%A9%B4-%EC%97%AC/]

build redis with msvc

redis windows 버젼 다운로드

(redis for window)[https://github.com/MSOpenTech/redis]

  • redis 2.8 압축풀면
  • redis2.8\msvc\RedisServer.sln에서 64bit/release를 선택한다.
  • x64디렉토리에 .exe파일들 생성

redis client lib

  • redis for windows 프로젝트에 포함되어 있는 hiredis 사용
  • redis-cplusplus-client 사용
    • (Redis cplusplus client Win32 port)[http://sourceforge.net/projects/rediscplusplusc/]
    • 테스트를 위해 boost 설정
  • 참고: http://stpetrus27.wordpress.com/2014/05/20/vc-redis-client-2

build mongodb 3.0 c++ driver with msvc

참고: [https://github.com/mongodb/mongo-cxx-driver/wiki/Download-and-Compile-the-Legacy-Driver#scons-options-when-compiling-the-c-driver]

mongodb 실행

  • mongodb를 먼저 실행시킨다. c:\data\db디렉토리를 기본으로 만들어서 실행한다.
  • C:\Program Files\MongoDB\Server\3.0\bin\mongod를 실행.

scons mongo db options

  • scons는 32bit버젼에만 설치가 가능하다. 아직까지 python자체는 32bit를 설치하는 것이 더 낫다.
  • boost 경로지정 : %joy_extlib%에 boost lib을 설치했다.
  • /MD 옵션 : --dynamic-windows
  • 아키텍쳐선택: --msvc-host-arch, x86 or x86_64

  • build디렉토리 이하에 있음.
  • 실행환경: msvc 2013
  • mongodb c++ driver git최신버젼

build boost for windows

빌드환경

  • boost 1_57
  • msvc 2013
  • mingw 491

윈도우 환경에서는 bootstrap.bat를 실행한다. 기본 컴파일러를 찾아서 b2를 빌드하고 복사해 줄 것이다. b2를 가지고 필요한 라이브러리 빌드를 할 수 있다.

테스트 빌드 환경을 위해서 아래 처럼 환경을 선택했다.
clean하고 다시 빌드 방식 선택

boost library 종류 선택

  • link 종류 : boost 라이브러리가 dll인가 static인가를 선택
  • runtime link : c++라이브러리가 dll인가 static인가 선택, 이쪽은 dll(/MD)를 선호 )
  • address-model : 32bit인가 64bit인가

msvc

  • c++전용: static link(boost static), shared_dll을 사용(/MD)
  • 다른언어와 함께사용 : shared link(boost dll), shared dll(/MD)
  • address-model : 32/64

mingw

  • c++전용: static link(boost static)
  • address-model : 32/64

  • mingw-w64 모델중 x86_64가 64bit 컴파일러를 제공한다. i686은 win32임.

pure virtual function call exception handling

Pure virtual functions 예외발생

의도하지 않게 pure virtual function을 호출하는 경우가 발생, exception handler를 설치해보아야 콜스택도 안남긴다.
msvc의 pure call함수는 핸들러를 호출 후 abort()를 친절하게 불러준다. 죽지않는 서버를 만들고자하는 사람에게는 절망을;;;
pure functaion을 사용하는 심각한 경우가 아니라면 로그정도 남기고 무시할 수 있으면 얼마나 좋을까?

[http://http://wiki.osdev.org/C++]에 훌륭한 솔류션이 나와 있어 소개한다. 함수는 어딘가에 선언되어 있으면 기존 pure call핸들러를 무시할 수 있다.

  • 테스트환경 : msvc 2010
  • 결과: 원하는대로 프로그램은 동작하고 종료는 안됨.

빠르고 가벼운 c++ format 라이브러리 : cppformat

cppformat

boost::format의 믿지못할 정도의 느린 성능에 fastformat을 사용하고 있으나 narrow char와 wide char의 둘중의 하나 지원, stlsoft의 의존성등으로 울며 겨자먹기식으로 사용하고 있는 상황,

매우 감동적인 라이브러리 cppformat 발견, 일단 속도는 홈페이지상에서 보았을 때 fastformat과 별반차이 없을듯, 사용상 편의점은 cppformat이 우수한듯. 무엇보다 감동적인것은 소스가 파일 두개! format.[h,cc]

사용해보기

  • msvc사용시 경고가 몇개 발생하는데 pragma warning위치가 소스 중간에 있는 것을 맨 위로 올려주고 추가 발생하는 경고를 더해주도록 하자.
  • 테스트환경 : msvc 2010, gtest, cppformat 1.0
  • 포맷오류시 exception을 발생시키는데 극복할 수 있는 매크로 define을 추가해놓았으니 참고하면 좋겠다.

사용소감

  • 한마디로 우수하다. 유연성도 뛰어남.
  • 포맷파라메터보다 인자가 많은 경우 무시하는데 이부분은 오류를 내주었으면 하는 바램이 있다.

using apache thrift like google protobuf

버퍼를 이용한 시리얼화

protobuf 처럼 serialize에 집중해서 apache thrift를 사용해보고 싶지만, 좋은 예제를 찾기가 어렵다.
테스트한 버젼: thrift-0.9.2

인터넷 자료의 경우 비교적 오래된 자료가 검색이 되어 변경되거나 개선된 점이 부각이 안되는 듯하다.
사용할 때는 라이브러리 버젼을 표시하는 것이 좋겠다.

thrift 메시지(구조체)와 상수 정의
- enum 숫자 자동으로 붙여주는 것은 좋은 기능인 듯.
- 전반적인 정의 언어는 thrift가 더 좋게 느껴진다.

thrift 정의

C++ 코드생성

thrift.exe -I src -r --gen cpp -out src guild.thrift
src디렉토리 안에 guild.thrift파일이 있다고 가정한다.

  • 생성하는 파일은 파일이름_constants.[h,cpp]파일이름_types.[h,cpp]이다.
  • include시에는 파일이름_constants.h만 하면 됨.

thrift를 메모리 버퍼에 할당/복원

  • 중간에 transport의 개념을 넣어 소켓/파일등 I/O를 담당하도록 할 수 있다.
  • 소스 pragmamsvc전용임.

  • 경고가 protobuf 보다는 적게 발생
  • msvc기반으로 빌드, gtest로 테스트
  • protobuf의 장점이 있고 thrift의 장점이 있다.
  • thrift site의 예제로 나와 있는 것은 소켓통신만 나와 있어서 전체적인 구조 파악이 어렵다.
  • 사용 샘플이 적은 것은 thrift 도입에 어려움 중 하나 일듯.

숫자형의 기본은 stdint (c++11 이후)를 사용하도록 하자.

숫자의 길이가 중요한 네트워크나 임베드에서 길이와 부호를 구분할 수 있는 <cstdint>를 사용하도록 하자.

[http://en.cppreference.com/w/cpp/types/integer]

ssl인증서 설치로 https 웹페이지 운영

openssl 키 만들기

openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr

namecheap을 통해 ssl인증서 구매하기

  • 9$결제 (1년단위)
  • 결제 후 ssl activate
  • server.csr파일의 내용 복사해서 넣어주기 (---안쪽에 암호화 되어있는 내용을 복사)

메일로 받은 .zip파일 아파치에 반영

서버타입을 아파치로 골라서 그런지 합쳐져있는 파일을 메일로 첨부해서 보내주었음.
압축 파일안에는 server.crt, server.ca-bundle 파일이 포함되어 있음.

sites-enabled/default-ssl.conf

https://www.namecheap.com/support/knowledgebase/article.aspx/9423/0/apache-opensslmodssl

아파치 재시작

service apache2 restart