DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

동일 머신에서 여러 대의 MySQL 서버 구동 시키기

DBMS 2
MySQL 가이드
데이터 베이스 관리
동일 머신에서 여러 대의 MySQL 서버 구동 시키기
작성자
admin
작성일
2021-02-19 10:53
조회
2870

동일 머신에서 여러 대의 MySQL 서버 구동 시키기

윈도우에서 여러대의 서버 구동 시키기
유닉스엣 여러대의 서버 구동 시키기
다중-서버 환경에서 클라이언트 프로그램 사용하기

동일 머신에서 여러 대의 mysqld 서버를 구동해야 하는 경우가 종종 발생한다. 하나의 머신에서 여러 대의 서버를 구동시키기 위해서는, 각 서버별로 개별적인 여러 가지 동작 파라미터 값이 설정되어야 한다. 이 값들은 명령어 라인 또는 옵션 파일에서 지정할 수 있다. Section 4.3, “프로그램 옵션 지정하기”를 참조.

각각의 서버는 아래의 옵션들에 대해서 개별적인 값을 가지고 있어야 한다:


  • --port=port_num
    --port는 TCP/IP 접속용 포트 번호를 제어한다.
  • --socket=path
    --socket은 유닉스에서 유닉스 소켓 파일 경로를 제어하며, 윈도우에서는 네임드 파이프 이름을 제어한다. 윈도우에서는, 네임드 파이트 접속을 지원하는 서버에 대해서만 정확한 파이프 이름을 지정하면 된다.
  • --shared-memory-base-name=name
    이 옵션은 현재 윈도우에서만 사용된다. 이것은 클라이언트가 윈도우 서버가 사용하는 공유 메모리 이름을 사용해서 접속할 수 있도록 하기 위한 것이다. 공유 메모리 접속을 지원하는 서버에 대해서만 정확히 지정하면 된다.
  • --pid-file=file_name
    이 옵션은 유닉스에서만 사용된다. 이것은 서버가 자신의 프로세스 ID를 기록하는 파일의 경로 이름을 가리킨다.

아래의 로그 파일 옵션을 사용한다면, 이 옵션들은 각 서버 별로 서로 틀리게 지정되어야 한다:


  • --log=file_name
  • --log-bin=file_name
  • --log-update=file_name
  • --log-error=file_name
  • --bdb-logdir=file_name

여러 개의 디스크 간에 로드를 분산시키기 위해 각 서버 별로 아래의 옵션을 달리 지정하면 성능을 개선 시킬 수가 있다:


  • --tmpdir=path
  • --bdb-tmpdir=path

서버 별로 임시 디렉토리를 달리 가지면 지정한 임시 파일을 어떤 MySQL 서버가 생성했는지 판단하기가 쉬워진다.

각 서버는 서로 다른 데이터 디렉토리를 사용해야 하는데, 이것은 --datadir=path 옵션을 사용해서 지정하도록 한다.

Warning: 일반적인 경우, 동일한 데이터 베이스에 두 대의 서버가 동시에 데이터를 업데이트할 수는 없다. 만약에 (이 경고에도 불구하고) 동일한 데이터 디렉토리를 사용해서 여러 개의 서버를 구동 하고 이 서버들의 로깅이 활성화 되어 있다면, 반드시 각 서버 별 로그 파일 이름을 지정하기 위한 옵션을 사용해야 한다. 그렇지 않으면, 서버는 동일한 파일에 로그를 시도할 것이다. 이런 형태의 설정은 MyISAM 과 MERGE 테이블만 지원하도록 해야 하며, 다른 스토리지 엔진에 대해서는 적용하지 않도록 한다.

서버간 공유 데이터 디렉토리에 대한 경고는 NFS 환경에서도 적용된다. 여러 대의 MySQL 서버가 NFS를 통해 공통의 데이터 디렉토리에 접근하도록 허용하는 것은 결코 좋은 생각이 아니다.


  • 가장 치명적인 문제는 바로 NFS의 버틀넥 (bottleneck) 발생이다.
  • 또 다른 문제는 두 개 또는 그 이상의 서버가 다른 서버들과 인터페이스를 하지 못하도록 수정을 해야 한다는 것이다. 일반적으로 NFS 파일 잠금은 lockd 데몬이 처리하지만, 모든 상황에서 100% 신뢰성을 제공해 주는 플랫폼은 존재하지 않는다.

