主從原理
master服務器將資料的改變記錄二進制binlog日志,當master上的資料發生改變時,則將其改變寫入二進制日志中;slave服務器會在一定時間間隔內對master二進制日志進行探測其是否發生改變,
當master服務器資料發生變化,則slave開始一個I/O Thread請求master二進制事件,同時maser節點為每個I/O執行緒啟動一個dump執行緒,用于向其發送二進制事件,并保存至從節點本地的中繼日志Relay_Log_File中,從節點將啟動SQL Thread從中繼日志中讀取二進制日志,在本地重放,使得其資料和主節點的保持一致,最后I/O Thread和SQL Thread將進入睡眠狀態,等待下一次被喚醒,
注意幾點:
1--master將操作陳述句記錄到binlog日志中,然后授予slave遠程連接的權限(master一定要開啟binlog二進制日志功能;通常為了資料安全考慮,slave也開啟binlog功能),
2--slave開啟兩個執行緒:IO執行緒和SQL執行緒,其中:IO執行緒負責讀取master的binlog內容到中繼日志relay log里;SQL執行緒負責從relay log日志里讀出binlog內容,并更新到slave的資料庫里,這樣就能保證slave資料和 master資料保持一致了,
3--Mysql復制至少需要兩個Mysql的服務,當然Mysql服務可以分布在不同的服務器上,也可以在一臺服務器上啟動多個服務,
4--Mysql復制最好確保master和slave服務器上的Mysql版本相同(如果不能滿足版本一致,那么要保證master主節點的版本低于slave從節點的版本)
5--master和slave兩節點間時間需同步
1.1 Mysql復制的流程

