六、mysql集群-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

  • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品

  • 一个新颖的数据库中间件产品


安装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查询结果证明读写分离配置成功


猜你喜欢

转载自blog.51cto.com/13712476/2130523