mycat+ mysql集羣 分庫分表

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章