redis运维篇下篇

最近在学redis,由于笔者是学运维的,所以推荐学习运维的小伙伴参考,希望对大家有帮助!

redis运维篇上篇:http://t.csdnimg.cn/MfPud

附加redis多用户管理:http://t.csdnimg.cn/DY3yx

目录

十.redis慢日志

十一.redis的key的有效期

十二.redis禁用的危险命令

十三.redis压测工具

十四.redis的两种持久化存储方式

14.1RDB持久化存储

14.2redis的AOF持久化存储

十五.redis的主从复制

十六.redis的哨兵模式


十.redis慢日志

面试题:redis慢,怎末排查
1.查看系统资源的占用情况
2.查看慢日志情况


1.查看慢日志的默认配置
127.0.0.1:6379> config get slow*
1) "slowlog-max-len"
2) "128"						#最多纪录128个
3) "slowlog-log-slower-than"
4) "10000"					#默认超过10毫秒就会记录


2.设置慢日志的时间
127.0.0.1:6379> config set slowlog-log-slower-than 1000	#超过1ms会被认定为慢日志
OK
127.0.0.1:6379> config get slow*
1) "slowlog-max-len"
2) "128"
3) "slowlog-log-slower-than"
4) "1000"		#1ms为慢日志


3.shell批量写入数据
for i in $(seq -w 100000);do redis-cli -a redispwd set name${i} test${i};redis-cli -a redispwd get name${i};done 2>/dev/null


4.产生慢日志
127.0.0.1:6379> keys * 	#当查询时间大于1ms,会产生慢日志
重复keys *操作获取多条慢日志

5.查询慢日志
127.0.0.1:6379> slowlog get	#默认获取最近10条慢日志 
127.0.0.1:6379> slowlog get 5	#获取最近5条慢日志
127.0.0.1:6379> slowlog len		#查看慢日志的条数
(integer) 20
127.0.0.1:6379> slowlog reset	#清空慢日志

6.Slowlog各字段意思
127.0.0.1:6379> slowlog get
 1) 1) (integer) 39				#慢日志的id,从0开始
    2) (integer) 1713758193		#慢日志时间戳,慢日志产生的时间
    3) (integer) 14426			#慢日志的运行时间
    4) 1) "keys"					#产生慢日志的命令
       2) "*"
    5) "127.0.0.1:46862"
    6) ""

十一.redis的key的有效期

-1代表key永久生效,-2代表key被删除了
127.0.0.1:6379> set name1  test1
OK
127.0.0.1:6379> get name1
"test1"
127.0.0.1:6379> ttl name1			#key的生命周期
(integer) -1
127.0.0.1:6379> expire name1 20		#设置key的有效期为20s
(integer) 1
127.0.0.1:6379> ttl name1
(integer) 8
127.0.0.1:6379> ttl name1
(integer) -2
此时key被回收了

十二.redis禁用的危险命令

​
>flushall		#会清空redis的所有数据
>flushdb		#清空db中的所有数据
>keys *		#在建过多的时候容易阻塞卡住

对禁用命令配置
vim /etc/redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""

​

十三.redis压测工具

会对redis里的所有命令进行测试
redis-benchmark -a redispwd	#默认的并发50个,一共10万个请求

十四.redis的两种持久化存储方式

14.1RDB持久化存储

RDB持久化存储
redis默认开启了RDB快照方式,提供持久化存储的功能


1.RDB存储方式的配置
127.0.0.1:6379> config get dir	#查看存储路径的设置
1) "dir"
2) "/data/redis"


127.0.0.1:6379> config get dbfilename	#查看RDB存储的文件名,默认为dump.rdb文件
1) "dbfilename"
2) "dump.rdb"

[root@bogon ~]# ls /data/redis/
dump.rdb  redis.log  redis.pid


127.0.0.1:6379> config get save
1) "save"
2) "3600 1 300 100 60 10000
     3600:3600s  1:1个key的变化      意为每隔1小时会将变化的只存储到文件中
     后面两组数类似概念:300  100       60  100000


2.验证RDB持久化存储

关闭RDB持久化存储
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
[root@bogon ~]# ls /data/redis/
dump.rdb  redis.log  redis.pid
[root@bogon ~]# systemctl stop redis
[root@bogon ~]# mv /data/redis/dump.rdb /data/redis/dump.rdb.bak
mv: overwrite '/data/redis/dump.rdb.bak'? y
[root@bogon ~]# ls /data/redis/
dump.rdb.bak  redis.log
[root@bogon ~]# systemctl start redis
[root@bogon ~]# redis-cli -a redispwd
127.0.0.1:6379> keys *
(empty array)


