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

posted @ 2020-10-26 21:44  suke_123  阅读(471)  评论(0编辑  收藏  举报