mysql主從(傳統複製模式)
環境搭建:
搭建兩臺MySQL伺服器,一臺作為主伺服器,一臺作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作。
主從配置需要注意的點
主從伺服器作業系統版本和位數一致;
Master 和 Slave 資料庫的版本要一致;
Master 和 Slave 資料庫中的資料要一致;
Master 開啟二進位制日誌, Master 和 Slave 的 server_id 在區域網內必須唯一;
Master 和 Slave 伺服器時間一致
主資料庫:CentOS7 MySQL8.0 192.168.10.6
從資料庫:CentOS7 MySQL8.0 192.168.10.7
主從配置:
1、配置主資料庫
1)主資料庫,你必須要啟用二進位制日誌(binary logging),並且建立一個唯一的Server ID,這步驟可能要重啟MySQL。
2)主伺服器傳送變更記錄到從伺服器依賴的是二進位制日誌,如果沒啟用二進位制日誌,複製操作不能實現(主庫複製到從庫)。
3)複製組中的每臺伺服器都要配置唯一的Server ID,取值範圍是1到(232)−1,你自己決定取值。
4)配置二進位制日誌和Server ID,你需要關閉MySQL和編輯my.cnf或者my.ini檔案,在 [mysqld] 節點下新增配置。
5)下面是啟用二進位制日誌,日誌檔名以“mysql-bin”作為字首,Server ID配置為1,如下:
vim /etc/my.cnf
[mysqld]
server-id=1 #資料庫唯一ID,主從的標識號絕對不能重複。
log-bin=master-bin #開啟二進位制日誌,也可以指定路徑。binlog日誌作用是用來記錄mysql內部增刪改查等對mysql資料庫有更新的內容的記錄(對資料庫的改動),對資料庫的查詢select或show等不會被binlog日誌記錄;主要用於資料庫的主從複製以及增量恢復。
binlog-do-db=test #需要同步的資料庫。如果是多個同步庫,就以此格式另寫幾行即可。如果不指明對某個具體庫同步,就去掉此行,表示同步所有庫(除了ignore忽略的庫)。
binlog-ignore-db=mysql #不同步mysql系統資料庫。如果是多個不同步庫,就以此格式另寫幾行;也可以在一行,中間逗號隔開。
innodb_flush_log_at_trx_commit=1
sync_binlog=1
log-slave-updates=1
提示1:如果你不配置server-id或者配置值為0,那麼主伺服器將拒絕所有從伺服器的連線。
提示2:在使用InnoDB的事務複製,為了儘可能持久和資料一致,你應該在my.cnf裡配置innodb_flush_log_at_trx_commit=1 和 sync_binlog=1
innodb_flush_log_at_trx_commit和sync_binlog是MySQL innodb引擎的兩個重要的引數,其中innodb_flush_log_at_trx_commit是將事務日誌從innodb log buffer寫入到redo log中,sync_binlog是將二進位制日誌檔案重新整理到磁碟上。
在主伺服器上最重要的二進位制日誌設定是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中的資料強制寫入磁碟。一般設定的sync_binlog並不是最安全的1,而是100或者是0。這樣犧牲一定的一致性,可以獲得更高的併發和效能,可根據自身的業務情況而定。
提示3:確保主伺服器裡的skip-networking選項未啟用,如果網路被禁用,你的從伺服器將不能與主伺服器通訊並且複製失敗。
重啟mysql
systemctl restart mysqld
2、在主資料庫裡建立一個同步賬號並授權slave許可權
1)每個從資料庫會使用一個MySQL賬號來連線主資料庫,所以我們要在主資料庫裡建立一個賬號,並且該賬號要授予 REPLICATION SLAVE 許可權,你可以為每個從資料庫分別建立賬號,當然也可以用同一個!
2)你可以用原來的賬號不一定要新創賬號,但你應該注意,這個賬號和密碼會被明文存放在master.info檔案中,因此建議單獨創一個只擁有相關許可權的賬號,以減少對其它賬號的危害!
3)建立新賬號使用“CREATE USER”,給賬號授權使用“GRANT”命令,如果你僅僅為了主從複製建立賬號,只需要授予REPLICATION SLAVE許可權。
4)下面來建立一個賬號,賬號名:test,密碼:Test@123,只允許192.168.1.的IP段登入,如下:
mysql> create user 'test'@'192.168.10.%' identified by '[email protected]';
mysql> grant replication slave on *.* to 'test'@'192.168.10.%';
mysql> flush privileges;
5)如果開啟防火牆,可能要配置下埠,如下:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
檢視主伺服器狀態
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 155 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.05 sec)
注意:記錄好File和Position,後面要用
3、配置從資料庫
1)從伺服器,同理,要分配一個唯一的Server ID,需要關閉MySQL,修改好後再重啟,如下:
vim /etc/my.cnf
[mysqld]
server-id=2
replicate-do-db = test #在master端不指定binlog-do-db,在slave端用replication-do-db來過濾
replicate-ignore-db = mysql #忽略的庫
read-only=1
提示1:如果有多個從伺服器,每個伺服器的server-id不能重複,跟IP一樣是唯一標識,如果你沒設定server-id或者設定為0,則從伺服器不會連線到主伺服器。
提示2:一般你不需要在從伺服器上啟用二進位制日誌,如果你在從伺服器上啟用二進位制日誌,那你可用它來做資料備份和崩潰恢復,或者做更復雜的事情(比如這個從伺服器用來當作其它從伺服器的主伺服器)。
提示3: read_only=1只讀模式,可以限定普通使用者進行資料修改的操作,但不會限定具有super許可權的使用者的資料修改操作;在MySQL中設定read_only=1後,普通的應用使用者進行insert、update、delete等會產生資料變化的DML操作時,都會報出資料庫處於只讀模式不能發生資料變化的錯誤,但具有super許可權的使用者,例如在本地或遠端通過root使用者登入到資料庫,還是可以進行資料變化的DML操作;為了保證主從同步可以一直進行,在slave庫上要保證具有super許可權的root等使用者只能在本地登入,不會發生資料變化,其他遠端連線的應用使用者只按需分配為select,insert,update,delete等許可權,保證沒有super許可權,則只需要將salve設定“read_only=1”模式,即可保證主從同步,又可以實現從庫只讀。
2)在slave上配置連線master的資訊
mysql> stop slave;
mysql> change master to
master_host='192.168.10.9',
master_user='test',
master_password='[email protected]',
master_log_file='master-bin.000001',
master_log_pos=155;
mysql> start slave;
檢視從伺服器狀態
mysql> show slave status\G;