redis高可用

redis高可用

redis持久化

持久化介绍

redis是一个内存数据库,数据都是存储于内存中,服务器重启数据就会丢失,为了避各种原因导致的数据丢失所以redis需要开启持久化。
redis持久化的两种方式:
rdb持久化。rdb持久化通过将redis在内存中的数据库信息记录到磁盘中的rdb文件,恢复时,读取rdb文件即可。
aof持久化。aof持久化通过将redis语句操作以追加的方式写入aof文件中,恢复时,redis数据库会按照aof文件中的语句顺序先后执行一遍达到数据统一。
rdb持久化和aof持久化各有利弊。

rdb持久化

rdb持久花花是指在规定的时间间隔内,将当前进程中的数据生成快照保存在硬盘中,使用二进制压缩储存,文件的后缀为rdb,redis重启后,可以基于rdb文件进行数据恢复。
rdb持久化可以手动触发和自动触发。
手动触发:
通过save命令和bgsave命令对数据进行快照生成rdb文件。但是save命令会阻塞redis主进程导致主进程无法处理请求,直到rdb文件创建完成主进程才能进行处理请求,所以save命令不要使用。而bgsave生成rdb文件时会创建一个子进程,这个子进程生成rdb文件,同时其他子进程会立刻结束工作并返回主进程,而主进程可以继续处理请求,在子进程生成rdb文件时,bgsave会阻塞其余子进程。
自动触发:
1、通过在配置文件中设置save m n,指定当m秒内发生n次变化时,自动触发。自动触发使用的是bgsave命令。
2、在主从复制场景下,如果从节点执行全量复制操作,则主节点会执行bgsave命令,并将rdb文件发送给从节点。
3、执行shutdown命令时,自动触发rdb持久化。

rdb持久化流程

(1)Redis父进程首先判断:当前是否在执行save,或bgsave/bgrewriteaof的子进程,如果在执行则bgsave命令直接返回。bgsave/bgrewriteaof的子进程不能同时执行,主要是基于性能方面的考虑:两个并发的子进程同时执行大量的磁盘写操作,可能引起严重的性能问题。
(2)父进程执行fork操作创建子进程,这个过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。
(3)父进程fork后,bgsave 命令返回"Background saving started”信息并不再阻塞父进程,并可以响应其他命令.
(4)子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换
(5)子进程发送信号给父进程表示完成,父进程更新统计信息。

aof持久化

RDB持久化是将进程数据写入文件,而AoF持久化,则是将Redis执行的每次写、删除命令记录到单独的日志文件中,查询操作不会记录;当Redis重启时优先执行AOF文件中的命令来恢复数据。
与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案。

aof持久化流程

命令追加(append):将Redis的写命令追加到缓冲区aof_buf;
文件写入(write)和文件同步(sync):根据不同的同步策略将aof_buf中的内容同步到硬盘;
文件重写(rewrite):定期重写aof文件,达到压缩的目的。

(1)命令追加:Redis先将写命令追加到缓冲区,而不是直接写入文件,主要是为了避免每次有写命令都直接写入硬盘,导致硬盘Io成为Redis负载的瓶颈。命令追加的格式是Redis命令请求的协议格式,它是一种纯文本格式,具有兼容性好、可读性强、容易处理、操作简单避免二次开销等优点。在aof文件中,除了用于指定数据库的select命令(如selecto为选中0号数据库)。是由Redis添加的,其他都是客户端发送来的写命令。
(2)文件写入(write)和文件同步(sync):Redis 提供了多种aof缓存区的同步文件策略,策略涉及到操作系统的write函数和fsync函数。为了提高文件写入效率,在现代操作系统中,当用户调用write函数将数据写入文件时,操作系统通常会将数据暂存到一个内存缓冲区里,当缓冲区被填满或超过了指定时限后,才真正将缓冲区的数据写入到硬盘里。这样的操作虽然提高了效率,但也带来了安全问题:如果计算机停机,内存缓冲区中的数据会丢失;因此系统同时提供了fsync、fdatasync等同步函数,可以强制操作系统立刻将缓冲区中的数据写入到硬盘里,从而确保数据的安全性。
(3)文件重写(rewrite):随着时间流逝,Redis服务器执行的写命令越来越多,aof文件也会越来越大:过大的AoF文件不仅会影响服务器的正常运行,也会导致数据恢复需要的时间过长。文件重写是指定期重写aof文件,减小aof文件的体积。需要注意的是,aof重写是把Redis进程内的数据转化为写命令,同步到新的aof文件;不会对旧的aof文件进行任何读取、写入操作。

启动时加载

