服務器-節點: 4臺
- mysql-主: 192.168.2.40
- mysql-從-node-0: 192.168.2.41
- mysql-從-node-1: 192.168.2.42
- mycat: 192.168.2.45
操作過程
- 1.搭建mysql主從節點
- 2.搭建mycat中間件節點
- 3.mycat服務配置
- 4.測試讀寫分離,讀的分發
1.搭建mysql主從節點
Mysql-高可用集群主從單一模式-binlog
2.搭建mycat中間件節點
# 2-1.基礎環境搭建: 安裝jdk
# 下載頁面: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
rpm -ivh jdk-8u201-linux-x64.rpm# 2-2.下載安裝 mycat:
wget http://dl.mycat.io/1.6.6.1/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -P /usr/local/src/
tar xvf /usr/local/src/Mycat-server-1.6.6.1-release-20181031195535-linux.tar.gz -C /usr/local
# 配置: 寫入環境變量,增加相應用戶
echo export PATH=$PATH:/usr/local/mycat/bin >>/etc/profile
echo export MYCAT_HOME=/usr/local/mycat >> /etc/profile
source /etc/profile
# 增加相應用戶
groupadd mycat -g 910
useradd mycat -g 910
chown -R mycat:mycat /usr/local/mycat
3.mycat服務配置
3-1.讀寫數據庫配置
vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- 聲明一個邏輯表, 表名為TESTDB, 和server.xml中的對應 --><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><!-- 通過dataHost定義的數據庫: database="xh"(真實數據庫) --><dataNode name="dn1" dataHost="dataHost01" database="xh" /><dataHost name="dataHost01" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native"><heartbeat>select user()</heartbeat><!-- 寫入節點(主節點) --><writeHost host="serverM1" url="192.168.2.40:3306" user="myuser" password="Aa123456"><!-- 讀取節點(從節點) --><readHost host="serverS0" url="192.168.2.41:3306" user="myuser" password="Aa123456"/><readHost host="serverS1" url="192.168.2.42:3306" user="myuser" password="Aa123456"/></writeHost></dataHost>
</mycat:schema>
balance指的負載均衡類型,目前的取值有4種:
- 0: 不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上。
- 1: 全部的readHost與stand by writeHost參與select語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,并且M1與 M2互為主備),正常情況下,M2,S1,S2都參與select語句的負載均衡
- 2: 所有讀操作都隨機的在writeHost、readhost上分發。
- 3: 所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力
switchType指的是切換的模式,目前的取值也有4種:- -1: 表示不自動切換
- 1: 默認值,表示自動切換
- 2: 基于MySQL主從同步的狀態決定是否切換,心跳語句為 show slave status
writeType值:- 0: 所有請求,分發到第一個: dataHost
- 1: 所有請求,分發到所有的: dataHost
- 2: 不執行寫操作
3-2.mycat服務,用戶配置
vim /usr/local/mycat/conf/server.xml
....
# 服務端口
<property name="serverPort">8066</property>
....
// 管理員配置,讀寫
<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">TESTDB</property>
</user>
// 普通用戶配置,只讀
<user name="user" defaultAccount="true"><property name="password">123456</property><property name="schemas">TESTDB</property><property name="readOnly">true</property>
</user>
....
3-3.開啟日志debug,啟動服務:
vim /usr/local/mycat/conf/log4j2.xml
....
# 開啟debug日志
<asyncRoot level="info" includeLocation="true"> 改為 <asyncRoot level="debug" includeLocation="true">
....
# 啟動服務
mycat start
# 啟動防火墻規則
firewall-cmd --permanent --add-port=8066/tcp && firewall-cmd --reload
4.測試讀寫分離
// 4-1.分發測試
// 4-1-1.先將 schema.xml 中的配置為: balance=0,不進行分發操作,【讀寫】全部在【主庫-192.168.2.40】
....
<dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
....
// 客戶端鏈接mycat

// 分別查看: 數據庫(【主-192.168.2.40】,【從0-192.168.2.41】,【從1-192.168.0.42】)查詢次數,寫入次數:
// 查詢次數
show global status like 'Com_select';
// 寫入次數
show global status like '%Com_in%';// 【客戶端】執行查詢: 10次,注意:工具可能不能直接打開表進行操作,只能運行sql語句
SELECT * FROM `user` limit 1;
INSERT `user`(name) VALUES('王五1');
INSERT `user`(name) VALUES('王五2');
INSERT `user`(name) VALUES('王五3');
// 分別查看: 數據庫(主,從0,從1)查詢次數,應該只有【主庫-192.168.2.40】有明顯的增加
//// 4-1-2.更改schema.xml 中的配置為: balance=3,讀在從庫,寫在主庫
// 客戶端】執行查詢: 10次
// 分別查看: 數據庫(主,從0,從1)查詢次數,應該只有【從0-192.168.2.41】,【從1-192.168.0.42】有明顯的增加
5.遺留問題:
- 主庫-宕機后,查詢語句也無法執行
- 從庫-有一臺宕機后,查詢語句也無法執行
轉載于:https://blog.51cto.com/3168834/2374749