MySQL 主從同步配置
1. MySQL 主從同步配置
1.1. 基礎信息
數據庫主服務器IP:127.0.0.1
數據庫從服務器IP:192.168.1.31
1.2. 主服務器配置文件my.ini配置 (master)
[mysqld]
#打開日誌(主機需要打開) 表示二進制變更日值
log-bin=mysql-bin
#服務器唯一id
server-id=1
#給從機同步的數據庫名稱
binlog-do-db=shenxianyun_console
binlog-do-db=shenxianyun_portal
binlog-do-db=test
#自動清理1天前的log文件
expire_logs_days=1
1.3. 重啟主MYSQL服務
service mysqld restart
1.4. 主數據庫授權同步數據庫的用戶
- 授權
GRANT REPLICATION SLAVE ON *.* TO ‘user‘@‘%‘ IDENTIFIED BY‘password’;
- 刷新權限
FLUSH PRIVILEGES;
- 查看主服務狀態
SHOW MASTER STATUS;
1.5. 從服務器配置文件my.ini配置(slave)
[mysqld]
#服務器id
server-id=2
#要從主機同步的庫
replicate-do-db=shenxianyun_console
replicate-do-db=shenxianyun_portal
replicate-do-db=test
#配置中繼日誌(一般可以不用)
#relay_log =
mysql-relay-bin
# slave將復制事件寫進自己的二進制日誌(後面會看到它的用處)。
#log_slave_updates = 1
#它防止改變數據(除了特殊的線程) 慎重使用
#read_only = 1
server_id是必須的,而且唯一。slave沒有必要開啟二進制日誌,但是在一些情況下,必須設置,例如,如果slave為其它slave的master,必須設置bin_log。在這裏,我們開啟了二進制日誌,而且顯示的命名(默認名稱為hostname,但是,如果hostname改變則會出現問題)。
relay_log配置中繼日誌,log_slave_updates表示slave將復制事件寫進自己的二進制日誌(後面會看到它的用處)。
有些人開啟了slave的二進制日誌,卻沒有設置log_slave_updates,然後查看slave的數據是否改變,這是一種錯誤的配置。所以,盡量使用read_only,它防止改變數據(除了特殊的線程)。但是,read_only並不很實用,特別是那些需要在slave上創建表的應用。
1.6. 重啟從MYSQL服務
service mysqld restart
1.7. 啟動slave (實現數據同步)
接下來就是讓slave連接master,並開始重做master二進制日誌中的事件。你不應該用配置文件進行該操作,而應該使用CHANGE MASTER TO語句,該語句可以完全取代對配置文件的修改,而且它可以為slave指定不同的master,而不需要停止服務器。如下:
- 配置slave服務器用於連接master服務器的參數
【註意:MASTER_LOG_FILE=‘mysql-bin.000001‘,MASTER_LOG_POS=594是通過前面的主數據庫SHOW MASTER STATUS;得到】
CHANGE MASTER TO MASTER_HOST=‘1.1.1.1‘,MASTER_USER=‘root‘, MASTER_PASSWORD=‘password‘,MASTER_LOG_FILE=‘mysql-bin.000001‘,MASTER_LOG_POS=594;
- 開啟SLAVE同步
start slave;
- 查看下slave狀態
show slave status;
當Slave_IO_Running和Slave_SQL_Running都為Yes,才說明主從復制成功
slave的I/O和SQL線程都已經開始運行,而且Seconds_Behind_Master不再是NULL。日誌的位置增加了,意味著一些事件被獲取並執行了。如果你在master上進行修改,你可以在slave上看到各種日誌文件的位置的變化,同樣,你也可以看到數據庫中數據的變化。
你可查看master和slave上線程的狀態。在master上,你可以看到slave的I/O線程創建的連接:
在master上輸入show processlist\G;
行2為處理slave的I/O線程的連接。
在slave服務器上運行該語句: show processlist;
行1為I/O線程狀態,行2為SQL線程狀態。
1.8. 添加新slave服務器
假如master已經運行很久了,想對新安裝的slave進行數據同步,甚至它沒有master的數據。
此時,有幾種方法可以使slave從另一個服務開始,例如,從master拷貝數據,從另一個slave克隆,從最近的備份開始一個slave。Slave與master同步時,需要三樣東西:
(1)master的某個時刻的數據快照;
(2)master當前的日誌文件、以及生成快照時的字節偏移。這兩個值可以叫做日誌文件坐標(log file coordinate),因為它們確定了一個二進制日誌的位置,你可以用SHOW MASTER STATUS命令找到日誌文件的坐標;
(3)master的二進制日誌文件。
可以通過以下幾中方法來克隆一個slave:
(1) 冷拷貝(cold copy)
停止master,將master的文件拷貝到slave;然後重啟master。缺點很明顯。
(2) 熱拷貝(warm copy)
如果你僅使用MyISAM表,你可以使用mysqlhotcopy拷貝,即使服務器正在運行。
(3) 使用mysqldump
使用mysqldump來得到一個數據快照可分為以下幾步:
<1>鎖表:如果你還沒有鎖表,你應該對表加鎖,防止其它連接修改數據庫,否則,你得到的數據可以是不一致的。如下:
mysql> FLUSH TABLES WITH READ LOCK;
< 2>在另一個連接用mysqldump創建一個你想進行復制的數據庫的轉儲:
shell> mysqldump --all-databases --lock-all-tables >dbdump.db
< 3>對表釋放鎖。
mysql> UNLOCK TABLES;
2. 復制的常用拓撲結構
復制的體系結構有以下一些基本原則:
(1) 每個slave只能有一個master;
(2) 每個slave只能有一個唯一的服務器ID;
(3) 每個master可以有很多slave;
(4) 如果你設置log_slave_updates,slave可以是其它slave的master,從而擴散master的更新。
MySQL不支持多主服務器復制(Multimaster Replication)——即一個slave可以有多個master。但是,通過一些簡單的組合,我們卻可以建立靈活而強大的復制體系結構。
1.9. 單一master和多slave
由一個master和一個slave組成復制系統是最簡單的情況。Slave之間並不相互通信,只能與master進行通信。如下:
如果寫操作較少,而讀操作很時,可以采取這種結構。你可以將讀操作分布到其它的slave,從而減小master的壓力。但是,當slave增加到一定數量時,slave對master的負載以及網絡帶寬都會成為一個嚴重的問題。
這種結構雖然簡單,但是,它卻非常靈活,足夠滿足大多數應用需求。一些建議:
(1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存儲引擎);
(2) 用一個slave作為備用master,只進行復制;
(3) 用一個遠程的slave,用於災難恢復;
1.10. 主動模式的Master-Master(Master-Master in Active-Active Mode)
Master-Master復制的兩臺服務器,既是master,又是另一臺服務器的slave。如圖:
主動的Master-Master復制有一些特殊的用處。例如,地理上分布的兩個部分都需要自己的可寫的數據副本。這種結構最大的問題就是更新沖突。假設一個表只有一行(一列)的數據,其值為1,如果兩個服務器分別同時執行如下語句:
在第一個服務器上執行:
mysql> UPDATE tbl SET col=col + 1;
在第二個服務器上執行:
mysql> UPDATE tbl SET col=col * 2;
那麽結果是多少呢?一臺服務器是4,另一個服務器是3,但是,這並不會產生錯誤。
實際上,MySQL並不支持其它一些DBMS支持的多主服務器復制(Multimaster
Replication),這是MySQL的復制功能很大的一個限制(多主服務器的難點在於解決更新沖突),但是,如果你實在有這種需求,你可以采用MySQL Cluster,以及將Cluster和Replication結合起來,可以建立強大的高性能的數據庫平臺。但是,可以通過其它一些方式來模擬這種多主服務器的復制。
1.11. 主動-被動模式的Master-Master(Master-Master in Active-Passive Mode)
這是master-master結構變化而來的,它避免了M-M的缺點,實際上,這是一種具有容錯和高可用性的系統。它的不同點在於其中一個服務只能進行只讀操作。如圖:
1.12. 帶從服務器的Master-Master結構(Master-Master with Slaves)
這種結構的優點就是提供了冗余。在地理上分布的復制結構,它不存在單一節點故障問題,而且還可以將讀密集型的請求放到slave上。
MySQL 主從同步配置