RDB文件的载入工作是在服务器启动时自动执行的,并没有专门的命令。但是由于Aor的优先级更高,因此当AOF开启时,Redis会优先载入AOF文件来恢复数据;仅当AOF关闭时,才会在Redis服务器启动时检测RDB文件,并自动载入。服务器载入RDB文件期间处于阻塞状态,直到载入完成为止。
Redis载入RDB文件时,会对RDB文件进行校验,如果文件损坏,则日志中会打印错误,Redis启动失败。

持久化配置

rdb持久化是默认开启的,所以这里配置一下aof持久化

#进入配置文件
[root@localhost ~]# vim /etc/redis/6379.conf
appendonly yes		#700行修改成yes,开启aof持久化
appendfilename "appendonly.aof"		#704行指定A0F文件名称
aof-load-truncated yes	#796行表示忽略最后一条可能存在问题的命令

#然后重启redis
[root@localhost ~]# redis_6379 restart

主从复制

主从复制的流程

1.若启动一个slave机器进程,则他会向master机器发送一个sync_command命令,请求同步链接
2.无论是第一次连接还是重新连接,master机器都会启动一个后台进程,将数据快照保存到数据文件中,同时master还会记录修改数据的所有命令并缓存在数据文件中
3.后台进程完成缓存操作之后,,master机器就会向slave机器发送数据文件,slave将数据文件保存至硬盘,然后将其加载到内存中
4.master机器收到slave的连接后,将其完整的数据文件发送给slave,如果master同时收到多个slave发来的同步请求则master会在后台启动一个进程以保存数据文件,然后将其发送给所有的slave机器,确保所有的slave机器都正常

主从复制的配置

redis主从复制
实验环境:
master 192.168.218.214
slave    192.168.218.215

#两台都安装好redis后,对主服务器进行配置
[root@localhost ~]# vim /etc/redis/6379.conf
bind 0.0.0.0	#70行修改监听地址为任意ip
daemonize yes	#137行开启守护进程
logfile /var/log/redis_6379.log	#172行指定日志文件位置
dir /var/lib/redis/6379	#264行指定工作目录位置
appendonly yes	#700行开启aof持久化

重启服务
redis_6379 restart


从服务器配置
[root@localhost utils]# vim /etc/redis/6379.conf
bind 0.0.0.0	#70行修改监听地址为任意ip
daemonize yes	#137行开启守护进程
logfile /var/log/redis_6379.log	#指定日志文件位置
dir /var/lib/redis/6379	#指定工作目录位置
replicaof 192.168.218.214 6379	#288行指定工作目录位置为master节点ip和端口
appendonly yes	#700行开启aof持久化

重启服务
redis_6379 restart

主服务器上查看主从复制信息
[root@localhost ~]# redis-cli info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.218.215,port=6379,state=online,offset=6258,lag=0
master_replid:4049b912d94e7414e3b9ff277f58df7c73c04db6	#切换主从的时候master节点标识会有更改
master_replid2:0000000000000000000000000000000000000000		#复制流中的一个偏移量,master处理完写入命令后,会把命令的字节长度做累加记录,统计在该字段。该字段也是实现部分复制的关键字段。
master_repl_offset:6258		#无论主从,都表示自己上次主实例repid1和复制偏移量;用于兄弟实例或级联复制,主库故障切换psync
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:6258

然后在主服务器上写入数据
在这里插入图片描述
在从服务器上查看
在这里插入图片描述

哨兵模式

哨兵模式介绍

哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题

使用一个或者多个哨兵(Sentinel)实例组成的系统,对redis节点进行监控在主节点出现故障的情况下,能将从节点中的一个从节点角色升级为主节点,进行故障转义,保证系统的可用性

哨兵模式主要功能
①:集群监控:负责监控Redis的master和slave进程是否正常工作
②:消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为告警通知给管理员
③:故障转移:如果master node(master角色)挂掉了,会自动转移到slave node上
④:配置中心:如果故障转移发生了,通知client客户端新的master地址

优点:高可用,哨兵模式是基于主从模式的,所有主从模式的优点,哨兵模式可以简单的检测和故障自动切换,系统更健壮,可用性更高

缺点:redis比较难支持在线扩容,在群集容量达到上限时在线扩容会变得很复杂

哨兵模式配置

三台服务器先做主从
所有节点修改哨兵配置文件
[root@localhost ~]# vim /opt/redis-5.0.7/sentinel.conf
protected-mode no	#17行去掉注释,关闭保护模式
port 26379	#21行哨兵默认监听的端口
daemonize yes	#26行开启守护进程
logfile "/var/log/sentinel.log" 	#36行指定日志存放路径
dir "/var/lib/redis/6379"	#65行指定数据库存放路径
sentinel monitor mymaster 192.168.218.214 6379 2	#84行指定master节点,当master挂了,需要两个哨兵同意才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 3000	#113行当服务器多久无响应判断服务器挂了,单位为毫秒
sentinel failover-timeout mymaster 180000	#146行故障节点最大超时时间,master挂了后slave指向新的master所需的最大时间
然后保存

