1.背景介绍
redis
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
为什么使用集群
大型网站应用,热点数据量往往巨大
为了提高网站响应速度,热点数据保存在内存中
单台服务主机的内存资源往往是有限制的,通过横向可伸缩扩展,使用多台主机提供服务,能够获得更好的效果
2.知识剖析
redis集群
Redis集群是一个由多个Redis服务器组成的分布式网络服务器群,集群中的各个服务器被称为节点(node),这些节点会相互连接并进行通信。分布式的Redis集群没有中心节点,所以用户不必担心某个节点会成为整个集群的性能瓶颈。
redis分布式
主从模式:Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。
读写分离模型:可以利用master来插入数据,slave提供检索服务。这样可以有效减少单个机器的并发访问数量
redis集群分片
1).将整个数据库分为 16384 个槽(slot)
2).计算键 key: slot_number = crc16(key) % 16384 ,其中 crc16 为 16 位的循环冗余校验函数
redis集群转向
对于一个被指派了槽的主节点来说,这个主节点只会处理属于指派给自己的槽的命令请求。如果一个节点接收到了与自己处理的槽无关的命令请求,那么节点会向客户端返回一个转向错误(redirection error),告诉客户端,哪个节点负责处理这条命令,之后客户端需要根据错误中包含的地址和端口号重新向正确的节点发送命令请求。
容错机制
Redis提供了节点之间相互发送的ping命令,用于测试每个节点的健康状态,集群中连接正常的节点接收到其他节点发送的ping命令时,会返回一个pong字符串。
投票机制
如果一个节点A给B发送ping没有得到pong返回,那么A就会通知其他节点再次给B发送ping,如果集群中超过一半的节点给B发送ping都没有得到返回,那么B就被坐实game over了,所以为了避免单点故障,一般都会为Redis的每个节点提供一个备份节点,B节点挂掉了立马启动B的备份节点服务器。
redis集群的缺点
1、集群无法正常提供服务的情况。
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认yes.
b:如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.
2、Redis集群无法提供强一致性,Redis集群有可能丢失掉部分数据,尽管系统已经发送确认给客户端.(异步模式)
redis集群搭建
1.redis-trib.rb
2.ruby环境
3.配置多个redis节点
4.集群的启动(/redis-trib.rb create --replicas 1 192.168.1.1 7001)
5.客服端配置
3.编码实战
4.常见问题
1、 Sorry, can't connect to node 47.95.248.39:7001
因为绑定bind了127.0.0.1,要么改bind,要么修改启动ip为127.0.0.1
2、 the node already knows other nodes
需要清除杀掉redis实例,然后删除每个节点下的临时数据文件appendonly.aof,dump.rdb,nodes-703x.conf,然后再重新启动redis实例即可启动集群
3、 redis集群如何关闭
需要逐个关闭集群