mysql主從(傳統複製模式)

  • 環境搭建: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;

相關文章
相關標籤/搜索