启动哨兵,先启动主节点,再启动从节点
[root@localhost ~]# cd /opt/redis-5.0.7/
[root@localhost redis-5.0.7]# redis-sentinel sentinel.conf &	#启动哨兵并放进后台
[1] 24251


[root@localhost redis-5.0.7]# redis-cli -p 26379 info sentinel	查看哨兵信息
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.218.214:6379,slaves=2,sentinels=3


验证:
[root@localhost redis-5.0.7]# ps -ef |grep redis	#查看主服务器redis进程号
[root@localhost redis-5.0.7]# kill -9 22470		#杀死主服务器进程

查看哨兵信息,发现master已经更改
在这里插入图片描述

集群模式

集群的作用

数据分区:
数据分区(或称数据分片)是集群最核心的功能(分布式)
集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力
Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及,例如,如果单机内存太大,bgsave 和 bgrewriteaof 的 fork 操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出

高可用:
集群支持主从复制(模式)和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务

数据分片:
Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383)集群的每个节点负责一部分哈希槽,每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

集群配置

redis的集群一般需要6个节点,33从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号:6001/6002/6003, 对应的从节点端口号:6004/ 6005/ 6006。

#回车,直到出现以下选项,手动修改为“/usr/local/redis/bin/redis-server”
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server

ln -s /usr/local/redis/bin/ /usr/local/bin/

#创建redis 6个端口的工作目录
cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}

vim /opt/redis.sh
#!/bin/bash
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done

sh -x /opt/redis.sh

cd /etc/redis/redis-cluster/redis6001		cd /etc/redis/redis-cluster/redis6002
vim redis.conf
bind 127.0.0.1
#69行,注释掉bind项或不修改,默认监听所有网卡
protected-mode no
#88行,修改,关闭保护模式
port 6001
#92行,修改,redis监听端口,
daemonize yes
#136行,开启守护进程,以独立进程启动
cluster-enabled yes
#832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf
#840行,取消注释,群集名称文件设置
cluster-node-timeout 15000
#846行,取消注释群集超时时间设置
appendonly yes
#700行,修改,开启AOF持久化

其他5个配置文件除端口号外改动相同
cp redis.conf ../redis6002/
--->yes

#启动服务
cd /etc/redis/redis-cluster/redis6001
redis-server redis.conf

#根据对应配置文件启动redis
vim /opt/redis_start.sh
#!/bin/bash
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
ps -ef | grep redis

sh -x /opt/redis_start.sh
加入集群
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1

#六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点
#下面交互的时候需要输入 yes 才可以创建
#-replicas 1 表示每个主节点有一个从节点

测试群集
redis-cli -p 6001 -c         #加-c参数,节点之间就可以互相跳转
127.0.0.1:6001> cluster slots    #查看节点的哈希槽编号范围
1) 1) (integer) 5461
   2) (integer) 10922        #哈希槽编号范围
   3) 1) "127.0.0.1"
      2) (integer) 6003        #主节点IP和端口号
      3) " fdca661922216dd69a63a7c9d3c4540cd6baef44"
   4) 1) "127.0.0.1"
      2) (integer) 6004        #从节点IP和端口号
     3) " a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6001
      3) "0e5873747a2e26bdc935bc76c2bafb19d0a54b11"
      4) 1) "127.0.0.1"
         2) (integer) 6006
         3) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6002
      3) "81 6ddaa3d1469540b2ffbcaaf9aa867646846b30"
   4) 1) "127.0.0.1"
      2) (integer) 6005
      3) " f847077bfe6722466e96178ae8cbb09dc8b4d5eb"
127.0.0.1:6001> set name zhangsan
-> Redi rected to slot [5798] located at 127.0.0.1:6003 
OK
127.0.0.1:6001> cluster keyslot name    #查看name键的槽编号
(integer) 5798

127.0.0.1:6001> cluster slots
1) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6003
      3) "f466e92c2487cea57aeca1ac74065e976f23bf0e"
   4) 1) "127.0.0.1"
      2) (integer) 6004
      3) "451dda82fd262ad6f3eaca5d39a4847b7c2b635c"
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 6002
      3) "1cbb5bdda47f98adb4193da8cc7b801ef76ac08e"
   4) 1) "127.0.0.1"
      2) (integer) 6006
      3) "fb71c49ba37aa0e2495160b6979d8c79b56f123f"
3) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6001
      3) "7696a844322b9a2c8d23125228afd25097885546"
   4) 1) "127.0.0.1"
      2) (integer) 6005
      3) "87412db1a80e4f8064205efdb581d34e0af80c2e"
      127.0.0.1:6001> set tom cat
-> Redirected to slot [8919] located at 127.0.0.1:6002
OK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值