Skip to content

Commit

Permalink
Merge pull request #9 from wuba/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
liuliuwd authored Sep 19, 2022
2 parents 0bb6693 + 5e02105 commit 881c33a
Show file tree
Hide file tree
Showing 92 changed files with 991 additions and 2,101 deletions.
49 changes: 25 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,41 +61,42 @@ CPU:20 x Intel(R) Xeon(R) Silver 4114 CPU @ 2.20GHz

<img src="document/img/rt.png" height="60%" width="60%" />

说明:以上对比测试的中数据,redis、zk、etcd相关非官方数据,均由我们在相同环境下实际压测得到。其中,对于qps的统计,客户端请求一次加锁再请求一次释放锁合并为一次计数,更详细的压测数据及压测条件可查看[开源对比](BENCHMARK.md)文档。
说明:以上对比测试的中数据,redis、zk、etcd相关非官方数据,均由我们在相同环境下实际压测得到。其中,对于qps的统计,客户端请求一次加锁再请求一次释放锁合并为一次计数,更详细的压测数据及压测条件可查看[开源对比](document/BENCHMARK.md)文档。

通过以上几个维度的测试分析,WLock的优势在于可靠性与系统吞吐量比较高,处理延迟略低于redis,但明显高于zookeeper与etcd,为此,对于分布式锁选型有以下建议:
1. 对可靠性要求不高,响应延迟比较敏感的场景,锁并发低于3W时可使用redis,高于3W建议用WLock;
2. 对可靠性要求比较高,同时锁并发高于500的场景,可使用WLock;

## 快速使用
```shell
# 创建集群,添加节点,节点上线相关操作都可以通过 UI 快速完成
http://localhost:8888/swagger-ui/index.html
```
#### 服务初始化步骤 :
1. **项目打包 :**

```shell
mvn clean install
```

2. **创建数据表** - [相关 SQL](document/sql/create.sql)
3. **部署注册中心并启动** - [详情](document/DEPLOY.md)
4. **创建集群** - [详情](document/DEPLOY.md)
5. **添加节点** - [详情](document/DEPLOY.md)
6. **节点上线** - [详情](document/DEPLOY.md)
7. **服务端初始化** - [详情](document/DEPLOY.md)
#### 本地运行 WLock
WLock 运行在所有主流操作系统上,只需要安装Java JDK 8 或更高版本。

#### 快速部署与启动 :
通过该启动方式,会创建默认集群(default_cluster)与默认秘钥(default_key),可快速部署注册中心与服务节点进行测试,[参考文档](document/QUICKDEPLOY.md)

