Redis之集群搭建

清疚 2022-05-09 09:24 356阅读 0赞

1、redis-cluster集群模式简介

关于redis的集群化方案 目前主要有以下三种:

  • Twitter开发的twemproxy
  • 豌豆荚开发的codis
  • redis官方的redis-cluster

    TwemproxyCodis都属于代理分区:

客户端 发送请求到一个 代理组件代理 解析 客户端 的数据,并将请求转发至正确的节点,最后将结果回复给客户端。

  • 优点:简化 客户端 的分布式逻辑,客户端 透明接入,切换成本低,代理的 转发存储 分离。
  • 缺点:多了一层 代理层,加重了 架构部署复杂度性能损耗

本篇博客,介绍的是redis官方的redis-cluster,redis-cluster是一种服务器分片技术,3.0版本开始正式提供。

Redis Cluster是去中心化的,这点与Codis有着本质的不同,Redis Cluster划分了16384个slots,每个节点负责其中的一部分数据。slot的信息存储在每个节点中,节点会将slot信息持久化到配置文件中,因此需要保证配置文件是可写的。当客户端连接时,会获得一份slot的信息。这样当客户端需要访问某个key时,就可以直接根据缓存在本地的slot信息来定位节点。这样就会存在客户端缓存的slot信息和服务器的slot信息不一致的问题,这个问题具体怎么解决呢?这里先卖个关子,后面会做解释。

性能

Redis Cluster不提供代理,而是让client直接重定向到正确的节点。

client中会保存一份集群状态的副本,一般情况下就会直接连接到正确的节点。

由于Redis Cluster是异步备份的,所以节点不需要等待其他节点确认写成功就可以直接返回,除非显式的使用了WAIT命令。

对于操作多个key的命令,所操作的key必须是在同一节点上的,因为数据是不会移动的。(除非是resharding)

Redis Cluster设计的主要目标是提高性能和扩展性,只提供弱的数据安全性和可用性(但是要合理)。

2、部署测试

  1. Redis集群中要求奇数节点(master的投票机制),所以至少要有三个节点,并且每个节点至少有一备份节点,所以至少需要6redis服务实例(主节点、备份节点由redis-cluster集群确定)

① 环境准备

准备三台机器(192.168.37.133、192.168.37.134、192.168.37.135),每台部署两个Redis实例(实际生产环境,也可以只用两台主机,每台主机部署三个Redis实例)

  • 192.168.37.133部署7001,7002端口的实例,分别放置在7001,7002目录下

70

  • 192.168.37.134部署7003,7004端口的实例,分别放置在7003,7004目录下

70 1

  • 192.168.37.135部署7005,7006端口的实例,分别放置在7005,7006目录下

70 2

②修改配置文件

修改每个实例的redis.conf配置文件

  1. port 6379
  2. cluster-enabled yes
  3. #后面src目录下可以看到nodes-6379.conf文件
  4. cluster-config-file nodes-6379.conf
  5. appendonly yes
  6. bind 0.0.0.0(允许所有ip客户端的访问)
  7. daemonize yes
  8. pidfile /opt/redis-4.0.11/7001/redis_7001.pid

③安装ruby

  1. yum -y install ruby ruby-devel rubygems rpm-build
  2. gem install redis

④启动实例

与单点的redis的启动方式一样,分别启动六个redis的实例

  1. ./redis-server ../redis.conf &

⑤开放端口

  • redis客户端连接端口

    192.168.37.133的7001,7002;192.168.37.134的7003,7004;192.168.37.135的7005,7006端口

  • 集群中实例相互通信(心跳包)的内部总线端口(redis客户端连接端口 + 10000)

    192.168.37.133的17001,17002;192.168.37.134的17003,17004;192.168.37.135的17005,17006端口

⑥集群配置

在任意一个redis的src目录执行

  1. ./redis-cli --cluster create 192.168.37.133:7001 192.168.37.133:7002 192.168.37.134:7003 192.168.37.134:7004 192.168.37.135:7005 192.168.37.135:7006 --cluster-replicas 1

replicas``1 表示我们希望为集群中的每个主节点创建一个从节点