보다 쉽게 생각을 하자: NFS를 통해서 서버들이 데이터 디렉토리를 공유하는 것은 잊어 버리자. 보다 좋은 솔루션은 쓰레드를 보다 효과적으로 처리하는 OS를 탑재한 다중 CPU 시스템을 하나 운영하는 것이다.

여러 대의 MySQL을 서로 다른 위치에 설치했다면, 각 서버별 베이스 설치 디렉토리를 --basedir=path 옵션으로 지정해서 각각의 서버가 서로 다른 데이터 디렉토리, 로그 파일, 그리고 PID 파일을 사용하도록 만든다. (이러한 모든 것들의 디폴트 값은 베이스 디렉토리와 관련이 있다). 이와 같은 경우, 여러분이 지정을 할 필요가 있는 한가지 다른 옵션은 --socket 과 --port 옵션이다. 예를 들면, tar 파일 바이너리 배포판을 사용해서 서로 다른 MySQL 버전들을 설치했다고 가정하자. 서로 다른 위치에 설치를 하였기 때문에, 여러분은 각각의 베이스 디렉토리 아래에서 명령어bin/mysqld_safe 를 사용해서 각각의 설치 서버를 시작할 수가 있다. mysqld_safe는 --basedir 옵션이 정확한지를 판단해서 mysqld에 전달하며, 여러분은 mysqld_safe에 대한 -socket 및 --port 옵션만 지정하면 된다.


명령어 라인에서 여러 개의 윈도우 서버 구동하기

명령어 라인에서 수동으로 여러 대의 서버를 구동하기 위해서는, 명령어 라인 또는 옵션 파일에 적절한 옵션을 지정해야 한다. 옵션 파일에 옵션을 주는 것이 더 편리한 방법이지만, 각각의 서버가 자신들의 옵션만을 가져가도록 해야 한다. 이렇게 하기 위해서는, 각 서버 별로 옵션 파일을 생성하고 서버를 구동할 때 서버에 --defaults-file 옵션이 붙은 파일 이름을 알려 준다.

여러분이 포트 3307에서 데이터 디렉토리 C:\mydata1를 가지고 mysqld를 구동시키고, 포트 3308에서는 mysqld-max를 C:\mydata2와 함께 구동 시킨다고 가정하자 (이렇게 하기 위해서는, 서버를 구동 하기 전에, 각 데이터 디렉토리는 이미 존재해야 하고 그랜트 테이블을 가지고 있는 mysql 데이터 베이스의 복사본을 가지고 있어야 한다.) 그런 다음에 두 개의 옵션 파일을 생성한다. 예를 들면, 아래와 같은 형식의 파일 C:\my-opts1.cnf를 생성한다:



[mysqld]
datadir = C:/mydata1
port = 3307


두 번째 파일 C:\my-opts2.cnf을 생성한다:



[mysqld]
datadir = C:/mydata2
port = 3308


그런 다음에 각 서버를 자신들의 옵션 파일과 함께 구동 시킨다:



C:\> C:\mysql\bin\mysqld --defaults-file=C:\my-opts1.cnf
C:\> C:\mysql\bin\mysqld-max --defaults-file=C:\my-opts2.cnf


NT시스템의 경우, 각 서버는 전면 (foreground)에서 구동되기 때문에 (서버가 동작을 마칠 때까지 프롬프트는 나타나지 않음), 위의 두 개의 명령어를 별도의 콘솔 윈도우에서 구동 시킨다.

서버를 셧다운? 서버에 접근해야 한다:



C:\> C:\mysql\bin\mysqladmin --port=3307 shutdown
C:\> C:\mysql\bin\mysqladmin --port=3308 shutdown


위와 같이 구성된 서버는 클라이언트가 TCP/IP를 통해 접속할 수 있도록 해 준다. 여러분이 사용하는 윈도우 버전이 네임드 파이프를 지원하고 네임드 파이프 접속을 허용하고자 한다면, mysqld-nt 또는 mysqld-max-nt 서버를 사용하여 네임드 파이프를 활성화 시키는 옵션과 네임드 파이프 이름을 지정해 준다. 네임드 파이프 접속을 지원하는 각 서버는 고유의 파이프 이름을 사용해야 한다. 예를 들면, C:\my-opts1.cnf 파일을 아래와 같이 작성해 보자:



[mysqld]
datadir = C:/mydata1
port = 3307
enable-named-pipe
socket = mypipe1


그런 다음에 아래와 같이 서버를 시작한다:



C:\> C:\mysql\bin\mysqld-nt --defaults-file=C:\my-opts1.cnf

두 번째 서버의 C:\my-opts2.cnf도 비슷하게 수정을 한다.

