【修真院java小课堂】REDIS缓存集群介绍

大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员。

今天给大家分享一下,修真院官网JAVA任务六,深度思考中的知识点——REDIS缓存集群介绍

一、背景介绍

Redis:


Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,通俗的来讲就是基于内存的高性能K/V数据库。
Redis 作为一个key—value储存系统。支持储存的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希散列)。

Redis 主从、哨兵的产生背景

主从模式


即使redis提供数据持久化,但由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。

哨兵模式

当主数据库遇到异常中断服务后,开发者可以通过手动的方式选择一个从数据库来升格为主数据库,以使得系统能够继续提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。

集群(CLUSTER)


集群是一组相互独立的、通过高速网络互相联通的节点,构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群就是一个独立的服务器。
集群技术是一种通用的技术,其目的是为了解决单机运算能力的不足、IO能力的不足、提高服务的可靠性、获得规模可扩展能力,降低整体方案的运维成本(运行、升级、维护成本)。能在大流量访问下提供稳定的业务,集群化是存储的必然形态。
1. 提高性能
2. 降低成本
3. 提高可扩展性
4. 增强可靠性

二、知识剖析

redis集群架构方案发展:

(1)客户端分片---Java(Jedis客户端)
(2)Twemproxy(基于代理的分片)多加了一个代理层
(3)Codis
(4)Redis Cluster(路由查询--官方实现)
(5)Proxy + Redis Cluster

(1)客户端分片---Java(Jedis客户端)

Jedis的客户端分片采用一致性hash算法,实现数据的分配存储。但当某一个分片服务挂了之后,客户端需要修改服务的指向才能动态的切换到当前分片的从服务去。 这是一种静态的分片方案,需要增加或者减少Redis实例的数量,需要手工调整分片的程序。 • 可运维性差,集群的数据出了任何问题都需要运维人员和开发人员一起合作,减缓了解决问题的速度,增加了跨部门沟通的成本。 • 在不同的客户端程序中,维护相同的分片逻辑成本巨大。

(2)Twemproxy(基于代理的分片)多加了一个代理层

Twemproxy是一个Twitter开源的一个Redis/Memcache代理服务器, 其基本原理是:Redis客户端把请求发送到Twemproxy,Twemproxy根据路由规则发送到正确的Redis实例,最后Twemproxy把结果汇集返回给客户端。 Twemproxy通过引入一个代理层,将多个Redis实例进行统一管理,使Redis客户端只需要在Twemproxy上进行操作,而不需要关心后面有多少个Redis实例,从而实现了Redis集群。 Twemproxy是早期Redis原生的Cluster没有成熟时的替代方案,而后Redis官方推荐的高性能集群方案还是基于其原生的Redis Cluster功能。 最大的问题是Twemproxy无法平滑地增加Redis实例。

(3)Codis

豌豆荚自主研发了Codis, 一个支持平滑增加Redis实例的Redis代理软件.

(4)Redis Cluster(路由查询--官方实现)

Redis Cluster从Redis 3.0开始引入,3.2版本趋于成熟。 Redis把所有的Key分成了16384个slot,每个Redis实例负责其中一部分slot。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。 Redis客户端在任意一个Redis实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。

(5)Proxy + Redis Cluster

redis集群的优点

1.缓存永不宕机:启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点失败或者不可达的情况下能够继续处理命令;
2.迅速恢复数据:持久化数据,能在宕机后迅速解决数据丢失的问题;
3.Redis可以使用所有机器的内存,变相扩展性能;
4.使Redis的计算能力通过简单地增加服务器得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长;
5.Redis集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈。
6.异步处理数据,实现快速读写。

三、常见问题

REDIS集群实现方式(主从模式)

四、解决方案

REDIS集群实现方式(主从模式)

流程:


1.创建不同的redis节点,在需要的地方运行redis实例,每个redis实例有单独的ip或端口,并且配置启用集群管理;

2.创建redis-trib的运行环境:安装ruby,redis.gem

3.通过使用Redis集群命令工具redis-trib创建集群;

./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002

--replicas 1 表示 自动为每一个master节点分配一个slave节点,上面有6个节点,程序会按照一定规则生成3个master(主)3个slave(从)

Redis 集群的数据分片


Redis 集群没有使用一致性hash,而是引入了哈希槽的概念。
Redis 集群内置了16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点. 
比如如果我想新添加个节点D,我需要从节点 A, B, C中得部分槽到D上.
如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 
由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

redis配置文件

redis.conf 集群的配置
#绑定ip(这里是本地配置,其他服务器配置对应的ip)
bind 127.0.0.1 
#端口
port 6379
#后台守护启动
daemonize yes
#开启aof模式
appendonly yes
#开启集群管理
cluster-enabled yes
#节点响应超时时间 如果超过这个响应时间就会认定节点不可用
cluster-node-timeout 5000

 

五、编码实战

1、启动: redis-server  7001.conf
连接redis:redis-cli -h 127.0.0.1 -c -p 7005
-h <主机ip>,默认是127.0.0.1
-p <端口>,默认是6379
-a <密码>,如果redis加锁,需要传递密码
2、安装ruby环境: apt-get install ruby ----redis下面这个集群工具使用ruby语言编写的
3、redis官方提供的集群工具: gem install redis
安装目录/usr/share/doc/redis-tools/examples/
4、集群命令:./redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

六、扩展思考

MEMCACHE和REDIS集群的对比

Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。 当客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数据会直接发送到该节点上存储。但客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据。

Redis官方集群方案 Redis Cluster Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供。对客户端来说,整个cluster被看做是一个整体,客户端可以连接任意一个node进行操作,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node

七、参考文献

https://blog.csdn.net/onupway/article/details/78387368

https://www.cnblogs.com/robin201711/p/8516844.html

8.更多讨论

1、redis集群的增加删除节点


(1)增加主节点:./redis-trib.rb add-node 127.0.0.1:9004 127.0.0.1:9001
第一个参数是新实例,第二个参数是集群中已有的节点。
(2)查看节点: cluster nodes
(3)增加从节点: ./redis-trib.rb add-node --slave 127.0.0.1:9005 127.0.0.1:9001
(4)删除节点: ./redis-trib.rb del-node 127.0.0.1:9001 'cbb01bdfdc265b190496956354d84aaae6e7d54d'
第一个参数是集群中的任何一个主节点地址,而第二个参数是要删除节点的 ID; 要删除的节点必须是空的,也就是不能缓存任何数据,否则会删除不成功。
(5)重新分片: ./redis-trib.rb reshard 127.0.0.1:9003

2、Redis集群方案什么情况下会导致整个集群不可用?

(1)如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态.

(2)如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

3、Redis集群之间是如何复制的?

采用异步复制。从 Redis 2.8 开始,从服务器会周期性地报告从复制流中处理的数据量。 

 

感谢观看,如有出错,恳请指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值