Linux云计算 |【第四阶段】NOSQL-DAY3

news2024/12/24 2:12:59

主要内容:

redis主从复制、哨兵服务(高可用)、数据持久化(RDB、AOF)

一、Redis主从复制概述

Redis 主从复制是一种数据复制机制,用于在多个 Redis 实例之间同步数据,以提高系统的可用性、可靠性和读取性能。主从复制的基本思想是将一个 Redis 实例(主节点)的数据复制到一个或多个其他 Redis 实例(从节点),从而实现数据的冗余备份和读写分离。以下是 Redis 主从复制的概述:

1. 基本概念

  • 主节点(Master):负责处理所有写操作,并将数据变更同步到从节点。
  • 从节点(Slave):复制主节点的数据,并可以处理读操作。从节点不处理写操作,只负责读取和备份数据。

2. 主从复制的配置

  • 主节点配置:通常不需要特殊配置,主节点默认接受所有客户端的读写请求。
  • 从节点配置:从节点需要配置主节点的地址和端口,例如:
    slaveof <master-ip> <master-port>
    
    或者在配置文件中设置:
    slaveof 192.168.1.100 6379
    

3. 数据同步过程

  • 全量复制(Full Resynchronization)
    • 当从节点首次连接到主节点时,会进行全量复制。主节点生成一个 RDB 快照文件,并将其发送给从节点。
    • 从节点接收并加载 RDB 文件,然后继续同步主节点的增量数据。
  • 增量复制(Partial Resynchronization)
    • 在全量复制完成后,主节点会将后续的数据变更(写操作)通过复制缓冲区(replication buffer)发送给从节点。
    • 从节点接收并应用这些增量数据,保持与主节点的数据一致性。

4. 复制缓冲区

  • 复制缓冲区(Replication Buffer):主节点维护一个复制缓冲区,用于存储最近的数据变更。从节点通过复制缓冲区接收增量数据。
  • 复制积压缓冲区(Replication Backlog):主节点还维护一个复制积压缓冲区,用于在从节点断开连接后重新同步数据。

5. 使用场景

  • 读写分离:适用于读多写少的场景,通过读写分离提高系统的读取性能。
  • 数据备份:适用于需要数据冗余备份的场景,提高数据的可靠性和容错能力。
  • 故障转移:适用于需要高可用性的场景,通过故障转移机制确保服务的连续性。

1)结构模式:一主一从、一主多从、主从从

2)主从复制工作原理(与MySQL的主从同步不同)

  • ① Slave向Master发送sync命令;
  • ② Master启动后台存盘进程,并收集所有修改数据命令;
  • ③ Master完成后台存盘后,传送整个数据文件到Slave;
  • ④ Slave接收数据文件,加载到内存中完成首次完全同步;
  • ⑤ 后续有新数据产生时,Master继续收集数据修改命令一次传给Slave,完成同步;

1、一主一从结构示例:

实验网络拓扑:

步骤1:恢复redis1和redis2的redis默认配置

① 修改2个节点的配置文件,注释集群功能,并重启服务

## redis1 
[root@redis1 ~]# vim /etc/redis/6379.conf
# cluster-enabled yes
# cluster-config-file nodes-6379.conf
# cluster-node-timeout 5000
[root@redis1 ~]# service redis_6379 stop   //停止服务
Stopping ...
Redis stopped
[root@redis1 ~]# ls /var/lib/redis/6379/
dump.rdb         nodes-6379.conf
[root@redis1 ~]# rm -f /var/lib/redis/6379/*    //清除数据目录
[root@redis1 ~]# service redis_6379 start   //启动服务
Starting Redis server...


## redis2 
[root@redis2 ~]# vim /etc/redis/6379.conf
# cluster-enabled yes
# cluster-config-file nodes-6379.conf
# cluster-node-timeout 5000
[root@redis2 ~]# service redis_6379 stop   //停止服务
Stopping ...
Redis stopped
[root@redis2 ~]# ls /var/lib/redis/6379/
dump.rdb         nodes-6379.conf
[root@redis2 ~]# rm -f /var/lib/redis/6379/*    //清除数据目录
[root@redis2 ~]# service redis_6379 start   //启动服务
Starting Redis server...