공유-메모리 접속을 지원하는 서버에 대해서도 비슷한 과정을 수행할 수가 있다. --shared-memory 옵션을 가지고 접속을 활성화 시키고 --shared-memory-base-name 옵션을 사용해서 서버 별 고유의 공유-메모리 이름을 지정한다.


서비스 형태로 여러 개의 윈도우 서버 시작하기

NT-기반 시스템의 경우, MySQL 서버를 윈도우 서비스 형태로 구동시킬 수가 있다. 단일 MySQL 서비스를 설치, 제어, 그리고 제거하는 과정은 Section 2.3.11, “윈도우 서비스 형태로 MySQL 시작하기”에서 설명하고 있다.

여러분은 여러 개의 MySQL 서버를 서비스 형태로 설치할 수도 있다. 이와 같은 경우에는, 반드시 각 서버가 별도의 서비스 이름을 사용하도록 해야 하며, 아울러 모든 다른 파라미터도 각 서버에 대해 고유의 값을 가지고 있어야 한다.

여러분이 C:\mysql-4.1.8 과 C:\mysql-5.0.19에 설치된 서로 다른 버전의 MySQL에서 mysqld-nt 서버를 구동 시킨다는 가정을 하자.

MySQL 서비스를 --install or --install-manual 옵션을 가지고 설치할 때에는 다음과 같은 원칙이 적용된다:


  • 여러분이 서비스 이름을 지정하지 않으면, 서버는 MySQL의 디폴트 서비스 이름을 사용하며, 표준 옵션 파일에 있는 [mysqld] 그룹에서 옵션을 읽게 된다.
  • --install 옵션 다음에 서비스 이름을 지정한다면, 서버는 [mysqld] 옵션 그룹을 무시하게 되며, 서비스와 동일한 이름을 가지고 있는 그룹에서 옵션을 대신 읽는다. 서버는 표준 옵션 파일에서 옵션을 읽는다.
  • 서비스 이름 다음에 --defaults-file 옵션을 지정한다면, 서버는 표준 옵션 파일을 무시하고 네임드 파일의 [mysqld] 그룹에서만 옵션을 읽게 된다.

위의 설명을 토대로, 여러분은 다중 서비스를 설정할 수 있는 여러 가지 방법을 알게 될 것이다. 아래에서는 몇 가지 예를 설명하고 있다. 이것들을 시도하기 전에, 우선 MySQL 서버를 종료하고 이미 존재하는 서비스를 제거하도록 해야 한다.


  • Approach 1: 하나의 표준 옵션 파일에 모든 서비스에 대한 옵션들을 지정한다. 이렇게 하기 위해서는, 각 서버 별로 별도의 서비스 이름을 사용한다 mysqld1이라는 서비스 이름을 사용해서4.1.8 mysqld-nt을 구동 시키고 mysqld2 서비스 이름을 사용해서는 5.0.19 mysqld-nt를 구동시킨다고 가정을 하자. 이와 같은 경우, 4.1.8을 위해서는 [mysqld1] 그룹을 사용하고, 5.0.19를 위해서는 [mysqld2] 그룹을 사용한다. 예를 들면, 아래와 같이 C:\my.cnf를 설정할 수가 있다:
    # options for mysqld1 service
    [mysqld1]
    basedir = C:/mysql-4.1.8
    port = 3307
    enable-named-pipe
    socket = mypipe1

    # options for mysqld2 service
    [mysqld2]
    basedir = C:/mysql-5.0.19
    port = 3308
    enable-named-pipe
    socket = mypipe2

    윈도우가 각 서비스 별로 정확한 실행 프로그램을 등록했는지 확인하기 위해서는, 전체 서버 경로 이름을 사용해서 아래와 같이 서비스를 설치한다:
    C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1
    C:\> C:\mysql-5.0.19\bin\mysqld-nt --install mysqld2

    서비스를 시작하기 위해서는, 서비스 관리자를 사용하거나, 또는 적당한 서비스 이름을 사용해서 NET START를 사용한다:
    C:\> NET START mysqld1
    C:\> NET START mysqld2

    서비스를 멈추기 위해서는, 서비스 관리자 또는 적당한 서비스 이름을 사용해서 NET STOP을 사용한다:
    C:\> NET STOP mysqld1
    C:\> NET STOP mysqld2

  • Approach 2: 개별 파일에 있는 각 서버 별로 옵션을 지정한 후에, 서비스를 설치할 때에 --defaults-file를 사용해서 각 서버가 사용할 파일을 알려 주도록 한다. 이렇게 하기 위해서는, 각 파일은 [mysqld] 그룹을 사용해서 옵션을 리스트 해야 한다.
    이 방식을 사용하는 경우, 4.1.8 mysqld-nt용 옵션을 지정하기 위해서는 아래와 같은 방식으로 C:\my-opts1.cnf를 생성한다:
    [mysqld]
    basedir = C:/mysql-4.1.8
    port = 3307
    enable-named-pipe
    socket = mypipe1
    5.0.19 mysqld-nt에 대해서는, C:\my-opts2.cnf를 아래와 같이 생성한다:
    [mysqld]
    basedir = C:/mysql-5.0.19
    port = 3308
    enable-named-pipe
    socket = mypipe2

    아래와 같이 서비스를 설치한다 (각 명령어를 하나의 열에 입력한다):
    C:\> C:\mysql-4.1.8\bin\mysqld-nt --install mysqld1
    --defaults-file=C:\my-opts1.cnf
    C:\> C:\mysql-5.0.19\bin\mysqld-nt --install mysqld2
    --defaults-file=C:\my-opts2.cnf

    MySQL 서버를 서비스로 설치할 때 --defaults-file 옵션을 사용하기 위해서는, 반드시 서비스 이름 앞에 옵션을 지정해야 한다. 서비스를 설치한 다음에는, 위에서 설명한 방식으로 서비스를 시작하고 종료한다.

