redis-cluster架构图
redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护,Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
复制
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失数据。但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障灯问题,也会导致数据丢失。为了避免单点故障,通常的做好是将数据库复制多个副本部署在不同的服务器上面,即使有服务器宕机了,其他服务器也可以继续提供服务。为此,Redis提供了复制功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。
在复制的概念中,我们把数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能有一个主数据库。
在Redis中使用复制功能非常容易,只需要在从数据库的配置文件中加入”slaveof 主数据库地址 主数据库端口”即可,主数据库无需进行任何配置。
一般在默认情况下从数据库是只读的,如果直接修改从数据库的数据会出现错误。当然我们也可以通过设置从数据库配置文件中的slave-read-only为no以使从数据库可写,但是因为对从数据库的任何更改都不会给任何其他数据库,并且一旦主数据库中更新了对应的数据就会覆盖从数据库中的改动,所以通常的场景下不应该设置从数据库可写
复制的原理
当一个从数据库启动后会向主数据库发送SYNC命令。同时主数据库接收到SYNC命令后会开始再后台保存快照,并将保存快照期间接收到的命令缓存起来。当快照完成后,Redis会将快照文件和所有缓存的命令发送给从数据库。从数据库收到后,会载入快照文件并执行收到的缓存的命令。以上过程称为复制初始化。初始化结束后,主数据库每当收到写命令时就会将命令同步给从数据库,从而保证主从数据库一致。
当主从数据库之间的连接断开重连后,Redis2.6以及之前的版本会重新进行复制初始化,即使从数据库可以仅有几条命令没有收到,主数据库也必须要将数据库里的所有数据重新传送给从数据库。这使得效率非常的低下。Redis2.8版的一个重要改进就是断线重连后,只传输断线期间的命令。
哨兵
从名字上我们就可以看出来哨兵是什么,哨兵的作用就是监控Redis系统的运行状况。
1.监控主数据库和从数据库是否正常运行。
2.主数据库出现故障时自动将从数据库转换为主数据库。
哨兵是一个独立的进程,在一个一主多从的Redis系统中,可以使用多个哨兵进行监控任务以保证系统足够稳健
哨兵实现的原理
哨兵进程启动时会读取配置文件的内容,首先通过配置文件中找出我们需要监控的主数据库,然后和主数据库建立两条连接,这两个连接的建立方式和普通的Redis客户端一样。其中一条连接用来订阅该主数据_sentinel_:hello
频道以获取其他同样监控该数据库的哨兵节点信息,另外哨兵也需要定期向主数据库发送INFO等命令获取主数据库本身的信息。进入了订阅模式后就不能再执行其他的命令了,所以这时哨兵会使用一条连接来发送这些命令。
和主数据库的连接建立完成后,哨兵会定时执行下面3个操作:
1.每10秒哨兵会向主数据库和从数据库发送INFO命令.
2.每2秒哨兵会向主数据库和从数据库的_sentinel_:hello
频道发送自己的信息。
3.每1秒哨兵会向主数据库,从数据库和其他哨兵节点发送PING命令