# redisWork
**Repository Path**: zhayan/redis-work
## Basic Information
- **Project Name**: redisWork
- **Description**: redis集群与JedisCluster模拟
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-02-11
- **Last Updated**: 2022-05-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Redis作业
[模拟结果](doc/redis集群分片模拟.rar)
## 安装
```
# C语言环境
yum install -y gcc-c++
# 下载
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar -zxf redis-5.0.5.tar.gz
# 编译
cd redis-5.0.5/src
make
# 安装各个实例
mkdir /redis -p
make install PREFIX=/redis/7001
make install PREFIX=/redis/7002
...
make install PREFIX=/redis/7008
# 实例配置(redis-5.0.5目录)
cp redis.conf /redis/7001/bin
cp redis.conf /redis/7002/bin
...
cp redis.conf /redis/7008/bin
# 各个实例配置
vim redis.conf
#bind 127.0.0.1
protected-mode no
port 7001-7008
daemonize no
cluster-enabled yes
pidfile /var/run/redis_[7001].pid
```
```
# 后台启动
cd /redis/7001/bin
./redis-server redis.conf
# cli登录
cd /redis/7001/bin
./redis-cli -h host -p port
```
## 集群设置
1. 三主三从:7001-7006,共6个节点
2. 额外一主一从进行扩容:7007-7008
3. 实例redis.conf配置:
```
port 7001
# 开启集群化
cluster-enabled yes
```
4. -c 启动
```
# 单个启动
cd redis/[7001]/bin
./redis-server redis.conf
# 连接,如果参数cluster-enabled yes已经存在,需要 -c连接
cd redis/[7001]/bin
./redis-cli -h 192.168.174.134 -p [7001] -c
```
5. 创建集群(实例中不能有数据):
```
cd redis/7001/bin
./redis-cli --cluster create 192.168.174.134:7001 192.168.174.134:7002 192.168.174.134:7003 192.168.174.134:7004 192.168.174.134:7005 192.168.174.134:7006 --cluster-replicas 1
```
6. 客户端连接集群:
```
cd redis/7001/bin
./redis-cli -h 192.168.174.134 -p 7001 -c
```
7. 集群状态:
```
cluster info
cluster nodes
```


| master-port | cluster-port | slot |
| ----------- | ------------ | ----------- |
| 7002 | 7006 | 5461-10922 |
| 7003 | 7005 | 10923-16383 |
| 7001 | 7004 | 0-5460 |
8. 数据模拟:获取数据发生redirect

## JedisCluster访问
## 节点扩容
### 7007主节点
1. 加入集群
```
cd redis/7007/bin
./redis-cli --cluster add-node 192.168.174.134:7007 192.168.174.134:7001
```

2. 节点分配slot(连接集群任意可用节点)
```
./redis-cli --cluster reshard 192.168.174.134:7007
```
3. 分配slot数量:3000
4. 输入接受slot的节点id:id通过 ``cluster nodes``查看7007的节点id
5. 输入源节点id:``all``
6. 开始移动slot:``yes``

| master | slave | slot |
| ------ | ----- | ------------------------------------------------- |
| 7002 | 7006 | 6462-10922 |
| 7003 | 7005 | 11922-16383 |
| 7001 | 7004 | 999-5460 |
| 7007 | | 设置3000个slot
0-998/ 5461-6461/ 10923-11921 |
### 7008从节点
1. 7008作为7007的从节点
2. 命令:
```
cd redis/7008/bin
./redis-cli --cluster add-node 192.168.174.134:7008 192.168.174.134:7007 --cluster-slave --cluster-master-id d47af82d181dc8be3bfb17b27d9ece1124d53f5c
```


| master | slave | slot |
| ------ | ----- | ------------------------------------------------- |
| 7002 | 7006 | 6462-10922 |
| 7003 | 7005 | 11922-16383 |
| 7001 | 7004 | 999-5460 |
| 7007 | 7008 | 设置3000个slot
0-998/ 5461-6461/ 10923-11921 |
## 节点缩容
```
./redis-cli --cluster del-node 192.168.174.134:7008 [7008节点id]
```
不能删除占有hash槽的节点,需要将该节点占用的hash槽分配出去。
hash槽分配出去流程:相当于扩容源调整
```
# 把里面的slot全部迁移
./redis-cli --cluster reshard 192.168.174.134:7007
# 被缩容节点的全部slot数量
# 其他接收slot的节点
# slot源为被缩容节点
```
## 数据模拟
不在同一个节点请求数据时发生重定向。

## 问题与解决
1. 重复扩容同一个节点导致的冲突
```
删除集群的配置文件nodes.conf,重新执行add-node
./redis-cli --cluster del-node 192.168.174.134:7007 99f4c7b5be3dcc9007d7c6a4316df3f32b1abd64
```
2.