DB Proxy,数据库中间件

mycat功能
1. 读写分离 M-S-S  M-M-S-S
2. 负载均衡   Galera Cluster
3. 支持数据的分片自动路由与聚合

同类产品
MySQL Proxy          MySQL官方    
Atlas                     奇虎360
DBProxy                美团点评
cober                    阿里巴巴
MyCat                   阿里巴巴

Mycat概述
Mycat是一个开源的分布式数据库系统,不同于oracle和mysql,Mycat并没有存储引擎,但是Mycat实现了mysql协议,前段用户可以把它当做一个Proxy。其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端mysql存储引擎里面。最新版本的Mycat不仅支持mysql,还可以支持MS SqlServer,Oracle,DB2等关系型数据库,而且还支持MongoDB这种NoSQL。Mycat对调用者屏蔽了后端存储具体实现。
Mycat的原理是先拦截用户的SQL语句并做分析:分片分析,路由分析,读写分离分析,缓存分析等,再对将该SQL语句发送到指定规则的数据库。最终将存储引擎返回的结果返回给用户.


架构:    一台MyCat LB     4台mysql  servers(服务器) 做成M-M-S-S
mysql读写分离实现   jdk+mycat环境部署_jdk

开始配置环境:


首先准备好mysql的主从复制,我的是M-M-S-S (双主双从)再接着配置java环境,最后部署mycat

一、配置java环境


JRE  ( Java Runtime Environment)  
是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

JDK (JDK:Java Development Kit )
JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。


下载:   jdk
mysql读写分离实现   jdk+mycat环境部署_安装_02mysql读写分离实现   jdk+mycat环境部署_jdk_03mycat对于 jdk的版本没有太高的的要求 8 9 10 的版本都行
[root@localhost ~]# jdk-10.0.1_linux-x64_bin.tar.gz -C /usr/local
[root@localhost ~]# ln -s /usr/local/jdk-10.0.1/ /usr/local/java
[root@localhost ~]# vim /etc/profile               #添加环境变量
/etc/profile最后面添加:
JAVA_HOME=/usr/local/java/bin
PATH=$PATH:$JAVA_HOME
export JAVA_HOME PATH

或者
[root@localhost ~]# vim /etc/profile
mysql读写分离实现   jdk+mycat环境部署_mysql_04mysql读写分离实现   jdk+mycat环境部署_间件 _05
[root@localhost ~]# source /etc/profile               #刷新环境变量
[root@localhost ~]# env |grep java                       #验证环境变量
[root@localhost ~]# java -version                         #查询java版本,查不出来就是环境变量设置有问题
java端口号9066

下载mycat
mysql读写分离实现   jdk+mycat环境部署_jdk_06mysql读写分离实现   jdk+mycat环境部署_安装_07[root@localhost ~]# tar xf  Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@localhost ~]# ls /usr/local/mycat/

二、配置mycat前端



配置mycat前端


[root@localhost ~]# vim  /usr/local/mycat/conf/server.xml
注释掉多余用户
mysql读写分离实现   jdk+mycat环境部署_jdk_08mysql读写分离实现   jdk+mycat环境部署_安装_09


启动mycat管理员   登录mycat的账户
mysql读写分离实现   jdk+mycat环境部署_间件 _10mysql读写分离实现   jdk+mycat环境部署_mysql_11

配置mycat后端


请务必先备份此文件    schema.xml    
[root@localhost ~]# vim /usr/local/mycat/conf/schema.xml
上面这个是我自己的配置
mysql读写分离实现   jdk+mycat环境部署_jdk_12mysql读写分离实现   jdk+mycat环境部署_mysql_13

这个schema 的 name="mycat"  和  bataNode 的database="mycat"  再加上前端的mycat 必须一致,否则会报错。
mysql读写分离实现   jdk+mycat环境部署_mysql_14mysql读写分离实现   jdk+mycat环境部署_间件 _15
schema name:mycat维护的集群名称。
datanode:后方节点群的名称。
datahost:后方节点群的主机名称。
writehost:写主机
readhost:读主机
小技巧!!!!倒着看。一般的脚本倒着看都能看懂.

关于属性(参数)的介绍:
负载均衡类型:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,
简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2     互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
3. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
4. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,
第一个挂了切到还生存的第二个writeHost,
重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost。
3. writeType="2",没实现。


                                           

三、配置后端mysql群


M-M-S-S 准备Mycat连接的用户及权限:
再其中一个M 服务器上设置,其余都会同步
mysql > grant all on *.* to 'mycatproxy'@'192.168.0.118' identified by 'WJW952945084@qq.com';



                                                   

四、启动MyCat


在mycat服务器上:

root@localhost ~]#  /usr/local/mycat/bin/mycat start
Starting Mycat-server...
启动成功,否则就是配置Mycat后端语法错误。ps:这里启动成功并不能说明什么,是一种假象。你配置有问题它一样也能起来。

[root@localhost ~]# ss -tnlp |grep java      #监测端口是否启动
[root@localhost ~]# ps aux | grep mycat      #检测进程是否启动

为了显示效果在mycat服务器上安装一个  mariadb查看效果
[root@localhost ~]# yum install -y mariadb
[root@localhost ~]# mysql -h10.18.43.101 -uroot -p123456 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| mycat    |
+----------+
1 row in set (0.00 sec)

注意后方mysql群中应该创建该库

在mycat上

select * from tianyun.t1;
insert into tianyun.t1 values(3);
查看效果

最后报错就去查询 mycat.log 日志
[root@localhost ~]# tailf /usr/local/mycat/logs/mycat.log



多库时设置mycat思路:
mysql读写分离实现   jdk+mycat环境部署_安装_16mysql读写分离实现   jdk+mycat环境部署_jdk_17mysql读写分离实现   jdk+mycat环境部署_jdk_18
mysql读写分离实现   jdk+mycat环境部署_jdk_19