## **Mycat讀寫分離**
```
數據庫讀寫分離對于大型系統或者訪問量很高的互聯網應用來說,是必不可少的一個重要功能。
對于MySQL來說,標準的讀寫分離是主從模式,一個寫節點Master后面跟著多個讀節點,讀節
點的數量取決于系統的壓力,通常是1-3個讀節點的配置
```

Mycat讀寫分離和自動切換機制,需要mysql的主從復制機制配合
## **Mysql的主從復制**

### 主從配置需要注意的地方
```
1、主DB server和從DB server數據庫的版本一致
2、主DB server和從DB server數據庫數據名稱一致
3、主DB server開啟二進制日志,主DB server和從DB server的server_id都必須唯一
```
## **Mysql主服務器配置**
```
第一步:修改my.conf文件:
在[mysqld]段下添加:
binlog-do-db=db1
binlog-ignore-db=mysql
#啟用二進制日志
log-bin=mysql-bin
#服務器唯一ID,一般取IP最后一段
server-id=134
第二步:重啟mysql服務
service mysqld restart
第三步:建立帳戶并授權slave
mysql>GRANT FILE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%' identified by '123456';
#一般不用root帳號,“%”表示所有客戶端都可能連,只要帳號,密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強安全。
刷新權限
mysql> FLUSH PRIVILEGES;
查看mysql現在有哪些用戶
mysql>select user,host from mysql.user;
第四步:查詢master的狀態
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 120 | db1 | mysql | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set
————————————————
```
## **Mysql從服務器配置**
```
第一步:修改my.conf文件
[mysqld]
server-id=166
第二步:配置從服務器
mysql>change master to master_host='192.168.25.134',master_port=3306,master_user='backup',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=120
注意語句中間不要斷開,master_port為mysql服務器端口號(無引號),master_user為執行同步操作的數據庫賬戶,“120”無單引號(此處的120就是show master status 中看到的position的值,這里的mysql-bin.000001就是file對應的值)。
第二步:啟動從服務器復制功能
Mysql>start slave;
第三步:檢查從服務器復制功能狀態:
mysql> show slave status \G;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.254.128
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master_log.000002
Read_Master_Log_Pos: 635
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 799
Relay_Master_Log_File: master_log.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 635
Relay_Log_Space: 973
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 36cebd9f-7c98-11e9-8f51-000c29a9c235
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
1 row in set (0.00 sec)
---------------------------------------------------------
Slave_IO_Running: Yes //此狀態必須YES
Slave_SQL_Running: Yes //此狀態必須YES
---------------------------------------------------------
```
**注:Slave\_IO及Slave\_SQL進程必須正常運行,即YES狀態,否則都是錯誤的狀態(如:其中一個NO均屬錯誤)。**
```
錯誤處理:如果出現此錯誤:Fatal error: The slave I/O thread stops because master
and slave have equal MySQL server UUIDs; these UUIDs must be different for
replication to work.因為是mysql是克隆的系統所以mysql的uuid是一樣的,所以
需要修改。
解決方法:刪除/var/lib/mysql/auto.cnf文件,重新啟動服務。
```

