非关系型数据库Redis(三):搭建三主三从的两种方式与SpringBoot整合Redis集群

一.搭建方式之常规方式

1.安装redis

  • 参考我博客:“https://blog.csdn.net/weixin_43934607/article/details/100537733” 的Redis安装

2.搭建节点

  1. 在redis安装目录下新建redis_cluster

  2. 在redis_cluster下新建六个端口号的文件夹(7000、7001、7002、7003、7004、7005)

  3. 先给7000的文件夹下复制一份redis.conf

  4. 编辑7000文件夹下的redis.conf:

    daemonize    yes     					//redis后台运行
    
    port  端口号         					//端口7000,7002,7003,7004,7005
    
    cluster-enabled  yes       				//开启集群  把注释#去掉
    
    cluster-node-timeout  5000         	    //请求超时  设置5秒够了
    
    appendonly  yes        					//aof日志开启,它会操作日志
    
    bind 127.0.0.1 192.168.56.129       	//后面这个Redis安装的这台机的内网IP(命令:ip addr),添加一个内网IP,这部不操作的话会导致内网其他节点无妨访问你的集群
    
    pidfile:/var/run/redis_端口号.pid 		//用来保存进程 每个端口号的pidfile要不同
    
    dbfilename dump_端口号.rdb				//以rdb形式来保存数据 每个端口号的dbfilename要不同
    
    appendfilename "appendonly_端口号.aof"	//以aof形式来保存数据 每个端口号的appendfilename 要不同
    
    cluster-config-file  nodes_端口号.conf   //集群的配置,首次启动自动生成 配置文件名要不同
    
    #requirepass foobared    				//有密码的话必须要要注释掉 取消密码
    
  5. 把这个redis.conf复制到其他几个端口的文件夹下 并修改下面不同端口下面这些配置

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  6. 各个节点启动成功

    1. 把redis带每个配置文件启动一次 并使用ps -ef|grep redis 查看是否所有进程启动成功

      ./redis-server ../redis_cluster/7000/redis.conf
      ./redis-server ../redis_cluster/7001/redis.conf
      ./redis-server ../redis_cluster/7002/redis.conf
      ./redis-server ../redis_cluster/7003/redis.conf
      ./redis-server ../redis_cluster/7004/redis.conf
      ./redis-server ../redis_cluster/7005/redis.conf
      

      在这里插入图片描述

    2. 启动成功之后 在src目录下会生成(白色字体那些文件)

      1. 每个节点设置的"cluster-config-file"对应的.conf文件
      2. 每个节点设置的"dbfilename"对应的.rdb文件
      3. 每个节点设置的"appendfilename"对应的.aof文件

      在这里插入图片描述

3.组建集群

redis版本<5.0

  1. 安装Ruby(redis版本>=5.0的话不是下面的方式):

    yum -y install ruby ruby-devel rubygems rpm-build
    gem install redis

    注意:如果显示ruby版本低于3.0“https://blog.csdn.net/Gushiyuta/article/details/90770681”(在步骤3之前 使用命令: source /etc/profile.d/rvm.sh 就可以启用rvm)

  2. 开启集群

    cd /usr/local/redis/src

    ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

    注意:

    • 我这里设置了127.0.0.1绑定我的虚拟机ip所以可以用127.0.0.1
    • 不是本机的注意开端口

redis版本>=5.0

  • 使用redis-cli

    cd /usr/local/redis/src

    ./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

搭建截图:

  • 过程 在这里插入图片描述

  • 成功
    在这里插入图片描述

  • 测试是否成功

    ./redis-cli -c -p 7000

4.redis-trib.rb的其他几个命令:

重新分片:./redis-trib.rb reshard 集群任一节点
如:./redis-trib.rb reshard 127.0.0.1:7000

增加节点(主):./redis-trib.rb add-node 要增加的节点 集群任一节点
如:./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

增加节点(从):./redis-trib.rb add-node --slave 要增加的节点 集群任一节点
如:./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000)

  • 如果报错 [ERR] Node is not empty. Either the node already knows other nodes (check with C…)
    • 进入src备份 .aof、.rdb数据文件

      cp -f {appendonly_7000.aof,appendonly_7001.aof,appendonly_7002.aof,appendonly_7003.aof,appendonly_7004.aof,appendonly_7005.aof,dump_7000.rdb,dump_7001.rdb,dump_7002.rdb,dump_7003.rdb,dump_7004.rdb,dump_7005.rdb} /tmp/redis-cluster-data
      
    • 删除所有节点 .aof、.rdb、.conf (但是会数据丢失 最好先备份所有.aof、.rdb文件)

      rm -f appendonly_7000.aof appendonly_7001.aof appendonly_7002.aof appendonly_7003.aof appendonly_7004.aof appendonly_7005.aof dump_7000.rdb dump_7001.rdb dump_7002.rdb dump_7003.rdb dump_7004.rdb dump_7005.rdb nodes_7000.conf nodes_7001.conf nodes_7002.conf nodes_7003.conf nodes_7004.conf nodes_7005.conf
      
    • 杀掉所有的redis进程 重新按步骤启动

