Redis学习笔记八:集群模式
作者:Grey
原文地址:Redis学习笔记八:集群模式
前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是用来解决Redis的单点容量问题。
如何来解决Redis单点容量问题呢?
如果数据可以拆分,我们可以让不同业务的客户端打到不同的Redis实例中。
如果数据不能拆分,我们有如下方式:
方案2-1 modula方式
可以通过Hash加上取模的方式来定位打到哪个Redis实例中。
这种方式的弊端在于:模数值固定,会影响分布式下的扩展性。
方案2-2 random方式
即每次请求redis的实例是随机的,一部分客户端负责push数据,一部分客户端负责消费数据,这样的场景可以适用于消息队列。
方案2-3 ketama方式
这种方式是通过一致性Hash算法(没有取模),规划成一个环形,环形上有很多虚拟节点,每次选择的实例通过hash算法对应到具体的一个节点。模型如下:
Client1~Client4通过Hash分别找到了环上A~B四个点

这种方式的优点在于:增加节点的时候可以分担其他节点的压力,不会造成全局洗牌。
缺点在于:新增节点造成一小部分数据不能命中,会使得缓存击穿,压到mysql
解决方案:取离我最近的2个物理节点
modula,random和ketama方式都是从客户端入手,因为每个客户端都需要与redis实例建立连接,所以,这种情况会导致连接的成本很高。如何解决这个问题呢?
我们可以在客户端和Redis之间增加一个代理层,通过代理层去实现原先在客户端要实现的三个方案。

此时,代理层就容易成为一个单点故障。所以代理可以做集群,然后最前端通过LVS来做负载均衡,防止LVS挂掉,可以通过KeepAlived来调配LVS,同时,KeepAlived也可以作为代理层健康检查的工具。整个架构图如下:

这三种模式的弊端都在于:只能让Redis做缓存,无法做数据库。(因为数据会丢失)
要解决这个问题,可以通过预分区的方式,增加槽位的概念:http://www.redis.cn/topics/cluster-tutorial.html
可以通过redis-cluster 模式(无主模型)来解决。

客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。
但是数据分治的时候,会带来一个问题,无法做聚合操作,怎么解决呢?
我们可以使用hash tag,让同一组key打到同一个redis实例上面,并且对同一hash tag下的key可以进行聚合操作。
Twemproxy实战
Twemproxy 也叫 nutcraker。是 Twitter 开源的一个 Redis 和 Memcache 代理服务器,主要用于管理 Redis 和 Memcached 集群,减少与Cache 服务器直接连接的数量。
启动3个redis服务实例:假设为:
- 6379
- 6381
- 6380

