From 21b8f6f305c9af92fcea6f13b619d2f7f7147e88 Mon Sep 17 00:00:00 2001 From: gaulzhw Date: Mon, 25 Sep 2017 12:43:56 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 149 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 104 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 90d7de7..895df35 100644 --- a/README.md +++ b/README.md @@ -1,72 +1,131 @@ # tcp-proxy -Genel TCP Proxy using Java NIO ,simple and fast +Mycat 2.0 预览版。 -学习Mycat核心,学习NIO编程,都可以从这个代码来理解。可以用来实现如下目标: -高性能HTTP Proxy -高性能FTP Proxy -高性能WebService 网关 +基于Nio实现,有效管理线程,解决高并发问题。 -如果代码看不懂,建议去看看《架构解密》中关于NIO的内容,或者报名Leader us私塾 中间件研发课程,QQ 群 106088787 +前后端共享buffer,支持全透传和半透传,极致提升内核性能,稳定性和兼容性。 -## 目前已实现的特性: -* 基于Nio实现,有效管理线程,解决高并发问题。 -* 自动集群功能。 -* 支持SQL92标准。 -* 支持单库内任意sql。 -* 前后端共享buffer,支持全透传和半透传,极致提升内核性能,稳定性 和 兼容性。 +# 功能特性 +- [x] 支持SQL92标准。 +- [x] 支持单库内任意sql。 -### 集群配置说明 +- [x] 支持读写分离。 -- 非集群模式 - - 指定`mycat.yml`中的ip和port - - 修改`cluster.yml`中的`enable: false`,设置cluster的port +- [x] 自动集群管理。 +- [x] 支持负载均衡。 -- 集群模式 - - 开启集群:`cluster.yml`中的`enable: true`,设置cluster的port,`myNodeId`需要在集群中唯一 - - 负载均衡:`balancer.yml`中的`enable: true`,设置balancer的port及strategy - - 集群模式下,只有在集群状态下才提供代理服务,在脱离集群状态下将暂时无法提供代理服务 +- [x] 支持主从切换。 +- [x] 支持动态注解。 +- [ ] 结果集缓存。 -### 运行方式: -#### 一 下载 - 1.1 window 环境 下载 mycat2-0.1-20170906223147-win.tar.gz
- 1.2 linux 环境 下载 mycat2-0.1-20170906223147-linux.tar.gz
-#### 二 修改配置文件 - 2.1 需要修改 conf 目录下 `schema.yml` `datasource.yml` 两个配置文件。
- 2.2 `schema.yml`中 需要设置 default-db (默认数据库), default-rep (默认复制组) 属性。
- 2.3 `datasource.yml` 中 需要设置 ip port user password min-con max-con 属性。
+# 配置说明 -#### 三 运行 +- mycat.yml:mycat代理的配置,指定开启的端口号提供代理服务 - 3.1 运行的方式与 1.6 相同。
- 3.2 linux 环境 运行 bin 目录下 ./mycat {console | start | stop | restart | status | dump }
- 3.3 window 环境 运行 bin 目录下 startup_nowrap.bat
- 3.4 运行成功后, 使用 root 账号登录,登录密码 123456 登录, 端口号 8066
+- cluster.yml:集群配置,可以开启关闭集群功能,指定集群端口和id号,id在集群内必须唯一 -#### 四 启动第二个mycat,并自动加入集群。 +- balancer.yml:负载均衡配置,可以开启关闭负载均衡,负载均衡只有在集群模式下才生效 - 4.1 集群相关配置文件 - `conf` 目录下, 修改mycat.yml,cluster.yml,balancer.yml 三个配置文件。
- 配置文件中 `cluster.allnodes` 属性 需要将集群中,所有节点的信息配置上。
- 4.2 需要注意的是,每个节点一套mycat程序。
- 4.3 配置完成后 按照第三步 启动mycat. 新启动的mycat 将自动加入集群中。
+- heartbeat.yml:心跳配置,指定心跳周期及切换间隔 -### 五 在IDEA中调试集群 +- schema.yml:mycat的逻辑库 - IDEA中调试可以设置启动参数,支持的启动参数: - -mycat.proxy.port 8067 - -mycat.cluster.enable true - -mycat.cluster.port 9067 - -mycat.cluster.myNodeId leader-2 \ No newline at end of file +- datasource.yml:后端数据库的复制组配置 + +- replica-index.yml:指定datasource.yml中复制组的写节点,默认为0 + +- sharding-rule.yml:分片规则 + + + + + +# 启动运行 + + +## 一、本地调试 + +配置文件只能有一个,在IDEA中调试可以设置启动参数,启动参数优先级比配置文件高,会替换掉配置文件的参数,现支持的启动参数: + +- -mycat.proxy.port 8067 + +- -mycat.cluster.enable true + +- -mycat.cluster.port 9067 + +- -mycat.cluster.myNodeId leader-2 + + + + + +## 二、编译运行 + +### 1. 下载源码并编译 + +1. clone源代码 git clone https://github.com/MyCATApache/tcp-proxy.git + +2. maven编译 mvn clean install + +3. 在target目录下找到操作系统对应的压缩包,如linux下的mycat2-0.1-20170906223147-linux.tar.gz + +4. 将压缩包解压缩到指定路径 + + + + + +### 2. 修改配置文件 + +配置文件在conf目录下,需要修改的配置文件包括: + +1. mycat.yml,指定ip和端口号 + +2. cluster.yml,指定是否开启集群模式以及集群节点的基本信息,默认集群关闭 + +3. balancer.yml,指定是否开启负载均衡模式以及负载均衡的基本信息,默认负载均衡关闭 + +4. heartbeat.yml,配置心跳相关信息,可以使用默认值 + +5. schema.yml,设置相关的schema + +6. datasource.yml,设置后端连接的复制组信息 + +7. replica-index.yml,设置复制组写节点配置,默认为0 + + + + + +### 3. 运行 + +1. 运行的方式与 1.6 相同 + +2. linux 环境 运行 bin 目录下 ./mycat {console | start | stop | restart | status | dump } + +3. window 环境 运行 bin 目录下 startup_nowrap.bat + +4. 运行成功后,使用 root 账号登录,登录密码 123456 登录,端口号为mycat.yml中配置的端口号,默认为8066 + + + + + +### 4. 集群启动 + +1. conf目录下,需要正确配置mycat.yml,cluster.yml,balancer.yml + +2. 配置完成后,按照第三步的方式依次启动各个节点的mycat,将自动进行集群管理 \ No newline at end of file From e8cd62d3d093a1e51d81a6d5674448fcf8214af6 Mon Sep 17 00:00:00 2001 From: zwyqz <329636271@qq.com> Date: Mon, 25 Sep 2017 12:44:00 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/io/mycat/mycat2/MySQLSession.java | 8 +++++++- .../src/main/java/io/mycat/mycat2/MycatSession.java | 11 ++++++++++- source/src/main/java/io/mycat/proxy/ProxyBuffer.java | 4 ++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/source/src/main/java/io/mycat/mycat2/MySQLSession.java b/source/src/main/java/io/mycat/mycat2/MySQLSession.java index 0ab24d5..9064032 100644 --- a/source/src/main/java/io/mycat/mycat2/MySQLSession.java +++ b/source/src/main/java/io/mycat/mycat2/MySQLSession.java @@ -9,6 +9,7 @@ import io.mycat.mycat2.beans.MySQLMetaBean; import io.mycat.mycat2.cmds.pkgread.PkgFirstReader; import io.mycat.mycat2.cmds.pkgread.PkgProcess; +import io.mycat.mycat2.console.SessionKeyEnum; import io.mycat.proxy.BufferPool; /** @@ -53,7 +54,12 @@ public void bind2MycatSession(MycatSession mycatSession) { public void unbindMycatSession() { this.useSharedBuffer(null); this.setCurBufOwner(true); //设置后端连接 获取buffer 控制权 + if(this.mycatSession != null) { + this.mycatSession.clearBeckend(this); + } this.mycatSession = null; + + this.getSessionAttrMap().remove(SessionKeyEnum.SESSION_KEY_CONN_IDLE_FLAG.getKey()); } @Override @@ -90,7 +96,7 @@ public void setMySQLMetaBean(MySQLMetaBean metaBean) { @Override public String toString() { - return "MySQLSession [database=" + database + ", ip=" + mysqlMetaBean.getDsMetaBean().getIp() + ",port=" + mysqlMetaBean.getDsMetaBean().getPort() + "]"; + return "MySQLSession [database=" + database + ", ip=" + mysqlMetaBean.getDsMetaBean().getIp() + ",port="+ mysqlMetaBean.getDsMetaBean().getPort()+ ",hashCode="+hashCode()+"]"; } } diff --git a/source/src/main/java/io/mycat/mycat2/MycatSession.java b/source/src/main/java/io/mycat/mycat2/MycatSession.java index 8af2ff8..fa51694 100644 --- a/source/src/main/java/io/mycat/mycat2/MycatSession.java +++ b/source/src/main/java/io/mycat/mycat2/MycatSession.java @@ -202,6 +202,7 @@ public void bindBackend(MySQLSession backend) { backend.setMycatSession(this); backend.useSharedBuffer(this.proxyBuffer); backend.setCurNIOHandler(this.getCurNIOHandler()); + backend.getSessionAttrMap().put(SessionKeyEnum.SESSION_KEY_CONN_IDLE_FLAG.getKey(), false); } /** @@ -212,6 +213,11 @@ public void unbindAllBackend() { backendMap.forEach((key, value) -> { if (value != null) { value.forEach(mySQLSession -> { + /*需要将前端的mycatSession设置为空 不然还会被使用*/ + MycatSession mycatSession = mySQLSession.getMycatSession(); + if(null != mycatSession) { + mycatSession.curBackend = null; + } mySQLSession.unbindMycatSession(); reactor.addMySQLSession(mySQLSession.getMySQLMetaBean(), mySQLSession); }); @@ -226,11 +232,14 @@ public void unbindBeckend(MySQLSession mysqlSession){ mysqlSession.unbindMycatSession(); list.remove(mysqlSession); } + clearBeckend(mysqlSession); + } + + public void clearBeckend(MySQLSession mysqlSession){ if(curBackend!=null&&curBackend.equals(mysqlSession)){ curBackend = null; } } - /** * 解除绑定当前 metaBean 所有的后端连接 * @param mySQLMetaBean diff --git a/source/src/main/java/io/mycat/proxy/ProxyBuffer.java b/source/src/main/java/io/mycat/proxy/ProxyBuffer.java index 3c6391d..e43fc6c 100644 --- a/source/src/main/java/io/mycat/proxy/ProxyBuffer.java +++ b/source/src/main/java/io/mycat/proxy/ProxyBuffer.java @@ -1,6 +1,5 @@ package io.mycat.proxy; -import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import org.slf4j.Logger; @@ -414,7 +413,7 @@ public byte[] getLenencBytes(int index) { * 值 * @return 长度 */ - public int getLenencLength(int lenenc) { + public static int getLenencLength(int lenenc) { if (lenenc < 251) { return 1; } else if (lenenc >= 251 && lenenc < (1 << 16)) { @@ -426,6 +425,7 @@ public int getLenencLength(int lenenc) { } } + public long getLenencInt(int index) { long len = getInt(index, 1) & 0xff; if (len == 0xfc) {