简述
单机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 是 Redis 3.0 版本引入的一项重要特性,它允许用户将 Redis 实例分组形成一个集群来提供高可用性和数据分区能力。通过这种方式,可以有效地提高系统的水平扩展能力,并确保即使某个节点出现故障,服务...
Redis可以通过主从复制和哨兵机制来实现高可用性: - **主从复制**:通过复制主节点的数据到一个或多个从节点,可以在主节点出现故障时切换到从节点继续提供服务。 - **哨兵机制**:哨兵负责监控主节点的状态,并在...
### 搭建Redis缓存高可用集群环境详解 #### 一、Redis集群方案比较 在探讨具体的搭建步骤之前,我们需要了解两种常见的Redis集群模式:哨兵模式与高可用集群模式。 ##### 1.1 哨兵模式 在Redis 3.0以前的版本中...
在构建分布式系统时,Session同步是一个关键问题,特别是在使用多个应用服务器如Nginx、Tomcat的情况下。...提供的jar包是实现这一目标的关键组件,它们共同确保了系统在高并发、高可用性场景下的稳定运行。
Redis 集群是一种分布式的数据存储解决方案,它能够实现数据的高可用性和水平扩展性。通过在多个节点之间分散数据和请求负载,Redis 集群能够在不牺牲性能的情况下支持大量的并发用户。本文档详细介绍了如何部署一个...
Redis集群是为了实现高可用性而设计的一种分布式架构。通过多个节点协同工作,实现数据的自动分区和故障转移等功能。 1. **准备环境**: - 准备至少6台服务器或虚拟机作为集群节点。 - 每台服务器上安装好Redis并...
本文将围绕Redis的高级功能——事务、集群、高可用性和高并发处理等方面进行深入探讨。通过理论与实践相结合的方式,旨在帮助读者更好地理解和掌握这些高级特性。 #### 二、高可用性与高并发处理 ##### 2.1 高可用...
Redis 自 3.0 版本开始支持集群模式(Cluster),该功能为 Redis 带来了水平扩展的能力,允许用户将数据分布在多个 Redis 实例上,从而提高性能并确保高可用性。以下是对 Redis Cluster 的关键特性和架构进行的详细...
1. **Redis Cluster支持**:3.2版本引入了官方的集群解决方案,允许用户在多个节点之间分配数据,实现高可用性和扩展性。通过slot映射,数据可以自动分散到各个节点,增强了系统的可伸缩性。 2. **LUA脚本原子执行*...
Redis的高可用架构主要包括两部分: 1. **集群部署**:通过设置多个节点来分担负载,实现更高的并发处理能力和数据容错能力。 2. **Redis Sentinel**:这是一个监控系统,负责监控主从节点的状态,当检测到主节点...
本文将详细介绍在CentOS系统上安装并配置Redis的过程,包括单机安装、主从模式、Sentinel高可用模式以及集群模式的安装步骤与注意事项。 #### 一、服务器规划与初始化 在开始安装之前,需要对服务器进行必要的规划...
- **集群支持**:通过 Redis Cluster 实现横向扩展。 #### 二、Redis 在实战中的应用 ##### 2.1 缓存需求分析 在高访问量的应用场景中,如网站的首页加载,大量的数据查询会导致性能瓶颈。例如,首页可能需要展示...
Redis 3.0 版本引入了对集群的支持,这使得 Redis 能够更好地支持高并发场景下的数据处理需求。集群架构的核心优势在于提高了系统的可扩展性和容错性。 ##### 1.1 Redis Cluster 的主要特性 - **节点自动发现**:...
- **Cluster 模式优化**:Redis 集群模式在 3.2 中得到增强,提供了更好的容错性和可用性,提高了大规模部署的稳定性。 - **Keyspace 通知**:增加了对 Keyspace 事件的通知支持,允许客户端订阅特定键的操作,...
哨兵模式是Redis的一种高可用解决方案,它能够监控Redis主从节点的状态,自动进行故障转移,并在故障恢复后自动恢复主从关系。 **1. Redis哨兵模式介绍** Redis哨兵系统由多个哨兵节点组成,它们之间通过Gossip...
- **Predixy**:一款高性能且功能全面的Redis代理,支持Redis Sentinel和Redis Cluster。 - **Redis-Cerberus**:作为Redis Cluster的代理,提供了丰富的功能和良好的性能表现。 综上所述,**Redis**的**主从复制**...
在构建高性能的Web服务时,负载均衡是一种关键的架构策略,它可以提高系统的可用性和响应速度。本配置示例聚焦于“Tomcat7+Nginx1.8+Redis2.6”的组合,这是一个常见的高并发解决方案,其中Nginx作为反向代理服务器...
### Redis 3.0 集群安装及配置详解 #### 一、概述 Redis(Remote Dictionary Server)是一款开源的键值存储系统,以...通过这种方式,不仅可以提升Redis的性能,还可以实现数据的冗余备份,增加系统的稳定性和可用性。