• Redis Cluster去中心化集群


    1、为什么要用Redis-Cluster集群? 

    1、首先Redis单实例主要有单点,容量有限,流量压力上限的问题。
    Redis单点故障,可以通过主从复制replication,和自动故障转移sentinel哨兵机制。但Redis单Master实例提供写服务,仍然有容量和压力问题,因此需要数据分区,构建多个Master实例同时提供读写服务(不仅限于从replica节点提供读服务)。

    2、并发问题
    redis官方声称可以达到 10万/s,每秒执行10万条命令
    假如业务需要每秒100万的命令执行呢?

    解决方案如下:
    正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力,一堆机器做一件事.还需要一定的机制保证数据分区,并且数据在各个主Master节点间不能混乱,当然最好还能支持在线数据热迁移的特性。

    2、什么是redis-cluster? 

    Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

    构架图:

    2.1、redis cluster特点

    1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
    2.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
    3.节点的fail是通过集群中超过半数的节点检测失效时才生效。

    2.2、redis-cluster数据分布

    Redis-cluster集群中有16384(0-16383)个哈希槽,每个redis实例负责一部分slot/槽位,集群中的所有信息通过节点数据交换而更新。一个hash slot中会有很多key和value。

    2.3、数据分布存储原理

    Redis 集群使用数据分片(sharding)来实现:Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value(name1: 张三) 时,redis 先对 key 使用 crc16 算法算出一个结果678698,然后把结果对 16384 求余数(集群使用公式 CRC16(key) % 16384),这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,那么redis就会把这个key 分配到对应范围的节点上了。同样,当连接三个节点任何一个节点想获取这个key时,也会这样的算法,然后内部跳转到存放这个key节点上获取数据。

    2、redis cluster的主从模式

    redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。

    3、集群部署

    环境准备:
    1.准备三机器,关闭防火墙和selinux
    2.制作解析并相互做解析/etc/hosts

    192.168.111.4        redis-1

    192.168.111.7        redis-2

    192.168.111.8        redis-3

    systemctl stop firewalld && setenforce 0

    3.1、三台机器同时进行

    1、安装redis
    1. [root@redis-1 ~]# mkdir /data
    2. [root@redis-1 ~]# yum -y install gcc automake autoconf libtool make
    3. [root@redis-1 ~]# wget https://download.redis.io/releases/redis-6.2.0.tar.gz
    4. [root@redis-1 ~]# tar xzvf redis-6.2.0.tar.gz -C /data/
    5. [root@redis-1 ~]# cd /data/
    6. [root@redis-1 data]# mv redis-6.2.0/ redis
    7. [root@redis-1 data]# cd redis/
    8. [root@redis-1 redis]# make
    9. [root@redis-1 redis]# mkdir /data/redis/data #创建存放数据的目录
    2、创建集群目录与节点目录 
    1. $redis-1
    2. [root@redis-1 redis]# mkdir /data/redis/cluster
    3. [root@redis-1 redis]# cd cluster/
    4. [root@redis-1 cluster]# mkdir 7000 7001
    5. [root@redis-1 cluster]# cp /data/redis/redis.conf 7000/
    6. [root@redis-1 cluster]# cp /data/redis/redis.conf 7001/
    7. $redis-2
    8. [root@redis-2 redis]# mkdir /data/redis/cluster
    9. [root@redis-2 redis]# cd cluster/
    10. [root@redis-2 cluster]# mkdir 7002 7003
    11. [root@redis-2 cluster]# cp /data/redis/redis.conf 7002/
    12. [root@redis-2 cluster]# cp /data/redis/redis.conf 7003/
    13. $redis-3
    14. [root@redis-3 redis]# mkdir /data/redis/cluster
    15. [root@redis-3 redis]# cd cluster/
    16. [root@redis-3 cluster]# mkdir 7004 7005
    17. [root@redis-3 cluster]# cp /data/redis/redis.conf 7004/
    18. [root@redis-3 cluster]# cp /data/redis/redis.conf 7005/
    3、修改节点配置文件redis.conf

     $注:所有节点配置文件全部修改切记需要修改的ip、端口、pid文件...避免冲突。确保所有机器都修改!

    1. [root@redis-1 ~]# cd /data/redis/cluster/7000/
    2. [root@redis-1 7000]# vim redis.conf
    3. bind 192.168.111.4 #每个实例的配置文件修改为对应节点的ip地址
    4. port 7000 #监听端口,运行多个实例时,需要指定规划的每个实例不同的端口号
    5. daemonize yes #redis后台运行
    6. pidfile /var/run/redis_7000.pid #pid文件,运行多个实例时,需要指定不同的pid文件
    7. logfile /var/log/redis_7000.log #日志文件位置,运行多实例时,需要将文件修改的不同
    8. dir /data/redis/data #存放数据的目录
    9. appendonly yes #开启AOF持久化,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态
    10. appendfilename "appendonly.aof" #AOF文件名称
    11. appendfsync everysec #表示对写操作进行累积,每秒同步一次
    12. cluster-enabled yes #启用集群
    13. cluster-config-file nodes-7000.conf #集群配置文件,由redis自动更新,不需要手动配置,运行多实例时请注修改为对应端口
    14. cluster-node-timeout 5000 #单位毫秒。集群节点超时时间,即集群中主从节点断开连接时间阈值,超过该值则认为主节点不可以,从节点将有可能转为master
    15. cluster-replica-validity-factor 10
    16. cluster-migration-barrier 1 #一个主机将保持连接的最小数量的从机,以便另一个从机迁移到不再被任何从机覆盖的主机
    17. cluster-require-full-coverage yes #集群中的所有slot(16384个)全部覆盖,才能提供服务

    cluster-replica-validity-factor 10

    #在进行故障转移的时候全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了导致数据过于陈旧,不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。(计算方法为:cluster-node-timeout * cluster-replica-validity-factor,此处为:5000 * 10 毫秒)

    4、 启动redis
    1. $redis-1
    2. [root@redis-1 ~]# cd /data/redis/src/
    3. [root@redis-1 src]# nohup ./redis-server ../cluster/7000/redis.conf &
    4. [root@redis-1 src]# nohup ./redis-server ../cluster/7001/redis.conf &
    5. $redis-2
    6. [root@redis-2 ~]# cd /data/redis/src/
    7. [root@redis-2 src]# nohup ./redis-server ../cluster/7002/redis.conf &
    8. [root@redis-2 src]# nohup ./redis-server ../cluster/7003/redis.conf &
    9. $redis-3
    10. [root@redis-3 ~]# cd /data/redis/src/
    11. [root@redis-3 src]# nohup ./redis-server ../cluster/7004/redis.conf &
    12. [root@redis-3 src]# nohup ./redis-server ../cluster/7005/redis.conf &

    5、创建redis-cluster集群

    在其中一个节点操作就可以 

    redis节点搭建起来后,需要完成redis cluster集群搭建,搭建集群过程中,需要保证6个redis实例都是运行状态。
    Redis是根据IP和Port的顺序,确定master和slave的,所以要排好序,再执行。

    1. [root@redis-1 ~]# cd /data/redis/src/
    2. [root@redis-1 src]# ./redis-cli --cluster create --cluster-replicas 1
    3. 192.168.111.4:7000 192.168.111.4:7001 192.168.111.7:7002 192.168.111.7:7003 192.168.111.8:7004 192.168.111.8:7005
    4. 注:全在一行写哈,顺序别搞错了

    6、登录查看集群信息
    1. [root@redis-1 ~]# cd /data/redis/src/
    2. [root@redis-1 src]# ./redis-cli -h 192.168.111.4 -p 7000 -c
    3. 192.168.111.4:7000> ping
    4. PONG
    5. 192.168.111.4:7000> cluster info #查看集群信息
    6. cluster state:ok #集群状态
    7. cluster slots assigned: 16384 #分配的槽
    8. cluster slots ok: 16384
    9. cluster slots pfail:0
    10. cluster slots fail:0
    11. cluster known nodes :6 #集群实例数

     查看集群实例 cluster nodes

  • 相关阅读:
    【实践篇】Redis最强Java客户端(四)之Ression分布式集合使用指南
    云原生|kubernetes|部署MySQL一主多从复制集群(基于GTID的复制)
    【开源】基于Vue和SpringBoot的快乐贩卖馆管理系统
    java计算机毕业设计精品旅游项目管理系统源码+mysql数据库+系统+lw文档+部署
    HTML计时事件(JavaScript)网页电子钟+网页计时器
    leetcode算法每天一题 020: 有效的括号(c++ stack<> queue<>的简单使用 )
    最长回文子序列 递归与动态规划
    Java Double toString(double d)方法具有什么功能呢?
    PCB设计仿真之探讨源端串联端接
    代码随想录算法训练营Day55|动态规划13
  • 原文地址:https://blog.csdn.net/zhaoyhr/article/details/132634590