Redis进阶
- 1. 主从复制机制
- 1.1 复制原理
- 1.2 配置“一主多从”试验主从复制
- 1)为每个Redis进程提供配置文件
- 2)分别在不同客户端启动Redis服务
- 3)配置服务器成为某主机的下属从机
- 1.3 不同模式
- 1.3.1 一主二仆
- 1.3.2 薪火相传
- 1.3.3 反客为主
- 1.4 哨兵模式
- 1.4.1 使用一主二仆模式试验哨兵模式
- 2. 集群
- 2.1 模拟实现集群
- 2.1.1 节点分配策略
- 2.1.2 slots介绍
- 2.2 集群相关操作
- 2.3 故障恢复
1. 主从复制机制
-
介绍:主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主;
-
优点:
1)读写分离,减轻主机的压力,性能扩展;
2)容灾快速恢复:某个从机宕机,可自动从其他的从机读取数据; -
缺点:复制延时,从机越多,复制延时的情况越严重;
-
通常配置为“一主多从”模式,主机宕机带来的影响可通过搭建集群解决;
1.1 复制原理
- 数据复制分为:1)全量复制:在从机连接主机时触发;2)增量复制:在主机有数据更新操作时触发;
情况1:从机连接主机(全量复制) - 从机Slave向主机Master发出数据同步请求;
- 主机将当前内存中数据持久化到本地rdb文件中,将rdb文件发送到从机;
- 从机保存rdb文件,随后加载该文件复制数据;
情况2:主机发生数据更新(增量复制)
- 主机发生数据更新,主动将数据更新操作发送到从机;
- 从机接收更新数据,完成数据同步;
1.2 配置“一主多从”试验主从复制
- 此处在一台服务器中,通过启动不同的Redis进程模拟“1主2从”;
- 有条件的可以使用多台主机模拟;
- 提前创建一个实验目录放置各个进程对应的redis.conf配置文件:1)
mkdir redis_demo
;2)cd redis_demo
; - 不同Redis进程需要对应不同的启动端口,此处三个进程分别对应6379、6380、6381端口;
- 配置文件公共内容通过
include
参数引入,由相同目录下redis.conf文件提供; - 主机负责写数据,从机负责读数据;
1)为每个Redis进程提供配置文件
- 各进程对应配置文件分别为:redis6379.conf、redis6380.conf、redis6381.conf;
- 配置文件内容包括:
拷贝多个redis.conf文件include(写绝对路径);
开启daemonize yes;
Pid文件名字pidfile;
指定端口port;
Log文件名字;
dump.rdb名字dbfilename;
Appendonly 关掉或者换名字;
2)分别在不同客户端启动Redis服务
- 使用不同的配置文件,通过
redis-server redis***.conf
启动Redis服务; - 使用
redis-cli -p 端口号
访问Redis服务; - 可使用
info replication
查看主从复制信息;
3)配置服务器成为某主机的下属从机
- 在从机环境下使用
slaveof 主机ip 主机Redis服务对应端口
进行配置;
1.3 不同模式
1.3.1 一主二仆
- 一个主机Master,两个从机Slave;
- 从机一旦连接主机,则会从头复制主机数据;
- 从机只负责读数据,无法写数据;
- 主机宕机后,从机不作任何操作,原地等待主机恢复;
1.3.2 薪火相传
- 从机slave也可以作为某些下属服务器的主机master;
- 从机只会与其从属的主机进行数据同步;
- 优点:有效降低主机的写压力;
- 缺点:一旦作为“主机”的从机宕机,其下属的从机都无法进行数据复制;
1.3.3 反客为主
- 当主机宕机后,与其相连的从机可变为主机;
- 实现方式,在从机中执行
slaveof no one
命令即可;
1.4 哨兵模式
- 反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库;
- 选择策略:
优先级在redis.conf中默认:replica-priority 100
,值越小优先级越高;
偏移量是指获得原主机数据最全的;
每个redis实例启动后都会随机生成一个40位的runid;
1.4.1 使用一主二仆模式试验哨兵模式
- 提前配置好一主二仆模式,参见2.2节;
- 在配置文件目录下新建sentinel.conf哨兵模式配置文件;
- sentinel.conf文件中写入内容
sentinel monitor 监控主机别名 主机ip Redis进程端口号 同意发生迁移的哨兵数量
:该哨兵需要监控的主机ip等信息; - 启动哨兵:
redis-sentinel sentinel.conf
; - 一旦哨兵所监控的主机发生故障,哨兵会根据投票数量在主机所下属的从机中选取一个作为新的主机;
- 原始主机重新启动后,自动变为从机;
2. 集群
-
Redis存在的问题:
1)Redis扩容问题;
2)Redis分摊并发写操作;
3)主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息; -
解决方案:
1)早期方案:代理主机
特点:客户端请求通过代理主机转发;
2)早期方案:无中心化集群
特点:服务器之间互相连通,任何一台服务器都可以作为客户端访问入口;
-
集群介绍:
1)Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N;
2)Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求; -
集群缺点:
1)多键操作是不被支持的 ;
2)多键的Redis事务是不被支持的;lua脚本不被支持;
3)由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大;
2.1 模拟实现集群
搭建集群流程:
- 1)清空已有的rdb文件、aof文件;
- 2)使用Redis服务器中6个不同的Redis进程模拟不同服务器,进程分别对应6379、6380、6381、6389、6390、6391端口,对应配置文件分别为:**redis6379.conf、redis6380.conf、redis6381.conf等;
- 3)配置文件内容包括:
拷贝多个redis.conf文件include(写绝对路径);
开启daemonize yes;
Pid文件名字pidfile;
指定端口port;
Log文件名字;
dump.rdb名字dbfilename;
Appendonly 关掉或者换名字;
cluster-enabled yes 打开集群模式;
cluster-config-file nodes-xxx.conf 设定节点配置文件名;
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换; - 4)启动6个Redis进程;
- 5)将6个节点合成一个集群:进入
Redis安装目录的src目录下
,使用redis-cli --cluster create --cluster-replicas 1 ip:6379 ip:6380 ip:6381 ip:6389 ip:6390 ip:6391
进行合体; - 6)采用
redis-cli -c -p 任意Redis服务端口
进行集群策略连接,设置数据会自动切换到相应的写主机; - 可使用
cluster nodes
查看集群节点信息;
2.1.1 节点分配策略
- 此处采用6个节点搭建无中心化主从集群;
- 每个主机搭配一个从机;
- Redis要求集群至少有3个主节点;
--cluster-replicas 1
指Redis要求每个主机至少需要一个从机,故6个节点被分为3组,每组由一个主节点和一个从节点构成;- 分配原则:1)尽量保证主节点不在同一个IP地址;2)尽量保证主节点和从节点不在同一个IP地址;
2.1.2 slots介绍
- slot是插槽的意思,Redis集群共包括16384个插槽,编号为0~16383;
- Redis集群将所有的插槽均分到每个主节点中,即每个主节点对应的插槽对应一个编号区间,比如0~5460;
- 数据库中的键属于某个插槽slot,集群通过
CRC16(key) % 16384
来计算键key属于哪个槽;
2.2 集群相关操作
- 在进行数据操作时,集群会先计算出键key属于哪个槽,然后通过插槽缺点数据所在主节点;
- 写入数据时需注意,不在一个slot下的键值,是不能使用mget,mset等多键操作,如果还想使用则需要通过{}定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去;
- 查找数据:
1)cluster keyslot key
计算key所在插槽;
2)cluster countkeysinslot 插槽编号
统计该插槽内key的数量;
3)cluster getkeysinslot 插槽编号 期望返回的key数量
返回期望数量个该槽中的键;
2.3 故障恢复
- 主节点出现故障,超过15秒会自动发生主从切换,切记如果为服务器设置了访问密码,需要在从机配置文件中配置对应主机
masterauth 密码
才能自动切换; - 发生故障的主节点恢复后,成为从机;
- 如果某段插槽对应的主从节点都出现故障,存在以下两种情况,该参数在redis.conf文件中进行配置:
1)cluster-require-full-coverage = yes
则整个集群全部挂掉,不能使用;
2)cluster-require-full-coverage = no
则整个集群中只有当前主从节点无法使用,其他部分正常使用;
参考资料:《尚硅谷》