步骤2:配置主从服务器

① 默认redis都是主服务器(无需配置)

[root@redis1 ~]# redis-cli
127.0.0.1:6379> INFO replication    //查看主从复制信息
# Replication
role:master    /角色为master主节点
connected_slaves:0
master_replid:fea1bd84c837c4968c506c4ef01df7bdb05ffa9f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

② 配置redis2(192.168.1.12)为redis1的从服务器

- 方法1:通过命令进行配置(临时生效)

[root@redis2 ~]# redis-cli
127.0.0.1:6379> SLAVEOF 192.168.2.11 6379   //指定主服务器IP和端口
OK
127.0.0.1:6379> INFO replication    //查看主从复制信息
# Replication
role:slave    //角色为Slave从节点
master_host:192.168.2.11    //主节点IP地址
master_port:6379            //主节点端口
master_link_status:up       //到主节点的连接状态
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:fdeac0f68bb6295ace1c3d82ecc0512f011afb8f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

- 方法2:修改配置文件(永久生效),需要重启服务

[root@redis2 ~]# vim /etc/redis/6379.conf
#slaveof <masterip> <masterport>
slaveof 192.168.2.11 6379    //指定主服务器IP和端口
[root@redis2 ~]# service redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

# 查看redis1主节点的主从复制信息

[root@redis1 ~]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:1     //从服务器连接为1
slave0:ip=192.168.2.12,port=6379,state=online,offset=364,lag=1
master_replid:fdeac0f68bb6295ace1c3d82ecc0512f011afb8f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:364
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:364

③ 测试配置

# 在redis1主服务器上添加数据

127.0.0.1:6379> SET name tom
OK
127.0.0.1:6379> SET email tom@tedu.cn
OK

# 在redis2从服务器上查看同步的数据

[root@redis2 ~]# redis-cli
127.0.0.1:6379> KEYS *
1) "email"
2) "name"
127.0.0.1:6379> MGET name email
1) "tom"
2) tom@tedu.cn

常见报错:在从服务器无法进行写入操作,会有报错

127.0.0.1:6379> SET name jerry
(error) READONLY You can't write against a read only slave.

与MySQL区别:Redis不可以往从服务器上写入操作会有报错,且没有相关授权用户操作;MySQL授权的用户假如有INSERT权限,可以往从服务器上写入数据,但会导致主从同步的SQL-server失效;


2、配置带验证的主从复制示例:

基于以上示例【一主一从结构】,配置认证

实验网络拓扑:

步骤1:配置主服务器redis1的连接密码为`tedu.cn`(redis1操作)

① 设置密码

[root@redis1 ~]# vim +501 /etc/redis/6379.conf
# requirepass foobared
requirepass tedu.cn    //请求密码

② 修改服务启动脚本(添加密码,否则关闭服务会报错)

[root@redis1 ~]# vim +43  /etc/init.d/redis_6379
            $CLIEXEC -p $REDISPORT -a tedu.cn shutdown

③ 重启服务

[root@redis1 ~]# service redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

步骤2:配置从服务器(redis2操作)

① 修改配置文件,设置主服务器连接密码

[root@redis2 ~]# vim +289 /etc/redis/6379.conf
# masterauth <master-password>
masterauth tedu.cn     //定义连接Master密码

② 重启服务

[root@redis2 ~]# service redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...

③ 在从服务器本机连接redis服务,查看主从复制信息

