검색 엔진의 방문이 늘어나고 있군...

Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Simple database load balancing with MySQL Proxy

  MySQL 프록시는 클라이언트와 SQL 서버 사이를 지나는 정보를 감사할 수 있으며 악성 질의로부터 MySQL 서버를 보호하거나 데이터베이스를 실제로 변경하지 않고도 클라이언트가 받을 정보를 바꾸기 위해 둘 사이에 흐르는 데이터를 변경할 수도 있습니다. 그 외에도 읽기 연산을 위한 서버를 추가하여 MySQL의 확정성을 높이고 MySQL 서버 사이에서 로드 밸런싱을 하면서 SELECT 문을 읽기 전용 슬레이브 서버로 보내도록 흐름을 최적화할 수 있습니다.

  대부분의 배포판에서 MySQL 프록시 패키지의 이름은 mysql-proxy입니다. CentOS의 경우 이 패키지는 EPEL 저장소에 있습니다. EPEL은 메인 CentOS 저장소에서 제공하지 않는 추가 패키지를 제공하는 저장소입니다. 이는 CentOS 6을 기준으로 아래 명령어를 통해 설치할 수 있습니다.
# rpm -ivh http://ftp-stud.hs-esslingen.de/pub/epel/6/i386/epel-release-6-8.noarch.rpm
  저장소를 추가하면 yum install mysql-proxy 명령어를 통해 설치할 수 있습니다.


설정
  레드햇 계열을 기준으로 MySQL Proxy의 설정 파일은 /etc/sysconfig/mysql-proxy 입니다. 설정 파일에서 아래와 같은 옵션을 설정할 수 있습니다.
  • ADMIN_USER - 프록시의 관리자 인터페이스를 위한 사용자. 디폴트 값으로 놔둔다.
  • ADMIN_PASSWORD - 관리자 계정의 패스워드 평문. 원하는 값으로 변경.
  • ADMIN_LUA_SCRIPT - Lua 프로그래밍 언어로 된 관리자 스크립트. 이 스크립트가 없으면 관리자 인터페이스가 작동하지 않는다. 디폴트 값으로 놔둔다.
  • PROXY_USER - 프록시를 돌릴 시스템 계정. 디폴트는 mysql-proxy며 그냥 놔둔다.
  • PROXY_OPTIONS - 로깅 레벨, 불러올 Lua 스크립트 등 프록시 옵션.
  가장 중요한 것은 PROXY_OPTIONS며 사용 예는 아래와 같습니다.
PROXY_OPTIONS="--daemon --log-level=info --log-use-syslog --plugins=proxy --plugins=admin --proxy-backend-addresses=192.168.1.102:3306 --proxy-read-only-backend-addresses=192.168.1.105:3306 --proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/rw-splitting.lua"
  로깅은 시스템의 syslog(--log-use-syslog)를 사용하여 info 레벨부터 기록(--log-level=info)하며 이는 프록시의 모든 시스템 메시지를 /var/log/messages 파일에 기록한다는 뜻입니다.

  2개의 플러그인을 쓰는데 하나는 기본 프록시 기능을 제공하는 플러그인(--plugins=proxy), 다른 하나는 백엔드 서버에 대한 유용한 정보를 사용자에게 관리자 인터페이스로 제공하는 플러그인(--plugins=admin)입니다.

  백엔드 서버는 하나의 읽기/쓰기 서버(--proxy-backend-adresses=192.168.1.102:3306)와 하나의 SELECT 문만 받는 읽기 전용 서버(--proxy-read-only-backend-addresses=192.168.1.105:3306)로 구성합니다. 읽기 전용 서버는 마스터 읽기/쓰기 서버의 리플리케이션 서버여야 합니다. MySQL 리플리케이션 디자인에 따라 더 많은 읽기/쓰기 서버를 추가할 수 있으며, 모든 질의는 라운드로빈 알고리즘으로 공평히 분배합니다. 프록시는 죽은 서버에 질의를 넘기지 않기 때문에 로드 밸런싱과 패일오버 모두에 유용합니다
.
  마지막 설정(--proxy-lua-script=/usr/lib/mysql-proxy/lua/proxy/rw-splitting.lua)은 읽기와 쓰기 사이에서 질의를 분배하는 Lua 스크립트의 위치입니다. 이는 MySQL 프록시의 가장 유용한 기능 중 하나로서 마스터 MySQL 서버의 부하를 줄이기 위해 SELECT 문을 읽기에 최적화된 슬레이브 서버로 보내는 역할을 합니다.

  하지만 이 Lua 스크립트는 EPEL 패키지에 기본으로 포함되어 있지 않습니다. 이 스크립트는 공식 MySQL 프록시 패키지를 통해 얻을 수 있습니다. 다운로드 옵션에서 generic Linux archive를 받아 압축을 풀면 디렉토리가 생기며 그 밑에 있는 share/doc/mysql-proxy 디렉토리에서 rw-splitting.lua 파일을 찾을 수 있습니다. 그 파일을 프록시 서버의 /usr/lib/mysql-proxy/lua/proxy/ 디렉토리에 복사합니다.


모니터링
  설정이 모두 끝나면 CentOS를 기준으로 아래 명령어를 통해 MySQL 프록시를 시작합니다.
# mysql proxy start
  시작에 성공했다면 /var/log/messages 파일에 아래와 비슷한 출력이 남을 것입니다.
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) mysql-proxy 0.8.2 started
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) proxy listening on port :4040
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) added read/write backend: 192.168.1.102:3306
Jan 14 21:54:08 server2 mysql-proxy: 2013-01-14 21:54:08: (message) added read-only backend: 192.168.1.105:3306
  지금 설정한 프록시를 테스트하려면 앞서 설명한 것처럼 MySQL 리플리케이션이 설정되어 있어야 합니다.

  프록시가 활동을 시작하면 MySQL 클라이언트로 서버의 4041 포트에 접속하여 관리자 인터페이스를 통해 상태를 확인할 수 있습니다. 만약 MySQL 프록시의 IP 주소가 192.168.1.201이라면 아래의 명령어로 프록시의 관리자 인터페이스에 접속할 수 있습니다. 관리자 로그인 ID와 패스워드는 /etc/sysconfig/mysql-proxy 파일에 정의한 것을 사용합니다.
$ mysql --host=192.168.1.201 --port=4041 -u admin -p
  관리자 인터페이스는 단순하며 Lua 관리자 스크립트에 따라 보통은 아래의 명령어만 사용할 수 있습니다.
SELECT * FROM backends;
  MySQL 프록시가 제대로 작동 중이라면 아래와 같은 결과가 나와야 합니다.
+-------------+--------------------+-------+------+------+-------------------+
| backend_ndx | address            | state | type | uuid | connected_clients |
+-------------+--------------------+-------+------+------+-------------------+
|           1 | 192.168.1.102:3306 | up    | rw   | NULL |                 0 |
|           2 | 192.168.1.105:3306 | up    | ro   | NULL |                 0 |
+-------------+--------------------+-------+------+------+-------------------+
2013/07/07 15:39 2013/07/07 15:39