1、第一階段
Mysql復制程序的第一部分就是master記錄二進制日志,在每個事務更新資料完成之前,master在二日志記錄這些改變,MySQL將事務串行的寫入二進制日志,即使事務中的陳述句都是交叉執行的,在事件寫入二進制日志完成后,master通知存盤引擎提交事務,
2、第二階段
就是slave將master的binary log拷貝到它自己的中繼日志,首先,slave開始一個作業執行緒——I/O執行緒,I/O執行緒在master上打開一個普通的連接,然后開始binlog dump process,Binlog dump process從master的二進制日志中讀取事件,如果已經跟上master,它會睡眠并等待master產生新的事件,I/O執行緒將這些事件寫入中繼日志,
3、第三階段
SQL slave thread(SQL從執行緒)處理該程序的最后一步,SQL執行緒從中繼日志讀取事件,并重放其中的事件而更新slave的資料,使其與master中的資料一致,只要該執行緒與I/O執行緒保持一致,中繼日志通常會位于OS的快取中,所以中繼日志的開銷很小,
此外,在master中也有一個作業執行緒:和其它MySQL的連接一樣,slave在master中打開一個連接也會使得master開始一個執行緒,復制程序有一個很重要的限制——復制在slave上是串行化的,也就是說master上的并行更新操作不能在slave上并行操作,
1.2 主從復制的前提條件
- 開啟binlog功能
- 主庫master節點建立同步資料賬號
- 從庫要配置master.info(CHANGE MASTER to...相當于配置密碼檔案和Master的相關資訊)
- start slave 開啟復制功能
主從配置
2.1 基礎環境
作業系統centos7.5,
| 節點名稱 | IP地址 |
|---|---|
| master | 192.168.150.185 |
| slave | 192.168.150.25 |
2.2 基礎配置
關閉selinux
#臨時關閉
setenforce 0
#永久關閉
vi /etc/sysconfig/selinux
...
...
SELINUX=disabled
...
...
關閉防火墻
systemctl stop firewalld&&systemctl stop iptables
時鐘同步配置
#安裝chrony
yum install chrony
#修改組態檔
vi /etc/sysconfig/selinux
...
...
server ntp1.aliyun.com iburst
...
...
#啟動服務
systemctl start chronyd
2.3 master主節點配置
修改組態檔
vim /etc/my.cnf
..........
[mysqld]
#資料庫唯一ID,主從的標識號絕對不能重復,
server-id=1
#開啟bin-log,并指定檔案目錄和檔案名前綴
log-bin=mysql-bin
#同步test資料庫,如果同時同步多個庫,就以此格式另寫幾行即可,如果不指定某個庫同步,洗掉此行,表示同步所有庫(除了ignore忽略的庫)
binlog-do-db=test
#不同步mysql系統資料庫,如果是多個不同步庫,就以此格式另寫幾行;也可以在一行,中間逗號隔開,
binlog-ignore-db=mysql
#設定二進制日志自動洗掉/過期的天數,避免占用磁盤空間,默認值為0,表示不自動洗掉,
expire_logs_days=7
#確保binlog日志寫入后與硬碟同步
sync_binlog=1
#bin-log日志檔案格式
binlog_format=ROW
溫馨提示:在主服務器上最重要的二進制日志設定是sync_binlog,這使得mysql在每次提交事務的時候把二進制日志的內容同步到磁盤上,即使服務器崩潰也會把事件寫入日志中,
sync_binlog這個引數是對于MySQL系統來說是至關重要的,他不僅影響到Binlog對MySQL所帶來的性能損耗,而且還影響到MySQL中資料的完整性,對于"sync_binlog"引數的各種設定的說明如下:
sync_binlog=0,當事務提交之后,MySQL不做fsync之類的磁盤同步指令重繪binlog_cache中的資訊到磁盤,而讓Filesystem自行決定什么時候來做同步,或者cache滿了之后才同步到磁盤,
sync_binlog=n,當每進行n次事務提交之后,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的資料強制寫入磁盤,
在MySQL中系統默認的設定是sync_binlog=0,也就是不做任何強制性的磁盤重繪指令,這時候的性能是最好的,但是風險也是最大的,因為一旦系統Crash,在binlog_cache中的所有binlog資訊都會被丟失,而當設定為“1”的時候,是最安全但是性能損耗最大的設定,因為當設定為1的時候,即使系統Crash,也最多丟失binlog_cache中未完成的一個事務,對實際資料沒有任何實質性影響,
從以往經驗和相關測驗來看,對于高并發事務的系統來說,“sync_binlog”設定為0和設定為1的系統寫入性能差距可能高達5倍甚至更多,
2.4 資料一致性
在同步前保證master和slave中的資料一致,新環境忽略本步驟
匯出資料庫之前先鎖定資料庫
#資料庫只讀鎖定命令,防止匯出資料庫的時候有資料寫入,unlock tables命令解除鎖定
mysql> flush tables with read lock;
匯出master資料庫中需要同步的庫
#匯出需要同步的庫
[root@master ~]#mysqldump -uroot test -p123456 >/opt/test.sql
#如不指定,則匯出所有庫
mysqldump -uroot -p123456 --all-databases>/opt/all.sql
將匯出資料匯入salve中
#傳到slave
scp /opt/all slave:/opt
#在slave匯入資料庫
mysql> source /opt/all.sql
2.5 創建資料同步賬號
登錄主資料庫創建一個用于從資料庫復制的賬號
mysql> create user 'rep'@'192.168.150.25' identified with mysql_native_password by 'repl123';
grant replication slave on *.* to 'rep'@'192.168.150.25';
mysql> flush privileges;
查看主服務器master狀態(注意File與Position項,從服務器需要這兩項引數)
mysql> show master status;
+-----------+-----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------+-----------+--------------+------------------+-------------------+
| mysql-bin.000065 | 186607472 | | | |
+-----------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2.6 配置slave
修改my.cnf組態檔
vim /etc/my.cnf
#設定從服務器id,必須于主服務器不同
server-id=2
#啟動MySQ二進制日志系統
log-bin=mysql-bin
#需要同步的資料庫名,如果不指明同步哪些庫,就去掉這行,表示所有庫的同步(除了ignore忽略的庫)
配置主從同步指令
#執行同步前,要先關閉slave
mysql> stop slave;
mysql> change master to master_host='192.168.150.185',master_user='repl',master_password='repl123',master_log_file='ON.000065',master_log_pos=186607472;
mysql> start slave;
mysql> show slave status \G;
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.150.185
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: ON.000065
Read_Master_Log_Pos: 187730832
Relay_Log_File: xmkjoa02-relay-bin.000002
Relay_Log_Pos: 46151494
Relay_Master_Log_File: ON.000065
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 187730832
Relay_Log_Space: 46151706
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: Yes
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 6c3f5abb-1c32-11ec-96ba-fa163e7a46bf
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 1
Network_Namespace:
1 row in set (0.00 sec)
如上,當IO和SQL執行緒的狀態均為Yes,則表示主從已實作同步了!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517689.html
標籤:MySQL