恢复数据
[root@bogon ~]# systemctl stop redis
[root@bogon ~]# mv /data/redis/dump.rdb.bak /data/redis/dump.rdb
mv: overwrite '/data/redis/dump.rdb'? y
[root@bogon ~]# systemctl start redis
[root@bogon ~]# redis-cli -a redispwd
127.0.0.1:6379> keys *
1) "k3"
2) "k1"
3) "k2"


设置关闭RDB
[root@bogon ~]# vim /etc/redis.conf
save ""
#save 3600 1
#save 300 100
#save 60 10000
[root@bogon ~]# systemctl start redis
[root@bogon ~]# systemctl stop redis
[root@bogon ~]# rm -f /data/redis/dump.rdb
[root@bogon ~]# systemctl start redis
[root@bogon ~]# ls /data/redis/
redis.log  redis.pid




验证关闭后重新登录数据存在吗
[root@bogon ~]# redis-cli -a redispwd
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> quit
[root@bogon ~]# systemctl restart redis
[root@bogon ~]# redis-cli -a redispwd
127.0.0.1:6379> keys *
(empty array)

14.2redis的AOF持久化存储

默认关闭
AOF持久化存储是把命令直接写入文件中,文件会不断扩大


开启AOF持久化存储

127.0.0.1:6379> config get append*		#查看AOF状态,默认关闭
1) "appendonly"
2) "no"
127.0.0.1:6379> config set appendonly yes	#开启AOF存储
OK
127.0.0.1:6379> config rewrite				#写入配置文件
OK


[root@bogon ~]#  cat /etc/redis.conf | grep append	#检查写入的AOF信息
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no

[root@bogon ~]# ls /data/redis/appendonly.aof 		#查看AOF文件的路径
/data/redis/appendonly.aof


[root@bogon ~]# redis-cli -a redispwd		#登录验证
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> quit
[root@bogon ~]# systemctl restart redis
[root@bogon ~]# redis-cli -a redispwd
127.0.0.1:6379> keys *
1) "k2"
2) "k1"


AOF文件的重写
可以减小AOF文件的大小,数据不会减少


手动重写
[root@bogon ~]# ll /data/redis/appendonly.aof 		#查看AOF文件大小
-rw-r--r--. 1 root root 173 Apr 23 13:46 /data/redis/appendonly.aof

127.0.0.1:6379> bgrewriteaof	#手动重写
Background append only file rewriting started

[root@bogon ~]# ll /data/redis/appendonly.aof 		#重写后,数据由173变为111
-rw-r--r--. 1 root root 111 Apr 23 13:55 /data/redis/appendonly.aof


自动重写
127.0.0.1:6379> config get *aof*
 1) "aof-rewrite-incremental-fsync"
 2) "yes"
 3) "aof-load-truncated"
 4) "yes"
 5) "aof-use-rdb-preamble"
 6) "yes"
 7) "aof_rewrite_cpulist"
 8) ""
 9) "auto-aof-rewrite-percentage"	#当增量达到100%时,会触发AOF重写
10) "100"
11) "auto-aof-rewrite-min-size"		#当AOF文件达到67M时,会触发AOF重写
12) "67108864"
13) "replicaof"
14) ""


十五.redis的主从复制

redis单台服务器缺点:
	1.容易数据丢失
	2.缓解单台服务器的读写压力


主从复制概念:
			保持主从服务器的数据一致性
			主服务器可用来写入和读取,从服务器仅用来读取,通过读写分离,降低写服务器的压力

本实验基于主服务器安装启动的前提下进行
主服务器端的配置:
[root@bogon ~]# systemctl stop firewalld	#关闭防火墙
[root@bogon ~]#setenforce 0	关闭selinux
[root@bogon ~]# vim /etc/redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes


[root@bogon ~]# scp -r /usr/local/bin/redis-* root@192.168.145.150:/usr/local/bin/	#将主服务器redis的启动文件同步到从服务器
[root@bogon ~]# scp -r /etc/redis.conf root@192.168.145.150:/etc/					#将主服务器的主配置文件同步到从服务器
[root@bogon ~]# redis-cli -a redispwd
127.0.0.1:6379> info	#查看主从关系
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.145.150,port=6379,state=online,offset=686,lag=1
master_failover_state:no-failover








从服务器端的配置:
[root@bogon ~]# systemctl stop firewalld	#关闭防火墙
[root@bogon ~]#setenforce 0	关闭selinux
[root@bogon ~]# redis-cli -v
redis-cli 6.2.1

