1. 程式人生 > >mysql主從複製與讀寫分離配置詳解

mysql主從複製與讀寫分離配置詳解

mysql主從複製與讀寫分離配置詳解

當網站達到一定規模時,資料庫最先出現壓力,這時候使用者會明顯感覺到卡頓,其原因是資料庫的寫入操作,影響了查詢的效率。這時可以考慮對資料庫配置主從複製和讀寫分離。設定多臺資料庫伺服器,包括一個主伺服器和n個從伺服器,主伺服器負責寫入資料,從伺服器負責讀取資料,主伺服器定時將資料更新到從伺服器上。

這樣做的好處是:
① 將資料庫的讀和寫分開,極大程度的緩解了鎖的爭用
② 增加了機器的處理能力。
③ 對於讀操作為主的應用(事實上大部分網站都是讀操作為主),使用讀寫分離是最好的場景,因為可以確保寫的伺服器壓力更小,而讀又可以接受些許時間上的延遲。

一、 配置主從複製

① 主伺服器上修改mysql資料庫配置檔案my.cnf,在[mysqld]下配置。
這裡寫圖片描述
引數解釋:
binlog-do-db:設定需要複製的資料庫
binlog-ignore-db:設定忽略的資料庫,mysql表示忽略所有的資料庫,跟binlog-do-b配合使用
log-bin:開啟bin-log日誌
server-id: 配置伺服器id,這個引數必須全域性唯一。

② 重啟mysql服務

③ 進入mysql命令列,輸入:show master status;記住File和Position兩個值,之後需要用到。
這裡寫圖片描述

④ 從伺服器上修改mysql資料庫配置檔案my.cnf


這裡寫圖片描述
注意server-id要跟主伺服器的不一樣,replicate-do-db要跟主伺服器的一樣。
⑤ 為slave端單獨建立一個賬號,方便許可權管理,然後把這個賬號的許可權賦予給slave端。

create useruser’@’X.X.X.X’ indetified by ‘XXXXX’;
grant replication slave on *.* touser’@’X.X.X.X’ identified by ‘XXXXX’;

X.X.X.X為從伺服器IP,XXXXX為密碼。這裡我的IP是172.18.225.2,密碼是123456

⑥ 進入從伺服器mysql命令列,執行下列命令:


這裡寫圖片描述
引數說明:
master_host:主伺服器ip
master_user:slave連線主伺服器的賬號
master_password:slave連線主伺服器的賬號的密碼
master_log_file,master_log_pos填寫剛剛主伺服器show master status看到的兩個file和position兩個值。

⑦ 從伺服器mysql命令列輸入show slave status\G;跟下圖類似說明配置完成。
這裡寫圖片描述

⑧ 測試在主伺服器寫入資料,在從伺服器能否看到相同的資料,如果可以說明主從複製配置完成。

二、 配置讀寫分離

① 使用mycat來管理mysql實現讀寫分離,mycat下載地址:http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE.jar (mycat需要jdk1.8的支援,沒有配置的請自行配置)

② 修改mycat目錄下conf/schema.xml,配置如下。裡面的url 連結到對應主機的IP,user是主伺服器能夠登入到該IP對應主機的賬號密碼,因此需要在從伺服器先為主伺服器分配好賬號和密碼。
這裡寫圖片描述

balance引數說明:

  • balance=”0”, 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上。
  • balance=”1”,全部的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,並且M1與 M2互為主備),正常情況下,M2,S1,S2都參與select語句的負載均衡。
  • balance=”2”,所有讀操作都隨機的在writeHost、readhost上分發。
  • balance=”3”,所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力,注意balance=3只在1.4及其以後版本有,1.3沒有。

writeType引數說明:

  • writeType=”0”, 所有寫操作傳送到配置的第一個writeHost,第一個掛了切到還生存的第二個writeHost,重新啟動後已切換後的為準,切換記錄在配置檔案中:dnindex.properties .
  • writeType=”1”,所有寫操作都隨機的傳送到配置的writeHost。

slaveThreshold=”100” 心跳時間

③ 修改mycat目錄下conf/schema.xml,配置如下,注意schemas要跟schema.xml裡schema的name對應。
這裡寫圖片描述

④ 配置完成之後進到mycat目錄下bin/,鍵入命令:./mycat start;或者也可以輸入兩次./mycat restart;通過有沒有提示Mycat-server was not running來判斷是否成功啟動,注意兩次restart間隔不要太短。如果不能成功啟動,可以通過mycat目錄下logs/wrapper.log日誌來檢視錯誤日誌。

⑤ 如果成功啟動,可以通過mysql -h127.0.0.1 -uroot -p123456 -P8066來進入mycat環境下的操作介面。其中h後的ip指向主伺服器,如果是在從伺服器上連線mycat,則寫上主機IP。賬號密碼使用的是server.xml裡面配置的user和password,-P指定8066埠是mycat預設資料埠,管理埠為9066。
這裡寫圖片描述

⑥ 在mycat目錄下logs/輸入命令 tail -f mycat.log 可以動態檢視mycat.log的變化。觀察到心跳包出現與從伺服器的連線正常。
這裡寫圖片描述

⑦ 登入mycat後執行一條select語句和insert語句,通過日誌觀察是否從從伺服器讀取,從主伺服器寫入。

select語句:
這裡寫圖片描述

insert語句:
這裡寫圖片描述

三、配置過程中遇到的問題

  1. 由於我使用的是兩個虛擬機器進行主從複製和讀寫分離的配置,虛擬機器之間勢必要互相連通。因此兩臺主機必須互相能夠ping通。一開始兩臺虛擬機器使用的網絡卡模式為橋接模式,這種網絡卡模式需要為兩臺虛擬機器配置好跟宿主機相同網段的IP,就可以互相訪問,但是我配置完之後發現不能夠ping通,檢查完之後發現是被虛擬機器裡面的ubuntu防火牆限制了。將防火牆禁用後可以互相ping通

  2. 配置了兩次主從,第二次時候出現ERROR 1201 (HY000): Could not initialize master!,這時候只需要在從伺服器mysql命令列中reset slave;再配置即可。

  3. 從伺服器的IO狀態一直顯示connecting,但是其他配置都正確,檢查後發現,原因是mysql的配置檔案my.cnf裡面的bind-address,只允許本機mysql連線,註釋掉就好了
    這裡寫圖片描述

  4. 防火牆記得開啟Mycat埠8066(資料埠)和9066(管理埠)