Rocky9Redis实现慢查询日志、多实例操作和数据持久化

实验目的

掌握redis的原理、特性,关系型数据库和非关系型数据库的对比,缓存的原理保存位置以及分层结构,Redis的应用场景,redis的安装使用,命令的操作,慢查询日志、多实例操作和数据持久化

实验主要内容

1、redis基础操作

2、redis实现慢查询日志

3、redis实现多实例操作

4、Redis实现数据持久化

实验环境与准备

3台拍完快照配置好的rocky9的linux主机,ip为10.100,

四、实验分析与设计思路

建议基于画图、思维导图等模式,结合文字描述,写的清晰、明了、得体

缓存cache 是为了调节速度不一致的两个或多个不同的物质的速度,置于中间,可以实现速度较快的一方加速速度较慢的一方的作用,比如CPU的一级、二级、三级缓存,是为了保存CPU最近经常访问的数据,内存是保存CPU经常访问硬盘的数据,而且硬盘也有大小不一的缓存,甚至是物理服务器的raid卡也有缓存,都是为了起到加速CPU访问硬盘数据的目的,因为CPU速度太快了,CPU需要的数据由于硬盘往往不能在短时间内满足CPU的需求,因此CPU缓存、内存、Raid卡缓存以及硬盘缓存在一定程度上满足了CPU的数据需求,即CPU从缓存读取数据,从而大大提高了CPU的工作效率

Cache:缓存,一般用于读操作,CPU读文件从内存读,如果内存没有就先从硬盘读到内存再读到CPU,将需要频繁读取的数据放在自己最近的缓存区域,下次读取的时候即可快速读取。清理缓存--->/proc/sys/vm/drop_caches

echo 1 > /proc/sys/vm/drop_caches 清理页缓存

echo 2 > /proc/sys/vm/drop_caches 清理元数据缓存

echo 3 > /proc/sys/vm/drop_caches 清理所有缓存

RDB模式

原理:基于时间的快照,默认只保留当前最新一次的快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前时间节点之间未快照的数据。

rdb数据写入的流程

redis从master主进程fork出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如tmp-<pid>.rdb,当数据保存完成之后再将上一次保存的RDB文件进行替换,然后关闭子进程,这样可以保证每一次做RDB快照的数据都是完整的。

因为直接替换RDB文件的时候,可能会出现突然断电等问题,从而导致RDB文件还没有保存完整就突然关机停止保存,而导致数据丢失的情况,后续可以手动将每次生成的RDB文件进行备份,这样可以最大化保存历史数据

Redis的AOF备份策略

AOF:AppendOnlyFile 按照操作顺序依次将操作追加到指定的日志文件末尾

AOF和RDB一样使用了写时复制机制,AOF默认为每一秒中fsync一次,即将执行的命令保存到AOF文件当中,这样即便redis服务器发生故障最多只丢失1秒钟之内的数据,也可以设置不同的fsync策略always,即设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入AOF文件的I/O影响,no是系统控制,操作不可控

注意:同时启用RDB和AOF,进行恢复时,默认AOF文件优先级高于RDB文件,即会使用AOF文件进行恢复

五、详细实验过程

1、redis基础操作

①编译安装redis 将脚本和源码包都移到主机中 bash new_install_redis.sh

new_install_redis.sh脚本内容如下:

-------------------------------------------------------------------------------------------------------------------

(此内容为注意事项,脚本中已做更改)安装过程中可能出现的问题:

1:WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

backlog参数控制的是三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列。应该调大,至少要超511,建议调到1024

2:vm.overcommit_memory 此值调到1 sysctl -a | grep overcommit_memory命令查看原始值

虚拟内存,允许内核分配所以物理内存,而不管当前的内存状态。

3:transparent hugepage

默认启用了透明大页面(可使内存页的4k提升为2M),这将导致redis内存使用出现延迟,要解决这个问题,要以root用户身份,

更改echo never > /sys/kernel/mm/transparent_hugepage/enabled 不启用,提升性能

rdb是88的话就是空的

使用Redis

-------------------------------------------------------------------------------------------------------------------

ss -tnl 查看redis端口是否开启----6379

连接redis-cli客户端,脚本中已经设置密码为666666 redis-cli -a 666666

需要使用python程序连接redis,先安装pip yum -y install pip,在安装pip3 install redis

查看Redis的主配置文件,查看修改后的配置vim /usr/local/redis/etc/redis.conf

自动同步机制

vim redis_test.py,将写入的数据调大到10000

可以看到在ls /usr/local/redis/data/ 里面并没有rdp文件,也就是没有保存数据

然后通过python redis_test.py

导入数据再次keys * 查看数据,可以看到数据已经导入

ll /usr/local/redis/data/ 查看文件,文件也已经生成

因为是一次写入10000条数据,在60s内就自动进行保存,如果是写入一条数据或者几条数据,那么自动写入的时间就会等待3600s,那么我们可以使用save和bgsave命令强行进行保存

写入一条数据,可以看到dbsize已经增加

但是并没有立即保存到dump.rdb中

使用bgsave

ll /usr/local/redis/data/ 可以看到数据量已经增多

查看用户密码 CONFIG GET requirepass

查看和修改最大并发连接数

CONFIG GET maxclients 查看最大并发连接数

CONFIG SET maxclients 11000 修改最大并发连接数

修改端口 CONFIG SET port 6380

绑定地址 CONFIG SET bind 192.168.10.100 CONFIG GET bind

设置最大内存使用参数

CONFIG SET maxmemory 500M

CONFIG GET maxmemory

CONFIG SET maxmemory 500MB

