

# MySQL memcached 지원
<a name="Appendix.MySQL.Options.memcached"></a>

Amazon RDS는 MySQL 5.6에서 도입된 InnoDB 테이블에 대한 `memcached` 인터페이스 사용을 지원합니다. `memcached` API가 있으면 애플리케이션에서 NoSQL 키-값 데이터 스토어와 비슷한 방식으로 InnoDB 테이블을 사용할 수 있습니다.

**참고**  
MySQL 8.4에서는 더 이상 memcached 인터페이스를 사용할 수 없습니다. DB 인스턴스를 MySQL 8.4로 업그레이드할 때는 기존 옵션 그룹에서 `memcached`를 비활성화해야 합니다.

`memcached` 인터페이스는 간단한 키 기반 캐시입니다. 애플리케이션은 이 `memcached`를 사용하여 키-값 데이터 쌍을 삽입하거나, 조작하거나, 캐시에서 가져옵니다. MySQL 5.6은 데몬 서비스를 이용한 플러그인이 추가되면서 `memcached` 프로토콜을 통해 InnoDB 테이블의 데이터를 노출시킵니다. MySQL `memcached` 플러그인에 대한 자세한 내용은 [InnoDB와 memcached의 통합](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached.html)을 참조하세요.

**RDS for MySQL DB 인스턴스에 memcached 지원을 활성화하는 방법**

1. 먼저 `memcached` 인터페이스에 대한 액세스를 제어하는 데 사용할 보안 그룹을 결정합니다. 기존에 SQL 인터페이스를 사용하는 애플리케이션과 앞으로 `memcached` 인터페이스에 액세스할 애플리케이션이 동일한 경우에는 기존에 SQL 인터페이스에서 사용하는 VPC 또는 DB 보안 그룹을 그대로 사용할 수 있습니다. 하지만 `memcached` 인터페이스에 액세스하는 애플리케이션이 다를 경우에는 새로운 VPC 또는 DB 보안 그룹을 정의해야 합니다. 보안 그룹 관리에 대한 자세한 내용은 [보안 그룹을 통한 액세스 제어](Overview.RDSSecurityGroups.md) 단원을 참조하세요.

1. 사용자 정의 DB 옵션 그룹을 생성한 후 엔진 유형 및 버전으로 MySQL을 선택합니다. 옵션 그룹의 생성에 대한 자세한 내용은 [옵션 그룹 생성](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.Create)을(를) 참조하세요.

1. [`MEMCACHED`] 옵션을 옵션 그룹에 추가합니다. `memcached` 인터페이스가 사용할 포트를 비롯해 인터페이스에 대한 액세스 제어에 사용할 보안 그룹을 지정합니다. 옵션 추가에 대한 자세한 내용은 [옵션 그룹에 옵션 추가](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.AddOption) 섹션을 참조하세요.

