[转帖]Redis系列(十五)、Redis6新特性之集群代理(Cluster Proxy)

redis,系列,十五,redis6,特性,集群,代理,cluster,proxy · 浏览次数 : 0

小编点评

**集群代理介绍** 集群代理是一种轻量级代理服务器,可将Redis集群代理到多个节点上,解决集群模式中单点故障的问题。 **主要功能:** - 支持跨节点和跨slot操作 - 允许跨 slot 查询 - 故障转移支持 - 可配置连接池 - 可开启跨 slot 查询 **配置步骤:** 1. 创建日志文件并使用 `redis-cli` 命令指定配置文件启动集群代理。 2. 启动 Redis 集群代理服务。 3. 连接集群代理客户端并使用 `redis-cli` 命令指定 7777端口。 **示例配置文件:** ``` # 主节点配置 cluster_id: 127.0.0.1:6391 # 从节点配置 node_id: 127.0.0.1:6392 node_id: 127.0.0.1:6393 # 默认端口 port: 7777 # 线程数 threads: 8 # 后台运行 daemonize: yes # 日志文件配置 logfile: /opt/app/redis-cluster-proxy/redis-cluster-proxy.log #跨slot查询设置 enable_cross_slot: yes # 最大客户端连接数 max_clients: 10000 # ACL 用户密码 auth_user: myuser auth_passw: mypassw # 连接池配置 connections_pool_size: 10 connections_pool_min_size: 10 connections_pool_spawn_every: 50 connections_pool_spawn_rate: 50 ``` **注意:** - 集群代理服务监听 7777端口,可使用 `redis-cli` 命令指定 7777端口启动客户端。 - 在使用集群代理之前,请确保您的本地 Redis 集群已经正常运行。 - 可以根据实际需求调整配置参数。

正文

在之前的文章中介绍了Redis6的集群搭建和原理,我们可以使用dummy和smart客户端连接集群,本篇介绍Redis6新增的一个功能:集群代理。客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群,对于客户端来说通过集群代理访问的集群就和单机的Redis一样,因此也能解决很多集群的使用限制。


目录

介绍

安装

下载解压

安装gcc4.9+版本

编译

安装

使用

配置启动

跨节点slot操作

故障转移

尾巴


Redis6系列文章

Redis系列(一)、CentOS7下安装Redis6.0.3稳定版

Redis系列(二)、数据类型之字符串String 

Redis系列(三)、数据类型之哈希Hash

Redis系列(四)、数据类型之列表List

Redis系列(五)、数据类型之无序集合Set

Redis系列(六)、数据类型之有序集合ZSet(sorted_set)

Redis系列(七)、常用key命令

Redis系列(八)、常用服务器命令 

Redis系列(九)、Redis的“事务”及Lua脚本操作

Redis系列(十)、详解Redis持久化方式AOF、RDB以及混合持久化

Redis系列(十一)、Redis6新特性之ACL安全策略(用户权限管理)

Redis系列(十二)、Redis6集群搭建及原理(主从、哨兵、集群)

Redis系列(十三)、pub/sub发布与订阅(对比List和Kafka)

Redis系列(十四)、Redis6新特性之RESP3与客户端缓存(Client side caching)

 

介绍

在Redis6的release note中可以看到新功能中的ACL,RESP3,客户端缓存我们在前面的文章中已经介绍过,本篇就看一下集群代理。集群代理与Redis在Github上是不同的项目,地址如下:

Github:https://github.com/RedisLabs/redis-cluster-proxy

集群代理(Redis Cluster Proxy): 将集群抽象为单实例,客户端不需要知道集群中的具体节点个数和主从身份,通过代理访问集群,就像访问单机Redis一样。同时集群代理也能解决在集群模式下multiple操作的限制及跨slot操作限制(如mget,mset...)。

Redis集群代理的特点

  • 自动化路由:每个查询被自动路由到集群的正确节点;
  • 多线程:多路复用通信模型,每个线程都有自己的集群连接;
  • 顺序性:在多路复用上下文中,保证查询的执行和应答顺序;
  • 无感知更新集群信息:当请求/重定向错误时会自动更新集群信息,客户端提交的查询会在集群信息更新完成后重新执行,对于客户端来说这一切是无感的,客户端不会收到请求/重定向的错误信息,而是直接收到查询的结果;
  • 跨槽/节点查询:支持跨slot或node的mutiple操作key,如mget,mset,del等。但由于mset,del会破坏原子性,因此该配置默认关闭;
  • ACL:支持连接开启了ACL的Redis集群;
  • DBSIZE:对于没有指定节点的命令,将会合并所有的信息的总和并返回;

 

安装

下载解压

从github上下载解压源码(2020-06-30:目前最新版是unstable版本)

  1. #git命令
  2. git clone https://github.com/artix75/redis-cluster-proxy
  3. #手动下载zip解压
  4. unzip redis-cluster-proxy-unstable.zip 

安装gcc4.9+版本