[root@redis2 ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> info replication   //查看主从复制信息
# Replication
role:slave
master_host:192.168.2.11
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:322
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:14f6ce64ec702fde0b0905ac257953f1034e1967
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:322
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:85
repl_backlog_histlen:238

验证配置:从服务器连接主服务器redis服务

[root@redis2 ~]# redis-cli -h 192.168.2.11
192.168.2.11:6379> ping
(error) NOAUTH Authentication required.   //认证失败
192.168.2.11:6379> info replication
NOAUTH Authentication required.    //认证失败
 
[root@redis2 ~]# redis-cli -h 192.168.2.11 -a tedu.cn    //指定密码连接
192.168.2.11:6379> ping
PONG
192.168.2.11:6379> info replication   //查看主从复制信息
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.2.12,port=6379,state=online,offset=1498,lag=1
master_replid:04f765d3caba1faf0a9580a23cfea8fb0fb98e41
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1498
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1498
192.168.2.11:6379> AUTH tedu.cn    //验证密码
OK

二、Sentinel 哨兵服务

Redis Sentinel 是 Redis 的高可用性解决方案,用于监控 Redis 主从复制环境中的主节点和从节点,并在主节点发生故障时自动进行故障转移。Sentinel 通过监控、通知和自动故障转移,确保 Redis 服务的高可用性和可靠性。以下是 Redis Sentinel 的概述:

  • 一般节点较少且不在redis集群中,需要实现主从切换,一般是主服务器宕机后,需要手动把一台从服务器切换为主服务器,无法实现自动的选举成主服务器;而通过哨兵服务sentinel来监视Master服务器,发现Master宕机后,可以将从服务器升级为主服务器;
  • 哨兵模式是redis官方提供的高可用方案,是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis服务实例的运行情况;

1.Sentinel 的基本概念

  • Sentinel 节点:Sentinel 是一个独立的进程,负责监控 Redis 主从集群的状态。多个 Sentinel 节点可以组成一个 Sentinel 集群,以提高监控的可靠性和容错能力。
  • 主节点(Master):被监控的 Redis 主节点。
  • 从节点(Slave):被监控的 Redis 从节点。

2.Sentinel 的功能

  • 监控(Monitoring):Sentinel 持续监控主节点和从节点的状态,检查它们是否正常运行。
  • 通知(Notification):Sentinel 可以通过配置的通知系统(如邮件、短信等)向管理员发送通知,报告主节点或从节点的状态变化。
  • 自动故障转移(Automatic Failover):当主节点发生故障时,Sentinel 会自动选择一个从节点提升为主节点,并通知其他从节点和新主节点进行数据同步。
  • 配置提供者(Configuration Provider):Sentinel 可以作为客户端的配置提供者,客户端可以通过 Sentinel 获取当前的主节点地址。

3.Sentinel 的工作原理

  • 监控:Sentinel 定期向主节点和从节点发送 PING 命令,检查它们的状态。如果某个节点在指定时间内没有响应,Sentinel 会将其标记为“主观下线”。
  • 主观下线和客观下线
    • 主观下线(Subjectively Down, SDOWN):单个 Sentinel 节点认为某个节点下线。
    • 客观下线(Objectively Down, ODOWN):当足够数量的 Sentinel 节点(达到 quorum 值)认为某个节点下线时,该节点被标记为客观下线。
  • 故障转移
    • 当主节点被标记为客观下线时,Sentinel 集群会进行故障转移。
    • Sentinel 集群通过选举机制选择一个 Sentinel 节点作为领导者,负责执行故障转移。
    • 领导者 Sentinel 选择一个从节点提升为主节点,并通知其他从节点和新主节点进行数据同步。
    • 客户端通过 Sentinel 获取新的主节点地址,继续进行读写操作。

1、故障切换(failover)的过程

假设主服务器宕机,哨兵先检测到这个结果,但并不会马上进行failover过程,仅仅是哨兵主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。


主配置文件:sentinel.conf

模板文件:redis-4.0.8/sentinel.conf

配置哨兵服务步骤:

  • ① 安装redis软件
  • ② 创建主配置文件(参考模板文件)

格式:sentinel monitor <name> <masterIP> <masterPort> <Quorum投票数>

③ 启动哨兵服务(Sentinel默认端口号为26379)

[root@sentinel ~]# ss -nlptu | grep :26379
tcp    LISTEN     0      128       *:26379                 *:*                   users:(("redis-sentinel",pid=11158,fd=6))

2、配置哨兵服务示例

基于以上示例【配置带验证的主从复制】,配置哨兵服务

实验网络拓扑:


步骤1:配置哨兵服务

[root@redis1 ~]# ls /usr/local/redis/bin/   //哨兵脚本(redis-sentinel)

① 在redis服务器(如redis1)上,拷贝哨兵程序到哨兵服务器

[root@redis1 ~]# scp -r /usr/local/redis 192.168.2.19:/usr/local

② 在sentinel服务器上,将redis安装目录添加至PATH环境变量

[root@sentinel ~]# echo 'export PATH=$PATH:/usr/local/redis/bin' >> /etc/bashrc
[root@sentinel ~]# source /etc/bashrc

# 查看帮助

[root@sentinel ~]# redis-sentinel -h
Usage: ./redis-server [/path/to/redis.conf] [options]
       ./redis-server - (read config from stdin)
       ./redis-server -v or --version
       ./redis-server -h or --help
       ./redis-server --test-memory <megabytes>
 
Examples:
       ./redis-server (run the server with default conf)
       ./redis-server /etc/redis/6379.conf
       ./redis-server --port 7777
       ./redis-server --port 7777 --slaveof 127.0.0.1 8888
       ./redis-server /etc/myredis.conf --loglevel verbose
 
Sentinel mode:
       ./redis-server /etc/sentinel.conf --sentinel

③ 创建哨兵服务的配置文件(手动创建)

[root@sentinel ~]# vim /etc/sentinel.conf
sentinel monitor redis1 192.168.2.11 6379 1   //监视主服务器(主机名、IP、端口、票数)
bind 0.0.0.0      //哨兵服务运行地址(使得Redis服务器可以跨网络访问)
sentinel auth-pass redis1 tedu.cn     //连接主服务器的密码

④ 启动哨兵服务

[root@sentinel ~]# redis-sentinel /etc/sentinel.conf
11158:X 21 Jun 14:23:32.181 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
11158:X 21 Jun 14:23:32.181 # Redis version=4.0.8, bits=64, commit=00000000, modified=0, pid=11158, just started

测试配置:

① 停止主服务器redis1节点的Redis服务

[root@redis1 ~]# service redis_6379 stop
Stopping ...
Redis stopped

# 哨兵服务状态信息

② 在redis2节点上查看主从复制状态(redis2节点vote投票为主服务器

[root@redis2 ~]# redis-cli
127.0.0.1:6379> INFO replication
# Replication
role:master     //已变为主服务器
connected_slaves:0
master_replid:5627cc5fe2bb9d81de6b50bfd3a69c83257d9ac7
master_replid2:04f765d3caba1faf0a9580a23cfea8fb0fb98e41
master_repl_offset:39496
second_repl_offset:33720
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:39496

③ 恢复redis1节点的Redis服务

[root@redis1 ~]# service redis_6379 start
Starting Redis server...

# 哨兵服务状态信息(将原主节点redis1作为redis2的从节点

④ 在redis1节点上查看主从复制状态(redis1节点已切换为redis2的从服务器

[root@redis1 ~]# redis-cli -a tedu.cn
127.0.0.1:6379> INFO replication
# Replication
role:slave    //已变为从服务器
master_host:192.168.2.12
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:69788
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5627cc5fe2bb9d81de6b50bfd3a69c83257d9ac7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:69788
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:56896
repl_backlog_histlen:12893

三、数据持久化

1、RedisDataBase(RDB),Redis数据库文件

  • ① 数据持久化方式之一;
  • ② 数据持久化默认方式;
  • ③ 按照指定时间间隔,将内存中的数据集快照写入硬盘;
  • ④ 通过RDB进行备份还原,只要拷贝RBD文件即可

RDB的优缺点:

① 优点:

  • 高性能的持久化实现:创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;
  • 过程中主进程不做任何IO操作;
  • 比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合;

② 缺点:

意外宕机时,丢失最后一次持久化的所有数据;

- RDB定义文件名:dbfilename “dump.rdb”

- 数据从内存保存到磁盘的频率设置:

  • save 900 1       //15分钟内有1个key改变即存盘 
  • save 300 10      //5分钟内有10个key改变即存盘
  • save 60 10000   //1分钟内有10000个key改变即存盘

- 手动存盘:

  • save         //阻塞写存盘
  • bgsave       //不阻塞写存盘(bg:backgroup后台)

补充:Redis是单线程来处理命令的,所有每一条到达服务端的命令不会立刻执行,所有的命令都会进入一个队列中,然后逐个被执行;并且多个客户端发送的命令的执行顺序是不确定的。但是可以确定的是不会有两条命令被同时执行,不会产生并发问题,这就是Redis的单线程基本模型;

配置RDB示例

步骤1:配置RDB参数,随便找一台redis服务器(关闭集群功能)

[root@redis7 ~]# vim /etc/redis/6379.conf
dbfilename dump.rdb    //RDB定义文件名(默认即可)
save 900 1
#save 300 10
save 120 10    //120秒内,有10个key改变即存盘
save 60 10000

步骤2:清空rbd数据

① 停止redis服务

[root@redis7 ~]# service redis_6379 stop
Stopping ...
Redis stopped

② 删除数据

[root@redis7 ~]# ls /var/lib/redis/6379/
dump.rdb         nodes-6379.conf
[root@redis7 ~]# rm -rf /var/lib/redis/6379/*

③ 启动redis服务

[root@redis7 ~]# service redis_6379 start
Starting Redis server...

# 查看数据文件,因为没有存储过任何数据,所以不存在RBD文件

[root@redis7 ~]# ls /var/lib/redis/6379/

步骤3:存储数据

① 120秒内添加10个数据,并记录一次存盘

[root@redis7 ~]# redis-cli
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3 k4 v4 k5 v5
OK
127.0.0.1:6379> MSET k6 v6 k7 v7 k8 v8 k9 v9 k10 v10
OK
127.0.0.1:6379> KEYS *
 1) "k1"
 2) "k4"
 3) "k8"
 4) "k2"
 5) "k10"
 6) "k7"
 7) "k9"
 8) "k3"
 9) "k5"
