redis分布式

【Redis】集群教程(Windows)

核能气质少年 提交于 2020-04-08 04:34:53
概述 Redis集群数据分片 Redis集群节点通讯 环境准备 搭建Redis集群 测试Redis集群 概述 Redis Cluster provides a way to run a Redis installation where data is automatically sharded across multiple Redis nodes Redis集群提供一个在多个Redis节点数据自动共享的方式,简单来说就是添加服务器的数量,达到 高可用,让Redis服务长时间有效运行,不会因为硬件/软件问题导致不可用 可扩展性,动态添加节点/删除节点,达到增加性能/减少服务器资源 分布式,节点可以不是 容错,若其中一台服务器故障挂了Redis也能继续使用(前提是有从节点并且可用) Redis集群数据分片 Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念. Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么: 节点 A 包含 0 到 5500号哈希槽. 节点 B 包含5501 到 11000 号哈希槽. 节点 C 包含11001 到 16384号哈希槽 这种结构的好处就是非常容易增加/删除节点,并且不会影响集群的使用 增加节点

vivo 大规模特征存储实践

扶醉桌前 提交于 2020-04-08 00:18:18
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/u1LrIBtY6wNVE9lzvKXWjA 作者:黄伟锋 本文旨在介绍 vivo 内部的特征存储实践、演进以及未来展望,抛砖引玉,吸引更多优秀的想法。 一、需求分析 AI 技术在 vivo 内部应用越来越广泛,其中特征数据扮演着至关重要的角色,用于离线训练、在线预估等场景,我们需要设计一个系统解决各种特征数据可靠高效存储的问题。 1. 特征数据特点 (1)Value 大 特征数据一般包含非常多的字段,导致最终存到 KV 上的 Value 特别大,哪怕是压缩过的。 (2)存储数据量大、并发高、吞吐大 特征场景要存的数据量很大,内存型的 KV(比如 Redis Cluster)是很难满足需求的,而且非常昂贵。不管离线场景还是在线场景,并发请求量大,Value 又不小,吞吐自然就大了。 (3)读写性能要求高,延时低 大部分特征场景要求读写延时非常低,而且持续平稳,少抖动。 (4)不需要范围查询 大部分场景都是单点随机读写。 (5)定时灌海量数据 很多特征数据刚被算出来的时候,是存在一些面向 OLAP 的存储产品上,而且定期算一次,希望有一个工具能把这些特征数据及时同步到在线 KV 上。 (6)易用 业务在接入这个存储系统时,最好没有太大的理解成本。 2. 潜在需求 扩展为通用磁盘

Redis 简介

蓝咒 提交于 2020-04-06 09:30:49
Redis 是一种基于键值对(key-value)的NoSql 数据库。Redis 中的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、HyperLogLog、GEO(地理信息定位)等多种数据结构和算法组成,因此Redis 可以满足很多场景的应用。而且,因为Redis 会将所有数据都存放在内存中,所以它的读写性能非常惊人。不仅如此,Redis 还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会 “丢失” 。除了上述功能以外,Redis 还提供了键过期、发布订阅、事务、流水线、Lua 脚本等附加功能。 Redis 特性 1.速度快 官方给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能。大致归纳速度快的四点原因如下: # Redis 的所有数据都是放在内存中的,这也是最主要的原因; # Redis 是用C 语言实现的,“距离” 操作系统更近,执行速度相对会更快; # Redis 使用了单线程架构,预防了多线程可能产生的竞争问题; # 源代码精细,集性能与优雅与一身; 2.基于键值对的数据结构服务器 与很多键值对数据库不同的是,Redis 中的值不仅可以是字符串,而且还可以是具体的数据结构,这样不仅便于在许多应用场景开发

Redis 的雪崩、穿透和击穿

