[MySQL][Admin] 멀티 인스턴스 수행방법
- Databases/MySQL
- 2020. 1. 27.
■ mysqld_multi - 다중 MySQL 서버 관리
mysqld_multi는 서로 다른 유닉스 소켓 파일과 TCP/IP 포트상에서 연결을 기다리는 mysqld 프로세스를 관리하기 위한 쉘 스크립트 프로그램입니다. 이것은 MySQL서버를 시작할수도 있고 종료할 수도 있으며, 또는 서버의 현재 상태를 보고할 수도 있습니다. MySQL 인스턴스 매니저는 다중 서버를 관리하는 것을 달리 의미하는 용어입니다.
mysqld_multi 는 my.cnf (또는 --config-file 옵션으로 이름 붙여진 파일)에서 [mysqldN]라는 이름의 그룹을 검색합니다. N는 모든 양수 정수가 될 수 있습니다. 이 번호는 다음의 섹션에서 옵션 그룹 번호 또는 GNR로 참조됩니다. 그룹 번호는 각 그룹을 구분하며 여러분이 시작, 종료, 또는 상태 레포트를 받고자 원하는 서버가 어떤 것인지를 지정하기 위한 mysqld_multi의 인수로서 사용됩니다. 이러한 그룹 내에 열거되어 있는 옵션들은 mysqld를 구동시키기 위해 사용하는 [mysqld] 그룹 내에서 사용하는 것과 동일한 것들입니다. 하지만, 다중 서버를 사용할 때에는, 각자의 서버는 유닉스 소켓 파일 및 TCP/IP 포트 번호와 같은 것에 대해 자신만의 옵션 값을 가져야 합니다.
mysqld_multi를 호출하기 위해서는 아래의 문법을 사용합니다.
shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR] ...]
start, stop, 그리고 report는 수행할 동작을 가리키는 것입니다. 여러분은 옵션 이름 다음에 나오는 GNR 리스트에 따라서, 단일 서버 또는 다중 서버에 대한 지정 동작을 실행을 할 수가 있습니다. 만약에 리스트가 없는 경우에는, mysqld_multi는 옵션 파일에 있는 모든 서버에 대해서 연산을 실행하게 됩니다.
각각의 GNR 값은 옵션 그룹 번호 또는 그룹 번호의 범위를 나타앱니다. 그 값은 옵션 파일에 있는 그룹 이름의 맨 끝에 있는 번호입니다. 예를 들면, [mysqld17]의 GNR 는 17이 됩니다. 번호의 범위를 지정하기 위해서는, 처음 번호와 마지막 번호 사이에 대시를 넣어서 구분합니다. GNR 값 10-13은 그룹 [mysqld10]에서 [mysqld13]를 표시합니다. 다중 그룹 또는 그룹 범위는 명령어 라인에서 지정할 수 있는데, 콤마로 구분을 합니다. GNR 리스트에는 화이트스페이스 문자 (스페이스 또는 탭)가 없어야 합니다. 참고로 화이트 스페이스 다음에 오는 문자는 모두 무시됩니다.
아래의 명령어는 옵션 그룹 [mysqld17]을 사용해서 단일 서버를 시작하게 합니다.
shell> mysqld_multi start 17
아래의 명령어는 옵션 그룹 [mysqld8] 및 [mysqld10] ~ [mysqld13]을 사용해서 여러 대의 서버를 종료합니다:
shell> mysqld_multi stop 8,10-13
옵션 파일을 설정하는 방법에 대한 예를 보기 위해서는, 아래의 명령어를 사용합니다.
shell> mysqld_multi --example
■ mysqld_multi 옵션들
mysqld_multi는 아래의 옵션을 지원합니다.
--help : 도움말 메시지를 출력한 후에 종료합니다.
--example : 샘플 옵션 파일을 출력 합니다.
--log=file_name : 로그 파일의 이름을 지정합니다. 파일이 존재한다면, 로그 결과가 뒤에 붙게 됩니다.
--mysqladmin=prog_name : mysqladmin 프로그램은 서버를 종료하기 위해 사용됩니다.
--mysqld=prog_name :
사용될 mysqld 바이너리. mysqld_safe 역시 이 옵션에 대한 값으로 지정할 수 있습니다. 만약에 mysqld_safe를 사용해서 서버를 구동 시켰다면, 여러분은 이에 대응하는 [mysqldN] 옵션 그룹에 mysqld 또는 ledir 옵션들을 포함 시킬 수가 있습니다. 이러한 옵션들은 mysqld_safe가 구동 시켜야 하는 서버의 이름과 서버가 저장되어 있는 디렉토리의 경로 이름을 나타냅니다.
[mysqld38]
mysqld = mysqld-max
ledir = /opt/local/mysql/libexec
--no-log : 로그 파일이 아닌 stdout에 로그 정보를 기록 합니다. 디폴트로는 로그 파일 결과가 기록됩니다.
--password=password : mysqladmin을 호출할 때 사용되는 MySQL 계정의 패스워드. 다른 MySQL 프로그램과는 달리, 이 옵션에 대한 패스워드 값은 필수 사항입니다.
--silent : 침묵 (Silent) 모드. 경고문을 비활성화 시킵니다.
--tcp-ip : 각각의 MySQL 서버를 유닉스 소켓 파일 대신에 TCP/IP 포트를 통해 연결 시킵니다. (만약에 소켓 파일이 누락되어 있으면, 서버는 동작은 하겠지만, TCP/IP 포트를 통해서만 접근할 수 있게 됩니다.) 디폴트로는, 유닉스 소켓 파일을 통해서 연결됩니다. 이 옵션은 stop 과 report 동작에 영향을 줍니다.
--user=user_name : mysqladmin을 호출할 때 사용하는 MySQL 계정의 사용자 이름.
--verbose : 좀더 자세하게 정보를 표현하도록 한다.
--version : 버전 정보를 출력합니다.
■ mysqld_multi에 대한 몇가지 내용.
+ 중요 사항
mysqld_multi를 사용하기 전에, 여러분은 mysqld 서버에 전달되는 옵션의 의미와 개별적인 mysqld 프로세스를 가져야 하는 이유가 무엇인지를 정확히 알아야 합니다. 동일한 데이터 디렉토리를 갖는 다중 mysqld 서버를 사용하는 것은 위험합니다. 여러분이 무엇을 하고 있는지 정확히 알지 못할 경우에는, 데이터 디렉토리를 구분해서 사용하셔야 합닏. 동일한 데이터 디렉토리를 가지고 여러 대의 서버를 구동시킨다고 하더라도 쓰레드 시스템에서는 아무런 성능의 효과를 얻을 수가 없습니다.
- 참고사항
각 서버에 대한 데이터 디렉토리는 특정 mysqld 프로세스가 구동되는 시스템의 전체 유닉스 계정이 접근 가능하다는 것입니다. 여러분이 무엇을 하고 있는지 정확히 알지 못할 경우에는, 이렇게 동작 시키기 위해서 유닉스 root 계정을 사용하시면 안됩니다.
+ mysqld 서버를 종료 시키기 위해 (mysqladmin 프로그램을 사용해서) 사용하는 MySQL 계정은, 각 서버에 대해서 동일한 사용자 이름과 패스워드를 가지고 있습니다. 또한, 그 계정은 SHUTDOWN 권한을 가지고 있습니다. 만약에 여러분이 관리하고자 하는 서버가 관리 계정에 대해서 서로 다른 사용자 이름 또는 패스워드를 가지고 있다면, 여러분은 각 서버 상에 동일한 사용자 이름과 패스워드를 가지고 있는 계정을 만들 필요가 있습니다. 예를 들면, 각 서버에 대해 아래의 명령어를 실행하면 공통의 multi_admin 계정을 설정할 수가 있습니다.
shell> mysql -u root -S /tmp/mysql.sock -p
Enter password:
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
각각의 mysqld에 대해 이러한 조치를 해야 합니다. 각각을 연결할 때에 연결 파라미터 값을 알맞게 변경합니다. 계정 이름의 호스트 이름 부분은 반드시 구동 시키고자 하는 mysqld_multi가 있는 호스트에서 multi_admin을 연결할 수 있게 해 주어야 합니다.
+ 유닉스 소켓 파일과 TCP/IP 포트 번호는 모든 mysqld마다 달라야합니다. (또는 호스트에 여러 네트워크 주소가 있는 경우 다른 서버가 다른 인터페이스를 수신하도록 bind_address 시스템 변수를 설정할 수 있습니다.)
+ mysqld_safe를 사용해서 (예를 들면, --mysqld=mysqld_safe) mysqld를 구동 시킨다면, --pid-file 옵션은 매우 중요한 것이 됩니다. 모든 mysqld는 자신의 고유 프로세스 ID 파일을 가지고 있어야 합니다. mysqld 대신에 mysqld_safe를 쓰는 장점은, mysqld_safe는 자신의 mysqld 프로세스를 모니터 하면서 만약에 프로세스가 kill -9를 사용하는 신호 또는 세그먼트 폴트 (fault)와 같은 다른 이유로 종료될 경우에 재 구동을 시킵니다.
+ mysqld에 --user 옵션을 사용할 수 있지만 이를 위해서는 mysqld_multi 스크립트를 Unix 수퍼 유저 (루트)로 실행해야합니다. 옵션 파일에 옵션이있는 것은 중요하지 않습니다. 수퍼 유저가 아니고 mysqld 프로세스가 고유 한 Unix 계정으로 시작된 경우 경고가 표시됩니다.
+ mysqld_safe 스크립트는 여러분이 특정 위치에서 서버를 시작하도록 요구합니다. 이것은 mysqld_multi를 구동 시키기 전에 특정 디렉토리로 위치를 변경해야 합니다. 만약에 서버 구동에 문제가 있을 경우에는, mysqld_safe 스크립트를 살펴 보셔야 합니다. 특히 아래의 라인을 주의 깊게 검사합니다.
MY_PWD=`pwd`
# Check if we are starting this relative (for the binary release)
if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a \
-x ./bin/mysqld
이 라인이 수행하는 테스트는 성공을 해야 하는데, 그렇지 않을 경우에는 문제가 생기게 됩니다.
관리자는 mysqld를 위해서 --user 옵션을 사용하고자 하겠지만, 이렇게 하기 위해서는 유닉스 root 사용자로 mysqld_multi 스크립트를 구동 시켜야 합니다. 옵션 파일 안에 옵션을 가지고 있는 것은 아무 문제가 없습니다. 만약 슈퍼 유저가 아니고 mysqld 프로세스가 유닉스 계정 아래에서 시작될 경우에는 단지 경고만 받게 됩니다.
■ mysqld_multi 사용 실전 예제
아래 예제에서는 여러분이 mysqld_multi를 가지고 옵션 파일을 어떻게 설정을 하는지를 보여 주고 있습니다. mysqld 프로그램이 시작되거나 또는 종료하는 순서는 옵션 파일에 어떤 순서로 되어 있는지에 달려 있습니다. 그룹 번호는 깨지지 않는 시퀀스 (unbroken sequence) 구성에 필요가 없다. 첫 번째와 다섯 번째의 [mysqldN] 그룹은 이 예제에서 의도적으로 생략 되었는데, 이것은 여러분이 옵션 파일에서 “갭 (gap)”을 가질 수 있음을 알려 주기 위함입니다. 이것은 여러분에게 보다 많은 유연성을 제공합니다.
+ 먼저 신규로 구축되는 서버든 데이터 디렉토리를 복제해서 구성하는 서버든 일단 먼저 위에서 얘기했듯이 Startup, Shutdown 전용 계정을 먼저 만듭니다.
mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';
+ 데이터 디렉토리를 복제합니다.(data 디렉토리가 /data/var01이라고 가정합니다.)
shell > cp -r /data/var01 /data/var02
shell > cp -r /data/var02 /data/var03
+ my.cnf을 만듭니다. 기존 my.cnf 파일은 백업합니다.
shell > cd /etc/
shell > cp my.cnf my.cnf.ori
shell > vi my.cnf
# This file should probably be in your home dir (~/.my.cnf)
# or /etc/my.cnf
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/share/mysql/english
user = john
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/share/mysql/swedish
user = monty
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/share/mysql/estonia
user = tonu
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/share/mysql/japanese
user = jani
2. 다음과 같이 서버를 수행합니다.
shell > mysqld_multi start 1
shell > mysqld_multi start 2
shell > mysqld_multi start 3
shell > mysqld_multi start 4
shell > mysqld_multi start 5
shell > mysqld_multi start 6
혹은
shell > mysqld_multi start 1-6
+ 종료시 다음과 같이 합니다.
mysqld_multi stop 8,10-13
mysqladmin으로도 종료할 수 있습니다.
shell > mysqladmin -u root -p -S /tmp/mysql.sock1
'Databases > MySQL' 카테고리의 다른 글
[MySQL][Security] SSL을 이용한 접속방법 (2) | 2020.02.14 |
---|---|
[MySQL][Security] 계정생성과 권한 (0) | 2020.02.09 |
[MySQL][Admin] 로그종류와 특징 (0) | 2020.01.16 |
[MySQL][Install] 8.0 Upgrade 방법 (0) | 2020.01.13 |
[MySQL][Admin] - 기본으로 제공되는 프로그램들 (0) | 2020.01.04 |