mycat介紹
Mycat數據庫分庫分表中間件
國內最活躍的、性能最好的開源數據庫中間件!
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
結合傳統數據庫和新型分佈式數據倉庫的新一代企業級數據庫產品
一個新穎的數據庫中間件產品
官網網址:http://www.mycat.io/
環境
服務名 | docker 容器的ip |
---|---|
mycat | 172.18.0.10 |
mysql-01 | 172.18.0.2 |
mysql-02 | 172.18.0.4 |
mysql-03 | 172.18.0.6 |
docker 構建mycat
創建Dockerfile 文件
需要提前下載jdk1.8 和 mycat1.6版本
# 設置鏡像的 base 鏡像,這裏我們使用 centos 系統鏡像
FROM docker.io/centos
# 複製依賴的 jdk 壓縮包,如果是 tar 格式文件,使用 ADD
COPY jdk-8u171-linux-x64.tar.gz /usr/local/
# 執行命令
RUN tar -zxvf /usr/local/jdk-8u171-linux-x64.tar.gz -C /usr/local/
# 設置環境變量
ENV JAVA_HOME=/usr/local/jdk1.8.0_171
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 複製依賴mycat壓縮包
COPY Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz /usr/local/
# 執行命令
RUN tar -zxvf /usr/local/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
# 設置環境變量
ENV MYCAT_HOME=/usr/local/mycat
RUN source /etc/profile
RUN source ~/.bash_profile
CMD ["/usr/local/mycat/bin/mycat", "console"]
執行下面的命令,就可以生成我們需要的含jdk8的mycat1.6的鏡像了( /home/mycat-server 這個是我的當前構建目錄)
docker build -t centos-jdk8-mycat1.6 -f Dockerfile /home/mycat-server
編寫mycat的sechma.xml文件
配置信息規則 請看mycat官網查詢
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<dataNode name="dn1" dataHost="mysql1" database="db1" />
<dataNode name="dn2" dataHost="mysql2" database="db2" />
<dataNode name="dn3" dataHost="mysql3" database="db3" />
<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<dataHost name="mysql1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS1" url="172.18.0.2:3306" user="root"
password="root" />
</dataHost>
<dataHost name="mysql2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS2" url="172.18.0.4:3306" user="root"
password="root" />
</dataHost>
<dataHost name="mysql3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS3" url="172.18.0.6:3306" user="root"
password="root" />
</dataHost>
</mycat:schema>
拉取mysql鏡像
docker pull mysql:5.7
創建docker-compose文件
首先安裝docker-compose
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
查看安裝是否成功
docker-compose -v
編寫docker-compose.yml 文件
version: '2'
services:
mycat:
image: centos-jdk8-mycat1.6
networks:
dcynet:
ipv4_address: 172.18.0.10
volumes:
- /home/mycat-server/mycat/logs:/usr/local/mycat/logs
- /home/mycat-server/schema.xml:/usr/local/mycat/conf/schema.xml
- /home/mycat-server/wrapper.conf:/usr/local/mycat/conf/wrapper.conf
ports:
- "8066:8066"
- "9066:9066"
mysql-01:
image: mysql:5.7
networks:
dcynet:
ipv4_address: 172.18.0.2
ports:
- "3307:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
mysql-02:
image: mysql:5.7
networks:
dcynet:
ipv4_address: 172.18.0.4
ports:
- "3308:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
mysql-03:
image: mysql:5.7
networks:
dcynet:
ipv4_address: 172.18.0.6
ports:
- "3309:3306"
environment:
- MYSQL_ROOT_PASSWORD=root
networks:
dcynet:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.18.0.0/16
對應配置文件中的ip 都需要對應自己docker 網絡信息
查詢語句
# 查看所有的網絡信息
docker network ls
# 查詢網絡 詳細信息
docker network inspect mycat-server_dcynet
docker-compose啓動服務
docker-compose up -d
此時docker 已經啓動多個mysql容器了端口分別爲 3307,3308,3309
和一個mycat容器了 端口是8066和9066
實驗sql
create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
insert into travelrecord(id,user_id,traveldate,fee,days) values(1,'Victor',20160101,100,10);
insert into travelrecord(id,user_id,traveldate,fee,days) values(5000001,'Job',20160102,100,10);
insert into travelrecord(id,user_id,traveldate,fee,days) values(10000001,'Slow',20160103,100,10);
注意 mycat 默認用戶名密碼 root 123456