赞
踩
Redis 集群是将数据和负载分散在多个节点上的一种方法。每个节点都是一个独立的 Redis 实例,这些实例协同工作以提供高可靠性和性能。在 Redis 集群中,数据被分数个槽位, 并将这些槽位分配给不同的节点存储,在读写数据时会自动进行数据迁移。Redis 集群的这种方式可以无需使用共享存储或共享内存等资源,便可以实现线性扩展。此外,Redis 集群还支持故障恢复和单点故障自动转移。
当单个 Redis 实例无法满足业务需求时,Redis 集群便显得尤其必要。Redis 集群可以提高系统的可用性、吞吐量和容错性,从而满足高并发、高可靠性的业务场景。
单机 Redis 可以通过升级到 Redis Cluster 来实现集群化部署。升级完成后,Redis 将变为一个多节点的集群,它包含多个节点,每个节点都是一个单独的 Redis 实例。下面介绍如何将 Redis 从单机模式升级为 Redis Cluster:
安装 Redis Server 和 Redis CLI
修改 Redis 配置文件 redis.conf。
# 启用集群模式
cluster-enabled yes
# 节点间通信的超时时间
cluster-node-timeout 5000
# 集群状态持久化方式,可以是rdb或者aof,也可以都开启
cluster-config-file nodes-6379.conf
重启 Redis 服务端
使用 redis-cli 创建 Redis Cluster
首先启动一个节点:
redis-server --port 7001 --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000
然后在该节点上使用 redis-cli 工具的 cluster 命令创建集群:
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 …
以上搭建方法适用于小型 Redis 集群搭建。对于大规模的生产环境,需要使用 Redis 集群管理软件(如 Redis Sentinel 或 Redis Cluster)来进行故障转移和负载均衡。
在搭建 Redis 集群之前,需要进行如下准备工作:
安装 Redis server 和 Redis cli 工具
在多个机器上安装 Redis,并确保它们都能够互相通信。
确保每个 Redis Server 实例的配置文件中 cluster-enabled=yes。
创建一个目录用于存储 Redis Cluster 节点数据(如 /opt/redis/cluster/n1、/opt/redis/cluster/n2 等)。
修改每个 Redis Server 实例的配置文件,设置 node 一系列的参数(nodeport、nodename、dbfilename等)。
# 集群名称
cluster-name mycluster
# 集群节点列表(多个Redis实例的 IP:PORT 组合)
cluster-announce-ip <your_ip_address>
cluster-announce-port <cluster_start_port>
# 同一节点的多个 Redis 实例需要有不同的端口号
port <different_port>
# 集群工作目录,用于存储会产生的日志和状态信息等
dir /path/to/redis/node1
# 不使用AOF持久化方式(至少在这里不启动),可以降低内存使用率
appendonly no
将各个 Redis Server 实例的配置文件拷贝到对应的目录(如 /opt/redis/cluster/n1、/opt/redis/cluster/n2 等),多个目录分别代表不同的节点。
修改集群中最少、最多节点数量(从而决定能存储的槽数量)。
cluster-node-timeout 5000 # 节点超时时间(单位毫秒)
cluster-config-file nodes-6379.conf # 集群状态持久化文件
cluster-minimum-nodes <number_of_nodes> # 集群最少节点数
cluster-max-redirects 6 # 节点内部重定向的最大次数
在多个节点上启动 Redis Server 实例,并在它们的配置文件中开启“集群模式”。
使用 redis-cli 工具的 cluster 命令创建集群:
redis-cli --cluster create <ip1>:<port1> <ip2>:<port2> ... --cluster-replicas
此处的 <ip>
和 <port>
是各个 Redis Server 实例的 IP 地址和端口号,--cluster-replicas
参数表示使用自动生成的从节点。
到这里,一个 Redis 集群便成功搭建了。可以使用 redis-cli 工具进行验证和测试。
Redis是一款支持较小内存的高性能键值对(key-value)存储数据库,随着业务数据逐步增大,单机Redis可能会出现内存不足、性能瓶颈等情况。数据分片是一种常见的解决Redis单点故障的方案,将数据划分到多个节点上进行存储和处理。
Redis官方提供了三种数据分片的策略:哈希一致性算法、按范围区间分片、哈希槽模式分片。
哈希一致性算法是一种将数据节点进行哈希运算,将结果映射到环形空间的算法。通俗的讲,就是将每个节点用一个哈希值表示,然后在某个范围内寻找距离节点最近的值,将数据存储到该节点上。需要注意的是,当节点数量发生变化时,该算法需要重新计算哈希值。
按范围区间分片是一种将数据按照值的范围划分为若干段,然后将每个段分配给不同的节点进行存储和处理。该策略适用于数据能够按照某种方式划分为多个区间的场景。例如,按照用户ID的范围进行分片。
哈希槽模式分片是Redis集群中最常用的一种分片策略。将Hash Slot(哈希槽)的数量固定为16384,将数据库中所有Key使用相同的哈希函数进行哈希运算,再对16384进行取余,确定该Key对应的哈希槽。每个节点负责处理一部分哈希槽。如果节点数发生变化,槽和节点之间的映射关系会重新计算,数据迁移至新节点。
Redis提供了监控集群状态的工具redis-cli、redis-trib.rb和redis-stat,可以通过命令行或Web界面查看集群的实时状态、数据流量、QPS等信息。
当集群中某个节点出现故障时,可以通过以下几个步骤进行处理:首先查看运行日志,分析故障原因;其次尝试重启、修复问题;最后如果无法修复,则通过增加新节点替代原有节点。
当节点掉线时,需要先确认节点是否真的掉线,而非假故障,然后检查运行日志,并在必要的情况下进行数据迁移。
当增加或删除节点时,需要将一些槽重新分配到其他节点上,并进行数据迁移。这个操作需要在集群处于正常状态时进行。关键在于避免数据重复和数据丢失。
集群的扩容很简单,只需要增加新节点,然后进行槽的重新分配和数据迁移即可。缩容相对较为困难,需要考虑如何进行异地备份、数据归档等操作。可以采用持久化方式来对被缩容的节点进行数据归档,并通过Redis提供的Restore命令进行恢复。
在Redis主从架构中,一个节点(Redis实例)被指定为主节点(master),其余节点为从节点(slave)。
主节点负责写操作并将写操作同步给从节点,从节点只能读取数据。
主从同步是指主节点将写操作同步到从节点,实现从节点数据与主节点数据的一致性。当从节点与主节点失去联系时,从节点变成不可用状态。
主从切换是指发生故障后将主节点切换到某个从节点,以此保证系统的可用性。
Redis哨兵模式是保证Redis高可用性的一种方式,通过Sentinel(哨兵)监控系统Redis节点状态,当某个Redis节点出现故障时,Sentinel会自动进行主从切换。
Redis集群是为了解决单台机器容量有限的问题,集群中的每个节点(在一定意义上可以看成是“分片”)处理部分数据,所有节点组成一个完整的Redis服务。
下面我们通过一个实例进行演示。
安装Redis和Ruby环境:
sudo apt-get update
sudo apt-get install redis-server ruby
安装ruby包管理器:
sudo apt-get install rubygems
安装redis和redis-trib.rb
sudo gem install redis
wget http://download.redis.io/redis-stable/src/redis-trib.rb
chmod +x redis-trib.rb
创建6个Redis实例,并启动:redis-6379,redis-6380,redis-6381,redis-6382,redis-6383,redis-6384
创建集群:
./redis-trib.rb create --replicas 1 \
127.0.0.1:6379 \
127.0.0.1:6380 \
127.0.0.1:6381 \
127.0.0.1:6382 \
127.0.0.1:6383 \
127.0.0.1:6384
连接到Redis集群中任意节点:
redis-cli -c -h 127.0.0.1 -p 6379
在Redis集群中创建key,并查看分配情况:
set foo bar
cluster keyslot foo
查看当前集群节点状态:
cluster nodes
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。