• Redis6.0新特性之Redis-cluster-proxy


    一、Redis-cluster

    针对单节点Redis出现的扩容等问题,Redis官方在Redis3.0版本时推出了Redis集群模式,集群模式主要有以下4个特点:

    1、redis cluster 采用无中心结构,每个节点都保存数据和整个集群的状态;
    2、节点之间使用GOSSIP协议彼此互联(PING-PONG机制),这些连接保持活跃,内部使用二进制协议优化传输速度和带宽;
    3、节点的fail是通过集群中超过半数的节点检测失效时才生效;
    4、客户端与redis节点直连,不需要中间proxy层;client根据node返回的错误信息重定向请求

    对应的缺陷有以下两点:
    1、无中心化的结构使得每个节点需要同剩余的节点进行通信,随着节点增多,网络压力增大。
    2、业务层和架构层高度耦合,出现问题难以拆分解决。

    针对Redis cluster的问题,市场上出现了诸如Codis、Twemproxy等分布式解决方案,都是在架构顶层增加一层无状态的代理,

    这样不仅解决了无中心结构互相通信造成的网络压力问题,也可以使得业务和架构低耦合,避免出现系统问题。

    但是由于各种原因,开源的解决方案无法持续更新来跟上Redis版本升级的进度,Redis一些固有的问题无法解决,对使用者带来了一定的烦恼。Redis作者更新了官方集群版的proxy。

    二、Redis-cluster-proxy

    Redis集群代理和上述的Codis、Twemproxy方案类似,是基于Redis集群的上层代理,通过使用代理,集群被抽象出来,访问代理如图访问Redis节点。

    Redis集群代理有以下几个特性:

    1、路由:每个查询将自动路由到集群的正确节点
    2、多线程
    3、支持多路复用和私有连接模型
    4、即使在多路复用上下文中,查询执行和返回顺序也得到保证
    5、在ASK|MOVED错误后自动更新集群的配置:当这些类型的错误在返回中发生时,代理会通过重新映射所有slot来自动更新集群的内部配置。更新完成后,将重新执行所有查询。
    6、跨slot/节点查询:支持在不同slot(甚至属于不同集群节点)的处理多个键的命令。这些命令将被分割成多个查询路由到不同的slot/节点。这些命令的结果返回是特定于命令的。
    MGET、MSET或DEL等其他命令将对所有应答的结果进行求和。因为这些查询实际上破坏了命令的原子性,所以它们的使用是可选的(默认禁用)。
    7、一些没有特定节点/slot的命令(如DBSIZE)被分发给所有节点,汇总每个节点的结果并返回。
    8、PROXY命令可以展现一些代理特定的信息。

    三、编译部署

    proxy编译详见:https://github.com/RedisLabs/redis-cluster-proxy (编译proxy对应的gcc版本要高于gcc5),此处重点讲部署。

    1、proxy启动的方式和Redis类似,命令为# ./redis-cluster-proxy -c /path/to/proxy.conf
    2、需要制定Redis-cluster的节点地址,可指定多个,格式为 cluster 127.0.0.1:7000
    3、设定proxy的侦听端口,默认7777
    4、设置proxy的线程数,默认为8线程,可根据实际情况部署。
    5、设置proxy的tcp-backlog队列长度,默认511,建议设置到2047。
    6、设置proxy的连接池connections-pool-size大小,默认10,建议根据实际情况调大。
    7、设置日志文件的路径,根据部署情况选择日志路径
    8、开启跨slot查询,enable-cross-slot yes。默认禁用

    根据说明,必须部署Redis集群,在配置文件里指定集群的部分节点,才可启动Redis集群代理。

    3.1 先创建一个4master节点的Redis集群

    /app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8031.conf &
    /app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8032.conf &
    /app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8033.conf &
    /app/zhouqw/redis-6.0.4/bin/redis-server /app/zhouqw/redis-6.0.4/redis8034.conf &
    /app/zhouqw/redis-6.0.4/bin/redis-cli --cluster create 192.168.10.202:8031 192.168.10.202:8032 192.168.10.202:8033 192.168.10.202:8034

    查看Redis集群的状态
    /app/zhouqw/redis-6.0.4/bin/redis-cli -p 8031 cluster nodes

    3.2 新建代理

    在proxy.conf文件里指定4个master节点,将日志级别设置为debug并启动

    /app/zhouqw/redis-cluster-proxy/bin/redis-cluster-proxy -c /app/zhouqw/redis-cluster-proxy/proxy.conf &

    查看启动后的proxy日志,日志记录了代理发现了4个master节点及其他的设置信息。

    通过proxy新建一个key hello,并将值设置为world,

    3.3 常用命令

    /app/zhouqw/redis-6.0.4/bin/redis-cli -p 7777  proxy cluster 可查看集群信息

    proxy config get 、proxy config set 命令和redis-cli客户端一样可以修改配置参数;proxy info   命令如图redis-cli info命令一样,只是提供的有效信息有限

    四、性能压测

    本次压测样例为100万请求,增大客户端连接数压测五次取平均值,压测结果显示Redis-cluster-proxy的QPS大概在5万到6万之间。与单线程IO Redis节点压测结果差距不大。

    五、结语

    由于市场上其他的分布式解决方案无法跟随底层的Redis版本进行更新迭代,无法享受Redis内核更新及新功能的红利,

    Redis-cluster-proxy解决了Redis-cluster无中心化的多节点网络通信压力、业务和架构高度耦合的问题,同时可以兼容底层Redis版本变更,是一个不错分布式解决方案的选择。

    由于目前Redis-cluster-proxy仍处于非稳定版本,GitHub上仍有反馈bug,部分proxy参数无法动态修改,统计信息缺失不易监控,距离在生产环境大规模部署有一定距离。

    期待Redis-cluster-proxy功能强大的一天!

  • 相关阅读:
    第二阶段冲刺10
    第二阶段冲刺9
    第二阶段冲刺8
    (转载)关于数组的几个面试题
    关于静态变量
    linux进程地址空间详解(转载)
    单例模式,多种实现方式JAVA
    最佳线程数
    python学习
    svn设置
  • 原文地址:https://www.cnblogs.com/chou1214/p/13971852.html
Copyright © 2020-2023  润新知