學習預覽:
(一)mysql 運維基礎篇(Linux雲計算從入門到精通)
(三)mysql 觸發器、存儲過程和函數(數據庫運維基礎補充)
(五)mysql數據備份—物理備份(完備+lvm快照+xtrabackup)+邏輯備份(mysqldump+導入導出)
(六)mysql複製技術—M-S主從配置(傳統+GTID)+M-M-S-S主從配置(GTID)
(七)mysql中間件mycat配置和部署(基於M-M-S-S)
(八) 數據庫集羣技術—Galera Cluster安裝與配置
(九)數據庫集羣技術Galera+mycat(數據庫運維學習終章)
聲明:
上一章我已經介紹了數據庫集羣技術—Galera Cluster安裝與配置,這篇mycat的配置就是基於上篇文章的基礎而做的。
配置好Galera Cluster之後,就開始安裝配置mycat了。安裝mycat之前的java環境和安裝的教程可以看下面這篇博客:
這篇博客主要介紹下配置文件schema.xml 和server.xml在Galera集羣下的配置。還有其它區別於之前mysql8下安裝mycat。因爲之前裝的是mysql8,這次裝的mysql5.7,其實區別並不大,就需要修改下mysql-connector-java的版本(正常你下載的mycat不需要額外花功夫搞這個,只是上次做實驗我裝的mysql-connector-java8,這次又要換回來。其它主要都是配置文件schema.xml 的區別)。
(1)先在Galera1創數據庫並授權給mycat用戶,我就先創三個數據庫(根據需要授權數據庫)。
create database blog;
create database shop;
create database blog;
grant all on testdb.* to testdb@'%' identified by 'Galera@123';
grant all on shop.* to shop@'%' identified by 'Galera@123';
grant all on blog.* to blog@'%' identified by 'Galera@123';
flush privileges;
(2)更換 mysql-connector-java(提醒,如果你做過我之前的實驗這一步要做的,沒做過的話可以跳過這一步)
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.35/mysql-connector-java-5.1.35.jar
ll
cp mysql-connector-java-5.1.35.jar /usr/local/mycat/lib/
cd /usr/local/mycat/
mv lib/mysql-connector-java-8.0.19.jar /root
chmod 777 lib/mysql-connector-java-5.1.35.jar
ll lib
(3) vim /usr/local/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!--配置連接mycat的用戶-->
<user name="testdb">
<property name="password">123456</property>
<!--虛擬數據庫,這個要和schema.xml定義的數據庫相一致-->
<property name="schemas">testdb</property>
</user>
<user name="shop">
<property name="password">123456</property>
<!--虛擬數據庫,這個要和schema.xml定義的數據庫相一致-->
<property name="schemas">shop</property>
</user>
<user name="blog">
<property name="password">123456</property>
<!--虛擬數據庫,這個要和schema.xml定義的數據庫相一致-->
<property name="schemas">blog</property>
</user>
</mycat:server>
(4)vim /usr/local/mycat/conf/schema.xml 。先做一個簡單介紹:
- balance=1 開啓讀寫分離機制,所有讀操作都發送到當前可用的writeHost上。
- wirteType=0 所有寫操作發送到第-個writeHost ,第一個掛了切換到第二個
- switchType=3 基於MySQL Galera cluster的切換機制, 心跳語句爲show status like 'wsrep%'
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="shop" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<schema name="blog" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="testdb" />
<dataNode name="dn2" dataHost="localhost2" database="shop" />
<dataNode name="dn3" dataHost="localhost3" database="blog" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="galera1" url="galera1:3306" user="testdb" password="Galera@123"> </writeHost>
<writeHost host="galera2" url="galera2:3306" user="testdb" password="Galera@123"> </writeHost>
<writeHost host="galera3" url="galera3:3306" user="testdb" password="Galera@123"> </writeHost>
<writeHost host="galera4" url="galera4:3306" user="testdb" password="Galera@123"> </writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="galera1" url="galera1:3306" user="shop" password="Galera@123"> </writeHost>
<writeHost host="galera2" url="galera2:3306" user="shop" password="Galera@123"> </writeHost>
<writeHost host="galera3" url="galera3:3306" user="shop" password="Galera@123"> </writeHost>
<writeHost host="galera4" url="galera4:3306" user="shop" password="Galera@123"> </writeHost>
</dataHost>
<dataHost name="localhost3" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="3" slaveThreshold="100">
<heartbeat>show status like 'wsrep%'</heartbeat>
<writeHost host="galera1" url="galera1:3306" user="blog" password="Galera@123"> </writeHost>
<writeHost host="galera2" url="galera2:3306" user="blog" password="Galera@123"> </writeHost>
<writeHost host="galera3" url="galera3:3306" user="blog" password="Galera@123"> </writeHost>
<writeHost host="galera4" url="galera4:3306" user="blog" password="Galera@123"> </writeHost>
</dataHost>
</mycat:schema>
(5)啓動mycat
#先關掉mycat,在控制檯中運行mycat,檢查錯誤,沒有錯誤就啓動mycat
/usr/local/mycat/bin/mycat stop
/usr/local/mycat/bin/mycat console
Running Mycat-server...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log
#啓動mycat
/usr/local/mycat/bin/mycat start
#檢測java端口是否打開
ss -nltp | grep java
LISTEN 0 1 127.0.0.1:32000 *:* users:(("java",pid=88675,fd=4))
LISTEN 0 100 :::9066 :::* users:(("java",pid=88675,fd=68))
LISTEN 0 100 :::8066 :::* users:(("java",pid=88675,fd=72))
(6)客戶端登錄
先添加主機解釋,這個自己做相應的修改(每臺都要做的)
192.168.119.163 galera1
192.168.119.160 galera2
192.168.119.161 galera3
192.168.119.162 galera4
開始登錄(登錄三個賬號查看)
mysql -h192.168.119.165 -utestdb -p123456 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| testdb |
+----------+
mysql -h192.168.119.165 -ushop -p123456 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| shop |
+----------+
mysql -h192.168.119.165 -ublog -p123456 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| blog |
+----------+
(7)檢測mycat是否實現讀寫分離
- 所有節點都正常writeHost負責寫操作,備writHost負責讀操作
- 當第一個writeHost失效時 ,其中一個備的writeHost負責寫操作,其他備的writeHost負責讀操作
- 當只有一個writeHost時,同時負擔讀寫
先配置conf/log4j.xml文件,將輸出級別調整爲debug級別,便於觀察問題:
vim /usr/local/mycat/conf/log4j2.xml
然後在客戶機上插入數據,並在mycat主機上查看日誌:tailf /usr/local/mycat/logs/mycat.log
MySQL [(none)]> insert into testdb.t1 values (5,'77777777777777777777');
如下圖,很明顯在Galera1上進行寫的:
如果讀呢?很明顯從Galera2上讀。
MySQL [(none)]> select * from testdb.t1 where name='77777777777777777777';
如果我直接把Galera1和Galera2掛掉呢?看看有什麼改變:
讀的時候發生讀節點轉換,轉換到Galera3上讀。
MySQL [(none)]> select * from testdb.t1 where name='77777777777777777777';
寫入數據的時候,開始從Galera4上寫入數據:
MySQL [(none)]> insert into testdb.t1 values (7,'888888888888887');
結束語:
自此Linux雲計算之mysql運維篇就結束了,我覺得這些還挺實用的,後面講的數據庫中間件mycat,其實介紹的很淺顯。有興趣的童鞋可以去官網下載官方文檔好好學習,比如它還適用於分佈式數據庫等等。後面如果我還會遇到一些比較有用的知識,也願意和大家一起分享。😀