1. 필요하다면 옵션 설정을 변경하여 `memcached` 파라미터를 구성합니다. 옵션 설정을 변경하는 방법에 대한 자세한 내용은 [옵션 설정 수정](USER_WorkingWithOptionGroups.md#USER_WorkingWithOptionGroups.ModifyOption)을(를) 참조하십시오.

1. 옵션 그룹을 인스턴스에 적용합니다. Amazon RDS는 옵션 그룹이 적용될 때 해당 인스턴스에 대한 `memcached` 지원을 활성화합니다.
   + 인스턴스 실행 시 사용자 정의 옵션 그룹을 지정하여 새로운 인스턴스에 대한 `memcached` 지원을 활성화합니다. MySQL 인스턴스 실행에 대한 자세한 내용은 [Amazon RDS DB 인스턴스 생성](USER_CreateDBInstance.md) 단원을 참조하십시오.
   + 인스턴스 설정 변경 시 사용자 정의 옵션 그룹을 지정하여 기존 인스턴스에 대한 `memcached` 지원을 활성화합니다. DB 인스턴스 변경에 대한 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 단원을 참조하십시오.

1. MySQL 테이블에서 `memcached` 인터페이스를 통해 액세스할 수 있는 열을 지정합니다. `memcached` 플러그인은 `containers`라는 이름의 전용 데이터베이스에 `innodb_memcache`라는 이름의 카탈로그 테이블을 생성합니다. 행을 `containers` 테이블에 삽입하여 `memcached`를 통해 액세스할 수 있도록 InnoDB 테이블을 매핑합니다. InnoDB 테이블에서 `memcached` 키 값을 저장하는 데 사용할 열 하나와, 이 키와 연동된 데이터 값을 저장하는 데 사용할 하나 이상의 열을 지정합니다. 또한 `memcached` 애플리케이션이 해당 열 세트를 참조하는 데 사용할 이름도 지정합니다. 행을 `containers` 테이블에 삽입하는 방법에 대한 자세한 내용은 [InnoDB memcached 플러그인의 내부 요소](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached-internals.html)를 참조하십시오. InnoDB 테이블을 매핑하고 `memcached`를 통해 액세스하는 예제는 [InnoDB memcached 플러그인에 대한 애플리케이션 작성](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached-developing.html)을 참조하세요.

1. `memcached` 인터페이스에 액세스하는 애플리케이션이 SQL 인터페이스를 사용하는 애플리케이션과 다른 컴퓨터 또는 EC2 인스턴스에 연결되어 있는 경우에는 이 컴퓨터에 대한 연결 정보를 MySQL 인스턴스와 연동되어 있는 VPC 보안 그룹에 추가합니다. 보안 그룹 관리에 대한 자세한 내용은 [보안 그룹을 통한 액세스 제어](Overview.RDSSecurityGroups.md) 단원을 참조하세요.

인스턴스에 대한 `memcached` 지원을 비활성화하려면 인스턴스를 변경하여 MySQL 버전의 기본 옵션 그룹을 지정합니다. DB 인스턴스 변경에 대한 자세한 내용은 [Amazon RDS DB 인스턴스 수정](Overview.DBInstance.Modifying.md) 단원을 참조하십시오.

## MySQL memcached 보안 고려 사항
<a name="w2aac47c83c15c13"></a>

`memcached` 프로토콜은 사용자 인증을 지원하지 않습니다. MySQL `memcached` 보안 고려 사항에 대한 자세한 내용은 MySQL 설명서의 [InnoDB memcached 플러그인의 보안 고려 사항](https://dev.mysql.com/doc/refman/8.0/en/innodb-memcached-security.html)을 참조하세요.

다음은 `memcached` 인터페이스의 보안을 강화하는 데 효과적인 작업입니다.
+ `MEMCACHED` 옵션을 옵션 그룹에 추가할 때 기본 11211이 아닌 다른 포트를 지정합니다.
+ 기존에 신뢰할 수 있는 클라이언트 주소 및 EC2 인스턴스에 대한 액세스를 제한하는 VPC 보안 그룹과 `memcached` 인터페이스가 연동되어 있는지 확인합니다. 보안 그룹 관리에 대한 자세한 내용은 [보안 그룹을 통한 액세스 제어](Overview.RDSSecurityGroups.md) 섹션을 참조하세요.

## MySQL memcached 연결 정보
<a name="w2aac47c83c15c15"></a>

`memcached` 인터페이스에 연결하려면 애플리케이션이 Amazon RDS 인스턴스의 DNS 이름과 `memcached` 포트 번호를 모두 지정해야 합니다. 예를 들어 인스턴스의 DNS 이름이 `my-cache-instance.cg034hpkmmjt.region.rds.amazonaws.com`이고, memcached 인스턴스가 포트 11212를 사용한다면 PHP에 지정되는 연결 정보는 다음과 같습니다.

 

```
1. <?php
2. 
3. $cache = new Memcache;
4. $cache->connect('my-cache-instance.cg034hpkmmjt.region.rds.amazonaws.com',11212);
5. ?>
```

**MySQL DB 인스턴스의 DNS 이름과 memcached 포트를 찾으려면**

1. AWS Management Console에 로그인한 후 [https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)에서 Amazon RDS 콘솔을 엽니다.

1. AWS Management Console 우측 상단 모서리에서 DB 인스턴스가 속한 리전을 선택합니다.

1. 탐색 창에서 **데이터베이스**를 선택합니다.

1. 세부 정보를 표시하고자 하는 MySQL DB 인스턴스 이름을 선택합니다.

1. [**Connect**] 섹션에 있는 [**Endpoint**] 필드의 값을 기록해둡니다. DNS 이름은 엔드포인트와 같습니다. 또한 [**Connect**] 섹션에 있는 포트는 `memcached` 인터페이스에 액세스하는 데 사용되지 않습니다.

1. **세부 정보** 섹션의 **옵션 그룹** 필드에 나열된 이름을 기록해둡니다.

1. 탐색 창에서 **옵션 그룹**을 선택합니다.

1. MySQL DB 인스턴스가 사용하는 옵션 그룹의 이름을 선택하여 옵션 그룹 세부 정보를 표시합니다. [**Options**] 섹션에 있는 [**MEMCACHED**] 옵션의 [**Port**] 설정 값을 기록해둡니다.

## MySQL memcached 옵션 설정
<a name="w2aac47c83c15c17"></a>

Amazon RDS는 MySQL `memcached` 파라미터를 Amazon RDS `MEMCACHED` 옵션의 옵션 설정으로 노출시킵니다.

### MySQL memcached 파라미터
<a name="w2aac47c83c15c17b4"></a>
+  `DAEMON_MEMCACHED_R_BATCH_SIZE` – 커밋으로 새로운 트랜잭션을 시작하기 전에 실행해야 할 `memcached` 읽기 연산(get) 수를 지정하는 정수입니다. 허용 값은 1\$14294967295이고, 기본값은 1입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `DAEMON_MEMCACHED_W_BATCH_SIZE` – 커밋으로 새로운 트랜잭션을 시작하기 전에 실행해야 할 `memcached` 쓰기 연산(add, set, incr 등) 수를 지정하는 정수입니다. 허용 값은 1\$14294967295이고, 기본값은 1입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `INNODB_API_BK_COMMIT_INTERVAL` – InnoDB `memcached` 인터페이스를 사용하는 자동 커밋 모드의 유휴 연결(idle connection) 횟수를 지정하는 정수입니다. 허용 값은 1\$11073741824이고, 기본값은 5입니다. 인스턴스를 다시 시작할 필요 없이 옵션이 바로 적용됩니다.
+  `INNODB_API_DISABLE_ROWLOCK` – InnoDB `memcached` 인터페이스 사용 시 행 잠금 기능을 활성화(1. true) 또는 비활성화(0. false)하는 부울입니다. 기본 값은 0(false)입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `INNODB_API_ENABLE_MDL` – 0(false)으로 설정 시 InnoDB `memcached` 플러그인이 사용하는 테이블을 잠그는 부울입니다. 따라서 SQL 인터페이스에서 DDL을 통해 삭제 또는 변경이 불가능합니다. 기본 값은 0(false)입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `INNODB_API_TRX_LEVEL` – `memcached` 인터페이스에서 처리하는 쿼리의 트랜잭션 격리 수준을 지정하는 정수입니다. 허용 값은 0\$13입니다. 기본값은 0입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.

Amazon RDS가 위 MySQL `memcached` 파라미터를 구성하지만 다음 파라미터는 변경할 수 없습니다. `DAEMON_MEMCACHED_LIB_NAME`, `DAEMON_MEMCACHED_LIB_PATH` 및 `INNODB_API_ENABLE_BINLOG`. MySQL 관리자가 `daemon_memcached_options`를 사용하여 설정하는 파라미터는 Amazon RDS의 개별 `MEMCACHED` 옵션 설정으로 이용할 수 있습니다.

### MySQL daemon\$1memcached\$1options 파라미터
<a name="w2aac47c83c15c17b6"></a>
+  `BINDING_PROTOCOL` – 사용할 바인딩 프로토콜을 지정하는 문자열입니다. 허용 값은 `auto`, `ascii` 또는 `binary`입니다. 기본 값은 `auto`이고, 이 경우 서버가 자동으로 클라이언트와 프로토콜을 협상합니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `BACKLOG_QUEUE_LIMIT` – 의 처리를 기다리는 네트워크 연결 수를 지정하는 정수입니다.`memcached` 이 파라미터의 최대 값을 높이면 `memcached` 인스턴스에 연결할 수 없다는 클라이언트의 오류 메시지가 줄어들 수 있지만 그렇다고 서버 성능이 향상되는 것은 아닙니다. 허용 값은 1\$12048이고, 기본값은 1024입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `CAS_DISABLED` – Compare and Swap(CAS) 기능을 활성화(1. true)하거나 비활성화(0. false)하는 부울로서, 이 기능을 활성화하면 항목 1개의 크기가 8바이트까지 줄어듭니다. 기본 값은 0(false)입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `CHUNK_SIZE` – 가장 작은 항목의 키, 값 및 플래그에 할당할 최소 청크 크기(바이트)를 지정하는 정수입니다. 허용 값은 1\$148입니다. 기본 값은 48이며, 값이 작을수록 메모리 효율이 크게 개선됩니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `CHUNK_SIZE_GROWTH_FACTOR` – 새로운 청크 크기를 조절하는 부동 소수점입니다. 이전 청크 크기와 `CHUNK_SIZE_GROWTH_FACTOR`를 곱한 값이 새로운 청크의 크기가 됩니다. 허용되는 값은 1\$12이고, 기본값은 1.25입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `ERROR_ON_MEMORY_EXHAUSTED` – 1(true)로 설정할 경우, 항목을 저장할 메모리가 없으면 `memcached`가 항목을 제거하지 않고 오류를 반환하는 부울입니다. 0(false)으로 설정할 경우 메모리가 없으면 `memcached`가 항목을 제거합니다. 기본 값은 0(false)입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `MAX_SIMULTANEOUS_CONNECTIONS` – 동시에 접속할 수 있는 최대 수를 지정하는 정수입니다. 이 값을 10보다 작게 설정하면 MySQL을 시작하지 못합니다. 허용 값은 10\$11024이고, 기본값은 1024입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다.
+  `VERBOSITY` – MySQL 오류 로그에서 `memcached` 서비스가 기록할 정보 수준을 지정하는 문자열입니다. 기본값은 v입니다. 옵션을 적용하려면 인스턴스를 다시 시작해야 합니다. 허용 값은 다음과 같습니다.
  +  `v` – 주요 이벤트 루프 실행 중 발생하는 오류와 경고를 기록합니다.
  +  `vv` – v에서 기록하는 정보에 더하여 각 클라이언트 명령과 응답을 기록합니다.
  +  `vvv` – vv에서 기록하는 정보에 더하여 내부의 상태 전환을 기록합니다.

Amazon RDS가 위 MySQL `DAEMON_MEMCACHED_OPTIONS` 파라미터를 구성하지만 다음 파라미터는 변경할 수 없습니다. `DAEMON_PROCESS`, `LARGE_MEMORY_PAGES`, `MAXIMUM_CORE_FILE_LIMIT`, `MAX_ITEM_SIZE`, `LOCK_DOWN_PAGE_MEMORY`, `MASK`, `IDFILE`, `REQUESTS_PER_EVENT`, `SOCKET` 및 `USER`.