[root@bogon ~]# vim /etc/redis.conf 
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
slaveof 192.168.145.149 6379	#添加主服务器的ip及端口
masterauth "redispwd"		#添加主服务器的密码

[root@bogon ~]# mkdir -p /data/redis
[root@bogon ~]# redis-server /etc/redis.conf		#启动从redis
[root@bogon redis]# redis-cli -a redispwd			#登录从redis
127.0.0.1:6379> keys *							#查看主redis的数据是否同步到从redis
1) "k1"
2) "k2"

127.0.0.1:6379> info		#查看主从关系
# Replication
role:slave
master_host:192.168.145.149
master_port:6379



添加数据验证主从同步

主服务器端的配置:
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> set k4 v4
OK

从服务器端的配置:
127.0.0.1:6379> keys *
1) "k4"
2) "k1"
3) "k3"
4) "k2"
发现k3,k4成功同步过来了

十六.redis的哨兵模式

注意:本实验搭建时,需要考虑以前的实验环境,另外3个端配置时同步进行

作用:实现主从自动切换,实现redis的高可用


哨兵高可用模式搭建
为防止哨兵的单点故障,将哨兵高可用的形式,多个哨兵监控redis的状态,哨兵个数一般设置为奇数个

注意:一般哨兵的部署不要和redis在同一台,防止机器挂掉后,哨兵不起作用了

规划:
192.168.145.149	主redis   哨兵1
192.168.145.151	从1redis  哨兵2
192.168.145.152	从2redis  哨兵3


本实验基于以上的主从复制实验环境

192.168.145.149(主redis)配置:
vim /etc/redis.conf
masterauth "redispwd"	#当主服务器宕机恢复时,会沦为从服务器的身份,向新的主服务器添加向主服务器同步数据时的验证密码
[root@bogon ~]# systemctl restart redis

哨兵配置:3个端均配置
[root@bogon ~]# vim /etc/sentinel.conf
bind 0.0.0.0
daemonize yes
port 26379
dir "/tmp"
logfile "sentinel.log"
sentinel monitor testmaster 192.168.145.149 6379 2
sentinel auth-pass testmaster redispwd
sentinel down-after-milliseconds testmaster 5000
sentinel failover-timeout testmaster 18000

启动哨兵:
[root@bogon ~]# /usr/local/bin/redis-sentinel /etc/sentinel.conf 
[root@bogon ~]# ps -ef | grep senti
root      147598       1  0 05:49 ?        00:00:00 /usr/local/bin/redis-sentinel 0.0.0.0:26379 [sentinel]
root      147604  146592  0 05:49 pts/0    00:00:00 grep --color=auto senti

验证哨兵实现的redis高可用:
停止redis服务:
[root@bogon ~]# systemctl stop redis	#停止主redis

恢复主数据库,查看其角色:
[root@bogon ~]# systemctl start redis
[root@bogon ~]# redis-cli -a redispwd	
127.0.0.1:6379> info 	#发现变成了151的从数据库
# Replication
role:slave
master_host:192.168.145.151
master_port:6379


验证哨兵的高可用性:
[root@bogon ~]# ps -ef | grep sen	#停掉一个哨兵
root        2117       1  0 15:27 ?        00:00:06 /usr/local/bin/redis-sentinel 0.0.0.0:26379 [sentinel]
root        2289    1743  0 15:48 pts/0    00:00:00 grep --color=auto sen
[root@bogon ~]# kill -9 2117





192.168.145.151(从1redis)配置
[root@bogon ~]# redis-cli -a redispwd	#登录redis查看目前的身份
127.0.0.1:6379> info 
# Replication
role:slave
master_host:192.168.145.149
master_port:6379
master_link_status:up

哨兵配置:3个端均配置
[root@bogon ~]# vim /etc/sentinel.conf
bind 0.0.0.0
daemonize yes
port 26379
dir "/tmp"
logfile "sentinel.log"
sentinel monitor testmaster 192.168.145.149 6379 2
sentinel auth-pass testmaster redispwd
sentinel down-after-milliseconds testmaster 5000
sentinel failover-timeout testmaster 18000

启动哨兵:
[root@bogon ~]# /usr/local/bin/redis-sentinel /etc/sentinel.conf 
[root@bogon ~]# ps -ef | grep senti
root      147598       1  0 05:49 ?        00:00:00 /usr/local/bin/redis-sentinel 0.0.0.0:26379 [sentinel]
root      147604  146592  0 05:49 pts/0    00:00:00 grep --color=auto senti


停掉主库后登录redis查看关系:
[root@bogon ~]# redis-cli -a redispwd	
127.0.0.1:6379> info	#发现由从库关系升级为主库关系
# Replication
role:master
connected_slaves:1

