Mycat
Mycat基於阿里開源的Cobar產品而研發 , 一個徹底開源的,面向企業應用開發的大數據庫集羣 , 一個可以視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣 ,MYCAT並不依託於任何一個商業公司, 永不收費,永不閉源 !
下載mycat http://dl.mycat.io/1.6.7.1/
mycat: 192.168.179.101
master: 192.168.179.99
slave: 192.168.179.100
下載Mycat,安裝JDK
Mycat是用Java編寫的,首先要安裝JDK,沒有JDK Java是跑不起來的。使用yum安裝JDK,不推薦使用源碼。
[root@localhost src]# yum list java-*
--查看你的yum源裏面支持的JDK java-1.8.0-openjdk.x86_64
[root@localhost src]# yum install java-1.8.0-openjdk -y --安裝1.8版本的JDK
[root@localhost src]# java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)
[root@localhost src]# tar -xvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local/ --解壓mycat到/usr/local下面
[root@localhost local]# cd mycat/ --可以看到mycat可以直接使用,不需要編譯安裝
[root@localhost mycat]# ls
bin catlet conf lib logs version.txt
[root@localhost ~]# echo "export PATH=/usr/local/mycat/bin:$PATH" > /etc/profile.d/mycat.sh
[root@localhost ~]# . /etc/profile.d/mycat.sh --配置環境變量,那麼root用戶就可以直接使用mycat命令了
修改server.xml文件
[root@localhost conf]# cd /usr/local/mycat/conf/ --來到mycat目錄下修改其配置文件
server.xml 只針對mycat的配置,不針對數據庫,配置數據庫需要配置schema.xml
[root@localhost conf]# vim server.xml
server.xml配置用戶登入信息,機登入到mycat數據節點的用戶
修改默認配置,默認管理用戶爲mycat,可讀可寫,lutixiadb是邏輯庫( 這裏的TESTDB的名字可以隨意寫,只需與schema.xml中的一致即可)mycat和user用戶是給到前端應用使用jdbc來做讀寫分離的
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">lutixiadb</property>
</user>
只讀用戶
<user name="user">
<property name="password">user</property>
<property name="schemas">lutixiadb</property>
<property name="readOnly">true</property>
</user>
修改schema.xml文件
[root@localhost conf]# vim schema.xml
配置schema.xml,將中間分庫分表的去掉,然後邏輯庫修改爲lutixiadb(設置邏輯庫以及數據庫節點)這裏配置分庫分表,因只做讀寫分離所以這裏暫不配置
<schema name="lutixiadb" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
</schema>
配置數據庫節點對應的後端真實的數據庫(dataNode標籤的主要作用是指明對哪一個數據庫進行操作和管理)其中的dataHost屬性對應的下面dataHost標籤的name屬性的值
<dataNode name="dn1" dataHost="localhost1" database="students" />
balance=1表示讀寫分離,writeType=0表示寫操作集中到第一個寫數據庫,switchType=1代表自動切換
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
檢測心跳的方法,可以用下面的語句,也可以用其他的,如果數據庫宕機會切換到第二個writeHost
<heartbeat>select user()</heartbeat>
下面是讀和寫的mysql的ip和端口,以及登錄的賬號和密碼
<writeHost host="hostM1" url="192.168.179.99:3306" user="mycat-proxy"password="123456">
<readHost host="hostS2" url="192.168.179.100:3306" user="mycat-proxy" password="123456" />
</writeHost>
<writeHost host="hostM2" url="192.168.179.100:3306" user="mycat-proxy" password="123456" />
</dataHost>
紅色部分是如果192.168.179.99寫庫宕機了,那麼192.168.179.100讀庫變成寫庫,讓業務可以進行讀寫操作,而不是之前的只讀操作
注意 dataHost節點的下面三個屬性
balance, switchType, writeType
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”,所有讀請求隨機的分發到writeHost下的readhost執行,writeHost不負擔讀壓力
writeType表示寫模式
writeType=“0”,所有的操作發送到配置的第一個writehost
writeType=“1”,隨機發送到配置的所有writehost
writeType=“2”,不執行寫操作
switchType指的是切換的模式,目前的取值也有4種:
switchType=‘-1‘ 表示不自動切換
switchType=‘1‘ 默認值,表示自動切換
switchType=‘2‘ 基於MySQL主從同步的狀態決定是否切換,心跳語句爲show slave status
switchType=‘3‘ 基於MySQL galary cluster的切換機制(適合集羣
主庫對mysql-proxy用戶進行授權
mysql> grant all on *.* to "mycat-proxy"@"192.168.179.101" identified by "123456"; --主庫授權
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)
[root@localhost ~]# mysql -h192.168.179.99 -umycat-proxy -p --授權完成可以在192.168.179.101上登入做測試,看是否可以遠程登入訪問master數據庫
Mycat啓動已經報錯解決
[root@localhost conf]# mycat start
Starting Mycat-server...
[root@localhost ~]# tail -f /usr/local/mycat/logs/wrapper.log --如果你碰到這個報錯,就是你的schema.xml配置出現了問題
INFO | jvm 1 | 2020/03/25 10:35:09 | Caused by: io.mycat.config.util.ConfigException: schema lutixiadb didn't config tables,so you must set dataNode property!
STATUS | wrapper | 2020/03/25 10:35:11 | <-- Wrapper Stopped
上面錯誤的提示是因爲我的dataNode='dn1'標籤忘記加上去了
<schema name="lutixiadb" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>
[root@localhost conf]# netstat -tpln | grep 80 --這個端口是我們需要登入的端口,數據通信端口
tcp6 0 0 :::8066 :::* LISTEN 3219/java
[root@localhost conf]# netstat -tpln | grep 9066 --這個是管理端口
tcp6 0 0 :::9066 :::* LISTEN 3219/java
MYCAT連接測試讀寫分離
[root@localhost conf]# mysql -umycat -p123456 -P8066 -h192.168.179.101 --登入到mycat的server端,有點看起來像mysql端
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.29-mycat-1.6.7.1-release-20190627191042 MyCat Server (OpenCloudDB)
MySQL [(none)]> show databases; --可以看到邏輯數據庫
+-----------+
| DATABASE |
+-----------+
| lutixiadb |
+-----------+
1 row in set (0.00 sec)
MySQL [(none)]> use lutixiadb; --選擇該邏輯庫
MySQL [lutixiadb]> show tables;
+--------------------+
| Tables_in_students |
+--------------------+
| t1 |
+--------------------+
1 row in set (0.01 sec)
MySQL [lutixiadb]> select * from t1; --查看數據
+------+----------+
| id | name |
+------+----------+
| 1 | xiaoming |
| 2 | xiaohua |
| 3 | lihua |
+------+----------+
3 rows in set (0.01 sec)
mysql> select * from t1; --跑到主庫去查看數據
+------+----------+
| id | name |
+------+----------+
| 1 | xiaoming |
| 3 | lihua |
+------+----------+
2 rows in set (0.00 sec)
在主庫查不到數據,通過代理可以查到,即可驗證讀寫分離成功。
報錯解決
MySQL [lutixiadb]> show tables;
ERROR 1184 (HY000): Invalid DataSource:0
可能是後端節點出現了問題,也有可能是代理端無法連上後端節點導致,可以先在代理端直接用授權用戶名和密碼登錄後端數據庫測試連接問題
[root@node3 conf]# mysql -umycat-proxy -h192.168.75.134 -p123456
ERROR 1129 (HY000): Host 'node3' is blocked because of many connection errors;
unblock with 'mysqladmin flush-hosts'
可以看到因爲多次錯誤,代理端服務器被鎖定了,所以也會出現上面的報錯,在後端主庫執行如下命令
mysqladmin flush-hosts
再次測試,一般問題就能解決。