1. 程式人生 > >複習電商筆記-19-mysql主從複製接受和操作

複習電商筆記-19-mysql主從複製接受和操作

 

第五天:MySQL主從複製+Amoeba讀寫分離

思考:

序號

知識點

型別

難度係數

掌握程度

  1.  

讀寫分離使用mysql proxy/mycat/amoeba

技術

1

熟練

  1.  

主從複製、讀寫分離實現流程

論述

1

熟練

  1.  

一主多從實現

技術

1

熟練

  1.  

主從時,設定從為只讀,會發生什麼現象

技術

1

瞭解

  1.  

代理實現分庫分表、規則

技術

3

熟練

知識點:

序號

知識點

型別

難度係數

掌握程度

  1.  

MySQL主從複製,主從配置實現

技能

1

熟練

  1.  

MySQL讀寫分離

程式碼

1

熟練

  1.  

Amoeba實現讀寫分離

程式碼

1

熟練

拓展作業:

序號

知識點

型別

難度係數

掌握程度

  1.  

SpringAOP實現讀寫分離

程式碼

1

熟練

  1.  

mycat實現讀寫分離

程式碼

1

熟練

  1.  

主從從結構實現,找出失敗原因

程式碼

1

熟練

 

 

*MySQL主從複製讀寫分離

 

 

原理

mysql主(稱master)從(稱slave)複製的原理:

1、 master將資料改變記錄到二進位制日誌(binary log)中,也即是配置檔案log-bin指定的檔案(這些記錄叫做二進位制日誌事件,binary log events)

2、 slave將master的binary log events拷貝到它的中繼日誌(relay log)

3、 slave重做中繼日誌中的事件,將改變反映它自己的資料(資料重演)

4、預設1分鐘同步一次

 

 

*時間差

在資料同步時總是會存在時間差,哪怕這個時間差非常小也是存在的。那如何處理呢?在主庫寫資料時在一個事務中,那就寫完就從主庫直接讀資料。寫完就可以從從庫中讀取資料了。

解決之道:分散式叢集

2016年8月30號騰訊開源了PhxSQL產品。

PhxSQL是由微信後臺團隊自主研發的一款服務高可用、資料強一致的分散式資料庫服務。該服務基於Percona5.6搭建,目標在於解決MySQL在容災和資料一致性方面的不足,並大幅簡化了MySQL容災切換的運維操作。

PhxSQL具有服務高可用、資料強一致、高效能、運維簡單、和MySQL完全相容的特點。服務高可用:PhxSQL叢集內只要多數派節點存活就能正常提供服務;出於效能的考慮,叢集會選舉出一個Master節點負責寫入操作;當Master失效,會自動重新選舉新的Master。資料強一致:PhxSQL採用多節點冗餘部署,在多個節點之間採用paxos協議同步流水,保證了叢集內各節點資料的強一致。

下載地址:https://github.com/tencent-wechat/phxsql

 

 

 

主從配置需要注意的地方

1、 主DB server和從DB server資料庫的版本一致。

2、 主DB server和從DB server資料庫資料一致[ 這裡就會可以把主的備份在從上還原,也可以直接將主的資料目錄拷貝到從的相應資料目錄]。

3、 主DB server開啟二進位制日誌,主DB server和從DB server的server_id都必須唯一。

 

主從複製Window版本

 

 

安裝兩個MySQL資料庫

不影響現有安裝的MySQL資料庫。

執行mysql-installer-community-5.6.22.0.msi安裝檔案,

按下圖選擇安裝路徑

這樣基礎的檔案都放在一個目錄下,這裡不要改變data目錄。目錄手工建立。

安裝完成後,關閉服務。

拷貝資料檔案

複製C:\Documents and Settings\All Users\MySQL\MySQL Server 5.6\下的data目錄到D:\javaenv\mysql5.6\3308下。

修改D:\javaenv\mysql5.6\3308\my.ini的60行的埠和96行的資料檔案路徑。

datadir=D:/javaenv/mysql5.6/3308/data

第二個MYSQL:複製整個3308目錄,改名為3309目錄。

修改下面的my.ini,如上,修改埠和資料檔案路徑。

註冊服務:

3308的服務已經註冊,只需註冊3309的。

在3309/bin/目錄下執行

mysqld –install MYSQL3309

修改登錄檔:

執行服務時要指定對應的my.ini檔案

執行regedit,開啟登錄檔,找到

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\下的MYSQL

編輯ImagePath鍵

"D:\javaenv\mysql5.6\3309\bin\mysqld.exe" --defaults-file="D:\javaenv\mysql5.6\3309\my.ini" MySQL56-3309

啟動時按對應的啟動檔案啟動。

服務中啟動這兩個服務。兩個MYSQL就可以同時運行了。

 

 

主從複製配置

必須兩個MYSQL的版本一致。配置主從後,從庫不要變更資料、結構等,容易造成異常,導致不能再同步資料。

主Master 3308,從Slave 3309

停掉服務。

service-id

3308 my.ini 126行 server-id=1

3309 my.ini 126行 server-id=2

開啟二進位制日誌記錄,這樣才可以實現主從複製:

在 3308 my.ini 最後加:

log-bin=mysql-bin		#啟用二進位制日誌;

啟動3308

SHOW MASTER STATUS;	檢視MASTER狀態(注意這兩個值)

啟動3309

執行下面配置語句,注意master_log_file和master_log_pos就是上面值。如果發生異常,重新啟動slave時,就可以按此配置。

CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=3308, MASTER_USER='root',MASTER_PASSWORD='root',
	master_log_file='mysql-bin.000007', 
	master_log_pos=609;

啟動從服務

START SLAVE;
SHOW SLAVE STATUS		檢視SLAVE狀態

如果出錯,可以看後面的錯誤資訊。如果正常,上面兩個都應該是YES。這樣當主庫建立資料庫、建立表、插入資料。從庫都會立刻同步。這樣就實現了主從複製。

 

 

 

常見錯誤

錯誤:提示uuid重複:

由於data拷貝是全目錄拷貝,將auto.cnf也拷貝,它裡面記錄了對資料庫的一個uuid標識,隨便產生個新的uuid,替換掉新目錄中的auto.cnf中的uuid串即可。

可以用select uuid()來產生新值,手工黏貼到auto.cnf檔案中。

 

錯誤:error connecting to master '[email protected]:3308' - retry-time: 60  retries: 1

許可權不夠。

錯誤:Error 'Table 'jtdb.a' doesn't exist' on query. Default database: ''. Query: 'insert into `jtdb`.`a`(`a`) values ( '123')'

故障造成從庫不能同步。

停止從庫stop slave;然後SHOW MASTER STATUS;查詢主庫的檔案和位置,更新配置

CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=3308, MASTER_USER='root',MASTER_PASSWORD='root',
	MASTER_LOG_FILE='mysql-bin.000007', 

MASTER_LOG_POS=609;(按主庫的當前檔案和位置)