구성환경
OS: CentOS6.6
mysql : rpm package 설치
server1: fox1 , 192.168.0.94
server2: fox2 , 192.168.0.95
mysql Replication : master-slave 방식 구성. server1 이 master, server2를 slave로 설정.(slave 는 여러 대를 설정 할 수 있지만, 여기서는 1대만 설정한다.)
참고 문서: https://dev.mysql.com/doc/refman/5.0/en/replication-howto.html
I. Mysql Master-Slave Replication
1. MySQL 설치(server1, server2)
RPM 패키지로 설치하기로 함. 설치 후에는 mysql_secure_installation 커맨드로, root 비밀번호를 설정하고, 불필요한 database, 계정 등을 제거한다.
# yum install mysql-server mysql # /usr/bin/mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MySQL to secure it, we'll need the current password for the root user. If you've just installed MySQL, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MySQL root user without the proper authorisation. Set root password? [Y/n] y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] y ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y ... Success! By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL!
2. master 서버 설정(server1)
/etc/my.cnf 의 [mysql] 절에 아래 내용을 추가한다. 여기서 fox라는 이름의 데이터베이스만 replication 하기로 한다.
## Replication related settings ... # For Replication master... server-id=1 log-bin binlog_do_db = fox
mysqld 를 다시 시작한다.
# /etc/init.d/mysqld restart
3. Replication Slave 설정(server2).
/etc/my.cnf의 [mysqld] 절에, 아래 내용을 추가한다. server-id 는 master와 다른 값을 사용해야 한다.
[mysqld] ... # for replication slave... server-id=2
수정 후 mysql서버를 다시 시작한다.
4. Replication을 위한 사용자 만들기(server1).
각 slave 들은 master접속을 위한 계정이 필요하다. 따라서, replication master에 mysql 계정을 만들어야 한다.
Replication 권한을 가지는 mysql 계정 repli 를 아래와 같은 방법으로 만든다.
mysql> grant replication slave on *.* to 'repli'@'%' identified by 'repli'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
5. replication master의 현재 binary log 상태 얻기(server1).
slave 에서 replication을 구성하기 위해서는 binary log로 master의 현재 상태를 결정한다. 이 정보는 slave의 replication 프로세스를 시작하기 전에 필요하다.
먼저, master에 접속하여 아래 쿼리를 실행한다.
mysql> flush tables with read lock; Query OK, 0 rows affected (0.02 sec)
아래 쿼리로 현재 binary log의 화일명과, position을 확인한다. 이것은, slave 설정에 필요하다.
mysql> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | mysqld-bin.000001 | 227 | fox | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
6. snapshot 만들기(server1)
master의 스냅샷을 만드는 방법은 두 가지가 있다. 첫번째는 mysqldump를 이용하는 방법, 두번째는 raw 데이타 화일을 이용하는 방법 이다.
6.1. mysqldump 를 이용하는 방법.
master(server1)에서, 아래와 같은 방법으로 dump를 받는다.
# mysqldump -u root -p --all-databases --master-data > mysql.sql Enter password: -- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
6.2 datafile을 복사하는 방법
master(server1)에서, 아래와 같은 방법으로 datafile을 복사한다.(fox 데이터베이스만 적용할 것이므로,fox만 tar로 묶는다).
# cd /var/lib/mysql # tar cvf fox.tar ./fox
7. slave에서 master 설정(server2)
server1에서 만든 스냅샷을 server2로 가져와서, import한다.(여기서는, 6.1방법으로 한다.)
# scp root@192.168.0.94:/root/db.sql /root/ # mysql -u root -p < db.sql
slave에서 아래 쿼리로 master를 설정한다. 이때, master_log_file과, master_log_pos는 master에서 show master status 문으로 확인한다.
mysql> change master to -> master_host='fox1', -> master_user='repli', -> master_password='repli', -> master_log_file='mysqld-bin.000001', -> master_log_pos=227; Query OK, 0 rows affected (0.18 sec)
아래 커맨드로 slave를 실행한다.
mysql> start slave; Query OK, 0 rows affected (0.00 sec)
8. 테스트
server1에서 스냅샷을 만들기 전에, fox라는 데이타베이스를 만들고, test1 테이블을 만들었다.
mysql> desc test1; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | ID | varchar(20) | YES | | NULL | | | NAME | varchar(20) | YES | | NULL | | | PHONE | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
server2에서 slave를 실행하고, server1에서 데이터를 insert또는 delete 해본다.
이후 server2 에서, 동일한 테이블을 select 했을 때, server1에서 입력한 데이터가 나옴을 볼 수 있다.
server1 mysql> select * from test1; +------+-----------+--------------+ | ID | NAME | PHONE | +------+-----------+--------------+ | fox | snowfox | 010-111-1111 | | wolf | snow wolf | 010-222-1111 | | kat | katherin | 010-222-3333 | | cat | catin | 010-444-1234 | +------+-----------+--------------+ 4 rows in set (0.00 sec) mysql> insert into test1 values('dog', 'big dog', '010-555-5555'); Query OK, 1 row affected (0.00 sec) mysql> select * from test1; +------+-----------+--------------+ | ID | NAME | PHONE | +------+-----------+--------------+ | fox | snowfox | 010-111-1111 | | wolf | snow wolf | 010-222-1111 | | kat | katherin | 010-222-3333 | | cat | catin | 010-444-1234 | | dog | big dog | 010-555-5555 | +------+-----------+--------------+ 5 rows in set (0.00 sec)
이제, Server2 에서 확인해본다.
mysql> select * from test1; +------+-----------+--------------+ | ID | NAME | PHONE | +------+-----------+--------------+ | fox | snowfox | 010-111-1111 | | wolf | snow wolf | 010-222-1111 | | kat | katherin | 010-222-3333 | | cat | catin | 010-444-1234 | | dog | big dog | 010-555-5555 | +------+-----------+--------------+ 5 rows in set (0.00 sec)
server1에서 insert한 dog관련 내용이 동일하게 출력 됨을 볼 수 있다.
— Mysql replication을 Master-Slave 로 사용 한다면 아래 과정은 필요없다.
II. Mysql Master-Master Replication.
Master-Master Replication은 위에서 구성한 , master-slave구성에서 기존 slave 를 master로 만들고, 기존 master에는 slave를 추가하여 간단하게 구성 할 수 있다.
즉, server1: master1, server2: slave1 의 구성에서 server1: master1 slave2, server2: slave1, master2의 구조가 된다.
Server1의 구성은 변경할 필요가 없다. server2 에서 아래와 같은 작업을 해 준다.
1. my.cnf 수정.(server2)
/etc/my.cnf를 아래와 같이 수정한다. server-id = 2 다음에 아래 내용을 추가한다.
server-id=2 log-bin = /var/log/mysql-bin.log binlog_do_db = fox
mysqld를 재시작한다.
# service mysqld restart Stopping mysqld: [ OK ] Starting mysqld: [ OK ]
2. replilcation을 위한 mysql 계정 만들기(server2)
mysql> grant replication slave on *.* to 'repli'@'%' identified by 'repli'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
3. server1, server2의 mysql을 재실행한다.
# service mysqld restart
server1, server2 의 mysql에서 slave를 실행한다.
mysql> start slave; Query OK, 0 rows affected, 1 warning (0.00 sec)
4. server2에서 server1을 master로 설정한다.
server2 에서, 아래 내용 확인
mysql> show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | mysqld-bin.000003 | 331 | fox | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
server1 에서,
mysql> stop slave; Query OK, 0 rows affected (0.00 sec) mysql> change master to -> master_host='fox2', -> master_user='repli', -> master_password='repli', -> master_log_file='mysqld-bin.000003', -> master_log_pos=331; Query OK, 0 rows affected (0.10 sec) mysql> start slave; Query OK, 0 rows affected (0.00 sec)
5. 테스트
server1이나 server2에서 테이블을 만들거나 삭제 또는 기존테이블에 데이타를 넣거나 삭제해 본다.
한쪽에서 변경한 내용이 다른쪽에서 동시에 적용됨을 확인할 수 있다.
——-
참고: mysql 테이블이 MyASM 방식으로 저장되었는지, InnoDB 방식으로 저장되었는지 확인하는 방법.
아래와 같은 query로 확인 가능하다.(mysql의 mysql의 user 테이블로 확인하는 경우.)
mysql> select engine from information_schema.tables where table_name='user' and table_schema='mysql'; +--------+ | engine | +--------+ | MyISAM | +--------+ 1 row in set (0.00 sec)