複習電商筆記-19-mysql主從複製接受和操作
第五天:MySQL主從複製+Amoeba讀寫分離
思考:
序號 |
知識點 |
型別 |
難度係數 |
掌握程度 |
|
讀寫分離使用mysql proxy/mycat/amoeba |
技術 |
1 |
熟練 |
|
主從複製、讀寫分離實現流程 |
論述 |
1 |
熟練 |
|
一主多從實現 |
技術 |
1 |
熟練 |
|
主從時,設定從為只讀,會發生什麼現象 |
技術 |
1 |
瞭解 |
|
代理實現分庫分表、規則 |
技術 |
3 |
熟練 |
知識點:
序號 |
知識點 |
型別 |
難度係數 |
掌握程度 |
|
MySQL主從複製,主從配置實現 |
技能 |
1 |
熟練 |
|
MySQL讀寫分離 |
程式碼 |
1 |
熟練 |
|
Amoeba實現讀寫分離 |
程式碼 | 1 |
熟練 |
拓展作業:
序號 |
知識點 |
型別 |
難度係數 |
掌握程度 |
|
SpringAOP實現讀寫分離 |
程式碼 |
1 |
熟練 |
|
mycat實現讀寫分離 |
程式碼 |
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;(按主庫的當前檔案和位置)