在之前安装Redis6的文章中有介绍,此处略过安装gcc9.1:

  1. #开启gcc9.1
  2. scl enable devtoolset-9 bash
  3. #查看gcc版本
  4. gcc -v

 

编译

执行下面的命令编译源码,出现下图表示安装成功:

  1. #进入目录并编译
  2. cd redis-cluster-proxy-unstable
  3. make
  4. #如果编译出错之后再编译可以先执行命令删除之前的编译文件
  5. make distclean

如果遇到错误unknown type name ‘_Atomic’ ,请检查gcc版本重新安装;

安装

编译成功后使用下面的命令安装Redis集群代理服务,出现下图表示安装成功:

  1. #安装Redis集群代理,可指定安装目录
  2. make install PREFIX=/opt/app/redis-cluster-proxy

使用

配置启动

从源码中将配置文件copy到安装目录:

cp /home/wyk/redis-cluster-proxy-unstable/proxy.conf /opt/app/redis-cluster-proxy/

修改配置文件:

vim /opt/app/redis-cluster-proxy/proxy.conf

  1. #配置Redis集群,这里我使用前几篇文章中配置的Redis6集群,三主三从
  2. cluster 127.0.0.1:6381 #主1
  3. cluster 127.0.0.1:6382 #主2
  4. cluster 127.0.0.1:6383 #主3
  5. cluster 127.0.0.1:6391 #从1
  6. cluster 127.0.0.1:6392 #从2
  7. cluster 127.0.0.1:6393 #从3
  8. #默认端口
  9. port 7777
  10. #线程数
  11. threads 8
  12. #后台运行
  13. daemonize yes
  14. #日志文件
  15. logfile "/opt/app/redis-cluster-proxy/redis-cluster-proxy.log"
  16. #允许跨slot查询
  17. enable-cross-slot yes
  18. #最大客户端连接数
  19. max-clients 10000
  20. #ACL用户密码(也可以在启动服务时指定)
  21. auth-user myuser #ACL用户
  22. auth mypassw #ACL密码
  23. #连接池
  24. connections-pool-size 10
  25. connections-pool-min-size 10
  26. connections-pool-spawn-every 50
  27. connections-pool-spawn-rate 50

创建日志文件并使用下面的命令指定配置文件启动集群代理:

  1. #创建日志文件
  2. touch /opt/app/redis-cluster-proxy/redis-cluster-proxy.log
  3. #启动Redis集群代理服务
  4. /opt/app/redis-cluster-proxy/bin/redis-cluster-proxy -c /opt/app/redis-cluster-proxy/proxy.conf

连接集群代理客户端

Redis集群代理服务监听7777端口,我们可以使用Redis命令行指定7777端口启动集群代理客户端:

  1. #连接Redis集群代理客户端
  2. /opt/app/redis6/bin/redis-cli -p 7777

跨节点slot操作

上面提到在集群代理中,会将集群抽象成一个Redis实例,对用户来说跨slot/node操作是无感的,而在默认集群中会重定向到对应slot所在的节点进行操作。

默认集群模式: 

在之前的Redis集群文章中演示了在dummy客户端中操作集群内的key时会重定向到该key存储的slot所在的节点:

  1. #使用-c进入集群命令行模式
  2. redis-cli -c -p 6381
  3. #使用命令查看key所在的槽
  4. cluster keyslot key1

 

集群代理模式:

在集群代理模式下,可以跨slot甚至跨节点操作key,而在集群模式下链接客户端是做不到的。下图演示了如果在集群代理中使用mset和mget跨slot跨node设置或查询key,对于用户来说仿佛是在使用一个单实例的Redis: 

故障转移

手动的使集群中一个主节点宕机,测试集群代理能否感知到集群的故障转移:

  1. #在6381主节点执行命令,手动的让其宕机
  2. #命令执行一个非法的内存访问从而让 Redis 崩溃,仅在开发时用于 BUG 调试,执行后需要重启服务
  3. debug segfault

情况一、主节点6381宕机,6391节点升级为主节点,集群恢复正常,但6381节点还没启动,此时集群代理无法使用,需要启动6381节点之后集群代理才能恢复使用:

情况二、手动将6381主节点宕机,当从节点6391升级为主节点后,重启6381节点作为6391的从节点,此时集群的主从机器全部正常启动,查询集群代理,不会收到影响:

尾巴

目前在Github上最新的版本仍是unstable版,毕竟是新功能,还是有很多BUG的,像集群的故障转移在集群代理中就没有做的很好,其次就是如果集群代理服务本身没有解决单点故障(可以尝试配合HAProxy等代理服务做负载均衡)。

官方最后声明中也提到【当前处于α版本,不推荐在生产环境使用]】:

This project is currently alpha code that is indented to be evaluated by the community in order to get suggestions and contributions. We discourage its usage in any production environment.

但不可否认的是集群代理给redis集群提供了轻量的代理层,也解决了很多在集群模式中的使用限制,未来的潜力还很大,让我们拭目以待吧!

 

