2014년 6월 16일 월요일

Memcached 복제 (3)

KMC 설치


KMC (Kakao Mem Cached)를 빌드하기 위해서는 MySQL 5.6 빌드시에 필요한 기본 라이브러리는 모두 설치가 되어 있어야 한다. 대표적으로 libaio-devel과 ncurses-devel 그리고 cmake 등은 설치되어 있지 않은 경우가 많으니 꼭 확인해보도록 하자. (물론 빌드하면서 에러가 출력되면 그때 그때 하나씩 설치해도 무방하다.)

그리고 KMC에서 꼭 필요한 아래 Memcached client 관련 라이브러리도 다운로드해서 설치하도록 하자.

  • libmemcached-1.0.4-1.el5.remi.x86_64.rpm
  • libmemcached-devel-1.0.4-1.el5.remi.x86_64.rpm


패키지의 이름은 무관하나 버전은 가능하면 크게 벗어나지 않도록 하자.

이제 KMC를 빌드하면 되는데, cmake를 실행할때에는 아래와 같이 몇가지 옵션들이 추가로 필요하다.

# cd mysql-5.6.14_kmc
# mkdir Release
# cd Release
# cmake .. \
'-DBUILD_CONFIG=mysql_release' \
'-DCMAKE_INSTALL_PREFIX=/usr/local/mysql' \
'-DWITH_INNODB_MEMCACHED=ON' \
'-DENABLED_LOCAL_INFILE=OFF' \
'-DHAVE_QUERY_CACHE=OFF' \
'-DOPTIMIZER_TRACE=OFF' \
'-DENABLE_DEBUG_SYNC=OFF' \
'-DENABLED_PROFILING=OFF' \
'-DWITH_ARCHIVE_STORAGE_ENGINE=OFF' \
'-DWITH_EMBEDDED_SERVER=OFF' \
'-DCOMPILATION_COMMENT=kmc' \
'-DENABLE_DTRACE=OFF'

물론 위의 모든 옵션이 꼭 필요한 것은 아니지만, 성능이나 Memcached plugin의 바이너리 로깅 기능 등을 위해서 필요하므로 혹시 변경이 필요한 경우에는 신중히 고려해서 적용하도록 하자.

cmake가 끝나면, make && make install 명령으로 KMC를 설치하면 된다. MySQL 프로그램이 설치되는 디렉토리는 INSTALL_PREFIX로 명시했던 /usr/local/mysql로 설치될 것이다.

프로그램의 설치가 완료되면, 일반적인 MySQL 서버 설치와 동일하게 $MYSQL_HOME/scripts/mysql_install_db 스크립트를 이용해서 MySQL 기본 딕셔너리 테이블들을 생성후, MySQL 서버를 시작하면 된다.

Memcached 관련 스키마 생성

MySQL 서버가 정상적으로 시작되었다면,
우선 Memcached 플러그인을 작동시키기 위해서 필요한 기본 스키마들을 생성하도록 하자. MySQL Memcached 플러그인이 작동하기 위해서 필요한 초기 스키마들은 아래 파일이 미리 준비되어 있으므로, source 명령으로 실행해주기만 하면 된다.

mysql> source $MYSQL_HOME/share/innodb_memcached_config.sql
mysql> use innodb_memcache
mysql> show tables

아래와 같은 InnoDB 테이블들이 정상적으로 준비되었는지 확인해보자.


  • cache_policies
  • config_options
  • containers

테이블이 준비되었다면, 이제 KMC를 위한 스키마들을 생성하도록 하자.

mysql> USE innodb_memcache;
mysql> INSERT INTO `containers` VALUES ('default','kmc','kmc_template','k','v','f','c','e','PRIMARY');

mysql> CREATE DATABASE kmc;
mysql> USE kmc;

