一、作业要求

RedisCluster的安装、部署、扩容和Java客户端调用,如下图:
image.png
(1)搭建Redis5.0集群,要求三主三从,记录下安装步骤
(2)能够添加一主一从(Master4和Slaver4),记录下安装步骤
(3)能够通过JedisCluster向RedisCluster添加数据和取出数据


二、完成步骤

1. 搭建 Redis5.0 集群,要求三主三从

1.1 准备集群环境

安装 Redis 需要安装 C 语言需要的 GCC 环境,同时下载 Redis 的安装包需要用到 wget 命令

  1. # 安装gcc-c++
  2. yum install -y gcc-c++
  3. # 安装wget
  4. yum install -y wget

1.2 下载并解压安装包

  1. cd /opt/lagou/software
  2. # 创建集群安装目录/usr/redis-cluster/7001
  3. mkdir -p /usr/redis-cluster/7001
  4. # 下载Redis 5.0
  5. wget http://download.redis.io/releases/redis-5.0.5.tar.gz
  6. # 解压缩
  7. tar -zxvf redis-5.0.5.tar.gz -C ../servers

1.3 编译 Redis 源码

  1. cd /opt/lagou/servers/redis-5.0.5/src/
  2. # 编译
  3. make install PREFIX=/usr/redis-cluster/7001
  4. # 拷贝 redis.conf 文件到7001下
  5. cp /opt/lagou/software/redis-5.0.5/redis.conf /usr/redis-cluster/7001/bin

1.4 修改配置文件

  1. cd /usr/redis-cluster/7001/bin
  2. # 修改配置文件
  3. vim redis.conf
  1. # bind 127.0.0.1
  2. # 设置端口
  3. port 7001
  4. # 开启集群支持
  5. cluster-enabled yes
  6. # 关闭保护模式
  7. protecte-mode no
  8. # 打开守护进程
  9. daemonize yes

1.5 由 7001 复制生成其他实例

  1. cd /usr/redis-cluster/
  2. cp -r 7001 7002
  3. cp -r 7001 7003
  4. cp -r 7001 7004
  5. cp -r 7001 7005
  6. cp -r 7001 7006

复制完毕后需要修改每个节点的配置文件,把各自的端口号修改即可

1.6 创建一键启动所有节点脚本

  1. cd /usr/redis-cluster
  2. vim start-all.sh
  1. #!/bin/bash
  2. redisDir=/usr/redis-cluster
  3. for i in 7001 7002 7003 7004 7005 7006
  4. do
  5. cd $redisDir/$i/bin/&&./redis-server redis.conf
  6. done
  1. # 创建完成后,更改脚本权限
  2. chmod 755 /usr/redis-cluster/start-all.sh
  3. # 启动
  4. /usr/redis-cluster/start-all.sh

image.png

1.7 创建 Redis 集群

  1. cd /usr/redis-cluster/7001/bin
  2. ./redis-cli --cluster create 192.168.31.121:7001 192.168.31.121:7002 192.168.31.121:7003 192.168.31.121:7004 192.168.31.121:7005 192.168.31.121:7006 --cluster-replicas 1

image.png

1.8 验证集群是否搭建成功

image.png

2.能够添加一主一从(Master4和Slaver4)

2.1 创建一个新节点

  1. # 创建新节点所在的文件夹
  2. mkdir /usr/redis-cluster/7007
  3. # 到安装好的 redis 目录下
  4. cd /opt/lagou/servers/redis-5.0.5/src/
  5. # 编译
  6. make install PREFIX=/usr/redis-cluster/7007
  7. # 复制 redis.conf 到创建好的新节点目录
  8. cp /opt/lagou/servers/redis-5.0.5/redis.conf /usr/redis-cluster/7007/bin/

2.2 修改配置文件

复制过来之前改好的也行,复制过来以后只改端口即可

  1. vim /usr/redis-cluster/7007/bin/redis.conf
  1. # bind 127.0.0.1
  2. # 设置端口
  3. port 7007
  4. # 开启集群支持
  5. cluster-enabled yes
  6. # 关闭保护模式
  7. protecte-mode no
  8. # 打开守护进程
  9. daemonize yes

