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
相关推荐
一休哥助手1 分钟前
全面解析 Linux 系统监控与性能优化
linux·运维·性能优化
忒可君5 分钟前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
watl020 分钟前
【Android】unzip aar删除冲突classes再zip
android·linux·运维
斌斌_____21 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
路在脚下@29 分钟前
Spring如何处理循环依赖
java·后端·spring
团儿.35 分钟前
Docker服务发现新纪元:探索Consul的无限魅力
运维·docker·云计算·服务发现·consul
一个不秃头的 程序员1 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
赵大仁1 小时前
在 CentOS 7 上安装 Node.js 20 并升级 GCC、make 和 glibc
linux·运维·服务器·ide·ubuntu·centos·计算机基础
vvw&1 小时前
Docker Build 命令详解:在 Ubuntu 上构建 Docker 镜像教程
linux·运维·服务器·ubuntu·docker·容器·开源
丁总学Java1 小时前
--spring.profiles.active=prod
java·spring