结果如下

  1. >>> Creating cluster
  2. >>> Performing hash slots allocation on 6 nodes...
  3. Using 3 masters:
  4. 192.168.37.133:7001
  5. 192.168.37.134:7003
  6. 192.168.37.135:7005
  7. Adding replica 192.168.37.134:7004 to 192.168.37.133:7001
  8. Adding replica 192.168.37.135:7006 to 192.168.37.134:7003
  9. Adding replica 192.168.37.133:7002 to 192.168.37.135:7005
  10. M: febe3f02bfb4800b5f9f0d0b57d675dc0fb882a0 192.168.37.133:7001
  11. slots:0-5460 (5461 slots) master
  12. S: 540f891d97dc0b0c4868488dfe1bc7de2813747a 192.168.37.133:7002
  13. replicates 0e022381183dbe47e4ee32e6a10abb19066c82ff
  14. M: 0eae91b1a0b4db3496d15d928f6a32eca50f7cdd 192.168.37.134:7003
  15. slots:5461-10922 (5462 slots) master
  16. S: 8e9f9cf9980ed5c0b59c1b7c3801645e3a13ff5a 192.168.37.134:7004
  17. replicates febe3f02bfb4800b5f9f0d0b57d675dc0fb882a0
  18. M: 0e022381183dbe47e4ee32e6a10abb19066c82ff 192.168.37.135:7005
  19. slots:10923-16383 (5461 slots) master
  20. S: 541d946fb7c1143b4365bec3c668dc76611ca901 192.168.37.135:7006
  21. replicates 0eae91b1a0b4db3496d15d928f6a32eca50f7cdd
  22. Can I set the above configuration? (type 'yes' to accept): yes
  23. >>> Nodes configuration updated
  24. >>> Assign a different config epoch to each node
  25. >>> Sending CLUSTER MEET messages to join the cluster
  26. Waiting for the cluster to join...
  27. >>> Performing Cluster Check (using node 192.168.37.133:7001)
  28. M: febe3f02bfb4800b5f9f0d0b57d675dc0fb882a0 192.168.37.133:7001
  29. slots:0-5460 (5461 slots) master
  30. 1 additional replica(s)
  31. M: 0eae91b1a0b4db3496d15d928f6a32eca50f7cdd 192.168.37.134:7003
  32. slots:5461-10922 (5462 slots) master
  33. 1 additional replica(s)
  34. M: 0e022381183dbe47e4ee32e6a10abb19066c82ff 192.168.37.135:7005
  35. slots:10923-16383 (5461 slots) master
  36. 1 additional replica(s)
  37. S: 8e9f9cf9980ed5c0b59c1b7c3801645e3a13ff5a 192.168.37.134:7004
  38. slots: (0 slots) slave
  39. replicates febe3f02bfb4800b5f9f0d0b57d675dc0fb882a0
  40. S: 541d946fb7c1143b4365bec3c668dc76611ca901 192.168.37.135:7006
  41. slots: (0 slots) slave
  42. replicates 0eae91b1a0b4db3496d15d928f6a32eca50f7cdd
  43. S: 540f891d97dc0b0c4868488dfe1bc7de2813747a 192.168.37.133:7002
  44. slots: (0 slots) slave
  45. replicates 0e022381183dbe47e4ee32e6a10abb19066c82ff
  46. [OK] All nodes agree about slots configuration.
  47. >>> Check for open slots...
  48. >>> Check slots coverage...
  49. [OK] All 16384 slots covered.

⑦验证

登录任意一台redis的客户端

  1. ./redis-cli -h 127.0.0.1 -p 7001

查看集群状态,执行

  1. cluster info

显示

  1. cluster_state:ok
  2. cluster_slots_assigned:16384
  3. cluster_slots_ok:16384
  4. cluster_slots_pfail:0
  5. cluster_slots_fail:0
  6. cluster_known_nodes:6
  7. cluster_size:3
  8. cluster_current_epoch:6
  9. cluster_my_epoch:1
  10. cluster_stats_messages_ping_sent:202
  11. cluster_stats_messages_pong_sent:218
  12. cluster_stats_messages_sent:420
  13. cluster_stats_messages_ping_received:213
  14. cluster_stats_messages_pong_received:202
  15. cluster_stats_messages_meet_received:5
  16. cluster_stats_messages_received:420

查看集群节点信息,执行

  1. cluster nodes

显示

  1. 0eae91b1a0b4db3496d15d928f6a32eca50f7cdd 192.168.37.134:7003@17003 master - 0 1538728029000 3 connected 5461-10922
  2. 0e022381183dbe47e4ee32e6a10abb19066c82ff 192.168.37.135:7005@17005 master - 0 1538728028666 5 connected 10923-16383
  3. 8e9f9cf9980ed5c0b59c1b7c3801645e3a13ff5a 192.168.37.134:7004@17004 slave febe3f02bfb4800b5f9f0d0b57d675dc0fb882a0 0 1538728031692 4 connected
  4. 541d946fb7c1143b4365bec3c668dc76611ca901 192.168.37.135:7006@17006 slave 0eae91b1a0b4db3496d15d928f6a32eca50f7cdd 0 1538728030685 6 connected
  5. 540f891d97dc0b0c4868488dfe1bc7de2813747a 192.168.37.133:7002@17002 slave 0e022381183dbe47e4ee32e6a10abb19066c82ff 0 1538728030000 5 connected
  6. febe3f02bfb4800b5f9f0d0b57d675dc0fb882a0 192.168.37.133:7001@17001 myself,master - 0 1538728030000 1 connected 0-5460

可以看到

7001是master,7004是其slave

7003是master,7006是其slave

7005是master,7002是其slave

我们再用Redis desktop manager 进行连接测试

70 3

可以看到,Icon跟单点部署的Redis的Icon不一样,是集群的Icon

至此,Redis集群搭建成功

发表评论

表情:
评论列表 (有 0 条评论,356人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis

    1、redis-cluster集群模式简介 关于redis的集群化方案 目前主要有以下三种: Twitter开发的twemproxy 豌豆荚开发的codis

    相关 redis

    文章来自博客园,稍加补充,如侵权,请联系删除 初学redis,学习了redis的常用数据结构,然后就到了学习redis集群的时候了 那么,学习前面应该先搭建起来redis集

    相关 Redis--

    集群概述 redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里