• Redis集群(主从集群)(一)


    1、为什么要用redis集群?

    首先单机版,需要考虑磁盘空间,如果单机版挂了,那么redis就挂了。

    其次主从复制,如果做了独写分离,写的都发到主节点,读的话,都发到从节点。降低了读写的压力。但是从机没办法替换主机,

    如果主机挂了,需要人工去用从机替换主机。

    其次是哨兵模式,会提供特殊的redis节点,主要作用是监控主机,如果主机挂了,那么会选择从机替换主机。缺陷是写操作无法负载均衡,

    替换过程种可能10秒不可用。

    最后集群,是由多组哨兵集群

    如果存入的数据是“hello” 那么对hello进行crc16算法算出hello的hash值,取余,分配到对应区间的主服务器上,其他两个主服务器是没有存这个数值的,它是采用

    分片技术。

    CRC16算法(待学)

    2、集群搭建

    本次版本采用5.0稳定版本,其余版本可以通过http://www.redis.cn/download.html下载(注:5.0以上的按照以下方法搭建)

    下载redis到data目录下
    wget http://download.redis.io/releases/redis-5.0.5.tar.gz
    cd redis-5.0.5
    make MALLOC=libc
    cd src && make install
    编译安装成功

     mkdir redis-cluster

      mkdir redis7000

      mkdir redis7001

      mkdir redis7002

     cp /data/redis-5.0.5/redis.conf ./redis7000

     vim redis.conf

     bind 服务器ip

     port 7000

     daemonize yes

     dir /data/redis-cluster/redis7000   # 不写绝对路径,会在启动文件夹下

     pidfile /var/run/redis_7000.pid   # 因为一台服务器有三台redis,到时候.pid文件都会写到6379.pid文件夹中

     cluster-enabled yes   # 是否以集群方式启用

     cluster-config-file nodes-7000.conf   # 别的集群找到该集群的配置信息

     cluster-node-timeout 15000   

     cluster-replica-validity-factor 10

     cluster-migration-barrier 1  # master的slave数量大于该值,slave才能迁移到其他孤立的master上,想禁用可以使用一个比较大的值,小于0则启动失败

     cluster-require-full-coverage yes  # 三个集群要将所有的槽道分完,配置成yes时候,当一个服务器宕机后,只有到达这个服务器的数据是丢失的,其他都能正常。

     # 配置设置成no时候,当一个服务器宕机后,该集群就不能接收数据

     修改其他配置文件:因为只要修改7000为7001就可以了,记住,这里要chmod 777 redis.conf

      sed 's/7000/7001/g' redis7000/redis.conf > ./redis7001/redis.conf

      sed 's/7000/7002/g' redis7000/redis.conf > ./redis7002/redis.conf

    # 启动redis:
    /data/redis-5.0.5/src/redis-server /data/redis-cluster/redis7000/redis.conf 
    /data/redis-5.0.5/src/redis-server /data/redis-cluster/redis7001/redis.conf 
    /data/redis-5.0.5/src/redis-server /data/redis-cluster/redis7002/redis.conf 
    启动成功后:
    ps -ef|grep redis 查看下

    此时redis是以集群方式运行的,是单节点。

    若是集群方式运行则进入redis set key1 value1是不可以的,如下:

    /data/redis-5.0.5/src/redis-cli -h ip地址 -p 7000 -c   # 不加-c相当于普通客户端,加了-c相当于以集群方式登陆,并且当在集群中一台redis设置值可以同时设置其他redis的值,这个功能只有redis-cli有,jedis没有 

     

     说明用集群启动后,必须要分配槽位才能运行

    下面进行meet、指派槽位、分配主从

    /data/redis-5.0.5/src/redis-cli -- cluster create ip1:port ip2:port  ip3:port  ip4:port ip5:port ip6:port   --cluster-replicas 2

    写在前面的默认

    输入:

    /data/redis-5.0.5/src/redis-cli --cluster help

     

      扩容:用add-node方法

        然后再用reshard去分配槽道

     下面方法是检测集群是否正常

    package com.mashibing.springboot04.util;
    
    import lombok.extern.slf4j.Slf4j;
    import lombok.var;
    import redis.clients.jedis.HostAndPort;
    import redis.clients.jedis.JedisCluster;
    import redis.clients.jedis.JedisPoolConfig;
    
    import java.util.HashSet;
    import java.util.Set;
    import java.util.UUID;
    
    /**
     * @author yk
     * @create 2020/10/27 14:43
     * @description
     */
    @Slf4j
    public class TestRedisCluster {
        public static void main(String[] args) {
            Set<HostAndPort> nodeList = new HashSet<>();
            nodeList.add(new HostAndPort("ip1",7000));
            nodeList.add(new HostAndPort("ip1",7001));
            nodeList.add(new HostAndPort("ip1",7002));
            nodeList.add(new HostAndPort("ip2",7000));
            nodeList.add(new HostAndPort("ip2",7001));
            nodeList.add(new HostAndPort("ip2",7002));
            nodeList.add(new HostAndPort("ip3",7000));
            nodeList.add(new HostAndPort("ip3",7001));
            nodeList.add(new HostAndPort("ip3",7002));
            //Jedis连接池设置
            var jedisPoolConfig = new JedisPoolConfig();
            //最大空闲连接,默认8个
            jedisPoolConfig.setMaxIdle(200);
            //最大连接数默认8个
            jedisPoolConfig.setMaxTotal(1000);
            //最小空闲连接数,默认0
            jedisPoolConfig.setMinIdle(100);
            //获取连接时最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常,小于0阻塞
            jedisPoolConfig.setMaxWaitMillis(3000);//设置2秒
            //对拿到的字段进行validateObject校验
            jedisPoolConfig.setTestOnBorrow(false);
            JedisCluster jedisCluster = new JedisCluster(nodeList,jedisPoolConfig);
            while (true) {
                try {
                    String s = UUID.randomUUID().toString();
                    jedisCluster.set("k" + s,"v" + s);
                    System.out.println(jedisCluster.get("k" + s));
                } catch (Exception e) {
                    log.error(e.getMessage());
                }
            }
        }
    }

    视频学习链接: https://www.bilibili.com/video/BV1dE411y7wD?p=5

  • 相关阅读:
    如何让Jboss的debug在myeclise上运行
    ./configure --prefix /?/? 解释
    解决locate无法使用的问题
    ifconfig command not found
    安装tomcat
    通过wget下载tomcat
    通过rpm安装jdk
    通过wget下载jdk
    oracle 创建表空间
    在ASP中使用VFP编写脚本程序
  • 原文地址:https://www.cnblogs.com/su-ke/p/13881547.html
Copyright © 2020-2023  润新知