在/usr/local/src目录下,下载最新的twemproxy的源码包
cd /usr/local/src
## 下载源码
wget https://github.com/twitter/twemproxy/archive/refs/tags/v0.4.1.tar.gz
## 解压
tar xf v0.4.1.tar.gz
## 重命名
mv twemproxy-0.4.1/ twemproxy/
接下来按照官方步骤编译安装
yum install automake libtool -y
cd /usr/local/src/twemproxy/
autoreconf -fvi
./configure --enable-debug=full
make
src/nutcracker -h
## 安装成服务
cp nutcracker.init /etc/init.d/nutcracker
chmod +x /etc/init.d/nutcracker
mkdir /etc/nutcracker
cp /usr/local/src/twemproxy/conf/* /etc/nutcracker/
cp /usr/local/src/twemproxy/src/nutcracker /usr/bin
接下来修改twemproxy的配置文件
vi /etc/nutcracker/nutcracker.yml
修改为:
alpha:
listen: 127.0.0.1:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 127.0.0.1:6379:1
- 127.0.0.1:6380:1
- 127.0.0.1:6381:1
启动
service nutcracker start
连接到代理:
redis-cli -p 22121
127.0.0.1:22121> set k1 1
OK
127.0.0.1:22121> get k1
"1"
不支持的一些操作。
127.0.0.1:22121> keys *
Error: Server closed the connection
127.0.0.1:22121> watch k1
Error: Server closed the connection
127.0.0.1:22121> mult
Error: Server closed the connection
127.0.0.1:22121> multi
Error: Server closed the connection
Redis学习笔记八:集群模式的更多相关文章
- redis 学习笔记-cluster集群搭建
一.下载最新版redis 编译 目前最新版是3.0.7,下载地址:http://www.redis.io/download 编译很简单,一个make命令即可,不清楚的同学,可参考我之前的笔记: red ...
- redis 学习笔记2(集群之哨兵模式的使用)
redis3.0之前已经有了哨兵模式,3.0之后有了cluster(分片集群),官方不推荐使用!!主要原因是分片后单节点故障后需要实现手动分槽... 集群较为成熟的解决方案codis,公司使用的是哨兵 ...
- Quartz学习笔记:集群部署&高可用
Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...
- redis解决方案之三种集群模式的概念与部署
上篇文章为大家总结了redis命令并讲述了持久化,今天我们来看一下redis的三种集群模式:主从复制,哨兵集群,Cluster集群 本篇文章先介绍redis-cluster集群模式,然后再依次介绍它的 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 集群容错
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 集群容错 在集群调用失败时,Dubbo提供了多种容错方案,缺省为failover重 ...
- redis相关笔记(二.集群配置及使用)
redis笔记一 redis笔记二 redis笔记三 1.配置:在原redis-sentinel文件夹中添加{8337,8338,8339,8340}文件夹,且复制原8333中的配置 在上述8333配 ...
- NodeJS学习笔记 (17)集群-cluster(ok)
cluster模块概览 node实例是单线程作业的.在服务端编程中,通常会创建多个node实例来处理客户端的请求,以此提升系统的吞吐率.对这样多个node实例,我们称之为cluster(集群). 借助 ...
- MongoDB学习笔记~Mongo集群和副本集
回到目录 一些概念 对于Mongo在数据容灾上,推荐的模式是使用副本集模式,它有一个对外的主服务器Primary,还有N个副本服务器Secondary(N>=1,当N=1时,需要有一台仲裁服务器 ...
- Redis 3.2.8 集群模式+Sentinel多Master部署
环境准备CentOS 7.3redis1 172.18.1.101:7001 masterredis2 172.18.1.102:7002 masterredis3 172.18.1.103:7003 ...
随机推荐
- 熟知Mysql基本操作
本文是学习 Mysql必知必会 后的笔记 学习之前需要创建一个数据库,然后导入下面两个mysql脚本 create database db1 charset utf8; ############### ...
- 【Spring】 Spring如何解决循环依赖的问题?
https://mp.weixin.qq.com/s/FtbzTMxHgzL0G1R2pSlh-A 通常来说,如果问Spring内部如何解决循环依赖,一定是单默认的单例Bean中,属性互相引用的场景. ...
- Dedecms自定义表单后台列表展现方式样式更改
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- hdu2482 字典树+spfa
题意: 给你一个地图,地图上有公交站点和路线,问你从起点到终点至少要换多少次公交路线. 思路: 首先上面的题意说的和笼统,没说详细是因为这个题目叙述的很多,描述起来麻烦, 下面 ...
- Python脚本与Metasploit交互进行自动永恒之蓝攻击
我们首先利用 findTarget() 函数找到目标网段或目标主机中开放了445端口的主机,然后利用 confickerExploit() 函数将攻击代码写入 configure.rc 配置文件中,最 ...
- ASLR 的关闭与开启(适用于 Windows7 及更高版本)
ASLR 是一种针对缓冲区溢出的安全保护技术,通过对堆.栈.共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的的一种技术 有的时候 ...
- Docker仓库-Docker Hub
Docker Hub Docker官方维护了一个公共仓库Docker Hub,其中已经包括了数量上百万的镜像,大部分需求都可以通过在Docker Hub 中直接下载镜像来实现. 注册: https:/ ...
- 7 IDEA连接数据库
IDEA连接数据库 连接成功后,选择数据库 查看数据库/表的内容就双击数据库 修改数据库--要点击DB才能保存 出现问题 错误描述 Server returns invalid timezone. G ...
- IntelliJ IDEA打开Maven项目,Spring boot所有依赖红名,不可用
导入外部的springboot项目时,出现报红线,无论怎么刷新maven就是不下载依赖包,情况如下 解决办法: 1)直接去自己的maven仓库,找到Spring boot,然后直接删除下面的文件 2) ...
- Mybatis学习之自定义持久层框架(五) 自定义持久层框架:封装CRUD操作
前言 上一篇文章我们完成了生产sqlSession的工作,与数据库的连接和创建会话的工作都已完成,今天我们可以来决定会话的内容了. 封装CRUD操作 首先我们需要创建一个SqlSession接口类,在 ...