本文簡單說明如何設定兩台 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 執行:
修改 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.logbinlog-ignore-db=mysql binlog-ignore-db=test server-id=1 auto_increment_increment=2 auto_increment_offset=1 [mysqld_safe] log -error=/var/log /mysqld.logpid-file=/var/run/mysqld/mysqld.pid
在 host1 建立 MySQL log 的專屬目錄
重開 host1 上的 MySQL 伺服器
建立給 host2 使用的 MySQL 帳戶
使用 MySQL 的命令列客戶端,執行下列指令:
1 2 3 4 5 6 7 8 9 10 11 root@host1 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.logbinlog-do-db=<database name> binlog-ignore-db=mysql binlog-ignore-db=test server-id=2 auto_increment_increment=2 auto_increment_offset=2 [mysqld_safe] log -error=/var/log /mysqld.logpid-file=/var/run/mysqld/mysqld.pid
在 host2 建立 MySQL log 的專屬目錄
重啟 host2 上的 MySQL
指定 host2 上的 MySQL 的 master 為 host1
注意’mysql-bin.000004’跟 106 是來自步驟 5。
1 2 3 4 5 6 7 8 9 10 11 root@host2 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 root@host1 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 root@host2 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 伺服器作為像是遠端備份或者分析資料庫的目的。