希望本文对你有帮助,请点个赞鼓励一下作者吧~ 谢谢!

    <div id="blogExtensionBox" style="width:400px;margin:auto;margin-top:12px" class="blog-extension-box"><div class="blog_extension night blog_extension_type1" id="blog_extension">
      <div class="blog_extension_card" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.6470&quot;}">
        <div class="blog_extension_card_left">
        <img src="https://img-blog.csdnimg.cn/79228be242af4b7eb88d4bb5a4f7ac12.png" alt="">
      </div>
        <div class="blog_extension_card_cont">
          <div class="blog_extension_card_cont_l">
            <span class="text">爱玩大数据</span>
            <div class="blog_extension_card_cont_r">
              <img class="weixin" src="https://g.csdnimg.cn/extension-box/1.1.6/image/weixin.png" alt="">
              <span>微信公众号</span>
              <img class="go" src="https://g.csdnimg.cn/extension-box/1.1.6/image/ic_move.png" alt="">
            </div>
          </div>
          <span class="style">每天一篇技术干货,助你get大厂offer!</span>
        </div>
      </div></div></div>
</article>

与[转帖]Redis系列(十五)、Redis6新特性之集群代理(Cluster Proxy)相似的内容:

[转帖]Redis系列(十五)、Redis6新特性之集群代理(Cluster Proxy)

在之前的文章中介绍了Redis6的集群搭建和原理,我们可以使用dummy和smart客户端连接集群,本篇介绍Redis6新增的一个功能:集群代理。客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群,对于客户端来说通过集群代理访问的集群就和单机的Redis一样,因此也能解决很多集

[转帖]Redis系列(十五)、Redis6新特性之集群代理(Cluster Proxy)

在之前的文章中介绍了Redis6的集群搭建和原理,我们可以使用dummy和smart客户端连接集群,本篇介绍Redis6新增的一个功能:集群代理。客户端不需要知道集群中的具体节点个数和主从身份,可以直接通过代理访问集群,对于客户端来说通过集群代理访问的集群就和单机的Redis一样,因此也能解决很多集

[转帖]Redis系列(十六)、Redis6新特性之IO多线程

https://blog.csdn.net/wsdc0521/article/details/106766587 终于,Redis的多线程版本横空出世,大大提高了并发,本篇就带大家来看看什么是IO多线程,和我们理解的多线程有什么区别,与Memcached的多线程又有什么区别。 目录 介绍 为什么Re

[转帖]Redis系列(十七)、Redis中的内存淘汰策略和过期删除策略

我们知道Redis是分布式内存数据库,基于内存运行,可是有没有想过比较好的服务器内存也不过几百G,能存多少数据呢,当内存占用满了之后该怎么办呢?Redis的内存是否可以设置限制? 过期的key是怎么从内存中删除的?不要怕,本篇我们一起来看一下Redis的内存淘汰策略是如何释放内存的,以及过期的key

[转帖]抛砖系列之redis监控命令

处理一下.. 前言 redis是一款非常流行的kv数据库,以高性能著称,其高吞吐、低延迟等特性让广大开发者趋之若鹜,每每看到别人发出的redis故障报告都让我产生一种居安思危,以史为鉴的危机感,恰逢今年十一西安烟雨不断,抽时间学习了几个redis监控命令,和大家分享一波。 redis-cli --s

[转帖]MySQL十六:36张图理解Buffer Pool

https://www.cnblogs.com/yunlongn/p/16630257.html 转载~ 在应用系统中,我们为加速数据访问,会把高频的数据放在「缓存」(Redis、MongoDB)里,减轻数据库的压力。 在操作系统中,为了减少磁盘IO,引入了「缓冲池」(buffer pool)机制。

[转帖]【Redis系列】Redis发布版本历史及特性

目录 概述Redis2.6Redis2.8Redis3.0Redis3.2Redis4.0Redis5.0Redis6.0Redis7.0 概述 Redis 使用标准版本标记进行版本控制:major.minor.patchlevel。 偶数的版本号表示稳定的版本, 例如 1.2,2.0,2.2,2.

[转帖]玩转REDIS-删除了两百万KEY,为什么内存依旧未释放?

https://www.freesion.com/article/87101375552/ 《玩转Redis》系列文章主要讲述Redis的基础及中高级应用。本文是《玩转Redis》系列第【12】篇,最新系列文章请前往公众号“zxiaofan”(点我点我)查看,或百度搜索“玩转Redis zxiaof

[转帖]Redis 运维实战 第09期:Redis 规范

https://cloud.tencent.com/developer/article/1986835 这是专栏《Redis 运维实战》的最后一篇,感谢您的阅读。也感谢 9 篇文章的审稿人:无为,提出了多个修改建议,让文章内容更全面。 由于能力有限,系列文章难免会存在错误或者遗漏,如果您有任何建议,

[转帖]Redis manager快速启动

2.x 快速启动 系统环境要求 JDK8+, OpenJDK8+ Maven3 Mysql5.7+ 启动命令 在 redis-manager 目录下执行 ./bin/start.sh 准备数据库 系统仅需要创建数据库即可,相关表会在项目启动时自动创建 CREATE DATABASE `redis_m