10) "k6"
127.0.0.1:6379> exit

② 验证查看数据文件

[root@redis7 ~]# watch -n1 ls /var/lib/redis/6379/   //watch命令实时动态查看
[root@redis7 ~]# ls /var/lib/redis/6379/
dump.rdb

步骤4:验证备份还原

① 备份数据文件

[root@redis7 ~]# cp /var/lib/redis/6379/dump.rdb /root/
[root@redis7 ~]# ls /root/
anaconda-ks.cfg  dump.rdb  redis-4.0.8

② 模拟误删除数据

[root@redis7 ~]# redis-cli
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> exit

③ 通过备份的dump.rdb文件,恢复数据

[root@redis7 ~]# service redis_6379 stop   //停止服务,防止其他用户连接产生新数据
Stopping ...
Redis stopped
[root@redis7 ~]# cp /root/dump.rdb /var/lib/redis/6379/   //用备份文件覆盖目标文件
cp:是否覆盖"/var/lib/redis/6379/dump.rdb"? yes

④ 启动服务并验证

[root@redis7 ~]# service redis_6379 start   //启动服务
Starting Redis server...
[root@redis7 ~]# redis-cli
127.0.0.1:6379> KEYS *
 1) "k1"
 2) "k4"
 3) "k8"
 4) "k6"
 5) "k3"
 6) "k9"
 7) "k5"
 8) "k7"
 9) "k10"
