`

请您先登录,才能继续操作

Redis高可用(2.2):Redis Cluster

 
阅读更多

简述

单机redis的内存和性能都存在瓶颈,为了支持海量数据需要使用多master模式(横向扩容),即redis cluster集群。redis cluster是利用切片技术实现的集群,支持一主多从,读写分离,以及自动故障转移等,从而达到其高可用。

 

优点

(1)自动将数据进行分片,每个master上放一部分数据

(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的。(自动主从复制,读写分离[默认所有的读写都是master完成,cluster模式没有所谓的读      写分离的概念]、和故障转移[主备切换],支持多个master的hash slot,支持数据分布式存储)

 (3) 智能自动切换挂载关系:

a、如果某些master挂载了多个(>1)slave,在其他相对挂载slave少的节点出现宕机,挂载多的slave会自动切换的少的节点上

b、集群中的节点宕机后重新启动会自动加入集群(优先变为slave)

 

端口

在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379。16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间

 

算法

redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot。redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot。hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去,移动hash slot的成本是非常低的。

 

测试环境

服务器3台:192.168.0.200、192.168.0.201、192.168.0.202

每台服务启动两个redis实例,端口分别为:7000、7001

在安装目录建立如下目录结构:

 

 

${redis}/cluster/
		7000/
		    conf
		    data
		    logs
		7001/
		    conf
		    data
		    logs
 

 

启动命令(安装目录执行):

./bin/redis-server ./cluster/7000/conf/7000.conf

./bin/redis-server ./cluster/7001/conf/7001.conf

 

配置(redis.conf,即7000.conf和7001.conf)

bind 192.168.0.200

port 7001

daemonize yes

pidfile /var/run/redis_7001.pid

logfile "/usr/local/redis/cluster/7001/logs/redis.log"

dir "/usr/local/redis/cluster/7001/data"

appendonly yes

#开启cluster集群

cluster-enabled yes

#集群间通信存储的配置数据

cluster-config-file "/usr/local/redis/cluster/7001/data/nodes-7001.conf"

#集群间通信超时时间

cluster-node-timeout 15000

 

防火墙(增加如下端口过滤)

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7000 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17000 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 17001 -j ACCEPT

 

拷贝安装包中的执行(ruby)脚本到安装目录的bin下

cp /usr/local/src/redis3.0/src/redis-trib.rb ./bin/

 

在线安装ruby环境

yum install ruby

yum install rubygems

#安装redis-trib.rb运行依赖的ruby的包redis-3.3.0.gem(上传“redis-3.3.0.gem”到/usr/local/src/)

gem install /usr/local/src/redis-3.3.0.gem

 

命令(任意一台服务器执行)

 

#创建集群(--replicas 1表示需要1个slave)

./bin/redis-trib.rb create --replicas 1 192.168.0.200:7000 192.168.0.200:7001 192.168.0.201:7000 192.168.0.201:7001 192.168.0.202:7000 192.168.0.202:7001

#结果(选择yes同意分配)

 

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.202:7000
192.168.0.201:7000
192.168.0.200:7000
Adding replica 192.168.0.201:7001 to 192.168.0.202:7000
Adding replica 192.168.0.202:7001 to 192.168.0.201:7000
Adding replica 192.168.0.200:7001 to 192.168.0.200:7000
M: f66e9c8f8f794c38679082f513955e7495b471ae 192.168.0.200:7000
   slots:10923-16383 (5461 slots) master
S: 7dd73f9e205f9db9b0896ba05a5ff3e6ccd7728c 192.168.0.200:7001
   replicates f66e9c8f8f794c38679082f513955e7495b471ae
M: 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd 192.168.0.201:7000
   slots:5461-10922 (5462 slots) master
S: 25890bb055947b74b4910f8a83c9a534fc7f824c 192.168.0.201:7001
   replicates b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f
M: b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f 192.168.0.202:7000
   slots:0-5460 (5461 slots) master
S: ca8767ec8451872b75a2659f568c9f55c6915f54 192.168.0.202:7001
   replicates 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join........
>>> Performing Cluster Check (using node 192.168.0.200:7000)
M: f66e9c8f8f794c38679082f513955e7495b471ae 192.168.0.200:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f 192.168.0.202:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 7dd73f9e205f9db9b0896ba05a5ff3e6ccd7728c 192.168.0.200:7001
   slots: (0 slots) slave
   replicates f66e9c8f8f794c38679082f513955e7495b471ae
S: 25890bb055947b74b4910f8a83c9a534fc7f824c 192.168.0.201:7001
   slots: (0 slots) slave
   replicates b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f
S: ca8767ec8451872b75a2659f568c9f55c6915f54 192.168.0.202:7001
   slots: (0 slots) slave
   replicates 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd
M: 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd 192.168.0.201:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  

 

#检查集群状态(check任意节点即可)

./bin/redis-trib.rb check 192.168.0.200:7000

#结果

 

>>> Performing Cluster Check (using node 192.168.0.200:7000)
M: f66e9c8f8f794c38679082f513955e7495b471ae 192.168.0.200:7000
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f 192.168.0.202:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 7dd73f9e205f9db9b0896ba05a5ff3e6ccd7728c 192.168.0.200:7001
   slots: (0 slots) slave
   replicates f66e9c8f8f794c38679082f513955e7495b471ae
S: 25890bb055947b74b4910f8a83c9a534fc7f824c 192.168.0.201:7001
   slots: (0 slots) slave
   replicates b7a80819050d5edc2c7a38f3d0ae1dfb4dc1267f
S: ca8767ec8451872b75a2659f568c9f55c6915f54 192.168.0.202:7001
   slots: (0 slots) slave
   replicates 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd
M: 11ebb1c83ad68a747a9cb1adf0d7be6c1929b7bd 192.168.0.201:7000
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  

 

#查看集群信息(info任意节点即可)

./bin/redis-trib.rb info 192.168.0.202:7000

结果:

 

192.168.0.202:7000 (b7a80819...) -> 3 keys | 5461 slots | 1 slaves.
192.168.0.200:7000 (f66e9c8f...) -> 1 keys | 5461 slots | 1 slaves.
192.168.0.201:7000 (11ebb1c8...) -> 1 keys | 5462 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.
  

 

#集群中增加新的master节点(192.168.0.203:7000,新的节点;192.168.0.201:7001,集群中任意节点)

./bin/redis-trib.rb add-node 192.168.0.203:7000 192.168.0.201:7001

 

#重新分片(192.168.0.201:7001,集群中任意节点。新增的master节点slot为空,需要手动其分配slot和迁移相关slot数据。分配(16384/master节点数)这么slot,类似于平均分配,也可根据自己实际情况分配。)

./bin/redis-trib.rb reshard 192.168.0.201:7001

 

#集群中增加新的slave节点(建立主从关系),master-id为要加到master主节点的node id,192.168.0.203:7001为新增的从节点,192.168.0.201:7001为集群中任意节点,用来辨识是哪个集群;如果没有给定那个主节点--master-id的话,redis-trib将会将新增的从节点随机到从节点较少的主节点上。

./bin/redis-trib.rb add-node --slave --master-id 1751e5a8a9cf9ac9bad349b3d0949107541a3c22 192.168.0.203:7001 192.168.0.201:7001

 

#移除master节点(192.168.0.201:7001,集群中任意节点,1751e5a8a9cf9ac9bad349b3d0949107541a3c22为主节点的node id,移除节点前需要转移节点上的slot。主节点移除后,挂在其上的slave节点会优先自动选择一些没有slave的节点进行自动挂载)

./bin/redis-trib.rb del-node 192.168.0.201:7001 1751e5a8a9cf9ac9bad349b3d0949107541a3c22

 

#移除slave节点(与移除master节点使用命令相同)

./bin/redis-trib.rb del-node 192.168.0.201:7001 38fcf92ee9a0d9b5f8e30c2fdf0ee6884cdbb00e

 

#redis-cli客户端操作与之前的不同之处

#1、slave节点不能直接读取当前缓存的数据,需要先执行readonly命令

 

192.168.0.202:7001> get name
(error) MOVED 5798 192.168.0.201:7000
192.168.0.202:7001> readonly
OK
192.168.0.202:7001> get name
"zhangsan"
  

 

#2、master节点set数据error(key对应的slot不在当前节点,需要转移。可通过redis-cli -c参数实现自动重定向)

 

192.168.0.201:7000> set age 12
(error) MOVED 741 192.168.0.202:7000

 

 

分享到:
评论

相关推荐

    Redis Cluster部署文档.docx

    Redis Cluster 是 Redis 3.0 版本引入的一项重要特性,它允许用户将 Redis 实例分组形成一个集群来提供高可用性和数据分区能力。通过这种方式,可以有效地提高系统的水平扩展能力,并确保即使某个节点出现故障,服务...

    Redis开发实战:基于Redis的实时排行榜系统的实验心得与案例解析

    Redis可以通过主从复制和哨兵机制来实现高可用性: - **主从复制**:通过复制主节点的数据到一个或多个从节点,可以在主节点出现故障时切换到从节点继续提供服务。 - **哨兵机制**:哨兵负责监控主节点的状态,并在...

    搭建Redis缓存高可用集群环境搭建

    ### 搭建Redis缓存高可用集群环境详解 #### 一、Redis集群方案比较 在探讨具体的搭建步骤之前,我们需要了解两种常见的Redis集群模式:哨兵模式与高可用集群模式。 ##### 1.1 哨兵模式 在Redis 3.0以前的版本中...

    nginx+ tomcat + redis-cluster 实现session同步所需的jar包

    在构建分布式系统时,Session同步是一个关键问题,特别是在使用多个应用服务器如Nginx、Tomcat的情况下。...提供的jar包是实现这一目标的关键组件,它们共同确保了系统在高并发、高可用性场景下的稳定运行。

    Redis集群部署

    Redis 集群是一种分布式的数据存储解决方案,它能够实现数据的高可用性和水平扩展性。通过在多个节点之间分散数据和请求负载,Redis 集群能够在不牺牲性能的情况下支持大量的并发用户。本文档详细介绍了如何部署一个...

    Redis集群搭建及使用

    Redis集群是为了实现高可用性而设计的一种分布式架构。通过多个节点协同工作,实现数据的自动分区和故障转移等功能。 1. **准备环境**: - 准备至少6台服务器或虚拟机作为集群节点。 - 每台服务器上安装好Redis并...

    10-Redis高级功能.docx

    本文将围绕Redis的高级功能——事务、集群、高可用性和高并发处理等方面进行深入探讨。通过理论与实践相结合的方式,旨在帮助读者更好地理解和掌握这些高级特性。 #### 二、高可用性与高并发处理 ##### 2.1 高可用...

    linux redis集群部署

    Redis 自 3.0 版本开始支持集群模式(Cluster),该功能为 Redis 带来了水平扩展的能力,允许用户将数据分布在多个 Redis 实例上,从而提高性能并确保高可用性。以下是对 Redis Cluster 的关键特性和架构进行的详细...

    Redis的Windows版本,内含3.2.100和4.0.2.2两个版本

    1. **Redis Cluster支持**:3.2版本引入了官方的集群解决方案,允许用户在多个节点之间分配数据,实现高可用性和扩展性。通过slot映射,数据可以自动分散到各个节点,增强了系统的可伸缩性。 2. **LUA脚本原子执行*...

    redis技术文档

    Redis的高可用架构主要包括两部分: 1. **集群部署**:通过设置多个节点来分担负载,实现更高的并发处理能力和数据容错能力。 2. **Redis Sentinel**:这是一个监控系统,负责监控主从节点的状态,当检测到主节点...

    CentOS安装Redis

    本文将详细介绍在CentOS系统上安装并配置Redis的过程,包括单机安装、主从模式、Sentinel高可用模式以及集群模式的安装步骤与注意事项。 #### 一、服务器规划与初始化 在开始安装之前,需要对服务器进行必要的规划...

    Redis学习-实战.docx

    - **集群支持**:通过 Redis Cluster 实现横向扩展。 #### 二、Redis 在实战中的应用 ##### 2.1 缓存需求分析 在高访问量的应用场景中,如网站的首页加载,大量的数据查询会导致性能瓶颈。例如,首页可能需要展示...

    57.redis集群安装.docx

    Redis 3.0 版本引入了对集群的支持,这使得 Redis 能够更好地支持高并发场景下的数据处理需求。集群架构的核心优势在于提高了系统的可扩展性和容错性。 ##### 1.1 Redis Cluster 的主要特性 - **节点自动发现**:...

    Redis3.2.rar

    - **Cluster 模式优化**:Redis 集群模式在 3.2 中得到增强,提供了更好的容错性和可用性,提高了大规模部署的稳定性。 - **Keyspace 通知**:增加了对 Keyspace 事件的通知支持,允许客户端订阅特定键的操作,...

    Redis集群安装笔记-精简V1.1.docx

    哨兵模式是Redis的一种高可用解决方案,它能够监控Redis主从节点的状态,自动进行故障转移,并在故障恢复后自动恢复主从关系。 **1. Redis哨兵模式介绍** Redis哨兵系统由多个哨兵节点组成,它们之间通过Gossip...

    03_redis 主从复制 Redis集群和哨兵模式.docx

    - **Predixy**:一款高性能且功能全面的Redis代理,支持Redis Sentinel和Redis Cluster。 - **Redis-Cerberus**:作为Redis Cluster的代理,提供了丰富的功能和良好的性能表现。 综上所述,**Redis**的**主从复制**...

    Tomcat7+Nginx1.8+Redis2.6负载均衡简单配置

    在构建高性能的Web服务时,负载均衡是一种关键的架构策略,它可以提高系统的可用性和响应速度。本配置示例聚焦于“Tomcat7+Nginx1.8+Redis2.6”的组合,这是一个常见的高并发解决方案,其中Nginx作为反向代理服务器...

    redis3.0集群安装

    ### Redis 3.0 集群安装及配置详解 #### 一、概述 Redis(Remote Dictionary Server)是一款开源的键值存储系统,以...通过这种方式,不仅可以提升Redis的性能,还可以实现数据的冗余备份,增加系统的稳定性和可用性。

Global site tag (gtag.js) - Google Analytics