1. 程式人生 > >六、mysql集群-mycat

六、mysql集群-mycat

idt ati check 分布式事務 san tst pan 合計 listen

Mycat關鍵特性

關鍵特性

  • 支持SQL92標準

  • 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常見SQL語法

  • 遵守Mysql原生協議,跨語言,跨平臺,跨數據庫的通用中間件代理。

  • 基於心跳的自動故障切換,支持讀寫分離,支持MySQL主從,以及galera cluster集群。

  • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster

  • 基於Nio實現,有效管理線程,解決高並發問題。

  • 支持數據的多片自動路由與聚合,支持sum,count,max等常用的聚合函數,支持跨庫分頁。

  • 支持單庫內部任意join,支持跨庫2表join,甚至基於caltlet的多表join。

  • 支持通過全局表,ER關系的分片策略,實現了高效的多表join查詢。

  • 支持多租戶方案。

  • 支持分布式事務(弱xa)。

  • 支持XA分布式事務(1.6.5)。

  • 支持全局序列號,解決分布式下的主鍵生成問題。

  • 分片規則豐富,插件化開發,易於擴展。

  • 強大的web,命令行監控。

  • 支持前端作為MySQL通用代理,後端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。

  • 支持密碼加密

  • 支持服務降級

  • 支持IP白名單

  • 支持SQL黑名單、sql註入***攔截

  • 支持prepare預編譯指令(1.6)

  • 支持非堆內存(Direct Memory)聚合計算(1.6)

  • 支持PostgreSQL的native協議(1.6)

  • 支持mysql和oracle存儲過程,out參數、多結果集返回(1.6)

  • 支持zookeeper協調主從切換、zk序列、配置zk化(1.6)

  • 支持庫內分表(1.6)

  • 集群基於ZooKeeper管理,在線升級,擴容,智能優化,大數據處理(2.0開發版)。

  • 什麽是MYCAT

  • 一個徹底開源的,面向企業應用開發的大數據庫集群

  • 支持事務、ACID、可以替代MySQL的加強版數據庫

  • 一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群

  • 一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server

  • 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品

  • 一個新穎的數據庫中間件產品


安裝mycat進行負載 讀寫分離

hosts配置
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 mycat
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.55     yum
172.16.1.200    master
172.16.1.105    slave
172.16.1.130    mycat



安裝jdk1.7

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html
mkdir /java
cd /java
tar xf jdk-7u80-linux-x64.tar.gz
chown -R root:root /java/jdk1.7.0_80
cat << EOF >>/etc/profile
export PATH=/java/jdk1.7.0_80/bin:$PATH
export CLASSPATH=.:/java/jdk1.7.0_80/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EOF
source /etc/profile
cd /application/tools/
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat/ /application/


設置mycat的環境變量

echo "export MYCAT_HOME=/application/mycat" >> /etc/profile
echo "export PATH=$PATH:/application/mycat/bin" >> /etc/profile
source /etc/profile



配置文件如下所示:

cd /application/mycat/conf/
vi schema.xml  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!--定義MyCAT實例的邏輯庫和邏輯表-->
        <schema name="appdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="master,master2,slave">  </schema>
        <!--定義MyCAT邏輯表中提到的所有dataNode所在的真實Host,以及dataNode所屬的真實數據庫-->
        <dataNode name="dn_test" dataHost="dn85" database="appdb" />
        <!--定義dataNode提到的dataHost的連接限制數、負載均衡取向,以及真實的讀寫地址(writeHost和readHost)-->
        <!--balance屬性 負載均衡類型,目前的取值有3種-->
        <!--balance="0", 所有讀操作都發送到當前可用的writeHost上-->
        <!--balance="1",所有讀操作都隨機的發送到readHost-->
        <!--balance="2",所有讀操作都隨機的在writeHost、readhost上分發-->
        
        <!--writeType屬性 負載均衡類型,目前的取值有3種-->
        <!--writeType="0", 所有寫操作都發送到可用的writeHost上-->
        <!--writeType="1",所有寫操作都隨機的發送到readHost-->
        <!--writeType="2",所有寫操作都隨機的在writeHost、readhost分上發-->
        
        <!--switchType="-1,1,2,3" 是否啟用主從切換-->
        <!--switchType='-1' 表示不自動切換-->
        <!--switchType='1' 默認值,表示自動切換-->
        <!--switchType='2' 基於MySQL主從同步的狀態決定是否切換,心跳語句為 show slave status-->
        <!--switchType='3'基於MySQL galary cluster的切換機制(適合集群)(1.4.1),心跳語句為 show status like 'wsrep%'-->
        <dataHost name="dn85" maxCon="1000" minCon="3" balance="-1"
         writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
