6.5 Memcached 플러그인
- PK 를 통한 검색 과 같은 단순한 쿼리의 반복 수행은 분석/최적화 부하가 상대적으로 큼
- MariaDB 5.5 의 HandlerSocket 인터페이스 제공
- MySQL 5.6 InnoDB 의 Memcached API 제공 (윈도우 미제공)
6.5.1 아키텍처
- 모든 테이블 접근은 모든 스토리지 엔진을 위한 "핸들러 API" 계층 경유 (최적X)
- Memcached 플러그인은 직접 InnoDB 스토리지 엔진 호출 (최적, MySQL 서버 프로세스 내 별도 스레드 형태)
Memcached 플러그인 기능 과 특성
- MySQL 서버 프로세스 내 스레드로 작동 하므로 InnoDB 스토리지 엔진 접근 빠름
- InnoDB API 직접 사용으로 빠름 (쿼리 분석/최적화, 핸들러 API 우회)
- Memchached 텍스트/바이너리 프로토콜 지원, Memcapable 의 55개 호환성 테스트 통과
- InnoDB 테이블의 멀티 컬럼을 구분자 활용하여 Memcached 의 Value 로 매핑 가능
- Memcached 의 캐시 메모리와 InnoDB 버퍼 풀 메모리 조합 사용 가능
- Memcached 옵션 지정 가능 : daemon_memcached_option 시스템 변수
- Memcached 플러그 인으로 유입되는 요청의 격리 수준 설정 가능 (innodb_api_trx_level )
6.5.2 설치 및 테스트
- libevent 1.4.3 이상 필요
- 컴파일 시 "-DWITH_INNODB_MEMCACHED=ON" 옵션 필요
- my.cnf
구분 | 설정 |
---|
TCP/IP 포트 | daemon_memcached_option = '-m 64 -p 11211 -c 200 -t 6' |
Unix 소켓 파일 | daemon_memcached_option = '-m 64 -c 200 -t 6 -s /tmp/memcached.sock' |
옵션
옵션 | 설명 | 비고 |
---|
-m | 로컬 캐시 메모리 크기(단위: MB) | MySQL 쿼리 캐시, InnoDB 버퍼 풀 무관 |
-p | Listen Port | |
-s | 유닉스 도메인 소켓 파일 | 클라이언트가 로컬에 있을 때, 설정 시 -p 옵션 무시 |
-c | 최대 연결 수 | |
-t | 사용자 요청 처리용 스레드 수 | 200개 커넥션의 요청을 6개 스레드가 처리 |
-v, -vv, -vvv | 에러/에러+경고/에러+경고+진단 로그 출력 | MySQL 서버 에러 로그 사용 |
Memcached 플러그인 활성화
-- 메타 테이블 생성
mysql> SOURCE $[MYSQL_HOME]/share/innodb_memcached_config.sql
-- 플러그인 활성화
mysql> INSTALL PLUGIN daemon_memcached SONAME "libmemcached.so";
Memcached 플러그인 메타 테이블
메타 테이블 | 설명 | 비고 |
---|
cache_policies | SET/GET/DELETE/FLUSH 에 대한 캐시 정책 설정 |
config_options | 레코드가 Memcached 프로토콜로 전송될 수 있도록 설정 | separator : 각 컬럼의 구분자 지정, table_map_delimiter : 키 명시 |
containers | Memcached 플러그인이 INSERT/SELECT 할 테이블의 정보 관리 |
프로토콜
프로토콜 | 설명 | 비고 |
---|
텍스트 | 텍스트 기반, 단순함, 처음 부터 사용 | Endian 고려 불필요 |
바이너리 | CPU, 네트워크 대역폭 적게 사용 | |
테스트
-- TCP/IP Port 접속
$ telnet localhost 11211
-- 데이터 입력 : key, flag, expire_time, byte_count, value
set matt 0 3600 12
Real MariaDB
-- 데이터 조회 : key
get matt
-- 데이터 삭제 : key
delete matt
-- 종료
quit
-- 유닉스 도메인 소켓 파일 접속
$ nc -U /tmp/memcached.sock
SET 명령 인자
인자 | 설명 | 비고 |
---|
key | 아이템의 키 | 최대 250 Byte |
flag | 응용프로그램에서 활용 가능한 4바이트 정수 타입 필드 | |
expire_time | 캐시 메모리에 유지할 시간 (초단위) | 259200 보다 작으면 상대 시간, 크면 unixtimestamp 로 인식 |
byte_count | 아이템의 값(value)의 전체 바이트 | 최대 1MB |
value | 아이템의 값 | |
6.5.3 캐시 정책
- Memcached 플러그인 자체 캐시 메모리 정책 (테이블 단위 설정 가능)
정책 | 설명 | 비고 |
---|
innodb_only | Memcached 플러그인 자체 캐시 무시 | SET 된 데이터는 즉시 InnoDB 에 영구 저장 |
cache_only | Memcached 플러그인 캐시만 사용, InnoDB 의 데이터와 무관하게 동작 | MySQL 서버 재기동 시 데이터 초기화 |
caching | InnoDB 엔진, Memcached 플러그인 협업 동작 | 먼저 Memcached 캐시 메모리 액세스 후 필요시 InnoDB 엔진 액세스 |
disabled | Memcached 플러그인 안씀 |
6.5.4 사용자 테이블 등록
- 초기화 스크립트(innodb_memcached_config.sql)는 test 데이터베이스 내 test_demo 테이블 생성 후 Memcached 플러그인에 등록.
Memcached 플러그인 적용 테이블, 키 컬럼 제약 사항
- 키 값에 공백/줄바꿈 포함 불가
- 키 타입은 정수, 문자열 만 가능
- 키 컬럼은 PRIMARY KEY, UNIQUE KEY 생성 필수
- 파티션 테이블 적용 불가
데모
create database my_service;
use my_service;
create table mc_store (
c_key varchar(250) collate Latin1_bin not null,
c_value mediumblob,
c_flag int not null default '0'
c_cas bigint unsigned not null default '0',
c_expire int not null default '0',
PRIMARY KEY (c_key)
) ENGINE = InnoDB STATS_PERSISTENT = 0;
use innodb_memcache;
insert into containers (name, db_schema, db_table, key_columns, value_columns, flags, cas_column, expire_time_column, unique_idx_name_on_key)
values ('default', 'my_service', 'mc_store', 'c_key', 'c_value', 'c_flag', 'c_ca', 'c_expire', 'PRIMARY');
-- containers.name = 'default'
- Memcached 는 테이블 개념 없으나, MySQL 테이블과 매핑 수단 제공
- @@product.A01 : product 테이블의 키가 'A01' 인 아이템
- @@order.A01 : order 테이블의 키가 'A01' 인 아이템
- A01 : default(유일한) 테이블의 키가 'A01' 인 아이템
6.5.5 관련 시스템 변수
변수
변수 | 설명 | 비고 |
---|
daemon_memcached_option | Memcached 플러그인 기동 옵션 | |
innodb_api_trx_level | Memcached 플러그인 커넥션 격리 수준 설정 | 0:READ_UNCOMMITED, 1:READ_COMMITED, 2:REPEATABLE_READ, 3:SERIALIZABLE |
daemon_memcached_{r,w}_batch_size | COMMIT 실행에 필요한 GET/SET 실행 수 | 기본값:1, 중요하지 않은 데이터라면 값을 늘려서 성능 개선 가능 |
innodb_api_bk_commit_interval | Memcached 플러그인 관련 커넥션 일괄 커밋 Interval | 기본값:5초 |
innodb_api_enable_binlog | Memcached 플러그인을 통한 변경 내용 바이너리 로그 기록 여부 |