二.搭建方式之Docker

1.docker安装和配置

  • 请参考我的博客:https://blog.csdn.net/weixin_43934607/article/details/100141057

2.安装redis

#拉取镜像 
docker pull redis:5.0.2

3.创建容器

docker create --name redis-node01 --net host \
-v /data/redis-data/node01:/data redis:5.0.2 \
--cluster-enabled yes \
--cluster-config-file nodes-node-01.conf \
--port 6379 

docker create --name redis-node02 --net host \
-v /data/redis-data/node02:/data redis:5.0.2 \
--cluster-enabled yes \
--cluster-config-file nodes-node-02.conf \
--port 6380 

docker create --name redis-node03 --net host \
-v /data/redis-data/node03:/data redis:5.0.2 \
--cluster-enabled yes \
--cluster-config-file nodes-node-03.conf \
--port 6381
  • 参数解释
    • –name:容器名称
    • –net:docker的网络模型(默认是桥接模式)
    • -v:映射的外面存储路径
    • 其他 "–"的参数都是上面redis集群搭建时用到的 就不解释了

4.启动容器

docker start redis-node01 redis-node02 redis-node03

5.进入redis-node01进行操作

docker exec -it redis-node01 /bin/bash

6.组建集群

  • cluster-replicas:每个节点有几个复制集
    上面搭建集群时设置为1 可以看见3个M 3个S,这里只有3个节点 所以就不设置复制集了 将cluster-replicas设置为0 可以看见只有3个M
redis-cli --cluster create 192.168.56.129:6379 192.168.56.129:6380 192.168.56.129:6381 --cluster-replicas 0
  • 注意:因为使用的网络模式是host模式 所以这里可以直接使用虚拟机ip

在这里插入图片描述

  • 如果安装出错要删除的话使用以下命令
    • 关闭容器:docker stop redis-node01 redis-node02 redis-node03
    • 删除容器:docker rm redis-node01 redis-node02 redis-node03
    • 删除数据:rm -rf /data/redis-data
  • 如果同样报错 [ERR] Node is not empty. Either the node already knows other nodes (check with C…)
    • 删掉 -v 指定的redis数据目录下的每个节点的 conf、rdb、aof文件

      rm -rf /data/redis-data

三.SpringBoot整合redis集群

1.依赖

	<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

2.application.properties:

	# redis集群
	#最大连接数据库连接数,设 0 为没有限制 
	spring.redis.jedis.pool.maxActive=50
	#最大建立连接等待时间 如果超过此时间将接到异常 设为-1表示无限制  单位为 ms
	spring.redis.jedis.pool.max-wait = 5000
	#最大最大空闲数,设 0 为没有限制 
	spring.redis.jedis.pool.max-Idle = 5
	#连接超时时间
	spring.redis.timeout = 10
	#所有节点地址
	spring.redis.cluster.nodes = 192.168.56.129:7000,192.168.56.129:7001,192.168.56.129:7002,192.168.56.129:7003,192.168.56.129:7004,192.168.56.129:7005
	#连接失败最大重连次数
	spring.redis.cluster.max-redirects=5

3.读取配置中cluster相关配置

@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
@Data
public class ClusterConfigurationProperties {

    private List<String> nodes;

    private Integer maxRedirects;

}

4.设置并重新注入RedisTemplate

@Configuration
public class RedisClusterConfig {

    @Autowired
    private ClusterConfigurationProperties clusterProperties;

    @Bean
    public RedisConnectionFactory connectionFactory() {
    	//集群的项目配置
        RedisClusterConfiguration configuration = new
                RedisClusterConfiguration(clusterProperties.getNodes());
        configuration.setMaxRedirects(clusterProperties.getMaxRedirects());
        //设置 客户端Jedis的连接
        return new JedisConnectionFactory(configuration);
    }


    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String,String>();
        //使用刚才设置好的ConnectionFactory
        redisTemplate.setConnectionFactory(factory);

        /**
         * 定义好三种序列化方式:Jackson序列化、Jdk序列化、String序列化
         */

        /**Jackson序列化  json占用的内存最小 */
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);

        /**Jdk序列化   JdkSerializationRedisSerializer是最高效的*/
        // JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();

        /**String序列化*/
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        /**
         * 设置不同数据类型的序列化方式
         * /

         /**将key value 进行stringRedisSerializer序列化*/
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(stringRedisSerializer);

        /**将HashKey HashValue 进行序列化*/
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

}

注意

  • 重启集群 只需要关闭每个节点 再次重新启动每个节点就可以 不用再执行一次创建集群的命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值