10) "k2"

补充:rdb文件无法直接使用cat查看,可以通过strings命令查看

[root@redis7 ~]# cat /var/lib/redis/6379/dump.rdb
REDIS0008▒      redis-ver4.0.8▒
redis-bits▒@▒ctimeªN▒`used-mem�▒
                                ▒
aof-preamble▒▒▒
k1v1k4v4k8v8k2v2k10v10k7v7k9v9k3v3k5v5k6v6▒.▒G▒v
[root@redis7 ~]# strings /var/lib/redis/6379/dump.rdb   //通过strings可查看rdb文件
REDIS0008
        redis-ver
4.0.8
redis-bits
ctime
used-mem
aof-preamble

补充:RDB存储数据不是立即存储,而是按照指定时间间隔,将内存中的数据集快照写入硬盘,如果意外宕机,时间间隔未到且未存盘,则可能会导致最后一次持久化数据全部丢失;AOF已追加方式进行存盘,安全性和可靠性比RDB存储更高,但因为是实时存数据,效率比RDB差;

2、Append Only File(AOF)

  • ① 追加方式记录写操作的文件
  • ② 记录redis服务所有写操作(与MySQL的binlong日志类似)
  • ③ 不断的将新的写操作,追加到文件的末尾
  • ④ 默认没有启用(appendonly yes启用aof)
  • ⑤ 使用cat命令可以查看文件内容

使用AOF文件恢复数据:

AOF定义文件名:appendfilename “appendonly.aof”

AOF文件记录写操作的方式:

  • appendfsync always      //实时记录,并完成磁盘同步
  • appendfsync everysec   //每秒记录一次,并完成磁盘同步
  • appendfsync no         //写入aof,不执行磁盘同步

AOF的优缺点:

① 优点:

  • 可以灵活设置持久化方式
  • 出现意外宕机时,仅可能丢失1秒的数据

② 缺点:

  • 持久化文件的体积通常会大于RDB方式
  • 执行fsync策略时的速度可能会比RDB方式慢

配置AOF示例:

① 命令行方式配置(永久修改)

[root@redis7 ~]# redis-cli
127.0.0.1:6379> CONFIG SET appendonly yes    //启用AOF
OK
127.0.0.1:6379> CONFIG REWRITE
OK
127.0.0.1:6379> SAVE
OK
127.0.0.1:6379> exit

② 查看AOF文件

[root@redis7 ~]# ls /var/lib/redis/6379/
appendonly.aof  dump.rdb
[root@redis7 ~]# cat /var/lib/redis/6379/appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
SET
$2
k1
$2
v1
*3
$3
...

补充:修改配置文件

[root@redis7 ~]# vim /etc/redis/6379.conf
appendonly yes
appendfilename “appendonly.aof"
appendfsync everysec

验证备份还原

① 备份AOF文件

[root@redis7 ~]# cp /var/lib/redis/6379/appendonly.aof /root/

② 模拟误删除数据

[root@redis7 ~]# redis-cli
127.0.0.1:6379> KEYS *
 1) "k1"
 2) "k4"
 3) "k8"
 4) "k6"
 5) "k3"
 6) "k9"
 7) "k5"
 8) "k7"
 9) "k10"
10) "k2"
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> KEYS *
(empty list or set)

③ 通过appendonly.aof备份的文件,恢复数据

[root@redis7 ~]# service redis_6379 stop
Stopping ...
Redis stopped
[root@redis7 ~]# rm -rf /var/lib/redis/6379/*
[root@redis7 ~]# cp /root/appendonly.aof /var/lib/redis/6379/

④ 启动服务并验证

[root@redis7 ~]# service redis_6379 start
Starting Redis server...
[root@redis7 ~]# redis-cli
127.0.0.1:6379> KEYS *
 1) "k9"
 2) "k5"
 3) "k4"
 4) "k2"
 5) "k1"
 6) "k7"
 7) "k10"
 8) "k8"
 9) "k3"
10) "k6"

RDB是将数据硬备份,而AOF是将追加记录文件的写操作在执行一遍,实现数据恢复;

小结:

本篇章节为【第四阶段】NOSQL-DAY3 的学习笔记,这篇笔记可以初步了解到 redis主从复制、哨兵服务(高可用)、数据持久化(RDB、AOF)。除此之外推荐参考相关学习网址:

  • 参考:http://www.redis.cn/topics/sentinel.html
  • 参考:Redis哨兵(Sentinel)模式 - 简书

Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM(HotSpot):方法区(Method Area)

文章目录 一、内存结构图二、方法区定义三、内存溢出问题四、常量池与运行时常量池 一、内存结构图 1.6 方法区详细结构图 1.8方法区详细结构图 1.8后&#xff0c;方法区是JVM内存的一个逻辑结构&#xff0c;真实内存用的本地物理内存。 且字符串常量池从常量池中移入堆中。 …

Actions Speak Louder than Words Meta史诗级的端到端推荐大模型落地

发现好久之前整理的推荐系统被遗忘在了草稿箱&#xff0c;让它出来见见世面。。。后续空了持续更新 文章目录 1.Background2.Related works2.1 典型推荐模型2.1.1 DIN2.1.2 DIEN2.1.3 SIM2.1.4 MMoE2.1.5 其他 2.2. 生成式推荐 3.Method3.1 统一特征空间3.2 重塑召回排序模型3.…

MySQL 面试题及答案

MySQL 面试题及答案&#xff1a; 一、基础问题 什么是数据库索引&#xff1f;有哪些类型&#xff1f; 答&#xff1a;数据库索引是一种数据结构&#xff0c;用于提高数据库查询的效率。它就像一本书的目录&#xff0c;可以快速定位到特定的数据行。 类型主要有&#xff1a; …

C++实现二叉树的创建删除,dfslfs,求叶子结点个数,求叶子结点个数,求树的高度

C实现二叉树的创建删除&#xff0c;dfs/lfs,求叶子结点个数&#xff0c;求树的高度 基本算法&#xff1a; 用链栈建立二叉树&#xff0c;通过递归实现深度优先的三种遍历&#xff0c;用队列实现广度优先层次遍历。借助递归思想求解叶子结点个数和树的深度。 tree.h定义基本的…

sysbench 命令:跨平台的基准测试工具

一、命令简介 sysbench 是一个跨平台的基准测试工具&#xff0c;用于评估系统性能&#xff0c;包括 CPU、内存、文件 I/O、数据库等性能。 ‍ 比较同类测试工具 bench.sh 在上文 bench.sh&#xff1a;Linux 服务器基准测试中介绍了 bench.sh 一键测试脚本&#xff0c;它对…

CAT1 RTU软硬件设计开源资料分析(TCP协议+Modbus协议+GNSS定位版本 )

01 CAT1 RTU方案简介&#xff1a; 远程终端单元( Remote Terminal Unit&#xff0c;RTU)&#xff0c;一种针对通信距离较长和工业现场环境恶劣而设计的具有模块化结构的、特殊的计算机测控单元&#xff0c;它将末端检测仪表和执行机构与远程控制中心相连接。 奇迹TCP RTUGNS…

【MySQL】数据库--索引

索引 1.索引 在数据中索引最核心的作用就是&#xff1a;加速查找 1.1 索引原理 索引的底层是基于BTree的数据存储结构 如图所示&#xff1a; 很明显&#xff0c;如果有了索引结构的查询效率比表中逐行查询的速度要快很多且数据越大越明显。 数据库的索引是基于上述BTree的…

C--结构体和位段的使用方法

各位看官如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论&#xff0c;感谢您的支持&#xff01;&#xff01;&#xff01; 一&#xff1a;结构体 首先结构体我们有一个非常重要的规则 非常重要&#xff1a; 我们允许在初始化时自动将字符串字面…

Jmeter关联,断言,参数化

一、关联 常用的关联有三种 1.边界提取器 2.JSON提取器 3.正则表达式提取器 接下来就详细讲述一下这三种的用法 这里提供两个接口方便练习 登录接口 接口名称&#xff1a;登录 接口提交方式&#xff1a;POST 接口的url地址&#xff1a;https://admin-api.macrozheng.com/a…

部署Tomcat服务

一、部署过程 1. 节点规划 节点IP 主机名 节点 192.168.20.20 tomcat Tomcat 2. 基础环境配置 2.1. 修改主机名 [rootlocalhost ~]# hostnamectl set-hostname tamcat [rootlocalhost ~]# bash 2.2. 关闭防火墙 [roottamcat ~]# systemctl stop firewalld [roott…

嵌入式单片机底层原理详解

前言 此笔记面向有C语言基础、学习过数字电路、对单片机有一定了解且尚在学习阶段的群体编写,笔记中会介绍单片机的结构、工作原理,以及一些C语言编程技巧,对于还停留在复制模板、copy代码阶段的读者会有比较大的帮助,待学习完成后可以独立完成几乎所有单片机的驱动开发。 …

macOS安装MySQL教程, 2024年9月26日更新, 亲测有效, 附有百度网盘下载链接

下载: https://dev.mysql.com/downloads/mysql/ 选第一个 DMG版本的. 这一步可能需要登录一下, 比较麻烦, 一会儿我传到百度网盘, 文末发百度网盘的链接. 点击下载按钮, 会弹出下载提示. 开始下载了, 很慢. 复制链接地址, 使用迅雷下载. 稍微快点. 我传到了百度网盘: 通过网…

Java List类

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Java 目录 &#x1f449;&#x1f3fb;List1. 接口与实现2. 特性3. 常用方法4. 示例代码5. 遍历6. 线程安全 &#x1f449;&#x1f3fb;List Java的 List …

【含文档】基于Springboot+微信小程序 的高校社团管理小程序(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

菱形继承、菱形虚拟继承、菱形继承中多态问题、菱形虚拟继承中多态问题

菱形继承以及菱形继承中的多态问题 一、对象模型&#xff08;一&#xff09;菱形继承 & 菱形虚拟继承&#xff08;一&#xff09;菱形继承中多态 & 菱形虚拟继承中多态 二、总结 本文主要叙述菱形继承、菱形虚拟继承、菱形继承中多态、菱形虚拟继承中多态&#xff0c;这…

JavaWeb 13.HTTP协议

和自己的情绪共处&#xff0c;永远保持乐观 —— 24.9.26 一、HTTP简介 HTTP 超文本传输协议 (HTTP-Hyper Text transfer protocol)&#xff0c;是一个属于应用层的面向对象的协议&#xff0c;由于其简捷、快速的方式&#xff0c;适用于分布式超媒体信息系统。它于1990年提出&a…

STL之vector篇(下)(手撕底层代码,从零实现vector的常用指令,深度剖析并优化其核心代码)

文章目录 1.基本结构与初始化1.1 空构造函数的实现与测试1.2 带大小和默认值的构造函数1.3 使用迭代器范围初始化的构造函数(建议先看完后面的reserve和push_back)1.4 拷贝构造函数1.5 赋值操作符的实现&#xff08;深拷贝&#xff09;1.6 析构函数1.7 begin 与 end 迭代器 2. …

jQuery——层次选择器

1、层次选择器&#xff1a;查找子元素&#xff0c;后代元素&#xff0c;兄弟元素的选择器。 ancestor descendant&#xff1a;在给定的祖先元素下匹配所有的后代元素 parent > child&#xff1a;在给定的父元素下匹配所有的子元素 prev next&#xff1a;匹配所有紧接在…

每日一练:二叉树的右视图

199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,…

超详细的 pytest教程 之前后置方法和 fixture 机制

前言 这一篇文章专门给大家讲解pytest中关于用例执行的前后置步骤处理,pytest中用例执行的前后置处理既可以通过测试夹具(fixtrue)来实现&#xff0c;也可以通过xunit 风格的前后置方法来实现。接下来我们一起看看如何具体使用。 一、xunit 风格的前后置方法 1、函数用例的前…