恢复主数据库后,查看其角色:
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.145.149,port=6379,state=online,offset=102969,lag=1
slave1:ip=192.168.145.152,port=6379,state=online,offset=102969,lag=1

验证哨兵的高可用性:
[root@bogon ~]# ps -ef | grep redis		#将redis服务关闭
root        2018       1  0 15:10 ?        00:00:10 redis-server 0.0.0.0:6379
root        2155       1  0 15:28 ?        00:00:11 /usr/local/bin/redis-sentinel 0.0.0.0:26379 [sentinel]
root        2320    1816  0 16:07 pts/0    00:00:00 grep --color=auto redis
[root@bogon ~]# kill -9 2018







192.168.145.152(从2redis)配置
[root@bogon ~]# redis-cli -a redispwd	#登录redis查看目前的身份
127.0.0.1:6379> info 
# Replication
role:slave
master_host:192.168.145.149
master_port:6379
master_link_status:up

哨兵配置:3个端均配置
[root@bogon ~]# vim /etc/sentinel.conf
bind 0.0.0.0
daemonize yes
port 26379
dir "/tmp"
logfile "sentinel.log"
sentinel monitor testmaster 192.168.145.149 6379 2
sentinel auth-pass testmaster redispwd
sentinel down-after-milliseconds testmaster 5000
sentinel failover-timeout testmaster 18000

启动哨兵:
[root@bogon ~]# /usr/local/bin/redis-sentinel /etc/sentinel.conf 
[root@bogon ~]# ps -ef | grep senti
root      147598       1  0 05:49 ?        00:00:00 /usr/local/bin/redis-sentinel 0.0.0.0:26379 [sentinel]
root      147604  146592  0 05:49 pts/0    00:00:00 grep --color=auto senti


停掉主库后登录redis查看关系:
[root@bogon ~]# redis-cli -a redispwd	
127.0.0.1:6379> info	#发现152依然为从库
# Replication
role:slave
master_host:192.168.145.149
master_port:6379


恢复主数据库后,查看其角色:
# Replication
role:slave		#发现152依然为从库
master_host:192.168.145.152
master_port:6379
master_link_status:up



验证哨兵的高可用性:
127.0.0.1:6379> info 	#发现从2起到的哨兵作用
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.145.142,port=6379,state=online,offset=431243,lag=1


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地构建编译Apache-Seatunnel2.3.5适配Web1.0.0运行实现Mysql-CDC示例

本地构建编译Apache-Seatunnel2.3.5适配Web1.0.0运行实现Mysql-CDC示例 文章目录 1.前言2.编译2.1版本说明2.2 seatunnel2.3.4-release分支配置2.3maven调优配置 3.web1.0.0适配3.1配置文件修改和新增文件3.2手动拷贝jar修改依赖3.3修改web不兼容的代码3.4 web编译打包 4.运行m…

PHP源码_在线艺术字体在线生成转换设计网站源码

最全的字体转换器在线转换、艺术字体在线生成器和字体下载,包括书法字体在线转换、毛笔字在线生成器,更有草书字体、篆体字、连笔字、POP字体转换器等中文和英文字体。 支持自己添加字体,在线艺术字体转换器,织梦内核艺术字体在线…

百川crm系统 教育crm系统 一款高效的培训机构管理系统

在教育培训行业日益竞争激烈的今天,如何精准把握客户需求、提升服务质量、实现客户价值最大化,成为了每一家教育培训机构都必须面对的问题。为此,一款高效、智能的CRM客户管理系统成为了教育培训机构不可或缺的得力助手。本文将为您详细介绍这…

在Linux操作系统中的磁盘分区管理案例

1.在硬盘sdb上创建不同的分区实例练习 Linux操作系统是安装在硬盘sda硬盘中,所以不要轻易动硬盘sda中的文件信息 有如下需求 创建主分区 500M 文件系统 ext4 挂载点 /web 创建主分区 500M 文件系统 ext4 挂载点 /nginx 创建逻辑分区 500M 文件系…

【消息队列】RabbitMQ五种消息模式

RabbitMQ RabbitMQRabbitMQ安装 常见的消息模型基本消息队列SpringAMQPWorkQueue消息预取发布订阅模式Fanout ExchangeDirectExchangeTopicExchange 消息转换器 RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件 官网地址:https://www.rabbitmq.com/ R…

java技术栈快速复习04_javaweb基础总结