여러 개의 서비스를 제거하기 위해서는, 각 서버 별로 mysqld -remove를 사용하고, 서비스 이름을 --remove 옵션 다음에 지정한다. 서비스 이름이 디폴트 (MySQL)인 경우에는 생략할 수 있다.


윈도우에서 여러대의 서버 구동 시키기

유닉스에서 여러 대의 서버를 구동 시키는 가장 쉬운 방법은 각각의 서버를 서로 다른 TCP/IP 포트와 유닉스 소켓 파일을 사용해서 컴파일해서 각 서버가 별도의 네트워크 인터페이스를 통하도록 하는 것이다. 각각의 설치 서버 별로 서로 다른 베이스 디렉토리를 가지고 컴파일하면 자동으로 서버 별 데이터 디렉토리, 로그 파일, 그리고 PID 파일 위치가 구분된다.

현재 설치되어 있는 4.1.8 서버가 디폴트 TCP/IP 포트 번호 (3306)와 유닉스 소켓 파일 (/tmp/mysql.sock)로 구성 되었다고 가정하자. 새로운 5.0.19 서버가 별도의 동작 파라미터를 가지도록 만들기 위해서는, 아래와 같이 configure 명령어를 사용한다:



shell> ./configure --with-tcp-port=port_number \
--with-unix-socket-path=file_name \
--prefix=/usr/local/mysql-5.0.19


여기에서, port_number 와 file_name은 디폴트 TCP/IP 포트 번호 및 유닉스 소켓 파일과는 달라야 하고, 또한 --prefix 값은 현재의 MySQL 서버가 설치되어 있는 디렉토리와는 다른 곳을 지정해야 한다.

만약에 지정한 포트 번호를 참조는 MySQL 서버가 이미 있다면, 여러분은 아래의 명령어를 사용해서 베이스 디렉토리와 유닉스 소켓 파일 이름을 포함한 몇몇 중요한 구성 변수가 사용하고 있는 동작 파라미터의 값을 알아 보도록 한다:



shell> mysqladmin --host=host_name --port=port_number variables

이 명령어를 통해 얻어진 정보를 사용해서 다른 서버가 추가될 때 사용할 수 없는 옵션 값이 무엇인지를 확인하도록 한다.

만약에 호스트 이름으로 localhost를 지정한다면, mysqladmin은 TCP/IP가 아닌 유닉스 소켓 파일 접속을 디폴트로 사용한다. MySQL 4.1 이후에는, --protocol={TCP|SOCKET|PIPE|MEMORY} 옵션을 사용해서 여러분이 사용하고자 하는 접속 프로토콜을 명확하게 지정할 수가 있다.

서로 다른 유닉스 소켓 파일과 TCP/IP를 가지고 시작하기 위해 새로운 서버를 컴파일할 필요는 없다. 동일한 서버 바이너리를 사용하고 런타임 시에 별도의 파라미터 값을 가지고 각각을 호출하는 것도 가능하다. 이렇게 하는 방법 중의 하나는 명령어 라인에서 옵션을 사용하는 것이다:



shell> mysqld_safe --socket=file_name --port=port_number

