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 '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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章