# 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 ``` ![](doc/img/clusterInfo.png) ​ ![](doc/img/clusterNodes.png) | master-port | cluster-port | slot | | ----------- | ------------ | ----------- | | 7002 | 7006 | 5461-10922 | | 7003 | 7005 | 10923-16383 | | 7001 | 7004 | 0-5460 | 8. 数据模拟:获取数据发生redirect ![](doc/img/clusterRedirected.png) ## JedisCluster访问 ## 节点扩容 ### 7007主节点 1. 加入集群 ``` cd redis/7007/bin ./redis-cli --cluster add-node 192.168.174.134:7007 192.168.174.134:7001 ``` ![](doc/img/clusterAdd.png) 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`` ![](doc/img/clusterNewNodes.png) | 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 ``` ![](doc/img/cluster7008.png) ![](doc/img/cluster7008Nodes.png) | 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源为被缩容节点 ``` ## 数据模拟 不在同一个节点请求数据时发生重定向。 ![](doc/img/redirected.png) ## 问题与解决 1. 重复扩容同一个节点导致的冲突 ``` 删除集群的配置文件nodes.conf,重新执行add-node ./redis-cli --cluster del-node 192.168.174.134:7007 99f4c7b5be3dcc9007d7c6a4316df3f32b1abd64 ``` 2.