梦想的初衷 提交于 2020-04-05 19:50:16
缓存雪崩 假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。 通常我们在使用 Redis 的时候,都会为缓存设置过期时间,但是如果在某个时间点,有大量缓存失效,那么下一个时间点就会有大量请求访问到数据库,这种情况下,数据库可能因为访问量多大导致“崩溃”,这就是缓存雪崩。 第一种情况:缓存雪崩的事前事中事后的解决方案如下: 事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。 事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。对于缓存大面积失效的情况可以设置缓存的失效时间使用随机数,避免此问题。 事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。 第二种情况: 不设置缓存过期时间 最暴力的解决办法,缓存不设置自动过期时间,只要缓存不崩,数据库就不会崩。 设置随机过期时间 另外一个办法,就是让缓存过期时间不那么一致,比如一批缓存数据24小时后过期,那么就在这个基础上,让每条缓存的过期时间前后随机 1-6000 秒(1

Redis集群

我们两清 提交于 2020-04-05 17:37:12
Redis 的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台 Redis 服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。 根据官方推荐,集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式。在测试环境中,只能在一台机器上面开启6个服务实例来模拟。 1、修改配置文件 将 redis.conf 的配置文件复制6份到7000 .....7005(文件名最好加上端口后缀),然后开始修改配置文件中的参数 mkdir cluster-test cd cluster-test mkdir 7000 7001 7002 7003 7004 7005采用最下配置,以7000为例(其他的参考修改端口和config-file): port 7000 protected-mode no cluster-enabled yes cluster-config-file nodes7000.conf cluster-node-timeout 5000 appendonly yes cd 7000 ../redis-server ./redis.conf 启动6个服务: 运行以下命令集群(5.0以上版本) redis-cli -

Redis分布式集群搭建

此生再无相见时 提交于 2020-04-03 05:33:21
Redis 集群架构图 上图蓝色为 redis 集群的节点。 节点之间通过 ping 命令来测试连接是否正常,节点之间没有主区分,连接到任何一个节点进行操作时,都可能会转发到其他节点。 1、Redis 的容错机制 节点之间会定时的互相发送 ping 命令,测试节点的健康状态,当节点接受到 ping 命令后,会返回一个 pong 字符串。 投票机制:如果一个节点 A 给节点 B 发送 ping 没有得到 pong 返回,会通知其他节点再次给 B 发送 ping ,如果集群中有超过一半的节点收不 B 节点的 pong 。那么就认为 B 节点挂了。一般会为每个节点提供一个备份节点,如果挂掉会切换到备份节点。 2、Redis 集群存储原理 Redis 对于每个存放的 key 会进行 hash 操作,生成一个 [ 0-16384] 的 hash 值(先进行 crc 算法再对 16384 取余)。 集群的情况下,就是把 [0-16384] 的区间进行拆分,放到不同的 redis 中。 3、Redis 的持久化 Snapshotting :定时的将 Redis 内存中的数据保存到硬盘中 AOF :将所有的 command 操作保存到 aof 中, AOP 的同步频率很高,数据即使丢失,粒度也很小,但会在性能上造成影响。 二、Redis 集群准备工作 Redis 安装 源码下载 下载地址

分布式集群环境下,如何实现session共享四(部署项目测试)

老子叫甜甜 提交于 2020-04-02 15:00:02
  这是分布式集群环境下,如何实现session共享系列的第五篇。在上一篇: 分布式集群环境下,如何实现session共享四(部署项目测试) 中,针对nginx不同的负载均衡策略:轮询、ip_hash方式,测试了session的不同使用情况,并且留下了一个问题: 有没有可能针对nginx负载均衡策略(轮询)的基础上,对session实现共享呢???   本篇在nginx负载均衡策略(轮询的基础上),通过spring-session将session存储到redis,实现session共享。 1.改造项目   1.1.导入依赖 <!--spring 版本--> <spring.version>5.0.2.RELEASE</spring.version> <spring.session.data.redis.version>1.3.1.RELEASE</spring.session.data.redis.version> <lettuce.version>3.5.0.Final</lettuce.version> <!-- spring web包 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}<

四、redis哨兵机制

你离开我真会死。 提交于 2020-04-01 08:10:13
版权声明:本文为转载文章,博客原文地址:http://blog.csdn.net/a67474506?viewmode=contents 一、 Redis 的哨兵(sentinel) 系统用于管理多个 redis 服务器,该系统执行以下三个任务: 1、 监控(Monitoring) : 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。 2、提醒(Notification) :当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。 3、自动故障迁移(Automatic failover) :当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。 二、哨兵   哨兵(sentinel) 是一个分布式系统,你可以在一个 架构 中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement

redis哨兵机制及配置

蓝咒 提交于 2020-04-01 08:07:01
Redis哨兵机制 什么是哨兵机制 Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务: · 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。 · 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。 · 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。 哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master. 每个哨兵(sentinel) 会向其它哨兵

互联网公司分布式集群架构图入门解析(简单通俗易懂,超详细)

旧巷老猫 提交于 2020-04-01 00:06:23
互联网公司分布式集群架构图入门解析(简单通俗易懂,超详细) 置顶 2018年11月08日 09:32:44 英俊帅比林 阅读数:1769 标签: 集群 分布式 互联网架构 java 更多 个人分类: JavaWeb 一、小型公司网络架构 狗子是某大学计算机专业本科应届毕业生,由于自己的技术不错,再加上互联网产业的巨大利润的驱使,狗子决定走上创业这条路,于是,狗子联合了同学二黑,鸡子,狗蛋等人花费了几个月的时间写出了一套网站,是关于足球资讯的pc端网站加上手机APP客户端。现在产品测试成功了,准备发布了,狗子想到了两个问题: 1.网站需要服务器 狗子之前所有的代码测试都是在本地服务器或者局域网上进行的,现在需要把产品发布到外网上,让所有的人都能访问,因此再用自己的电脑当服务器显然很不现实,于是,狗子去买了一台服务器,在上面装了jdk,tomcat,mysql等必备环境,把网站搭了起来,又经过了很多测试,运行毫无问题了,通过网站的ip可以访问并且实现功能了,而且app的后台也在服务器上测试成功了,目前公司的架构如图所示: 那么问题又来了: 2.网站需要域名 显然,如果让各地的用户需要记住你服务器的ip地址才能访问你的网站的话,那是会被用户拿刀追着砍的。因此,狗子需要一个便于记住的域名,以后在浏览器输入这个域名就能够访问这个网站,所以,狗子拿着申请下来的各种资质,找到了域名贩卖商