首页 > 数据库 >Redis持久化、主从复制、哨兵高可用

Redis持久化、主从复制、哨兵高可用

时间:2023-04-20 17:14:19浏览次数:37  
标签:主库 AOF 主从复制 aof Redis redis 哨兵 RDB sentinel

Redis持久化、主从复制、哨兵高可用

Redis持久化

1.什么是持久化?
Redis的所有数据保存在内存中,对数据的更新将异步的保存到硬盘上
2.持久化的实现方式?

快照:某时某刻数据的一个完成备份
    mysql---->Doump
    redis---->RDB
写日志:任何操作记录日志,要恢复日志,只要吧日志重新走一遍即可
	mysql---->Binloog
    Hhase----->Hlog
    Redis----->AOF

RDB

RDB 持久化在指定的时间间隔生成数据集的时间点快照

image-20230416224901757

触发机制有三种:
1.save(同步)
    1 客户端执行save命令----》redis服务端----》同步创建RDB二进制文件
    2 会造成redis的阻塞(数据量非常大的时候)
    3 文件策略:如果老的RDB存在,会替换老的
    4 复杂度 o(n)
    
2.bgsave(异步,Backgroud saving started)	
    1 客户端执行save命令----》redis服务端----》异步创建RDB二进制文件(fork函数生成一个子进程(fork会阻塞reids),执行createRDB,执行成功,返回给reids消息)
    2 此时访问redis,会正常响应客户端
    3 文件策略:跟save相同,如果老的RDB存在,会替换老的
    4 复杂度 o(n)

3.自动(通过配置)
    配置   seconds   changes
    save   900        1
    save   300        10
    save   60         10000
    如果60s中改变了1w条数据,自动生成rdb
    如果300s中改变了10条数据,自动生成rdb
    如果900s中改变了1条数据,自动生成rdb
    
'''以上符合任意一条,就能够自动生成rdb,内部使用bgsave'''

AOF

利用 AOF 持久化将服务器收到的所有写操作命令记录下来,并在服务器重新启动的时候,利用这些命令来恢复数据集。
AOF 的命令使用的是与 Redis 本身协议的命令一致,通过追加的方式将数据写入备份文件中,同时当备份文件过大时,Redis 也能对备份文件进行重压缩。
客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复
AOF的三种策略:
1.always:redis–》写命令刷新的缓冲区—》每条命令fsync到硬盘—》AOF文件
2.everysec(默认值):redis——》写命令刷新的缓冲区—》每秒把缓冲区fsync到硬盘–》AOF文件
3.no:redis——》写命令刷新的缓冲区—》操作系统决定,缓冲区fsync到硬盘–》AOF文件

AOF重写

# 随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题
本质就是把过期的,无用的,重复的,可以优化的命令,来优化存储,这样可以减少磁盘的占用量,加速恢复速度。

重写的流程:

image-20230416224919150

AOF持久化配置

# AOF重写配置参数
	auto-aof-rewrite-min-size:500m
    auto-aof-rewrite-percentage:增长率
        
# aof持久化的配置
appendonly yes #将该选项设置为yes,打开
appendfilename "appendonly.aof" #文件保存的名字
appendfsync everysec #采用第二种策略
no-appendfsync-on-rewrite yes #在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失

混合持久化

# 可以同时开启aof和rdb,他们是相互不影响的

# redis 4.x以后,出现了混合持久化,其实就是aof+rdb,解决恢复速度问题

开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理

# 配置参数:必须先开启AOF
# 开启 aof
appendonly yes
# 开启 aof复写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 开启 混合持久化
aof-use-rdb-preamble yes  # 这正有用的是这句话
# 关闭 rdb
save ""

# aof重写可以使用配置文件触发,也可以手动触发:bgrewriteaof

主从复制原理和方案

# 为什么需要主从?
因为会出现以下的问题:
1.机器故障
2.容量瓶颈
3.QPS瓶颈

# 主从解决了QPS瓶颈,机器故障问题
# 主从实现的功能
	一主一从,一主多从
    做读写分离
    做数据副本
    提高并发量

一个master可以有多个slave
一个slave只能有一个master
数据流向是单向的,从master到slave,从库只能读,不能写,主库既能读又能写
# redis主从赋值流程,原理
1. 副本(从)库通过slaveof 127.0.0.1 6379命令,连接主库,并发送SYNC给主库 
2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库
3. 副本库接收后会应用RDB快照,load进内存
4. 主库会陆续将中间产生的新的操作,保存并发送给副本库
5. 到此,我们主复制集就正常工作了
6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库.
7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在.
8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库
9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的
# 主从同步主库是否要开启持久化?
如果不开有可能,主库重启操作,造成所有主从数据丢失!
# 主从复制配置
	-1 命令方式,在从库上执行
    	slaveof 127.0.0.1 6379 #异步
    	# 从库不能写了,以后只能用来读
        
        slaveof no one  # 从库:断开主从关系
    
    -2 配置文件方式,在从库加入
    	slaveof 127.0.0.1 6379 #配置从节点ip和端口
		slave-read-only yes #从节点只读,因为可读可写,数据会乱
    	autpass 123456
	
# 辅助配置(给主库用的)
min-slaves-to-write 1
min-slaves-max-lag 3
#那么在从服务器的数量少于1个,或者三个从服务器的延迟(lag)值都大于或等于3秒时,主服务器将拒绝执行写命令