javaweb概述 JDBC JDBC(Java DataBase Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。简单说就是用Java语言来操作数据库。 jdbc原理 早期SUN公司的天才们想编写一套可以连接…

C++ ─── 内存管理

1 . C / C内存分布 我们先看下面的一段代码和相关问题 int globalVar 1;static int staticGlobalVar 1;void Test(){static int staticVar 1;int localVar 1;int num1[10] {1, 2, 3, 4};char char2[] "abcd";char* pChar3 "abcd";int* ptr1 (int…

Postgresql源码(127)投影ExecProject的表达式执行分析

无论是投影还是别的计算,表达式执行的入口和计算逻辑都是统一的,这里已投影为分析表达式执行的流程。 1 投影函数 用例 create table t1(i int primary key, j int, k int); insert into t1 select i, i % 10, i % 100 from generate_series(1,1000000…

JeeSite框架安装部署

下载JeeSite框架。 依次执行两个sql文件。 如果是mysql8.0,则create_user.sql需要改成下面的内容: -- 打开 my.ini 给 [mysqld] 增加如下配置: -- sql_modeONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREAT…

YOLOv8核心原理深度解析

YOLOv8源码地址: https://github.com/ultralytics/ultralytics 一、简介: 根据官方描述,Yolov8是一个SOTA模型,它建立在Yolo系列历史版本的基础上,并引入了新的功能和改进点,以进一步提升性能和灵活性,使其成为实现目标检测、图像分割、姿态估计等任务的最佳选择。其具体…

代码随想录——双指针与滑动窗口(四)

一.1423. 可获得的最大点数 题目详情 解题思路 这里我们每次只能取最左或最右边的卡牌,第一反应其实是使用双指针,通过局部贪心来解决,但是如果两边相等的话用局部贪心无法来判断到底取哪一边,那我们不妨换一个思路: 我们首先任…

DICOM 测试工具

一个DICOM测试工具。 引用了 fo-dicom 。fo-dicom 算是比较好用的,我的另外一个项目也是用了它。 using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; …

Go语言map

map 概念 在Go语言中,map 是一种内建的数据结构,它提供了一种关联式的存储机制,允许你以键值对的形式存储数据。每个键都是唯一的,并且与一个值相关联。你可以通过键来查找、添加、更新和删除值,这类似于其他编程语言…

Spring Boot的热部署工具“AND”Swagger测试工具

Spring Boot的热部署&Swagger测试页面的使用 热部署指的是在项目无需重启的情况下,只需要刷新页面,即可获得已经修改的样式或功能。要注意该工具一般用于开发环境,在生产环境中最好不要添加这个工具。 对于无需重启便可刷新这么方便的工…

小剧场短剧影视小程序源码_后端PHP

项目运行截图 源码贡献 https://githubs.xyz/boot?app42 部署说明 linux/win任选 PHP版本:7.3/7.2(测试时我用的7.2要安装sg扩展 ) 批量替换域名http://video.owoii.com更换为你的 批量替换域名http://120.79.77.163:1更换为你的 这两个…

交通运输智慧监管平台---强化物流安全与效率的新举措

一、建设背景 随着社会对于交通安全和环境保护的要求不断提高,对卡车运输的监管和合规性要求也逐渐加强。为了满足快速发展的物流需求,提高供应链协同和可追溯性、解决安全问题、提高运输效率和降低成本,我们利用现代技术和信息化手段着力建设…

Spark SQL编程初级实践

参考链接 Spark编程: Spark SQL基本操作 2020.11.01_df.agg("age"->"avg")-CSDN博客 RDD编程初级实践-CSDN博客 Spark和Hadoop的安装-CSDN博客 1. Spark SQL基本操作 { "id":1 , "name":" Ella" , "age":…

数字电路-5路呼叫显示和8路抢答器

本内容涉及两个电路,分别为5路呼叫显示电路和8路抢答器电路,包含Multisim仿真原文件,为掌握FPGA做个铺垫。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易! 目录: 一、5路呼叫显…

每日OJ题_DFS爆搜深搜回溯剪枝②_力扣526. 优美的排列

目录 力扣526. 优美的排列 解析代码 力扣526. 优美的排列 526. 优美的排列 难度 中等 假设有从 1 到 n 的 n 个整数。用这些整数构造一个数组 perm(下标从 1 开始),只要满足下述条件 之一 ,该数组就是一个 优美的排列 &#…

nginx缓存清理

背景 昨天打开我的gpt镜像网站,意外发现静态图片资源全都无法获取了 CoCo-AI 一番排查下来,发现是引用的cdn链接失效了 且cdn源是属于七牛云的,且不再维护,于是果断切换到cloudflare export function getEmojiUrl(unified: str…
最新文章