本文簡單說明如何設定兩台 MySQL server,讓它們彼此互相備份資料(Master-master 模式)。雖然這樣的設定通常是支援高可用性(high availability) 平台的一部分,但本文不包含如何完成其他 HA 的工作。設定兩台 MySQL 伺服器互相備份,主要目的就是要確認資料的安全性;同時也提高可用性。

假設

底下假設兩台伺服器的名稱跟 IP,  分別為 host1(192.168.0.1) 跟 host2(192.168.0.2)。

  • OS: CentOS 6.2
  • MySQL 版本: 5.1.61

步驟

按照底下小節所描述的步驟,逐一完成設定。

在兩台機器完成 MySQL 軟體基本的安裝

在 CentOS/RHEL 下,只需要以 root 執行:

1
# yum -y install mysql-server

修改 host1 的 / etc/my.cnf 內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

log-bin=/var/log/mysql/mysql-bin.log
#binlog-do-db=<database name>  # input the database which should be replicated
binlog-ignore-db=mysql            # input the database that should be ignored for replication
binlog-ignore-db=test

server-id=1

auto_increment_increment=2
auto_increment_offset=1

[mysqld_safe]

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

在 host1 建立 MySQL log 的專屬目錄

1
2
[email protected]# mkdir -p /var/log/mysql
[email protected]# chown mysql:mysql /var/log/mysql

重開 host1 上的 MySQL 伺服器

1
[email protected]# /etc/init.d/mysqld restart

建立給 host2 使用的 MySQL 帳戶

使用 MySQL 的命令列客戶端,執行下列指令:

1
2
3
4
5
6
7
8
9
10
11
[email protected]#  mysql -u root
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replica2'@'192.168.0.%' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000004 | 106       |              | mysql,test       |
+------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
mysql> quit

修改 host2 的 / etc/my.cnf 內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0

log-bin=/var/log/mysql/mysql-bin.log
binlog-do-db=<database name>  # input the database which should be replicated
binlog-ignore-db=mysql            # input the database that should be ignored for replication
binlog-ignore-db=test

server-id=2

auto_increment_increment=2
auto_increment_offset=2

[mysqld_safe]

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

在 host2 建立 MySQL log 的專屬目錄

1
2
[email protected]# mkdir -p /var/log/mysql
[email protected]# chown mysql:mysql /var/log/mysql

重啟 host2 上的 MySQL

1
[email protected]# /etc/init.d/mysqld restart

指定 host2 上的 MySQL 的 master 為 host1

注意’mysql-bin.000004’跟 106 是來自步驟 5。

1
2
3
4
5
6
7
8
9
10
11
[email protected]# mysql -u root
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica1', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=106;

mysql> START SLAVE;
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000001 | 106       |              | mysql,test     |
+------------------+-----------+--------------+------------------+
1 row in set (0.01 sec)

建立給 host1 使用的 MySQL 同步用帳戶

1
2
3
4
5
6
7
8
9
10
11
[email protected]#  mysql -u root
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replica2'@'192.168.0.%' IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
mysql> show master status;
+------------------+-----------+--------------+------------------+
| File             | Position  | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000001 | 106       |              | mysql,test       |
+------------------+-----------+--------------+------------------+
1 row in set (0.01 sec)
mysql> quit

指定 host1 上的 MySQL 的 master 為 host2

1
2
3
4
5
[email protected]# mysql -u root

mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica2', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;

mysql> START SLAVE;

結語

在線的生產環境(production environment),如果使用 MySQL 作為資料庫的服務軟體的話,常常會設定雙主 (master-master) 備援。同時會設置不定數量的 slave 伺服器作為像是遠端備份或者分析資料庫的目的。