哨兵高可用

高可用:服务可用性高
# 主从复制不是高可用
#主从存在问题
1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master --》  哨兵
2 主从复制,只能主写数据,所以写能力和存储能力有限---》集群

# 哨兵:Sentinel  实现高可用

# 工作原理:
    1 多个sentinel发现并确认master有问题
    2 选举触一个sentinel作为领导
    3 选取一个slave作为新的master
    4 通知其余slave成为新的master的slave
    5 通知客户端主从变化
    6 等待老的master复活成为新master的slave
    
#高可用搭建步骤
	第一步:先搭建一主两从
    第二步:哨兵配置文件,启动哨兵(redis的进程,也要监听端口,启动进程有配置文件)
    port 26379
    daemonize yes
    dir /root/redis/data
    bind 0.0.0.0
    logfile "redis_sentinel.log"
    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 30000


    port 26390
    daemonize yes
    dir /root/redis/data1
    bind 0.0.0.0
    logfile "redis_sentinel.log"
    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 30000


    port 26381
    daemonize yes
    dir /root/redis/data2
    bind 0.0.0.0
    logfile "redis_sentinel.log"
    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 30000
	
    第三步:启动三个哨兵
    
	./src/redis-sentinel ./sentinal_26379.conf
    ./src/redis-sentinel ./sentinal_26380.conf
    ./src/redis-sentinel ./sentinal_26381.conf

    第四步:停止主库,发现80变成了主库,以后79启动,变成了从库
    

标签:主库,AOF,主从复制,aof,Redis,redis,哨兵,RDB,sentinel
From: https://www.cnblogs.com/zx0524/p/17337490.html

相关文章

  • MySQL GTID 主从复制错误修复方法
    MySQL传统的主从复制方式使用master_log_files和master_log_pos两个参数来确定复制位点。当出现复制错误时,可以设置跳过出错的事务来恢复同步,MySQL提供了sql_slave_skip_counter参数来实现此功能。使用方法如下:root@(none)>stopslave;QueryOK,0rowsaffected(0.0......
  • redis主从的配置和使用
    评:1,redis配置文件常用选项说明daemonizeno说明:是否把redis-server启动在后台,默认是“否”。若改成yes,会生成一个pid文件。pidfile/var/run/redis.pid说明:redis-server的pid文件。port6379说明:redis-server的端口号dbfilenamedump.rdb说明:数据库文件的位置,......
  • Redis常用的通用命令
    一、通用命令通用命令是指部分数据类型可以使用的指令。可以通过help[command]查看某一个命令的用法。二、常用通用命令1、keys:查看符合模板的所有key,可使用通配符:*匹配多个字符,?匹配一个字符 2、del:删除指定的key 3、exists:判断key是否存在4、ex......
  • redisTemplate
    RedisTemplate//设置序列化 redisTemplate.setDefaultSerializer(newFastJsonRedisSerializer<>(Object.class)); redisTemplate.setValueSerializer(newGenericFastJsonRedisSerializer());1.RedisTemplate中定义了对5种数据结构操作redisTemplate.o......
  • Redis简介及安装教程
    一、认识Redisredis诞生于2009年,全称是RemoteDictionaryServer,远程字段服务器,是一个基于内存的键值对数据库。特征:键值(key)型,value支持多种不同的数据类型,功能丰富单线程,每个命令具备原子性低延迟,速度快(基于内存,IO多路复用,良好的编码)支持数据持久化(RDB和AOF)支持主从集......
  • redis 事务
    redis事务MULTI,EXEC,DISCARD和WATCH是Redis事务的基础。它们允许在一个步骤中执行一组命令,并有两个重要的保证:事务中的所有命令都被序列化并按顺序执行。在执行Redis事务的过程中,不会发生由另一个客户端发出的请求。这保证了命令作为一个单独的操作被执行。要么所有的命令都没......
  • 虹科干货 | 打破传统!金融界黑科技—虹科Redis企业版数据库
    金融行业数字化转型浪潮来袭,客户需求也正加速向在线金融服务转移。金融机构想要实现现代化改造技术堆栈,为客户提供实时交互、欺诈检测等一系列个性化创新服务,就必须重视遗留系统和传统数据库架构“老年病”问题!面对数字化颠覆带来的挑战和压力,接受变化是关键!一些极力打破传统束......
  • Day 25 25.2 Scrapy框架之分布式爬虫(scrapy_redis)
    分布式爬虫(scrapy_redis)分布式爬虫是指将一个大型的爬虫任务分解成多个子任务,由多个爬虫进程或者多台机器同时执行的一种爬虫方式。在分布式爬虫中,每个爬虫进程或者机器都具有独立的爬取能力,可以独立地爬取指定的网页或者网站,然后将爬取到的数据进行汇总和处理。分布式爬......
  • mysql,redis,mongodb常用命令
    MySQL常用命令:1.mysql-uusername-p:以指定用户身份登录MySQL数据库。2.showdatabases:列出所有数据库。3.usedatabase_name:选择指定的数据库。4.showtables:列出当前数据库中的所有表。5.describetable_name:显示指定表的结构。6.select*fromtable_name:查询指......
  • Redis为什么快?
    redis是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。和Memcached类似。redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。它的速度快主要归功于以下几个方面:内存数......