mysql> DROP TABLE IF EXISTS `kmc_template`;
mysql> CREATE TABLE `kmc_template` (
  `k` varchar(255) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
  `v` mediumblob,
  `f` int(11) NOT NULL DEFAULT '0',
  `c` bigint(20) unsigned NOT NULL DEFAULT '0',
  `e` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 STATS_PERSISTENT=0;

mysql> INSERT INTO `kmc_template` VALUES ('1','DO-NOT-REMOVE',0,0,0);

KMC를 위한 my.cnf 설정

이제 마지막으로 Memcached를 위한 설정들을 my.cnf 파일에 적용하고 Memcached 서비스가 가능토록 MySQL 서버를 기동해보도록 하자. (MySQL 서버가 기동중이라면 셧다운하도록 하자.)

...
innodb_data_file_path = ibdata1:64M:autoextend
...
innodb_log_file_size = 32M
innodb_log_files_in_group = 2
innodb_log_buffer_size = 16M

## Memcached -----------------------------------------------------------------------------
daemon_memcached_option = '-m 20480 -p 11211 -c 80000 -t 8 -s /tmp/memcached.sock'
innodb_api_enable_binlog = 1
innodb_api_trx_level=0 ## READ-UNCOMMITTED
innodb_api_bk_commit_interval=1
daemon_memcached_r_batch_size=1
daemon_memcached_w_batch_size=1
innodb_api_enable_mdl=OFF

## Replication:Binary log
server-id  = 1
## Replication query is always idempotent
slave_exec_mode = IDEMPOTENT
## Memcached connection string :: with socket file
kmc_connect_string = '--SOCKET="/tmp/memcached.sock" --BINARY-PROTOCOL --NOREPLY --TCP-NODELAY --TCP-KEEPALIVE'
binlog-checksum = NONE
sync_binlog = 0
master_info_repository = FILE
relay_log_info_repository = FILE
sync_master_info    = 0
sync_relay_log      = 0
sync_relay_log_info = 0
slave_checkpoint_group = 100000
slave_checkpoint_period = 1000
max_binlog_size = 100M
expire_logs_days=1
expire_max_log_files = 15
binlog-format = ROW

대 부분 기본적으로 설정되어 있는 옵션들도 있지만, 안정성과 성능을 위해서 설정되어 있는 것이므로, 큰 문제가 없다면 최소한 이 정도의 옵션은 my.cnf에 포함시키도록 하자.

daemon_memcached_option 옵션은 Memcached 쓰레드가 기동되면서 사용하는 옵션이므로 신중히 설정하도록 하자. 그리고 kmc_connect_string는 MySQL Slave의 SQL Thread가 바이너리 로그를 읽어서 Replay시에 접속하는 Memcached 서버의 정보이므로, 로컬 Memcached 서버의 접속 정보를 설정하면 된다. 또한 InnoDB는 거의 데이터 저장소로 사용되지 않으므로, innodb의 데이터 파일과 리두 로그의 크기는 최소화해서 설정해주는 것이 좋다.

이제 MySQL 서버를 기동하고, Memcached의 기능을 테스트해보자.
물론, KMC의 복제를 연결하는 방법과 복제 상태를 확인하는 방법은 기존 MySQL 서버와 동일하다.

KMC 테스트

MySQL 서버가 기동되면, 아래와 같이 간단히 Memcached의 기능을 테스트를 수행해볼 수 있다.

[root@matt001 ~]# telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

set matt 0 0 9
Seong Uck
STORED

get matt
VALUE matt 0 9
Seong Uck
END

delete matt
DELETED

get matt
END

quit
Connection closed by foreign host.

만약 Memcached로 접속하는 socket file (/tmp/memcached.sock)이 정상적으로 작동하는지 확인하고자 한다면 아래와 같이 netcat 유틸리티를 이용하면 된다.

[root@matt001 ~]# nc -U /tmp/memcached.sock
set matt 0 0 9
SEONG UCK
STORED

get matt
VALUE matt 0 9
SEONG UCK
END

quit
[root@matt001 ~]#

물론 복제된 데이터를 확인하고자 한다면, 마스터에서 SET을 실행하고 슬레이브 Memcached로 접속해서 GET으로 데이터를 확인해보면 된다. 또한 바이너리 로그를 mysqlbinlog 유틸리티로 열어서 내용을 확인해보는 것이 좋은 방법일 것이다.



댓글 없음:

댓글 쓰기