<!--真實的讀寫地址-->
                <heartbeat>select user()</heartbeat>
                <writeHost host="100_M"  url="172.16.1.200:3306" user="appuser" password="mtls0352">
                        <readHost host="87_S1" url="172.16.1.87:3306" user="appuser" password="mtls0352"/>
                </writeHost>
        </dataHost>
</mycat:schema>
vi server.xml
<user name="appuser">
                <property name="password">123456</property>
                <property name="schemas">appdb</property>
        </user>


在數據庫中創建用戶、mycat會有這個用戶連接數據庫

create user appuser@'%' identified by 'mtls0352';
create database appdb char set utf8;
grant all on appdb.* to appuser@'%';


開啟mycat

mycat start


查看端口

netstat -tnlp
TCP *:9066 (LISTEN) #虛擬schema管理端口 
TCP *:8066 (LISTEN) #虛擬schema登陸端口


登錄mycat管理端:

mysql -uappuser -p123455 -h172.16.1.130 -P9066
mysql> show @@heartbeat;
mysql> show @@heartbeat;
+--------+-------+--------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME   | TYPE  | HOST         | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
+--------+-------+--------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| 200_M  | mysql | 172.16.1.200 | 3306 |       1 |     0 | idle   |       0 | 23,23,23     | 2018-05-29 22:42:18 | false |
| 105_S1 | mysql | 172.16.1.105 | 3306 |       1 |     0 | idle   |       0 | 75,75,75     | 2018-05-29 22:42:18 | false |
+--------+-------+--------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
2 rows in set (0.00 sec)



mycat讀寫分離驗證


更改日誌的輸出模式
vi /application/mycat/conf/log4j.xml 
修改<asyncRoot level="info" includeLocation="true">
為 <asyncRoot level="debug" includeLocation="true">


創建表

mysql -uappuser -p123456 -h172.16.1.130 -P8066
create table test (id bigint not null primary key,user_id varchar(100),date DATE, fee decimal);
insert into test(id,user_id,date,fee)  values(1,@@hostname,20161201,100);
insert into test(id,user_id,date,fee)  values(5000001,@@hostname,20161202,100);
select * from test;


查詢觀察日誌的變化

select * from test
tail -f /application/mycat/logs/wrapper.log 
[root@mycat logs]# cat  wrapper.log  | grep "select read source 105_S1"
INFO   | jvm 1    | 2018/05/29 22:46:13 | 2018-05-29 22:46:13,624 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:34 | 2018-05-29 22:46:34,026 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:34 | 2018-05-29 22:46:34,550 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:34 | 2018-05-29 22:46:34,914 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:35 | 2018-05-29 22:46:35,225 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:35 | 2018-05-29 22:46:35,546 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:35 | 2018-05-29 22:46:35,877 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:36 | 2018-05-29 22:46:36,237 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:36 | 2018-05-29 22:46:36,559 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:36 | 2018-05-29 22:46:36,892 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:37 | 2018-05-29 22:46:37,199 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:37 | 2018-05-29 22:46:37,523 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:37 | 2018-05-29 22:46:37,840 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:38 | 2018-05-29 22:46:38,153 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:38 | 2018-05-29 22:46:38,477 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:38 | 2018-05-29 22:46:38,831 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
INFO   | jvm 1    | 2018/05/29 22:46:39 | 2018-05-29 22:46:39,193 [DEBUG][$_NIOREACTOR-0-RW] select read source 105_S1 for dataHost:dn85  (io.mycat.backend.datasource.PhysicalDBPool:PhysicalDBPool.java:456) 
[root@mycat logs]# cat  wrapper.log  | grep "select read source 105_S1" | wc -l
17
進行了17查詢結果證明讀寫分離配置成功


六、mysql集群-mycat