#### 常规部署与启动 :
以下为生产环境正常服务部署、启动流程:
1. **创建数据表**
- wlock注册中心为方便快速启动,使用 H2 数据库,线上建议使用mysql,建表请参考 [ SQL](document/sql/create.sql).
2. **调整数据库配置**[详情](document/DEPLOY.md#调整数据库配置)
3. **部署注册中心并启动** - [详情](document/DEPLOY.md#部署注册中心并启动)
4. **创建集群** - [详情](document/DEPLOY.md#通过swagger进行集群创建)
5. **添加节点** - [详情](document/DEPLOY.md#通过swagger进行节点添加)
6. **节点上线** - [详情](document/DEPLOY.md#通过swagger进行节点上线)
7. **服务端初始化** - [详情](document/DEPLOY.md#服务端初始化)


#### 客户端初始化

**1. 注册秘钥**

```shell
# 访问注册中心节点通过 swagger 快速注册秘钥
http://localhost:8888/swagger-ui/index.html#/key-rest/addKeyUsingPOST
```


**2. 依赖客户端jar包**

```shell
Expand All @@ -118,15 +119,15 @@ http://localhost:8888/swagger-ui/index.html#/key-rest/getKeyListUsingPOST
**4. 初始化**

```java
wLockClient = new WLockClient("test123_8", "127.0.0.1", 22020);
wLockClient = new WLockClient("D484FEEF4F6E564920FABD0DE3C58D77", "127.0.0.1", 22020);
String lockKey = "my_test_lock";
WDistributedLock wdLock = wlockClient.newDistributeLock(lockKey);
```

**参数说明 :**
**keyHash**秘钥名称,从秘钥配置中获取
**keyHash**秘钥hash key,从秘钥配置中获取
**registryIp** :注册中心 ip
**registryPort** :注册中心端口
**registryPort** :注册中心端口
**lockKey** :分布式锁名称
**WDistributedLock** :分布式锁对象封装

Expand Down Expand Up @@ -160,11 +161,11 @@ AcquireLockResult writeResult = writeLock.tryAcquireLock(1000 * 60, 1000 * 60);
**以上只是简单使用demo,详细使用说明请参考[使用文档](document/USE.md)**

## 文档
[开源对比](document/BENCHMARK.md)
[部署文档](document/DEPLOY.md)
[接口文档](document/USE.md)
[分布式锁源码实现对比](document/CONTRAST.md)

[开源对比](document/BENCHMARK.md)
[部署文档](document/DEPLOY.md)
[接口文档](document/USE.md)
[分布式锁源码实现对比](document/CONTRAST.md)
## 参考
[How to do distributed locking](https://martin.kleppmann.com/2016/02/08/how-to-do-distributed-locking.html)

Expand Down
1 change: 1 addition & 0 deletions benchmark/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
<executions>
<execution>
<phase>package</phase>
<id>client</id>
<goals>
<goal>shade</goal>
</goals>
Expand Down
7 changes: 3 additions & 4 deletions client/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,11 @@
<id>copy</id>
<phase>package</phase>
<configuration>
<tasks>
<mkdir dir="${project.basedir}/../target/client"/>
<target>
<copy file="${project.basedir}/target/${project.artifactId}-${project.version}.jar"
tofile="${project.basedir}/../target/client/${project.artifactId}-${project.version}.jar"
tofile="${project.basedir}/../target/${project.artifactId}-${project.version}.jar"
overwrite="true"/>
</tasks>
</target>
</configuration>
<goals>
<goal>run</goal>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.com.wuba.wlock.client;
package com.wuba.wlock.client;

import com.wuba.wlock.client.WDistributedLock;
import com.wuba.wlock.client.WLockClient;
Expand All @@ -37,7 +37,7 @@ public class AcquireLockTest {
@Before
public void init() {
try {
wLockClient = new WLockClient("test123_8", "127.0.0.1", 22020);
wLockClient = new WLockClient("D484FEEF4F6E564920FABD0DE3C58D77", "127.0.0.1", 22020);
Random random = new Random();
lock = random.nextInt(10000) + "test_key_";
wdLock = wLockClient.newDistributeLock(lock);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.com.wuba.wlock.client;
package com.wuba.wlock.client;

import com.wuba.wlock.client.LockOption;
import com.wuba.wlock.client.WDistributedLock;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.com.wuba.wlock.client;
package com.wuba.wlock.client;

import com.wuba.wlock.client.WDistributedLock;
import com.wuba.wlock.client.WLockClient;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.com.wuba.wlock.client;
package com.wuba.wlock.client;

import com.wuba.wlock.client.WLockClient;
import com.wuba.wlock.client.WReadLock;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.com.wuba.wlock.client;
package com.wuba.wlock.client;

import com.wuba.wlock.client.WDistributedLock;
import com.wuba.wlock.client.WLockClient;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package java.com.wuba.wlock.client;
package com.wuba.wlock.client;

import com.wuba.wlock.client.WDistributedLock;
import com.wuba.wlock.client.WLockClient;
Expand Down
69 changes: 32 additions & 37 deletions document/DEPLOY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,58 +4,53 @@
# 服务端初始化详细步骤 :

> 创建集群,添加节点,节点上线相关操作都可以通过 UI 快速完成 : http://localhost:8888/swagger-ui/index.html
> 下方列出的方式是使用 curl 直接调用接口
> url 中的 localhost 表示的是注册中心地址
1. **项目打包 :**
```shell
mvn clean install
## 常规服务部署与启动

### 创建数据表 [相关 SQL](sql/create.sql)
### 调整数据库配置
```
2. **创建数据表** - [相关 SQL](sql/create.sql)
3. **部署注册中心并启动**
```shell
cd target
sh registry/start.sh
unzip registry.zip
cd registry
# 编辑配置文件 :
# 设置配置中的数据库 url 以及用户名,密码.
# 设置配置中的redis ip 端口以及密码.
vi config/application.yml
```
4. **创建集群**

### 部署注册中心并启动

```shell
# url参数 :
# 集群名
# 分组数量
curl -X POST "http://localhost:8888/wlock/cluster/add" -H "accept: */*" -H "token: token" -H "Content-Type: application/json" -d "{\"clusterName\":\"demo_01\",\"groupCount\":15}"
sh bin/start.sh
```
### 通过swagger进行集群创建

5. **添加节点 : **
接口 : `/wlock/cluster/add`

### 通过swagger进行节点添加

> wlock 服务端支持集群模式部署和单机部署,如果服务端为单机部署,在添加节点时候只要添加一个节点即可.
>
> 如果是集群模式部署,请注意多个集群使用的paxos 端口 , tcp 端口 , telnet 端口,udp 端口需要保持一致,每个节点的序列 ID 需要不一样.
```shell
# url参数 :
# 集群名
# 节点
# paxos 端口
# 序列 id
# tcp 端口
# telnet 端口
# udp 端口
curl -X POST "http://localhost:8888/wlock/server/add?clusterName=demo_01&ip=127.0.0.1&paxosPort=123&sequenceId=1&tcpPort=124&telnetPort=125&udpPort=126" -H "accept: */*" -H "token: token" -d ""
```
6. **节点上线**
接口 : `/wlock/server/add`

### 通过swagger进行节点上线
> 对于添加好的节点进行上线操作,只有上线后的节点才会真正对外提供服务
```shell
# url参数 :
# 集群名
# 需要上线的服务序列 id 列表
curl -X POST "http://localhost:8888/wlock/server/online?clusterName=demo_01&serverIdList=1" -H "accept: */*" -H "token: token" -d ""
```
7. **服务端初始化**
> 按照添加节点进行项目启动 ,启动节点数量和添加节点数量相同
接口 : `/wlock/server/online`


### 服务端初始化
> 依次启动已添加的服务节点
```shell
# 1. 执行初始化之前请确认 config 下的registry.properties 中的 registryServerIp配置是不是注册中心 ip
# 2. 确认 server.properties 配置的 listenPort 是不是注册中心新增节点的 tcp 端口,二者需要保持一致
# 3. 由于服务端使用了 RocksDB,mac 的m1 芯片不支持运行 RocksDB,所以建议服务端部署服务器运行
cd target
sh server/start.sh
```
unzip -d ./server server.zip
sh server/bin/start.sh
```

45 changes: 45 additions & 0 deletions document/QUICKDEPLOY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@



# 服务端初始化详细步骤 :

> 创建集群,添加节点,节点上线相关操作都可以通过 UI 快速完成 : http://localhost:8888/swagger-ui/index.html
> url 中的 localhost 表示的是注册中心地址
## 快速部署与启动
### 部署注册中心并启动
```shell
# 在 target 目录中找到 registry 目录,cd 到该目录下执行下面命令 :
sh bin/start.sh
# 确认是否启动成功 :
cat log/registry* | grep "Application start finish"
```
### 快速初始化服务节点
#### swagger 方式 :

快速启动接口 : `/wlock/quick/init`

备注 : 该接口会自动帮助创建 `default_cluster`集群,并且按照参数添加节点,对节点进行创建,给该集群添加秘钥`default_key`.秘钥key和集群会在响应中返回.

#### 脚本方式 :

```shell
# sequence_id 序列 id,用于唯一标识一个集群内的节点,同一集群内唯一
# ip 节点 ip
# tcp_port : 用于对外暴露的端口
# paxos_port : 进行 paxos 的端口
# udpPort : paxos 进行 udp 通信端口
sh quickStart.sh quickinit <sequence_id> <ip> <tcp_port> <paxos_port> <udp_port>
```
### 启动服务节点
> 依次启动已添加的服务节点
```shell
# 启动前确认项:
# 1. 执行初始化之前请确认 config 下的registry.properties 中的 registryServerIp配置是不是注册中心 ip
# 2. 确认 server.properties 配置的 listenPort 是不是注册中心新增节点的 tcp 端口,二者需要保持一致
# 3. 由于服务端使用了 RocksDB,mac 的m1 芯片不支持运行 RocksDB,所以建议服务端部署服务器运行
cd target
unzip -d ./server server.zip
sh server/bin/start.sh
```
52 changes: 27 additions & 25 deletions document/sql/create.sql
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,22 @@ UNIQUE KEY `uniq_g_c` (`group_id`,`cluster_id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='server节点与分组表';

CREATE TABLE `t_key` (
`id` bigint(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '序号',
`name` varchar(255) NOT NULL COMMENT '秘钥名',
`hash_key` varchar(255) NOT NULL,
`cluster_id` varchar(100) NOT NULL COMMENT '集群名',
`org_id` varchar(255) NOT NULL COMMENT '部门id',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`creator` varchar(255) NOT NULL COMMENT '创建人',
`owners` varchar(255) NOT NULL COMMENT '负责人',
`create_time` datetime NOT NULL COMMENT '创建时间',
`group_id` int(10) DEFAULT NULL COMMENT '分组ID',
`qps` int(11) NOT NULL COMMENT 'qps',
`auto_renew` int(10) NOT NULL DEFAULT '0' COMMENT '是否自动续约',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_h` (`hash_key`),
UNIQUE KEY `uniq_m` (`name`)
`id` bigint(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '序号',
`name` varchar(255) NOT NULL COMMENT '秘钥名',
`hash_key` varchar(255) NOT NULL,
`cluster_id` varchar(100) NOT NULL COMMENT '集群名',
`description` varchar(255) DEFAULT NULL COMMENT '描述',
`creator` varchar(255) COMMENT '创建人',
`create_time` datetime NOT NULL COMMENT '创建时间',
`group_id` int(10) DEFAULT NULL COMMENT '分组ID',
`qps` int(11) NOT NULL COMMENT 'qps',
`auto_renew` int(10) NOT NULL DEFAULT '0' COMMENT '是否自动续约',
`multi_group` tinyint(4) DEFAULT '0' COMMENT '多分组标志0单分组,1多分组',
`group_ids` varchar(255) DEFAULT NULL COMMENT '分组列表,多分组才会使用',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_h` (`hash_key`),
UNIQUE KEY `uniq_m` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=294 DEFAULT CHARSET=utf8 COMMENT='秘钥表';
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8 COMMENT='秘钥表';

CREATE TABLE `t_migrate` (
Expand All @@ -71,16 +72,17 @@ KEY `idx_cluster` (`cluster`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='秘钥迁移表';

CREATE TABLE `t_migrate_process` (
`id` bigint(18) NOT NULL AUTO_INCREMENT COMMENT '主键',
`state` tinyint(4) NOT NULL COMMENT '迁移状态',
`key_hash` varchar(255) NOT NULL COMMENT '秘钥hash',
`migrate_key_version` bigint(18) NOT NULL COMMENT 't_migrate 对应的 version',
`is_end` tinyint(4) NOT NULL COMMENT '是否完成 : 0,1',
`groups` varchar(255) NOT NULL COMMENT '迁移的 group',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_key_hash` (`key_hash`)
`id` bigint(18) NOT NULL AUTO_INCREMENT COMMENT '主键',
`state` tinyint(4) NOT NULL COMMENT '迁移状态',
`key_hash` varchar(255) NOT NULL COMMENT '秘钥hash',
`migrate_key_version` bigint(18) NOT NULL COMMENT 't_migrate 对应的 version',
`is_end` tinyint(4) NOT NULL COMMENT '是否完成 : 0,1',
`groups` varchar(255) NOT NULL COMMENT '迁移的 group',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`node_list` varchar(500) DEFAULT NULL COMMENT '迁移节点列表',
PRIMARY KEY (`id`),
KEY `idx_key_hash` (`key_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='迁移表';

CREATE TABLE `t_server` (
Expand Down
Loading

0 comments on commit 881c33a

Please sign in to comment.