두 번째 서버를 구동하기 위해서는, --socket과 --port 옵션 값을 다른 값으로 지정하고, --datadir=path 옵션을 mysqld_safe에 전달해서 서버가 다른 데이터 디렉토리를 사용하도록 한다.

다른 방법은 환경 변수를 사용해서 유닉스 소켓 파일 이름과 TCP/IP 포트 번호를 설정하는 것이다:



shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
shell> MYSQL_TCP_PORT=3307
shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
shell> mysql_install_db --user=mysql
shell> mysqld_safe --datadir=/path/to/datadir &


이 방법은 두 번째 서버를 빠르게 시작할 수 있도록 한다. 이 방법의 장점은 환경 변수 설정이 동일한 쉘에서 호출하는 모든 클라이언트 프로그램에 적용된다는 것이다. 따라서, 이러한 클라이언트에 대한 접속이 자동으로 두 번째 서버를 가리키게 된다.

서버를 자동으로 실행하기 위해서는, 서버 부팅 시점에 실행되는 스타트업 스크립트가 아래의 명령어 별로 적당한 옵션 파일 경로를 가지고 각 서버 별로 한번씩은 실행되도록 만든다:



shell> mysqld_safe --defaults-file=file_name

각 옵션 파일은 지정한 서버를 지칭하는 옵션 값을 가지고 있어야 한다.

유닉스 시스템의 경우, mysqld_multi 스크립트를 사용해서 여러 대의 서버를 구동할 수가 있다. Section 5.4.3, “mysqld_multi - 다중 MySQL 서버 관리”를 참조할 것.


다중-서버 환경에서 클라이언트 프로그램 사용하기

클라이언트에 컴파일된 것과는 다른 네트워크 인터페이스를 참조하고 있는 서버에 클라이언트 프로그램을 가지고 접속하기 위해서는, 아래의 방법 중에 하나를 사용한다:


  • 리모트 서버에 TCP/IP를 경유해서 접속하기 위해서는 클라이언트를 --host=host_name --port=port_number와 함께 시작하고, 로컬 서버에 접속하기 위해서는 --host=127.0.0.1 --port=port_number를 가지고 시작하거나, 유닉스 소켓 파일 또는 윈도우 네임드 파이프를 사용해서 로컬 서버에 접속을 할 경우에는 --host=localhost --socket=file_name을 사용해서 클라이언트를 시작한다.
  • MySQL 4.1 이후에는, TCP/IP를 경유한 클라이언트 접속은 --protocol=tcp를, 유닉스 소켓 파일을 경유하는 접속은 --protocol=socket를, 네임드 파이프 경유 접속은 --protocol=pipe를, 공유 메모리 경유 접속은 --protocol=memory를 사용한다. TCP/IP 접속의 경우에는 --host 와 --port 옵션도 함께 지정해야 한다. 유닉스 소켓 파일 또는 윈도우 네임드 파이프 이름을 위해서는 --socket 옵션을, 공유 메모리 이름을 위해서는 --shared-memory-base-name 옵션을 함께 지정하도록 한다. 공유 메모리 접속은 윈도우에서만 지원된다.
  • 유닉스에서는, 클라이언트를 시작하기 전에 MYSQL_UNIX_PORT 와 MYSQL_TCP_PORT 환경 변수를 설정해서 유닉스 소켓 파일과 TCP/IP포트 번호를 가리키도록 한다. 특정 유닉스 소켓 파일 또는 포트 번호를 일반적으로 사용한다면, .login 파일에 이러한 환경 변수를 설정하는 명령어를 입력해서 여러분이 로그인 할 때마다 적용되도록 만든다.
  • 옵션 파일의 [client] 그룹 안에 디폴트 유닉스 소켓 파일과 TCP/IP포트 번호를 지정한다. 예를 들면, 윈도우에서는 C:\my.cnf, 유닉스에서는 홈 디렉토리의 .my.cnf 파일을 사용하도록 한다.
  • C 프로그램에서는, mysql_real_connect()에 유닉스 소켓 파일과 포트 번호 인수를 지정할 수가 있다. 또한, mysql_options()를 실행해서 프로그램 읽기 옵션 파일을 가질 수도 있다.
  • 만약에 Perl DBD::mysql 모듈을 사용한다면, 여러분은 MySQL 옵션 파일에서 옵션을 읽을 수가 있다. 예를 들면:

$dsn = "DBI:mysql:test;mysql_read_default_group=client;"              
. "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
$dbh = DBI->connect($dsn, $user, $password);


출처 : MySQL 코리아