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

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
Posted
Filed under 프로그램과 명령어/서버와 서비스
참조 원문 : Using mysqldump to Back Up Your MySQL Database

  저번에 SSH와 관련된 글에서도 mysqldump를 이용해서 백업을 하는 모습이 잠깐 등장했었는데요. 이걸 이용해서 서버의 모든 데이터베이스를 백업할 수도 있고 하나의 데이터베이스나 테이블 단위로 백업하는 것도 가능합니다. 그래서 이번에는 MySQL에서 가장 기초적인 백업 도구인 mysqldump를 이용한 백업에 대해 알아보겠습니다. 터미널에서 mysqldump를 쳐보면 대략 아래와 같은 실행법이 출력됩니다.
mirashi@myservlab:~$ mysqldump
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]
For more options, use mysqldump --help
  예를 들어 모든 데이터베이스의 스키마와 데이터를 backup.sql이라는 이름으로 저장하려면 다음과 같이 명령어를 사용하면 됩니다. 물론 루트가 아니라도 모든 DB를 읽을 수 있는 권한이 있는 계정이 있다면 그 계정을 사용하면 되겠습니다
mysqldump -u root -p --all-databases > backup.sql
Enter password:   <- 패스워드 입력
  만들어진 파일을 까보면 SQL 문으로 이뤄진 것을 볼 수 있는데 DB를 하나하나 Use로 선택하면서(없으면 생성) 기존의 테이블을 DROP으로 지운 후 백업할 당시의 내용으로 다시 만드는 것을 볼 수 있습니다.

  아래는 'singleDB'라는 이름의 데이터베이스를 db_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB > db_backup.sql
  그리고 아래는 'singleDB'라는 데이터베이스 안에 있는 'singleTABLE'이라는 이름의 테이블을 table_backup.sql이라는 파일로 백업하는 예입니다.
mysqldump -u root -p singleDB singleTABLE > table_backup.sql
  경우에 따라서는 데이터베이스의 스키마만 백업하고 싶을 수도 있는데 그럴 때는 아래처럼 --no-data 옵션을 추가하면 됩니다.
mysqldump -u root -p --no-data singleDB > db_backup.sql
  이와 반대로 데이터만 백업하고 싶을 때는 --no-create-info 옵션을 주면 됩니다.
mysqldump -u root -p --no-create-info singleDB > db_backup.sql
  이제 이걸 응용해서 cron을 이용해 자동으로 백업을 하도록 만들어보겠습니다. 먼저 DBbackup.sh 이란 이름으로 아래의 간단한 스크립트를 만듭시다. 스크립트의 저장 위치는 /var/scripts, MySQL 루트 계정의 패스워드는 abcd, 백업할 데이터베이스명은 singleDB, 백업의 저장 위치는 /var/backup, 파일명은 'DBbackup-년월일.sql'로 가정하겠습니다.
#!/bin/sh
mysqldump -uroot -pabcd singleDB > /var/backup/DBbackup-`date +%Y%m%d`.sql
  파일 내에 MySQL 루트 계정의 비번이 노출되어 있으므로 퍼미션 관리에 신경써야 합니다. 이제 'crontab -e'를 통해 특정 시간에 스크립트가 실행되도록 만듭니다. 아래 예에서는 새벽 3시에 돌아가도록 하고 있습니다.
0 3 * * * /var/script/DBbackup.sh
  지금까지 알아본 방법은 MySQL에서 백업을 하는 방법 중 가장 간단한 방법입니다. 만약 증분 백업을 원하신다면 binary_log 툴을 이용하는 방법이 있고 이중화를 위한 마스터/슬레이브 구성(마스터 서버의 데이터를 슬레이브 서버로 복사)을 원하신다면 Replication을 이용하는 방법이 있습니다. 아마 언젠가 관련 내용을 포스트하는 날이 오지 않을까 싶네요.


2010/11/18 15:29 2010/11/18 15:29