Skip to content

Commit

Permalink
Merge pull request MyCATApache#26 from MyCATApache/master
Browse files Browse the repository at this point in the history
从主干合并
  • Loading branch information
yanjunli authored Sep 25, 2017
2 parents 6bf79b1 + 9dd2815 commit 4e7a575
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 49 deletions.
149 changes: 104 additions & 45 deletions README.md
Original file line number Diff line number Diff line change
@@ -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 <br>
1.2 linux 环境 下载 mycat2-0.1-20170906223147-linux.tar.gz<br>

#### 二 修改配置文件

2.1 需要修改 conf 目录下 `schema.yml` `datasource.yml` 两个配置文件。<br>
2.2 `schema.yml`中 需要设置 default-db (默认数据库), default-rep (默认复制组) 属性。<br>
2.3 `datasource.yml` 中 需要设置 ip port user password min-con max-con 属性。<br>
# 配置说明

#### 三 运行
- mycat.yml:mycat代理的配置,指定开启的端口号提供代理服务

3.1 运行的方式与 1.6 相同。<br>
3.2 linux 环境 运行 bin 目录下 ./mycat {console | start | stop | restart | status | dump }<br>
3.3 window 环境 运行 bin 目录下 startup_nowrap.bat<br>
3.4 运行成功后, 使用 root 账号登录,登录密码 123456 登录, 端口号 8066<br>
- cluster.yml:集群配置,可以开启关闭集群功能,指定集群端口和id号,id在集群内必须唯一

#### 四 启动第二个mycat,并自动加入集群。
- balancer.yml:负载均衡配置,可以开启关闭负载均衡,负载均衡只有在集群模式下才生效

4.1 集群相关配置文件
`conf` 目录下, 修改mycat.yml,cluster.yml,balancer.yml 三个配置文件。<br>
配置文件中 `cluster.allnodes` 属性 需要将集群中,所有节点的信息配置上。<br>
4.2 需要注意的是,每个节点一套mycat程序。<br>
4.3 配置完成后 按照第三步 启动mycat. 新启动的mycat 将自动加入集群中。<br>
- heartbeat.yml:心跳配置,指定心跳周期及切换间隔

### 五 在IDEA中调试集群
- schema.yml:mycat的逻辑库

IDEA中调试可以设置启动参数,支持的启动参数:
-mycat.proxy.port 8067
-mycat.cluster.enable true
-mycat.cluster.port 9067
-mycat.cluster.myNodeId leader-2
- 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,将自动进行集群管理
8 changes: 7 additions & 1 deletion source/src/main/java/io/mycat/mycat2/MySQLSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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()+"]";
}

}
11 changes: 10 additions & 1 deletion source/src/main/java/io/mycat/mycat2/MycatSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ public void bindBackend(MySQLSession backend) {
backend.setCmdChain(getCmdChain());
backend.useSharedBuffer(this.proxyBuffer);
backend.setCurNIOHandler(this.getCurNIOHandler());
backend.getSessionAttrMap().put(SessionKeyEnum.SESSION_KEY_CONN_IDLE_FLAG.getKey(), false);
}

/**
Expand All @@ -194,6 +195,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);
});
Expand All @@ -208,11 +214,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
Expand Down
4 changes: 2 additions & 2 deletions source/src/main/java/io/mycat/proxy/ProxyBuffer.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package io.mycat.proxy;

import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;

import org.slf4j.Logger;
Expand Down Expand Up @@ -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)) {
Expand All @@ -426,6 +425,7 @@ public int getLenencLength(int lenenc) {
}
}


public long getLenencInt(int index) {
long len = getInt(index, 1) & 0xff;
if (len == 0xfc) {
Expand Down

0 comments on commit 4e7a575

Please sign in to comment.