目录
一、主从复制
1.1 概念
主从复制,简单来说就是主机数据更新后根据配置和策略, 自动同步到从机的master/slaver机制,Master以写为主,Slave以读为主。
可以实现读写分离、性能扩展、容灾快速恢复。
1.2 特点
1.可以在主机上写,在从机上读取数据,但在从机上写数据会被拒绝。
2.主机挂掉,重启就行;从机重启需重设(我附庸于谁?)
3.假如从机是后来加入的,它将从头复制数据,而不是从切入点复制。
4.若master挂掉,后面slave可以顶替master的位置,其后面的slave不用做任何修改。以前的master恢复后只能做slave了(反客为主)。
但这需要手动设置,想要自动设置要开启哨兵模式(反客为主的自动版),能够在后台监控主机是否故障。如果故障了根据投票数(优先级别)自动将从库转换为主库。这需要单独配置一个sentinel.conf,因为哨兵是一个单独的服务器。
优先级 - 在redis.conf中默认:slave-priority 100,值越小优先级越高
偏移量 - 是指获得原主机数据最全的
rinid - 每个redis实例启动后都会随机生成一个40位的runid
5.上一个Slave可以是下一个slave的Master,Slave同样可以接收其他 slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险(薪火相传)。
1.3 原理
- Slave启动成功连接到master后会发送一个sync命令
- Master接到命令启动后台的存盘进程(RDB),同时收集所有接收到的用于修改数据集的命令, 在后台进程执行完毕之后,master将传送整个数据文件(RDB)到slave,以完成一次完全同步
- 全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
- 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
- 若重新连接master,会自动执行一次完全同步(全量复制)
- 每次主服务器进行写操作后,都会和从服务器进行数据同步(增量复制)。
二、集群
传统的主从复制模式可能存在容量不足、并发写的问题,另外,若主机宕机,会导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置。
2.1 概念
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
2.2 slots
假设一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。
其实就是很像hash算法,将数据分散存在多个区域中。
2.3 特点
1.在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。
2.redis-cli客户端提供了 –c 参数实现自动重定向。
如 redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。
3.即使连接的不是主机,集群会自动切换主机存储。主机写,从机读。
4.无论从哪台主机写的数据,其他主机上都能读到数据。
5.不在一个slot下的键值,是不能使用mget,mset等多键操作。可以通过{ }来定义组的概念,从而使key中{ }内相同内容的键值对放到一个slot中去。
6.如果主节点下线,从节点会自动升为主节点;主节点恢复后,回来变成从机。
7.如果所有某一段插槽的主从节点都宕掉,根据配置文件的不同设置,整个集群都挂掉或者该插槽数据全都不能使用,也无法存储。
2.4 优缺点
优点:
1.实现扩容
2.分摊压力
3.无中心配置相对简单
不足:
1.多键操作是不被支持的
2.多键的Redis事务是不被支持的。lua脚本不被支持
3.由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。