CONTEND
7.1 DB Proxy數據庫中間件概述
(1)DB Proxy的應用場景,APPserver端不需要判斷如何去訪問數據庫(畢竟後面的數據庫環境可能會比較複雜),所以只需要安裝proxy就可以實現讀寫分離,訪問數據庫。大概的拓撲圖幫助大家理解其概念哦:
(2)數據庫中間件的主要作用:
- 1.讀寫分離 M-S-S M-M-S-S
- 2.負載均衡 Galera Cluster
- 3.支持數據的分片自動路由與聚合
(3)常見的數據庫中間件:
- MySQL Proxy MySQL官方(這個好像不太好用的亞子)
- Atlas 奇虎360
- DBProxy 美團點評
- Amoeba 早期阿里巴巴
- cober 阿里巴巴
- MyCat 阿里巴巴 (這個比較常用,下面我就使用mycat來部署mysql中間件)
7.2 mycat概述
這個官網上給它的解釋很詳細,我就簡單拉個概念。
- 一個徹底開源的,面向企業應用開發的大數據庫集羣
- 支持事務、ACID、可以替代MySQL的加強版數據庫
- 一個可以視爲MySQL集羣的企業級數據庫,用來替代昂貴的Oracle集羣
- 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
- 結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
- 一個新穎的數據庫中間件產品
7.3 配置java環境
下面我就直接開始安裝mycat了,先配置java環境,mycat是依賴java環境的。
#我安裝的jdk14版本,比較新,大家根據需要下載
wget https://download.oracle.com/otn-pub/java/jdk/14.0.1+7/664493ef4a6946b186ff29eb326336a2/jdk-14.0.1_linux-x64_bin.tar.gz?AuthParam=1587277033_3ff384ec1aceaba6c3613c6c76d44642
#檢查一下本地是否有安裝java,有的話先卸載,因爲低版本的java不適用mycat
rpm -qa | grep java
yum remove java-1.* -y
#解壓
tar xf jdk-14.0.1_linux-x64_bin.tar.gz\?AuthParam\=1587277033_3ff384ec1aceaba6c3613c6c76d44642 -C /usr/local/
ln -s /usr/local/jdk-14.0.1/ /usr/local/java #創建一個鏈接方便使用
#編輯環境變量
vim /etc/profile
----------------------------------------------------------------------------------------
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
----------------------------------------------------------------------------------------
#source生效
source /etc/profile
env | grep java #檢查java環境
PATH=/usr/local/java/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
JAVA_HOME=/usr/local/java
----------------------------------------------------------------------------------------
java -version #檢查JAVA版本
java version "14.0.1" 2020-04-14
Java(TM) SE Runtime Environment (build 14.0.1+7)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
7.4 mycat安裝部署
我這個依舊是基於上篇文章M-M-S-S做的,拓撲如下:
7.4.1 下載mycat和相關驅動
(1)下載mycat:
#我下載的是1.6.7版本
wget http://dl.mycat.i0/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux. tar.gz
#解壓到/usr/local目錄下
tar xf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local/
#修改權限
useradd mycat;passwd mycat
chown mycat:mycat /usr/local/mycat
(2)下載8.x版本的驅動
因爲我的數據庫是mysql8版本,需要下載8.x版本的驅動,Mycat 默認的MySQL驅動版本爲5.x。到maven中央倉庫上覆制8.x驅動jar包的下載地址,然後到Linux上使用wget命令進行下載:
https://mvnrepository.com/artifact/mysql/mysql-connector-java
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar
#將jar包方到這個目錄下,並刪除5.X版本
mv mysql-connector-java-8.0.18.jar /usr/local/mycat/lib/
rm -rf /usr/local/mycat/lib/mysql-connector-java-5.1.35.jar
#接着使用chmod命令設置該驅動包的權限:
chmod 777 lib/mysql-connector-java-8.0.18.jar
7.4.2 修改配置文件
主要配置文件schema.xml、server.xml 、wrapper.conf和rule.xml。
方便觀看,我把多餘的註釋和一些內容刪去了,但不影響mycat的使用,後面我會再詳細介紹配置文檔的。
(1)schema.xml文件配置,開放兩個數據庫(testdb和bbs)給用戶。
cd /usr/local/mycat/;
vim conf/schema.xml
<?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="bbs" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="testdb" />
<dataNode name="dn2" dataHost="localhost1" database="bbs" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="jdbc:mysql://master1:3306" user="mycat_user" password="Root@123">
<readHost host="slave1" url="jdbc:mysql://slave1:3306" user="mycat_user" password="Root@123" />
<readHost host="slave2" url="jdbc:mysql://slave2:3306" user="mycat_user" password="Root@123" />
</writeHost>
<writeHost host="master2" url="jdbc:mysql://master2:3306" user="mycat_user" password="Root@123">
<readHost host="slave1" url="jdbc:mysql://slave1:3306" user="mycat_user" password="Root@123" />
<readHost host="slave2" url="jdbc:mysql://slave2:3306" user="mycat_user" password="Root@123" />
</writeHost>
</dataHost>
</mycat:schema>
(2)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="root">
<property name="password">123456</property>
<!--虛擬數據庫,這個要和schema.xml定義的數據庫相一致-->
<property name="schemas">testdb,bbs</property>
</user>
<!--配置第二個連接mycat的用戶-->
<user name="user">
<property name="password">user</property>
<property name="schemas">testdb,bbs</property>
<!--開啓只讀模式-->
<property name="readOnly">true</property>
</user>
</mycat:server>
(3)rule.xml文件配置就默認好了,以後再研究,不過wrapper.conf這個文件要注意了,後面mycat頻繁起不來的很多原因都可以在這邊解決
- 比如MyCat啓動報錯,“運行./mycat console報錯 Unrecognized VM option 'AggressiveOpts'”,我們只需在這個文件把這行註釋掉。
- 還有會輸出以下錯誤信息:(是因爲mycat默認需要的內存要求大於機器的實際內存,修改一下就好了。)
wrapper | Launching a JVM...
wrapper | JVM exited while loading the application.
jvm 1 | Invalid maximum heap size: -Xmx4G
jvm 1 | The specified size exceeds the maximum representable size.
jvm 1 | Error: Could not create the Java Virtual Machine.
jvm 1 | Error: A fatal exception has occurred. Program will exit.
wrapper | Launching a JVM...wrapper | JVM exited while loading the application.
#wrapper.java.additional.3=-XX:+AggressiveOpts wrapper.java.additional.9=-Xmx1G wrapper.java.additional.10=-Xms256M
7.4.3 master1上開啓授權賬號
這個很簡單,注意這邊賬號和密碼要和schema.xml給的賬號密碼一致,並且授權的數據庫也要一致哦。
create user 'mycat_user'@'192.168.119.164' identified with mysql_native_password by 'Root@123';
grant all on testdb.* to 'mycat_user'@'192.168.119.164' ;
grant all on bbs.* to 'mycat_user'@'192.168.119.164' ;
7.5 開啓mycat並測試
(1)啓動mycat並檢查java進程是否起來
#通過console可以啓動mycat並且檢查啓動出現的問題
[root@Centos7-host1 mycat]# bin/mycat console
#保證沒問題直接start
[root@Centos7-host1 mycat]# bin/mycat start
#檢查java進程是否起來,記住這邊8066是客戶端登錄mycat的端口哦!
[root@Centos7-host1 mycat]# ss -nltp | grep java
LISTEN 0 1 127.0.0.1:32000 *:* users:(("java",pid=84602,fd=4))
LISTEN 0 100 :::9066 :::* users:(("java",pid=84602,fd=68))
LISTEN 0 100 :::8066 :::* users:(("java",pid=84602,fd=72))
(2)客戶端登錄測試
客戶機也要添加相應的主機解釋,也要安裝mysql客戶端(最好不要用mysql8版本的,會出問題,因爲密碼加密的方式不一樣)。我這個測試機安裝的是MariaDB客戶端。
#登錄,這邊注意連接的主機是mycat的IP哦,賬號密碼也是訪問mycat的賬戶密碼,不要用訪問數據庫的賬戶密碼
#端口是8066,前面我提示過了。
mysql -h192.168.119.164 -uroot -p123456 -P8066
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.29-mycat-1.6.7.4-release-20200105164103 MyCat Server (OpenCloudDB)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| bbs |
| testdb |
+----------+
MySQL [(none)]> select * from testdb.t1;
+----+---------+
| id | name |
+----+---------+
| 1 | jack |
| 2 | tom |
| 3 | lucy |
| 4 | master1 |
| 5 | master2 |
+----+---------+
(3)mycat主機也可以查看日誌,看客戶端訪問的記錄,訪問的是哪臺數據庫(我就不細說咯)。
[root@Centos7-host1 mycat]# cat logs/mycat.log
over,還有最後一篇數據庫集羣技術再下一篇博客中介紹!