# lg-redis **Repository Path**: sunli1103_admin/lg-redis ## Basic Information - **Project Name**: lg-redis - **Description**: 【java训练营作业17-Redis集群】第五阶段 大型分布式系统缓存架构进阶 模块一 高性能分布式缓存Redis、分布式 Redis 解决方案Codis(Twemproxy替代方案)本模块对Redis的持久化方案、删除策略、IO多路复用模型、Redis集群模式、预热、雪崩、击穿、穿透等进行系统剖析。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-07-20 - **Last Updated**: 2022-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 作业说明 #### 课程介绍 > **第五阶段 大型分布式系统缓存架构进阶** > 模块一 高性能分布式缓存Redis、分布式 Redis 解决方案Codis(Twemproxy替代方案) > 本模块对Redis的持久化方案、删除策略、IO多路复用模型、Redis集群模式、预热、雪崩、击穿、穿透等进行系统剖析。 #### 作业内容 > **RedisCluster的安装、部署、扩容和Java客户端调用** > > ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/053716_2182ed79_1712191.png "屏幕截图.png") > > 如图: > >1. 搭建Redis5.0集群,要求三主三从 > >2. 能够添加一主一从(Master4和Slaver4) > >3. 能够通过JedisCluster向RedisCluster添加数据和取出数据 > >4. 作业提交要求: > > (1)1、2提交环境操作手册 > > (2)3提交程序代码 > > (3)视频讲解安装手册及程序代码 #### 软件版本 最好和课程内容版本保持一致,否则会遇到版本冲突问题 ``` CentOS 7.7 Redis 5.0.5 JDK 11 Jedis 3.3.0 ``` #### 实现步骤 ##### 1. 搭建Redis5.0集群,要求三主三从 **安装Redis** 1. 安装环境类库(注意事项1) ```shell yum -y install gcc gcc-c++ kernel-devel ``` 2. 配置程序包(注意事项1) ```shell wget http://download.redis.io/releases/redis-5.0.5.tar.gz tar -zxvf redis-5.0.5.tar.gz mkdir /usr/local/redis mv redis-5.0.5 /usr/local/redis/redis-5.0.5 cd /usr/local/redis/redis-5.0.5 make MALLOC=libc ``` 3. 配置集群环境 ```shell mkdir -p /usr/local/redis/redis-cluster/7001 make install PREFIX=/usr/local/redis/redis-cluster/7001 cp /usr/local/redis/redis-5.0.5/redis.conf /usr/local/redis/redis-cluster/7001/bin vi /usr/local/redis/redis-cluster/7001/bin/redis.conf ``` ```shell #bind 127.0.0.1 protected-mode no port 7001 daemonize yes cluster-enabled yes ``` 批量复制集群节点,并分别修改端口号 ```shell cd /usr/local/redis/redis-cluster cp -r 7001 7002 cp -r 7001 7003 cp -r 7001 7004 cp -r 7001 7005 cp -r 7001 7006 ``` 4. 创建批量启动脚本 `start.sh` ```shell cd 7001/bin ./redis-server redis.conf cd ../.. cd 7002/bin ./redis-server redis.conf cd ../.. cd 7003/bin ./redis-server redis.conf cd ../.. cd 7004/bin ./redis-server redis.conf cd ../.. cd 7005/bin ./redis-server redis.conf cd ../.. cd 7006/bin ./redis-server redis.conf cd ../.. ``` 设置权限并启动 ```shell chmod u+x start.sh ./start.sh ``` 5. 检查启动结果 ```shell ps -ef | grep redis ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/232650_547420db_1712191.png "屏幕截图.png") 6. 启动集群模式(注意事项2) ```shell cd /usr/local/redis/redis-cluster/7001/bin ./redis-cli --cluster create 192.168.0.111:7001 192.168.0.111:7002 192.168.0.111:7003 192.168.0.111:7004 192.168.0.111:7005 192.168.0.111:7006 --cluster-replicas 1 ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/232531_721d3da4_1712191.png "屏幕截图.png") 7. 测试 ```shell cd /usr/local/redis/redis-cluster/7001/bin ./redis-cli -h 192.168.0.111 -p 7001 -c set name:001 sunli set name:002 lagou get name:001 get name:002 ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/232817_6f9c6e55_1712191.png "屏幕截图.png") 查看集群信息 ```shell cluster info cluster nodes ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/232907_c022e876_1712191.png "屏幕截图.png") ##### 2. 能够添加一主一从(Master4和Slaver4) 1. 配置新主节点 ```shell cd /usr/local/redis/redis-5.0.5/src mkdir /usr/local/redis/redis-cluster/7007 make install PREFIX=/usr/local/redis/redis-cluster/7007 cp /usr/local/redis/redis-cluster/7001/bin/redis.conf /usr/local/redis/redis-cluster/7007/bin vi /usr/local/redis/redis-cluster/7007/bin/redis.conf ``` ```shell port 7007 ``` 2. 启动新节点,并添加到集群 ```shell cd /usr/local/redis/redis-cluster/7007/bin ./redis-server redis.conf ./redis-cli --cluster add-node 192.168.0.111:7007 192.168.0.111:7001 ``` 3. 重新分槽(连接集群中任意一个可用结点都行) ```shell ./redis-cli --cluster reshard 192.168.0.111:7007 ``` ```shell # 重新分配槽数量 3000 # node id 2f109543cf336cc4d4613a8f980575160b10ec2b # 分配方式:从全部节点平分 all # 确认执行 yes ``` 4. 确认分槽结果 ```shell ./redis-cli -h 192.168.0.111 -p 7001 -c cluster nodes ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/233550_3aafecd2_1712191.png "屏幕截图.png") 5. 添加从节点 ```shell cd /usr/local/redis/redis-5.0.5/src mkdir /usr/local/redis/redis-cluster/7008 make install PREFIX=/usr/local/redis/redis-cluster/7008 cp /usr/local/redis/redis-cluster/7001/bin/redis.conf /usr/local/redis/redis-cluster/7008/bin vi /usr/local/redis/redis-cluster/7008/bin/redis.conf ``` ```shell port 7008 ``` 6. 启动新节点,并添加到集群 ```shell cd /usr/local/redis/redis-cluster/7008/bin ./redis-server redis.conf ./redis-cli --cluster add-node 192.168.0.111:7008 192.168.0.111:7007 --cluster-slave --cluster-master-id 2f109543cf336cc4d4613a8f980575160b10ec2b ``` 7. 确认节点信息 ```shell ./redis-cli -h 192.168.0.111 -p 7001 -c cluster nodes ``` ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/233857_9806b58e_1712191.png "屏幕截图.png") #### 3. 能够通过JedisCluster向RedisCluster添加数据和取出数据 测试代码(注意事项2) JedisClusterTest.java ```java package com.lagou.redis; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.HashSet; import java.util.Map; import java.util.Set; public class JedisClusterTest { public static void main(String[] args) { JedisPoolConfig config = new JedisPoolConfig(); Set nodeList = new HashSet<>(); nodeList.add(new HostAndPort("192.168.0.111", 7001)); nodeList.add(new HostAndPort("192.168.0.111", 7002)); nodeList.add(new HostAndPort("192.168.0.111", 7003)); nodeList.add(new HostAndPort("192.168.0.111", 7004)); nodeList.add(new HostAndPort("192.168.0.111", 7005)); nodeList.add(new HostAndPort("192.168.0.111", 7006)); nodeList.add(new HostAndPort("192.168.0.111", 7007)); nodeList.add(new HostAndPort("192.168.0.111", 7008)); JedisCluster jedisCluster = new JedisCluster(nodeList, 3000, config); Map nodes = jedisCluster.getClusterNodes(); jedisCluster.set("name:002", "sunli"); String value = jedisCluster.get("name:002"); System.out.println(value); } } ``` pom.xml ```xml 4.0.0 com.lagou lagou-redis-jediscluster 1.0-SNAPSHOT redis.clients jedis 3.3.0 org.apache.maven.plugins maven-compiler-plugin 11 11 ``` 运行结果 ![输入图片说明](https://images.gitee.com/uploads/images/2020/0720/234032_2a720cf4_1712191.png "屏幕截图.png") #### 注意事项 1. 安装环境 新装CentOS7.7环境下make redis时需要安装gcc,make install 前需要使用 `make MALLOC=libc` 加载相应类库。 2. ip问题 服务器端配置操作中涉及到的ip地址统一采用局域网ip或外网ip,否则程序访问时无法成功。比如不能使用127.0.0.1,因为外部访问虚拟机时使用的ip为局域网的192.168.0.111。推测JedisCluster创建连接池时读取了服务端nodes.conf中的ip配置信息。 #### 视频讲解 ![视频讲解](reference/md-videos/redis.mp4)