環境搭建:
搭建兩臺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 'Test@123';
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='Test@123',
master_log_file='master-bin.000001',
master_log_pos=155;
mysql> start slave;
查看從服務器狀態
mysql> show slave status\G;