redis做为一个开源的kv数据库在互联网公司被普遍应用。
做为nosql的一员redis有这几个优势:redis
事物都不是完美的,redis也有很多缺点:算法
为了解决上述的缺点,互联网公司主要提出了三种类型的技术sql
特色:
由客户端本身计算key在哪一个机器上存储和查找,和后端服务器没有什么关系,下降了redis server集群的复杂度,增长了开发的难度。
缺点:
可是客户端要实时知道,集群节点的信息状态,新增节点的时候客户端要支持动态的sharding,可是多数客户端不支持,所以没有大规模使用。数据库
此方式是借助一个代理服务器实现数据分片,客户端直接与proxy联系,proxy计算集群节点信息,并把请求发送到对应的集群节点。后端
表明应用:缓存
twitter 开发。它主要经过事件驱动模型来达到高并发,每收到一个请求,经过解析请求,发送请求到后端服务,再等待回应,发送回请求方。有这几个特色:服务器
架构图(来源于网络)
因为twemprox自己是单点的所以 常常和高可用软件搭配使用网络
配置示例:数据结构
xxxx:
listen: 127.0.0.1:4097
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 127.0.0.1:6378:1架构
distribution:为一致性哈希算法
servers:为后端缓存服务,twemproxy能够预先链接每一个server或者不,根据接收到的请求具体分析出key,而后根据key来选择适当的server。
codis 由豌豆荚的团队编写,也是采用代理分片的技术。
架构图(来源于网络)
Codis组件:
Codis怎么分片?
Codis 采用 Pre-sharding 的技术来实现数据的分片, 默认分红 1024 个 哈希槽。其实就是预分片,将这些分布式状态保存在ZK中,最大后端支持1024个redis server。另外每一个哈希槽必须有个对应的组id,数据迁移和redis cluster 同样由哈希槽为单位。
客户端随意与集群中的任何节点通讯,服务器端负责计算某个key在哪一个机器上,当客户端访问某台机器时,服务器计算对应的key应该存储在哪一个机器,而后把结果返回给客户端,客户端再去对应的节点操做key,是一个重定向的过程,目前官方的Redis Cluster 集群支持
特色:
Redis Cluster 如何分片?
采用CRC16(key) % 16384 来计算键 key 属于哪一个槽,其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和。
如何进行故障转移?
当主节点down掉以后,选举出一个从成为新的主
被选中的从执行slave no one 成为新的主
新主撤销down掉主的哈希槽指派,把这些哈希槽指派给本身
新主和集群其余节点进行通讯,广播本身是主了
新主开始接收请求和哈希槽指派
如何选举?
从在集群中属于冷备,读写请求都不会发往从节点。
从发现本身的主down掉以后,会广播一条 cluster_type_fallover_auth_reqeust的消息,要求其余的主节点给本身投票
其余收到主节点而且还没投票的状况下会把票投给他,返回一个cluster_type_fallover_auth_ack的消息,就是钦定他
当集群中n/2+1的数量的投票从就成为主。
这个选举周期没选成,就下一个周期从新开始
对比
系统参数
vm.overcommit_memory = 1
net.core.somaxconn = 8192 同配置的backlog
echo never > /sys/kernel/mm/transparent_hugepage/enabled
配置参数 Maxmemory 102400mb/10gb timeout 180 tcp-keepalive 300 repl-backlog-size 32M #psync初始大小 client-output-buffer-limit normal 512mb 256mb 60 client-output-buffer-limit slave 1024mb 256mb 120