데이터베이스 · 3 min read · Oct 08, 2025

완벽한 로드 밸런스 및 고가용성 웹 클러스터: 2대의 서버에서 Xen을 실행하는 Ubuntu 8.04 하디 헤론 - 페이지 4

10. MySQL 복제 (web1, web2)

10.1 Mysql MySQL 5.0 설치하기

apt-get install mysql-server-5.0 mysql-client-5.0

복제가 작동할 수 있도록 하려면 MySQL이 모든 인터페이스에서 수신 대기하도록 해야 하므로 /etc/mysql/my.cnf에서 bind-address = 127.0.0.1 줄을 주석 처리합니다:

vi /etc/mysql/my.cnf

[...]
# skip-networking 대신 기본값은 이제 localhost에서만 수신 대기하는 것입니다.
# 이는 더 호환성이 있으며 덜 안전하지 않습니다.
#bind-address           = 127.0.0.1
[...]

그 후 MySQL을 재시작합니다:

/etc/init.d/mysql restart

web1에서

이제 web2.example.com이 MySQL 데이터베이스에 접근할 수 있도록 복제 사용자 slave2_user를 설정합니다:

mysql -u root -p

MySQL 셸에서 다음 명령을 실행합니다:

GRANT REPLICATION SLAVE ON . TO ‘slave2_user’@’%’ IDENTIFIED BY ‘slave2_password’;
FLUSH PRIVILEGES;
quit;

web2에서

이제 web2.example.com에서 마지막 두 단계를 다시 수행합니다:

mysql -u root -p

GRANT REPLICATION SLAVE ON . TO ‘slave1_user’@’%’ IDENTIFIED BY ‘slave1_password’;
FLUSH PRIVILEGES;
quit;

web1 및 web2에서

이제 나중에 메일 서버에 사용될 데이터베이스를 생성합니다:

mysqladmin -u root -p create mail

다음으로 MySQL 셸로 이동합니다:

mysql -u root -p

MySQL 셸에서 SELECT, INSERT, UPDATE, DELETE 권한을 가진 사용자 mail_admin을 생성합니다. 이 사용자는 Postfix와 Courier가 메일 데이터베이스에 연결하는 데 사용됩니다:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.
TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;
quit;

10.2 복제 설정하기

이제 /etc/mysql/my.cnf에서 마스터-마스터 복제를 설정합니다. 마스터-마스터 복제에 대한 중요한 구성 옵션은 auto_increment_increment와 auto_increment_offset입니다:

  • auto_increment_increment는 연속적인 AUTO_INCREMENT 값 간의 증가를 제어합니다.
  • auto_increment_offset은 AUTO_INCREMENT 열 값의 시작 지점을 결정합니다.

N개의 MySQL 노드(N=2인 경우)가 있다고 가정하면, 모든 노드에서 auto_increment_increment의 값은 N이며, 각 노드는 auto_increment_offset에 대해 서로 다른 값을 가져야 합니다(1, 2, …, N).

이제 두 개의 MySQL 노드를 구성해 보겠습니다:

web1에서

vi /etc/mysql/my.cnf

다음 줄을 “[mysqld]” 바로 아래에 추가합니다:

server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
#eth1에 크로스오버 케이블을 설치하지 않았다면 192.168.1.105를 사용하세요
master-host = 192.168.0.105
master-user = slave1_user
master-password = slave1_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

그리고 “max_binlog_size” 줄을 수정합니다:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

web2에서

vi /etc/mysql/my.cnf

server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
#eth1에 크로스오버 케이블을 설치하지 않았다면 192.168.1.104를 사용하세요
master-host = 192.168.0.104
master-user = slave2_user
master-password = slave2_password
master-connect-retry = 60
replicate-do-db = mail
log-bin = /var/log/mysql/mysql-bin.log
binlog-do-db = mail
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index

그리고 “max_binlog_size” 줄을 수정합니다:

[...]
max_binlog_size         = 500M
[...]

/etc/init.d/mysql restart

web1 및 web2에서

이제 복제를 시작합니다:

mysql -u root -p

MySQL 셸에서 다음 명령을 실행합니다:

reset master;
stop slave;
reset slave;

이제 다음을 실행합니다:

web1에서

CHANGE MASTER TO MASTER_HOST=’192.168.0.105’, MASTER_USER=’slave1_user’, MASTER_PASSWORD=’slave1_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

web2에서

CHANGE MASTER TO MASTER_HOST=’192.168.0.104’, MASTER_USER=’slave2_user’, MASTER_PASSWORD=’slave2_password’, MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=98;

start slave;
quit;

이제 복제가 작동해야 합니다.

10.3 복제 테스트하기

web1 및 web2에서

mysql -u root -p

MySQL 셸에서 다음 명령을 실행합니다:

show slave status \G;

출력에는 다음과 같은 3개의 중요한 줄이 있어야 합니다:

[...]
Slave_IO_State: Waiting for master to send event
[...]
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: mail
[...]

이제 mysql을 종료할 수 있습니다:

quit;

web1에서

테스트를 위해 web1.example.com에 데이터를 삽입합니다. 이는 다음 장에서 메일에 사용됩니다:

mysql -u root -p

MySQL 셸에서 다음 명령을 실행합니다:

use mail;

다음 테이블을 생성합니다:

CREATE TABLE domains (
domain varchar(50) NOT NULL,
transport varchar(128) NOT NULL default ‘smtp:[192.168.1.104]’,
PRIMARY KEY (domain) )
TYPE=MyISAM;

CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
TYPE=MyISAM;

CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) TYPE=MyISAM;

CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) TYPE=MyISAM;

quit;

이 새로 생성된 테이블은 복제 덕분에 web2 메일 데이터베이스에도 나타나야 합니다.

web2에서

이제 확인합니다:

mysql -u root -p

MySQL 셸에서 다음 명령을 실행합니다:

use mail;
show tables;

출력은 다음과 같아야 합니다:

+----------------+
| Tables_in_mail |
+----------------+
| domains         |
| forwardings    |
| transport        |
| users              |
+----------------+
4 rows in set (0.00 sec)

quit;

복제가 작동하는 것을 확인합니다.

10.4 ldirectord용 사용자 생성하기

이제 ldirectord.php 파일에서 데이터베이스에 연결할 사용자를 생성합니다.

web1 및 web2에서

mysql -u root -p

MySQL 셸에서 다음 명령을 실행합니다:

GRANT USAGE ON . TO ‘ldirectord’@’localhost’ IDENTIFIED BY ‘LDIRECTORD_PASSWORD’;
quit;

이제 브라우저에서 다음 주소로 이동하면:

http://192.168.1.104/ldirectord.php

http://192.168.1.105/ldirectord.php

화면에 다음과 같이 표시되어야 합니다:

MySQL에 연결됨

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.