18 複製 18 複製... 1 18.1 複製配置... 3 18.1.1 基於Binary Log的資料庫複製配置... 3 18.1.2 配置基於Binary log的複製... 3 18.1.2.1 設置複製master的配置... 3 18.1.2.2 創建複製要用的用戶... 4 18. ...
18 複製
18.2.1.3 確定binary log中安全和非安全語句
18.2.5.1 評估資料庫級別複製和bianry log選項
複製是一個MySQL服務master,複製到另外一個服務slave。複製預設是非同步的。Slave不需要一直連接到slave獲取master的更新。根據配置,你可以複製所有的資料庫,或者指定資料庫,或者資料庫內的幾個表。
MySQL複製的有點:
1.可以分散負荷到多個slave來提高性能。在這個環節,所有的寫必須在master執行,讀可以在slave上執行。這個模式可以提高些性能。也提高讀性能。
2.數據安全,因為數據被覆制到slave,slave可以暫停複製進場,可以執行備份,不會損壞master上的數據。
3.分析,live數據可以在master上創建,分析行為可以在slave上執行,不會影響master。
4.長距離數據分佈,你可以使用在本地創建遠程數據的副本,不需要訪問master。
MySQL 5.7支持不同的複製方法。傳榮的方法是基於master的binlog,根據log文件的positions來同步。新的方法是基於全局事務標示(GTIDs)是事務標示因此不需要log文件和位置,簡化了很多複製任務。複製使用GTIDs保證了master和slave 的一致性,只要在master上提交的事務也會在slave 上提交。關於使用GTIDs複製具體看: Section 18.1.3, “Replication with Global Transaction Identifiers”
在MySQL中的複製支持不同類型的同步。通常是單路非同步的同步,一個服務作為master,多個作為slave。在MySQL5.7,半同步複製也被支持,擴展了非同步複製。使用半同步複製,在事務提交回覆session之前,保證至少有一個slave接受到通知並且接受並且記錄了事務的日誌。MySQL也支持延遲複製比如slave至少延遲指定時間的日誌。
有2個核心類型的複製,基於語句的複製,語句行的複製。也可以使用混合複製類型。
複製通過一些列的選項和變數控制。
當你使用複製來解決各種不同問題,包括性能,支持不同資料庫的備份。和一些列解決方案來緩解系統錯誤。
18.1 複製配置
18.1.1 基於Binary Log的資料庫複製配置
根據資料庫的配置,Binary log的格式不同。Slave配置讀取master的binary log並且執行。
沒個slave複製整個binary log。Slave負責哪個語句要被執行。除非你執行了,否則搜有binary log 都會被執行到slave。你可以配置slave指定只執行那些資料庫或者表的binary log。
每個slave都保留了一個binary log 的相關記錄,記錄已經從master傳過來的文件名和文件中的位置。也就是說多個slave 可以連接到master並且執行不同的binary log部分。因為slave控制了這些進程,獨立的slave可以連接或者不連接到服務,不會對master操作影響。也是因為每個slave記錄了當前Binary log 的位置,可以讓slave斷開之後重新連接。
Master和每個slave必須配置一個唯一的id,server-id,另外每個slave必須配置關於master的一些信息,具體可以看change master to的參數。
18.1.2 配置基於Binary log的複製
大致步驟如下:
1.在master,啟動binary log配置server id。可能需要重啟服務。
2.每個slave想要連接的master,必須配置server id,可能需要重啟服務。
3.可選,創建一個獨立的用戶來驗證,讀取binary log。
4.在創建數據快照或者複製進程之前,在master上需要記錄當前binary log 的位置。你需要配置slave這樣slave知道從哪裡開始執行事件。
5.如果你已經有了數據在master上,想要使用它來同步到slave,你需要創建一個數據快照,並且複製到slave。存儲引擎會影響創建快照的方式,當你使用MyISAM你必須停止語句獲取READ-LOCK,獲取當前的binary log並且導出數據。在允許master繼續執行語句之前。如果你沒有停止服務導出數據,master 的狀態信息就不匹配,導致slave的資料庫損壞或者不一致。如果你使用innodb,不需要使用read-lock。
6.配置slave連接到master 的信息比如host,login,binary log文件名和位置。
18.1.2.1 設置複製master的配置
為了配置master使用binarylog文件,你必須啟動binary log並且設置server id。如果沒有被設置,需要重啟服務。
Binary Log必須被啟動,因為binary log是傳輸修改的基礎。如果binary log 沒有啟動,那麼就不能配置複製。
在複製組內的每個服務必須配置唯一的server id。這個ID用來表示唯一的服務,必須是1到2^32-1中的一個值。
配置binary log和server id選項,關閉MySQL服務並且修改my.cnf在mysqld的配置下設置log-bin和server-id選項。如果已經存在那個根據需要來修改。例如:
[mysqld]
log-bin=mysql-bin
server-id=
修改之後需要重啟。
18.1.2.2 創建複製要用的用戶
每個slave連接到master使用MySQL用戶名和密碼,所以必須有個用戶賬號在master,slave可以用來連接。任何賬號可以使用這個操作,必須要有REPLICATION SLAVE許可權。你可以根據選擇為不同的slave創建不同的賬號,或者使用相同的賬號連接到master。
儘管你沒有創建指定的用戶用於複製,要註意複製用戶名密碼是明文保存在碼,master信息表或者文件中。
使用create user來創建用戶。授予複製需要的許可權。如果你創建賬號是為了複製,只需要REPLICATION SLAVE許可權就可以了。
mysql> CREATE USER 'repl'@'%.mydomain.com' IDENTIFIED BY 'slavepass';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com';
18.1.2.3 獲取複製Binary Log坐標
為了配置 slave啟動複製進程你需要master 當前binary log的坐標。如果master已經運行但是沒有啟動binary log那麼SHOW MASTER STATUS和mysqldump –master-data是空的。這個時候只要指定文件為空,位置為4.
如果master已經設置了binary log,使用以下過程來獲取:
1.啟動會話連接到master,以只讀模式刷新所有的表,flush tables with read lock。
2.在其他會話中,使用SHOW MASTER STATUS語句回去binary log的位置和文件。
18.1.2.4 選擇同步數據快照的方法
如果master資料庫包含的數據需要複製到所有的slave。有2個複製數據的方法:
1.使用mysqldump導出數據
2.如果是binary portable文件你可以複製原生的數據文件。比mysqldump可能要有效的多。
18.1.2.4.1 使用mysqldump創建快照
shell> mysqldump --all-databases --master-data > dbdump.db
使用--master-data會自動生成change master語句。
18.1.2.4.2 使用原生數據文件創建數據快照
可以使用企業版的備份工具mysqlbackup備份,也可以使用xtrabackup進行備份。
18.1.2.5配置Slave
配置slave前,確保以下步驟:
1.配置MySQL Master
2.獲取master狀態信息
3.在master上釋放讀鎖
18.1.2.5.1 設置Slave配置
每個複製slave必須有一個唯一的server id。重啟服務生效。
如果slave server id已經沒有被設置,或當前值server id和master的沖入,需要重新設置一個server id。如果有多個slave每個slave 都要有一個唯一的server id。slave上沒必要啟動binary log。但是如果你在slave 上啟動了binary log,你可以使用slave的binary log備份和恢復。也可以把slave作為複雜拓撲的一部分。比如這個slave對於其他slave是master。
18.1.2.5.2 在slave設置master
為了slave可以和master交互,需要配置master的連接信息。使用如下語句:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
Change master to語句也有其他選項比如使用SSL。Change master to的所有選項可以查看:Section 13.4.2.1, “CHANGE MASTER TO Syntax”.
如果master有數據可以導入到slave中,導入方法如下:
1.如果有一個快照資料庫導入,查看: Section 18.1.2.5.3, “Setting Up Replication between a New Master and Slaves”.
2.如果你沒有快照資料庫導入可以看:Section 18.1.2.5.3, “Setting Up Replication between a New Master and Slaves”.
18.1.2.5.3 在新的master和slave配置複製
當沒有快照導入,為新的master配置slave。在所有slave都要執行
1.啟動MySQL Slave並且連接
2.執行change master to配置master replication server。
這個方法也可以使用在設置一個新的master,已經有了數據dump要導入的master上。
如果配置複製環境使用了其他伺服器的數據來配置新master,可以dump文件來生成型的服務。資料庫更新會自動傳播到slave。
18.1.2.5.4 使用已經存在數據來配置複製
當配置複製但是已經有數據了,在複製啟動錢,把快照從master傳輸到slave。步驟如下:
1.啟動slave,但是使用—skip-slave-start,不啟動slave。
2.導入dump文件
如果使用raw data創建了快照:
1.把數據文件解壓倒slave數據目錄
2.啟動slave,--skip-slave-start
3.使用master的相關信息來配置slave。獲取change master to要的信息。
4.啟動slave
你已經處理了過程,slave連接到master並且複製master上所有的更新。
1.如果master忘記了設置server-id,slave不能連接
2.如果slave忘記了server-id,slave的error日誌就會有以下錯誤
Warning: You should set server-id to a non-0 value if master_host is set; we will force server id to 2, but this MySQL server will not act as a slave.
slave使用的信息存放在master info中,跟蹤了已經處理了多少master的binary log。這個數據可以是文件或者表的方式,有—master-info-repository來決定。當參數為file,你可以在數據文件中找到2個文件master.info和relay-log.info。如果為table那麼信息保存在mysql下的master_slave_info表中。如果刪除表或者文件master信息就會丟失。
18.1.2.6 為複製環境增加一個slave
可以在不停止master的情況下為複製環境增加一個slave。為新的slave配置一個server-id。
1.關閉存在的slave
2.複製數據目錄到新的slave。你可以使用tar打包,也可以直接cp或者rsync。
當心的複製slave加入,往往會發生以下常見錯誤:
071118 16:44:10 [Warning] Neither --relay-log nor --relay-log-index were used; so
replication may break when this MySQL server acts as a slave and has his hostname
changed!! Please use '--relay-log=new_slave_hostname-relay-bin' to avoid this problem.
071118 16:44:10 [ERROR] Failed to open the relay log './old_slave_hostname-relay-bin.003525'
(relay_log_pos 22940879)
071118 16:44:10 [ERROR] Could not find target log during relay log initialization
071118 16:44:10 [ERROR] Failed to initialize the master info structure
這個錯誤是因為—relay-log沒有指定導致的,relay log文件以host名字開頭,有一個index文件,--relay-log-index文件控制。
為了避免這個問題使用,--relay-log使用和老的slave一樣的值。如果選項沒有被顯示設置使用hostname-relay-bin。設置--relay-log-index和老的slave一樣。如果沒有顯示設置預設為hostname-relay-bin.index。如果你已經設置了relay log也是有以上的錯誤:
a.如果沒有設置relay log設置,在新的slave上關閉slave,stop slave。如果來的slave也啟動了,老的slave也需要關閉。
b.複製老的slave中的relay log index文件內容到新的slave relay log index文件中。
c.執行重命名
3.複製master信息和relay log信息內容到新的slave。
4.啟動已經存在的slave
5.在新的slave 上給一個新的server-id
6.啟動新的slave,使用master信息的內容來啟動。
18.1.3 基於全局事務標示符的複製
18.1.3.1 GTID概述
GTID是事務的唯一標示。並不是對某一個服務來說是唯一標示,是所有服務內都是唯一的。
GTID有2部分組成,有冒號分隔如下: