1. 程式人生 > >mysql主從搭建和測試步驟

mysql主從搭建和測試步驟

主從配置步驟:
 假設兩臺機器分別為192.168.0.202, 192.168.0.203,其中202做主,203做從。

1. 在兩臺mysql上建立同步使用者。202執行:
GRANT ALL PRIVILEGES ON *.* TO 'repl'@'192.168.0.203' IDENTIFIED BY 'repl' WITH GRANT OPTION;

203執行:
GRANT ALL PRIVILEGES ON *.* TO 'repl'@'192.168.0.202' IDENTIFIED BY 'repl' WITH GRANT OPTION;

讓兩個mysql可以互相通過repl/repl訪問對方。

2. 對兩臺機器,開啟/etc/my.cnf mysql配置檔案,在[mysqld]下開啟以下選項:
log-bin=mysql-bin

innodb_flush_log_at_trx_commit = 1
sync_binlog=1

binlog-do-db=bookmark
binlog-do-db=debate
binlog-ignore-db=test
binlog-ignore-db=mysql

replicate-do-db=bookmark
replicate-do-db=debate

其中binlog-do-db和replicate-do-db標記出需要進行同步的資料庫,對於多個數據庫,重複選項多次即可,如上面的配置則表示同步bookmark和debate。binlog-ignore-db表示不

進行同步的資料庫,上面的配置表示不同步test, mysql庫。

對於主mysql(202),開啟選項:
server-id=1
對於203,從mysql,開啟選項
server-id=2

注意server-id選項必須開啟,並且叢集中每個mysql都要有一個單獨的值,不能重複。一般設定主為1,從為2, 3, 4....。手冊上說只要不相同什麼整數都沒有關係,可以設定為IP的值,如:202,

203.

3. 重新啟動兩個mysql. 分別輸入:show master status; 命令,此時應該顯示:

+------------------+----------+-----------------+------------------+
| File             | Position | Binlog_Do_DB    | Binlog_Ignore_DB |
+------------------+----------+-----------------+------------------+
| mysql-bin.000006 |       98 | bookmark,debate | test,mysql       |
+------------------+----------+-----------------+------------------+

1 row in set (0.00 sec)

輸入:show slave status; 命令,應該顯示:
Empty set (0.00 sec)

表示還沒有從。

4. 為了避免風險,主mysql現在最好不要對外提供服務,就是說主mysql的已有資料不要在動了。主mysql(202), 執行下面的命令:
FLUSH TABLES WITH READ LOCK;

鎖定表,這個時候所有的commit都會失敗。
執行:show master status;
把輸出結果記錄下來,尤其是那個File和Position的值,後面要用。這裡就是:mysql-bin.000006和98

把2個mysql都停掉,命令:./mysqladmin -u root shutdown

現在把master mysql(202)的資料複製到203上,讓slave的資料和master的同步。例如用sftp把202 data目錄的bookmark, debate複製到203的data目錄內。兩邊一定要保持一致。

5. 啟動slave mysql(203),執行命令:

CHANGE MASTER to MASTER_HOST='192.168.0.202', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=98

其中master_host就是主mysql, master_log_file, master_log_pos為上一步在master端執行show master status; 獲得的File和Position值,此處換成那些值。注意數字是沒有單

引號引起來的。如果上面一步File和Position沒有值,master_log_file='', master_log_pos=4

然後執行: start slave;

6. 啟動master mysql(202).

在master端執行:unlock tables; 解除第4步的鎖表。

在slave端執行:show slave status \G ; 察看Slave_IO_State,一般應該為"Waiting for master to send event";此時Slave_IO_Running和Slave_SQL_Running應該為true,

如果不是,在slave端執行: stop slave; start slave; 重啟複製程序。Replicate_Do_DB為要複製的資料庫,和my.cnf配置的相同。

在master端執行: show master status; 對比File, Position的值和上面slave端的Master_Log_File,Read_Master_Log_Pos,兩邊相同則表示搭建完成。

7. 測試叢集正確。

  1). 在master端建立一個數據庫abc,然後察看slave端是否同步建立了。
  2). 在abc插入幾條記錄,察看slave端資料是否同步插入。
  3). 更新abc的記錄,察看slave端資料是否同步
  4). 刪除abc的記錄,察看slave端資料是否同步
  5). 停掉slave伺服器,重新執行2,3,4的內容,重啟slave,看slave端資料是否同步。
 
  在執行上面的操作過程中,每執行一次都用第6步的方法察看master的File, Position值和slave的Master_Log_File,Read_Master_Log_Pos是否相同,如果主從工作正常,這

兩個值在一次同步完成以後(slave status的Slave_IO_State顯示:Waiting for master to send event)將會完全相同。

8. 日誌檢查 

  如果有錯誤,檢查mysql data目錄的 ...machinname.err 檔案。

9. 應用切換到slave

 如果master mysql壞掉了,需要將應用轉移到slave段。首先在slave端執行:show master status; 把輸出儲存下來,然後再把應用切換過去。儲存輸出的File和Position值將可以用於以後從slave恢復master.

 具體從slave恢復master的辦法:

 在master端執行:

CHANGE MASTER to MASTER_HOST='192.168.0.203', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='repl', MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=98 ;

其中 MASTER_HOST 為slave的ip, MASTER_LOG_FILE, MASTER_LOG_POS為切換到slave時記錄下的File和Position值。

在master執行:start slave;

待master內容基本恢復以後(在master執行:show slave status \G; Slave_IO_State顯示為Waiting for master to send event)

將應用切換回master。

待系統穩定後master執行:stop slave停止slave。如果要避免master重啟以後自動開啟slave,可以將master mysql的data資料夾的master.info檔案刪掉。

===================================================================================================================

一、主從同步的作用

   1、資料分佈

   2、負載均衡(load balancing)

   4、高可用性(high availability)和容錯

二、主從同步原理

   mysql(MariaDB)的主從複製其實很簡單,只要搞懂了原理,配置一個主從複製就是三下五除二的工夫

1、二進位制日誌

   想要做主從複製必須得有這個二進位制日誌,那二進位制日誌記錄的是什麼呢?二進位制日誌中儲存的只是跟伺服器修改相關的操作,也叫複製日誌

   二進位制日誌為了避免日誌檔案過大,要進行不停地滾動,其主要有兩個功能:

   (1)即時點恢復

   (2)複製

   因為二進位制日誌有即時點恢復功能,所以萬一某天一個不小心失誤把資料庫刪了,只要二進位制日誌檔案儲存完好,就可以把我們的資料恢復回來。可見二進位制日誌是非常重要的,因此二進位制日誌千萬不要和你的資料庫目錄放到一起,而要另找一個位置儲存

   今天我們要做的是利用他的第二個功能完成主從複製

2、中繼日誌

   中繼日誌和複製相關,中繼日誌是從伺服器從主伺服器上讀取主伺服器上二進位制日誌中的事件,每讀一個過來,並儲存到本地。

3、主從同步原理

wKiom1NL6CuzBZn2AAF0SQq6SYk430.jpg

   原理詳解:

   1)主伺服器發生資料更改操作,資料寫入到資料檔案和二進位制檔案中,然後去喚醒從伺服器的I/O執行緒(IO thread)

   2)從伺服器的IO thread來請求主伺服器並把從主伺服器的binlog dump執行緒返回結果寫入到本地中繼日誌中

   3)從伺服器的SQL thread每讀一條中繼日誌,然後寫一條到本地資料檔案中

   4)此過程中,從伺服器只是同步主伺服器的資料,所以他無需開啟二進位制日誌,而且從伺服器最好設為只讀模式

   5)主從複製並不是一個備份的過程,它只是一個數據同步的過程,因為,如果你在主伺服器上刪除一個庫,那你會發現從伺服器上也沒有了

   6)從伺服器並不能負載主伺服器的寫操作,它只可以負載主伺服器的讀操作;因為,不管你主伺服器寫多少,從伺服器都會通過它的中繼日誌和主伺服器的二進位制日誌同步到它本地的

三、主從同步的實現

1、修改主伺服器的配置檔案,我這裡的資料目錄在/mydata/data下,為了安全,我把二進位制日誌放到了/mydata/binlogs下,別忘了給這幾個目錄設定屬主和屬組為mysql使用者,mysql組

wKioL1NL5tPhDZQhAACGNoQylJA433.png

2、在從伺服器上修改主配置檔案,方法同上一步

wKioL1NL523Q60FnAACpJeMS5uo355.png

3、檢視從伺服器的中繼日誌是否啟動成功

wKiom1NL59qQrvfKAABSSR44tJo687.png

4、在主伺服器上建立有複製許可權的賬號

wKiom1NL6GWDCPnsAAAq6ksFitA533.png

5、在主伺服器上檢視其狀態資訊

wKioL1NL6GniGkKvAAAxheGBB2A943.png

6、從伺服器連線主伺服器

wKioL1NL6KKjOnMMAAA9x71JKVg434.png

7、檢視從伺服器的狀態資訊,檢查是否連線主伺服器成功

wKioL1NL6Qbj2ibwAABmkca4J0A693.png

   這裡的Slave_IO_Running和Slave_SQL_Running兩個執行緒必須都為Yes才是正確的,出現了什麼connecting啊還是no什麼的都是沒連線成功的。IO thread是去請求主伺服器的二進位制日誌並寫入到本地中繼日誌的,SQL thread是從中繼日誌寫入到本地資料檔案的。

8、在主伺服器上建立一個數據庫

wKioL1NL6ejA7IShAABNlcLvfgA495.png

9、在從伺服器上啟動複製執行緒,測試hlbrc這個庫是否同步成功

1 mysql>start slave;

wKioL1NL6kax7-PJAABzjio32Vs192.png

四、主從同步配置過程總結

1、主伺服器

   1)修改server-id

   2)啟用二進位制日誌

   3)建立有複製許可權的賬號

2、從伺服器

   1)修改server-id

   2)啟用中繼日誌

   3)連線主伺服器

   4)啟程複製執行緒