zoukankan      html  css  js  c++  java
  • Redis Cluster搭建(基于Docker)

    redis集群形式

    数据分区方案

    客户端分区

    image-20210401091518520

    客户端分区方案的代表为Redis Sharding, Redis Sharding是Redis Cluster出来之前,业界普遍使用的Redis多实例集群方法。Java的Redis客户端驱动库Jedis,支持RedisSharding功能,即Shardedledis以及结合缓存池的ShardedJedisPool.

    代理分区

    image-20210401091838866

    代理分区常用方案有Twemproxy和Codis。

    高可用方式

    Sentinel哨兵

    Sentinel哨兵机制支持高可用。

    哨兵的作用就是监控Redis系统的运行情况。主要功能包括以下三个:

    • 监控(Monitoring):.哨兵(sentinel)会不断地检查你的Master和Slave是否运作正常。
    • 提醒(Notification):当被监控的某个Redis出现问题时,哨兵(sentinel)可以通过API向管理员或者其他应用程序发送通知
    • 自动故障迁移(Automatic failover):当主数据库出现故障时自动将从数据库转换为主数据库。

    image-20210401092253974

    Redis-cluster

    Redis的官方多机部署方案,Redis Cluster。一组Redis Cluster是由多个Redis.实例组成,官方推荐我们使用6实例,其中3个为主节点,3个为从结点。一旦有主节点发生故障的时候,Redis Cluster可以选举出对应的从结点成为新的主节点,继续对外服务,从而保证服务的高可用性。那么对于客户端来说,知道知道对应的key是要路由到哪一个节点呢?Redis Cluster把所有的数据划分为16384个不同的槽位,可以根据机器的性能把不同的槽位分配给不同的Redis.实例,对于Redis.实例来说,他们只会存储部分的Redis数据,当然,槽的数据是可以迁移的,不同的实例之间,可以通过一定的协议,进行数据迁移。

    image-20210401092629508

    redis cluster缺点:

    • key批量操作支持有限
    • key事务操作支持有限
    • key作为数据分区的最小粒度
    • 不能将一个大的键值对象如hash、list等映射到不同的节点
    • 不支持多数据空间
    • 复制结构只支持一层
    • 命令大多会重定向

    一致性hash:

    一致性哈希可以很好的解决稳定性问题,可以将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临接的存储节点存放。而当有节点加入或退出时,仅影响该节点在Hash环上顺时针相邻的后续节点。

    image-20210401095821109

    部署Cluster集群

    image-20210401101523967

    创建6个redis节点

    for port in $(seq 7001 7006);  
    do 
    mkdir -p /mydata/redis/node-${port}/conf
    touch /mydata/redis/node-${port}/conf/redis.conf
    cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
    port ${port}
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    cluster-announce-ip 192.168.1.48
    cluster-announce-port ${port}
    cluster-announce-bus-port 1${port}
    appendonly yes
    EOF
    docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port}  
    -v /mydata/redis/node-${port}/data:/data 
    -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf 
    -d redis:5.0.7 redis-server /etc/redis/redis.conf; 
    done
    

    image-20210401102728055

    建立集群

    docker exec -it redis-7001 /bin/bash
    redis-cli  --cluster create 192.168.1.48:7001 192.168.1.48:7002 192.168.1.48:7003 192.168.1.48:7004 192.168.1.48:7005 192.168.1.48:7006 --cluster-replicas 1
    

    image-20210401102939304

    测试

    redis-cli -c -h 192.168.1.48 -p 7001
    set a1 a
    set hello  h
    get  a1
    get hello
    

    image-20210401103508739

    查看集群信息

    cluster info
    

    image-20210401103536948

    模拟主节点宕机

    docker stop redis-7001
    docker exec -it redis-7002 /bin/bash
    redis-cli -c -h 192.168.1.48 -p 7002
    cluster nodes
    

    image-20210401103843654

    观察到:7001宕机了,但是7006主动变成master了。

    现在主动恢复7001节点:

    docker start redis-7001
    

    观察节点:

    cluster nodes
    

    image-20210401104041536

    7001变成7006的slave了。

    通过redis cluster可以做到节点的故障切换。

  • 相关阅读:
    Python 魔术方法及调用方式
    Python metaclasses
    Python 实例方法,类方法和静态方法
    Python 2.x和3.x不同点
    Python 类总结
    Python 添加模块
    Python-读入json文件并进行解析及json基本操作
    linux环境下的python安装过程
    Linux系统目录结构以及简单说明
    linux下python安装
  • 原文地址:https://www.cnblogs.com/wwjj4811/p/14605344.html
Copyright © 2011-2022 走看看