環境搭建:mysql
搭建兩臺MySQL服務器,一臺做爲主服務器,一臺做爲從服務器,主服務器進行寫操做,從服務器進行讀操做。web
主從配置須要注意的點sql
主從服務器操做系統版本和位數一致;數據庫
Master 和 Slave 數據庫的版本要一致;vim
Master 和 Slave 數據庫中的數據要一致;安全
Master 開啓二進制日誌, Master 和 Slave 的 server_id 在局域網內必須惟一;服務器
Master 和 Slave 服務器時間一致網絡
主數據庫:CentOS7 MySQL8.0 192.168.10.6併發
從數據庫:CentOS7 MySQL8.0 192.168.10.7app
主從配置:
一、配置主數據庫
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
二、在主數據庫裏建立一個同步帳號並受權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,後面要用
三、配置從數據庫
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;