CONFIG GET maxmemory

删除记录FLUSHALL

2、redis实现慢查询日志

查询慢查询日志的条数(默认返回值类型为整形) SLOWLOG LEN

设置慢查询日志的时间为100ms CONFIG SET slowlog-log-slower-than 100

实行慢查询语句 keys *

使用SLOWLOG get 查看慢查询的相关信息,其中keys * 就是慢查询的指令

执行模糊匹配查询 keys k*

可以看到慢查询的信息又新增一条keys k*

3、redis实现多实例操作

由于redis为单线程,所以不能充分发挥CPU多核功能,于是我们可以类似mysql考虑多实例redis的bin程序共享,然后分别独立出自身的数据库、日志、配置文件、PID

将脚本 查看脚本内容 vim install_instance.sh 创建四个Redis实例

运行脚本 bash install_instance.sh 查看实例ls /usr/local/redis/etc/ 四个实例创建成功

ss -tnl 查看端口情况 四个实例端口均开启,确实创建成功

4、Redis实现数据持久化

①RDP模式

基于时间的快照,默认只保留当前最新一次的快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前时间节点之间未快照的数据。

调高访问的数量为100000 vim redis_test.py 重新导入数据

使用该命令来查看临时生成的文件

( redis-cli -p 6379 -a 666666 save & ); pstree -p | grep redis-server;ls -l /usr/local/redis/data/

恢复RDB数据的时候需要先停服,否则开机状态下拷贝会将新拷贝的数据写入内存,造成数据的差异化导致服务允许错误而停服

数据在导入完成之后,若关闭Redis服务

Dbsize查看数据导入情况,不能因为显示为100000,就认为导入完成了,导入到rdb文件还需要时间,这个时间如果停服,则会终止导入,终止的快还可能没导入,就像我下面操作的那样,dbsize到100000就停服了,结果就没导入进去

使用bgsave命令强行保存数据导入

再次运行

python redis_test.py

bgsave

ll /usr/local/redis/data/

可以看到数据都导入到dump.rdb中了

定时自动保存RDB

先查看Persistence字段 redis-cli -a 666666 输入INFO 查看Persistence

先将数据清空 FLUSHALL

查看脚本内容 vim backup_RDB.sh

执行脚本 python redis_test.py 生成数据导入Redis中

此时数据库中的内容正在逐步增加

查看数据也增加了 ll /usr/local/redis/data/

FLUSHALL 把数据清除

将备份的dump.rdp文件复制到/usr/local/redis/data/路径下,将已经清空的dump.rdp文件删除

cp /backup/redis-rdb/dump.rdb_2024-04-28_22-50-11 /usr/local/redis/data/

rm -rf /usr/local/redis/data/dump.rdb

mv /usr/local/redis/data/dump.rdb_2024-04-28_22-50-11 /usr/local/redis/data/dump.rdb

重启Redis服务,查看备份完成后的数据,可以看到备份成功!

systemctl restart redis

redis-cli -a 666666

②AOF备份策略

临时打开AOF模式

CONFIG SET appendonly yes

config get appendonly

ls /usr/local/redis/data/

ls /usr/local/redis/data/appendonlydir/

ll /usr/local/redis/data/appendonlydir/

其中文件appendonly.aof.1.incr.aof 是AOF临时保存文件,存到磁盘中的,只要不删除就不会消失

将rdb文件备份保存

cp /usr/local/redis/data/appendonlydir/appendonly.aof.1.base.rdb /backup/appendonly.aof.1.base.rdb.bak

关闭临时开启aof模式

127.0.0.1:6379> config set appendonly no

OK

127.0.0.1:6379> config get appendonly

1) "appendonly"

2) "no"

删除数据,数据删空了

127.0.0.1:6379> dbsize

(integer) 50001

127.0.0.1:6379> FLUSHALL

OK

ll /usr/local/redis/data/ 数据空空

关闭服务,将备份文件覆盖原本的dump.rdb,然后重启服务,查看数据内容

systemctl stop redis

cp /usr/local/redis/data/appendonlydir/appendonly.aof.1.base.rdb /usr/local/redis/data/dump.rdb

systemctl restart redis

ll /usr/local/redis/data/

修改配置文件并重启服务 永久开启AOF模式

vim /usr/local/redis/etc/redis.conf

重启服务 systemctl restart redis 可以看到数据已经恢复

总结

rdb数据写入的流程

redis从master主进程fork出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如tmp-<pid>.rdb,当数据保存完成之后再将上一次保存的RDB文件进行替换,然后关闭子进程,这样可以保证每一次做RDB快照的数据都是完整的。

因为直接替换RDB文件的时候,可能会出现突然断电等问题,从而导致RDB文件还没有保存完整就突然关机停止保存,而导致数据丢失的情况,后续可以手动将每次生成的RDB文件进行备份,这样可以最大化保存历史数据

Redis的RDB快照备份策略

①:save 同步,生产环境在大规模的数据保存场景会产生阻塞,不推荐使用

②:bgsave 异步,后台执行,不影响其他命令的运行

③:自动 基于主配置文件进行设定。

AOF和RDB一样使用了写时复制机制,AOF默认为每一秒中fsync一次,即将执行的命令保存到AOF文件当中,这样即便redis服务器发生故障最多只丢失1秒钟之内的数据,也可以设置不同的fsync策略always,即设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入AOF文件的I/O影响,no是系统控制,操作不可控。

注意:同时启用RDBAOF,进行恢复时,默认AOF文件优先级高于RDB文件,即会使用AOF文件进行恢复

  • 23
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我变秃了也没变强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值