1. 程式人生 > >mysql主從(傳統複製模式)

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;