分布式与集群的联系与区别如下:

  • 分布式是指将不同的业务分布在不同的地方。
  • 而集群指的是将几台服务器集中在一起,实现同一业务。
  • 分布式的每一个节点,都可以做集群,而集群并不一定就是分布式的。而分布式,从狭义上理解,也与集群差不多,但是它的组织比较松散,不像集群,有一定组织性,一台服务器宕了,其他的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,一个节点宕了,这个业务就不可访问了。


主从模式中,当主节点宕机之后,从节点是可以作为主节点顶上来继续提供服务,但是需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。于是,在 Redis 2.8 版本开始,引入了哨兵(Sentinel)这个概念,在主从复制的基础上,哨兵实现了自动化故障恢复。

哨兵模式中,单个节点的写能力,存储能力受到单机的限制,动态扩容困难复杂。于是,Redis 3.0 版本正式推出 Redis Cluster 集群模式,有效地解决了 Redis 分布式方面的需求。Redis Cluster 集群模式具有高可用、可扩展性、分布式、容错等特性

Redis Cluster 采用无中心结构,每个节点都可以保存数据和整个集群状态,每个节点都和其他所有节点连接。Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。因为最小的 Redis 集群,需要至少 3 个主节点,既然有 3 个主节点,而一个主节点搭配至少一个从节点,因此至少得 6 台Redis。

所有 Redis 节点之间采用 Gossip 协议进行通信,交换维护节点元数据信息。
读请求分配给 Slave 节点,写请求分配给 Master,数据同步从 Master 到 Slave 节点。缺点:数据通过异步复制,无法保证数据强一致性;



分区算法

随着请求量和数据量的增加,一台机器已经无法满足需求,我们就需要把数据和请求分散到多台机器。这时候就需要引入分布式存储

范围分区
范围分区将数据基于范围映射到每一个分区,这个范围是你在创建分区时指定的分区键决定的。数据库中这种分区方式是最为常用的,并且分区键经常采用日期。

优点:同一范围内的范围查询不需要跨节点,提升查询速度
应用场景:MySQL,Oracle

一致性哈希分区
实现思路是为系统中每个节点分配一个token,范围一般在0~2^32,这些token构成一个哈希环。数据读写执行节点查找操作时,先根据key计算hash值,然后顺时针找到第一个大于等于该哈希值的token节点。

优点:这种方式相比节点取余最大的好处在于加入和删除节点只影响哈希环中相邻的节点,对其他节点无影响。
缺点:当使用少量节点时,节点变化将大范围影响哈希环中数据映射,因此这种方式不适合少量数据节点的分布式方案。
应用场景:Memcached

虚拟槽分区

在一致性hash分区的基础上加入了虚拟槽(slot)的概念,通过 virtual slot 将哈希环分割成更小的粒度,小粒度的 slot 块被不同的 node 持有。

优点:每个node均匀的分配了slot,缩小增减节点影响的范围
缺点:需要存储node和slot的对应信息
应用场景:Redis Cluster



配置

准备三台虚拟机,Redis节点分别为6371,6372;6373,6374;6375,6376

虚拟机中分别创建目录:mkdir -p /usr/local/redis/cluster/conf /usr/local/redis/cluster/data /usr/local/redis/cluster/log

编写配置文件
三个节点分别创建 redis-.conf 并添加以下配置( 为具体端口为了区分文件)。

注意:修改配置文件中所有 IP 和端口部分内容,可以使用 vi 命令 %s/old/new/g 全局替换。

vi /usr/local/redis/cluster/conf/redis-6371.conf(注意配置文件名称起名规则)

# 放行访问IP限制
bind 0.0.0.0
# 端口
port 6371
# 后台启动
daemonize yes
# 日志存储目录及日志文件名
logfile "/usr/local/redis/cluster/log/redis-6371.log"
# rdb数据文件名
dbfilename dump-6371.rdb
# aof模式开启和aof数据文件名
appendonly yes
appendfilename "appendonly-6371.aof"
# rdb数据文件和aof数据文件的存储目录
dir /usr/local/redis/cluster/data
# 设置密码
requirepass 123456
# 从节点访问主节点密码(必须与 requirepass 一致)
masterauth 123456
# 是否开启集群模式,默认 no
cluster-enabled yes
# 集群节点信息文件,会保存在 dir 配置对应目录下
cluster-config-file nodes-6371.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点 IP
cluster-announce-ip 192.168.10.101
# 集群节点映射端口
cluster-announce-port 6371
# 集群节点总线端口
cluster-announce-bus-port 16371

每个 Redis 集群节点都需要打开两个 TCP 连接。一个用于为客户端提供服务的正常 Redis TCP 端口,例如 6379。还有一个基于 6379 端口加 10000 的端口,比如 16379。

第二个端口用于集群总线,这是一个使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测、配置更新、故障转移授权等等。客户端永远不要尝试与集群总线端口通信,与正常的 Redis 命令端口通信即可,但是请确保防火墙中的这两个端口都已经打开,否则 Redis 集群节点将无法通信。

创建 Redis Cluster 集群
启动 6 个 Redis 节点

/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6371.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6372.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6373.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6374.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6375.conf
/usr/local/redis/bin/redis-server /usr/local/redis/cluster/conf/redis-6376.conf

创建集群
随便一个 Redis 节点中使用客户端运行以下命令即可(注意IP和端口):

/usr/local/redis/bin/redis-cli -a 123456 --cluster create \
192.168.10.101:6371 192.168.10.101:6372 \
192.168.10.102:6373 192.168.10.102:6374 \
192.168.10.103:6375 192.168.10.103:6376 \
--cluster-replicas 1
  • --cluster:构建集群环境的所有 Redis 节点 IP + PORT 信息
  • --cluster-replicas 1:主节点数/从节点数的比例,使用一比一的比例,6 个节点最终会产生 3 主 3 从的集群环境

至此一个高可用的 Redis Cluster 集群搭建完成,该集群中包含 6 个 Redis 节点,3 主 3 从

检查集群状态

/usr/local/redis/bin/redis-cli -a 123456 --cluster check 192.168.10.101:6371

查看主从日志
主节点日志
tail -f -n 1000 /usr/local/redis/cluster/log/redis-6371.log

从节点日志
tail -f -n 1000 /usr/local/redis/cluster/log/redis-6374.log


Natcret
1 声望0 粉丝