2.3 复制从节点并修改配置文件

  1. cd /usr/redis-cluster
  2. cp -r 7007/ 7008/
  1. vim 7008/bin/redis.conf
  2. #修改端口即可

2.4 添加主节点

  1. # 启动 7007 节点
  2. cd 7007/bin
  3. ./redis-server redis.conf

image.png

  1. cd 7007/bin
  2. ./redis-cli --cluster add-node 192.168.31.121:7007 192.168.31.121:7001

image.png
给刚添加的 7007 节点分配 slot,连接上集群(连接集群中任意一个可用结点都行),执行 reshard

  1. ./redis-cli --cluster reshard 192.168.31.121:7007

image.png

2.5 添加从节点

  1. # 启动 7008 节点
  2. cd /usr/redis-cluster/7008/bin
  3. ./redis-cli redis.conf

image.png

  1. ./redis-cli --cluster add-node 192.168.31.121:7008 192.168.31.121:7007 --cluster-slave --cluster-master-id b8223ddc655581f762db2b2413db31558df2a3d5

image.png
image.png
添加成功


3.通过 JedisCluster 向 RedisCluster 添加数据和取出数据

  1. <dependencies>
  2. <dependency>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>jedis</artifactId>
  5. <version>2.9.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>junit</groupId>
  9. <artifactId>junit</artifactId>
  10. <version>4.12</version>
  11. </dependency>
  12. </dependencies>
  1. /**
  2. * FileName: Cluster
  3. * Author: zhaozhuang
  4. * Date: 2021/4/6 下午10:52
  5. * Description:
  6. */
  7. package com.zz.redis;
  8. import org.junit.Test;
  9. import redis.clients.jedis.HostAndPort;
  10. import redis.clients.jedis.JedisCluster;
  11. import redis.clients.jedis.JedisPoolConfig;
  12. import java.util.HashSet;
  13. import java.util.Set;
  14. import java.util.concurrent.TimeUnit;
  15. public class Cluster {
  16. private static JedisCluster jedis;
  17. static {
  18. // 添加集群的服务节点Set集合
  19. Set<HostAndPort> hostAndPortsSet = new HashSet<HostAndPort>();
  20. // 添加节点
  21. hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7001));
  22. hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7002));
  23. hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7003));
  24. hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7004));
  25. hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7005));
  26. hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7006));
  27. // Jedis连接池配置
  28. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  29. // 最大空闲连接数, 默认8个
  30. jedisPoolConfig.setMaxIdle(10);
  31. // 最大连接数, 默认8个
  32. jedisPoolConfig.setMaxTotal(50);
  33. //最小空闲连接数, 默认0
  34. jedisPoolConfig.setMinIdle(0);
  35. // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
  36. jedisPoolConfig.setMaxWaitMillis(2000); // 设置2秒
  37. //对拿到的connection进行validateObject校验
  38. jedisPoolConfig.setTestOnBorrow(true);
  39. jedis = new JedisCluster(hostAndPortsSet, jedisPoolConfig);
  40. }
  41. /**
  42. * 测试key:value数据
  43. */
  44. @Test
  45. public void testKey() throws InterruptedException {
  46. System.out.println("判断某个键是否存在:"+jedis.exists("username"));
  47. System.out.println("新增<'username','wukong'>的键值对:"+jedis.set("username", "timo"));
  48. System.out.println("是否存在:"+jedis.exists("username"));
  49. System.out.println("新增<'password','password'>的键值对:"+jedis.set("password", "123456"));
  50. System.out.println("删除键password:"+jedis.del("password"));
  51. System.out.println("判断键password是否存在:"+jedis.exists("password"));
  52. System.out.println("设置键username的过期时间为10s:"+jedis.expire("username", 10));
  53. TimeUnit.SECONDS.sleep(2); // 线程睡眠2秒
  54. System.out.println("查看键username的剩余生存时间:"+jedis.ttl("username"));
  55. System.out.println("查看键username的剩余生存时间:"+jedis.ttl("username"));
  56. System.out.println("移除键username的生存时间:"+jedis.persist("username"));
  57. System.out.println("查看键username的剩余生存时间:"+jedis.ttl("username"));
  58. System.out.println("查看键username所存储的值的类型:"+jedis.type("username"));
  59. }
  60. }

image.png