```
以上操作過程,從服務器配置完成。
```
## **Mycat配置**
Mycat 1.4?支持MySQL主從復制狀態綁定的讀寫分離機制,讓讀更加安全可靠,配置如下:
```
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM" url="192.168.25.134:3306" user="root"
password="root">
<readHost host="hostS" url="192.168.25.166:3306" user="root"
password="root" />
</writeHost>
</dataHost>
```
### **屬性講解**
```
設置 balance="1"與writeType="0"
Balance參數設置:
1. balance="0", 所有讀操作都發送到當前可用的writeHost上。
2. balance="1",所有讀操作都隨機的發送到readHost。
3. balance="2",所有讀操作都隨機的在writeHost、readhost上分發
4. balance=”3”, 所有讀請求隨機的分發到 writeHost 對應的 readhost 執行,writerHost不負擔讀壓力
WriteType參數設置:
1. writeType="0", 所有寫操作都發送到可用的writeHost上。
2. writeType="1",所有寫操作都隨機的發送到readHost。
3. writeType="2",所有寫操作都隨機的在writeHost、readhost分上發。
“readHost是從屬于writeHost的,即意味著它從那個writeHost獲取同步數據,因此,
當它所屬的writeHost宕機了,則它也不會再參與到讀寫分離中來,即“不工作了”
,這是因為此時,它的數據已經“不可靠”了。基于這個考慮,目前mycat 1.3和
1.4版本中,若想支持MySQL一主一從的標準配置,并且在主節點宕機的情況
下,從節點還能讀取數據,則需要在Mycat里配置為兩個writeHost并設置banlance=1。”
設置 switchType="2" 與slaveThreshold="100"
switchType 目前有三種選擇:
-1:表示不自動切換
1 :默認值,自動切換
2 :基于MySQL主從同步的狀態決定是否切換
“Mycat心跳檢查語句配置為 show slave status ,dataHost 上定義兩個新屬性:
switchType="2" 與slaveThreshold="100",此時意味著開啟MySQL主從復制狀態綁定的讀寫分
離與切換機制。Mycat心跳機制通過檢測 show slave status 中的 "Seconds_Behind_Master",
"Slave_IO_Running", "Slave_SQL_Running" 三個字段來確定當前主從同步的狀態以及
Seconds_Behind_Master主從復制時延。“
```
- 序言
- 系統要求
- 版本更新日志
- 遠豐商城技術對接說明
- 開發指導
- 系統架構
- 負載集群
- 云存儲
- 框架內容
- 基礎
- 開發規范
- 目錄結構
- 架構
- 架構總覽
- 數據庫
- 數據庫連接
- 基本使用
- 緩存
- 配置
- 路由
- 數據字典
- ucenter
- shop
- paycenter
- ucenter_admin
- shop_admin
- paycenter_admin
- shop1
- shop2
- shop3
- 通訊內容
- 商家中心
- 頂部導航欄
- 店鋪信息欄
- 店鋪及商品提示欄
- 交易提示欄
- 銷售情況統計欄
- 集群架構圖
- 單品銷量排行欄
- 店鋪運營推廣欄
- 平臺聯系方式欄
- 訂單物流
- 商品
- 商品列表
- 商品詳情
- 商品發布與編輯
- 分銷商品
- 關聯版式
- 商品規格
- 圖片空間
- 淘寶導入
- 訂單流程
- 交易訂單
- 訂單退款/退貨
- 促銷
- 團購管理
- 加價購
- 限時折扣
- 滿即送
- 代金券管理
- 分銷
- 店鋪
- 店鋪設置
- 自銷產品供應商
- 實體店鋪
- 品牌申請
- 店鋪信息
- 消費者保障服務
- 門店賬號
- 分銷商--產品供應商
- 分銷明細
- 批發市場
- 商家微信公眾號
- 售后服務
- 咨詢管理
- 投訴管理
- 退款管理
- 退貨管理
- 雜項
- 遠程上傳圖片
- 接口(廢棄,參考最外層接口項)
- 接口說明
- 品牌
- 商品規格
- 商品類型
- 商品分類
- 商品
- 訂單
- 商品/店鋪收藏
- 足跡
- 退款及退貨
- 商家店鋪
- 會員
- 入駐協議
- 訂單接口
- 商品接口
- 訂單物流接口
- 商家中心接口
- 促銷接口
- 快遞鳥物流接口
- 代金券接口
- 首頁版塊
- 團購
- 平臺紅包
- 限時折扣接口
- 拼團接口
- wap首頁模板
- JS
- 銀聯支付
- 多語言
- 商品評分
- 圖片加載
- 買家申請退款退貨
- 商家退款退貨
- 平臺退款退貨
- 添加發票
- 提交訂單
- 確認訂單
- 運費銷售區域
- 獲取會員地址
- 充值
- 導出XLS
- 商城系統集成
- 多語言實現
- 三級分銷推廣鏈接發展推廣員
- app.ini.php
- 去分銷
- 版本更新
- 物流支持
- 運營人員建議
- 業務邏輯
- 統計結算
- 客服消息
- 賬號
- 三級分銷
- IM
- 配置
- 平臺帳號
- 活動數據表說明
- 接口
- 數據庫中間鍵
- MyCat的優勢
- 概念說明
- Mycat的下載及安裝
- 參數配置案列
- Mycat讀寫分離
- 基本命令
- 常見錯誤