六、mysql集群-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開發版)。
一個徹底開源的,面向企業應用開發的大數據庫集群
支持事務、ACID、可以替代MySQL的加強版數據庫
一個可以視為MySQL集群的企業級數據庫,用來替代昂貴的Oracle集群
一個融合內存緩存技術、NoSQL技術、HDFS大數據的新型SQL Server
結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品
一個新穎的數據庫中間件產品
什麽是MYCAT
安裝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