Akemi

Redis部署与参数

2024/09/19

编译安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
yum -y groupinstall "Development Tools"
yum -y install tcl
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
tar xf redis-5.0.5.tar.gz
cd redis-5.0.5/

make MALLOC=libc
make install

# 安装完之后会生成几个文件
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具

redis-server # 启动
redis-cli # 进入redis命令行

redis> PING # 可以测试客户端和服务器连接是否正常、服务是否正常

# 内核参数,使内核分配所有物理内存
echo vm.overcommit_memory=1 >> /etc/sysctl.conf
0表示会申请,如果内存不够就拒绝
1表示允许超出物理内存
2表示允许超过物理内存和swap内存

redis自带的二进制命令

1
2
3
4
5
6
redis-benchmark 基准性能测试工具
redis-check-aof aof持久化时,对有问题的aof文件进行修复
redis-check-rdb rdb持久化时,对有问题的rdb文件进行修复
reids-sentinel 哨兵模式节点启动命令
redis-cli 客户端命令行工具
redis-server redis数据库启动命令

redis参数

/etc/redis.conf文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
bind 127.0.0.1
# 指定接受信息的网卡ip,这里是lo

protected-mode yes
# 禁止公网直接访问redis
如果要启用redis对外连接1.关闭protected-mode 2.启用时,配置访问密码或bind IP

tcp-backlog 511
#tcp连接中已完成队列的长度;首先该值不能大于/proc/sys/net/core/somaxconn值
对于负载很大的服务程序来说,默认128太少。一般会将它修改为2048或者更大。在/etc/sysctl.conf中添加net.core.somaxconn = 2048,然后sysctl -p

daemonize yes 是否以后台守护经常方式运行
pidfile /var/run/redis.pid pid文件路径
port 6379 监听端口,默认为6379
timeout 300 超时时间,如果为0就不会主动断开连接
loglevel verbose 日志级别,共支持四个级别,debug、verbose、notice、warning,默认为verbose
Logfile "/var/log/redis/redis-8000.log" 日志记录方式,默认为标准输出,可指定文件
databases 16 开启的数据库数量,默认为16

save 持久化策略设置参数(将内存的数据写入磁盘)
需要根据实际情况进行修改
save 900 1 # 900 秒内如果至少有 1 个 key 的值变化,则保存
save 300 10 # 300 秒内如果至少有 10 个 key 的值变化,则保存
save 60 10000 # 60 秒内如果至少有 10000 个 key 的值变化,则保存

rdbcompression yes 存储至本地数据库时是否压缩数据,默认开启,使用LZF压缩
开启会消耗cpu时间,关闭会导致数据库文件变大

dbfilename dump.rdb 保存的数据文件(数据快照类型),.rdb就是redis的持久化的数据文件
dir ./ 数据快照存放的目录
slaveof 当本机为slave时,设置master的IP和port,redis启动时,会自动从master进行数据同步

appendonly no 是否开启appendonlylog,默认为no。
如果开启,每次写操作都会记录一条log到aof文件中,提高数据抗风险能力(更安全),但消耗大量CPU资源
redis默认情况下异步写入磁盘,如果不开启,可能在断电时导致一段时间内的数据丢失。因为redis本身同步数据是按照里面的save同步

appendfilename 指定更新日志的文件名,默认为appendnoly.aof

appendfsync everysec 更新日志的方式,可选三种
no 使用操作系统进行数据缓存同步到磁盘——快速
always 每次更新后手动使用fsync()将数据写入磁盘——慢,安全
everysec 每秒同步一次

maxmemory 8G redis最大内存限制
redis启动时会将数据加载到内存中,达到最大内存后,redis会尝试清楚已到期的key,如果依然到达最大内存值,就无法进行写入
redis新的vm机制会把key放在内存,value存放到swap
由于bgsave的使用,所以一般不大于为机器物理内存的一半

maxclients 128 同一时间最大客户端连接数,默认无限制

redis操作

redis的订阅和发布
相当于是实时的生产者消费者模型,频道channel发布信息,通过subcribe方法来订阅

1
2
3
4
5
6
7
8
订阅一个频道
subcribe channel-1

在一个频道中发布信息
publish channel-1 11111
publish channel-1 wangsheng

所有订阅的频道都能收到发布的信息

redis慢查询

慢查询顾名思义就是很慢的查询,可能会导致客户端超时,所以要避免

慢查询日志:

慢查询日志是Redis服务端在命令执行前后计算每条命令的执行时长,当超过某个阈值是记录下来的日志。日志中记录了慢查询发生的时间,还有执行时长、具体什么命令等信息,它可以用来帮助开发和运维人员定位系统中存在的慢查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
获取慢查询日志
slowlog get
slowlog get <number> 查询慢查询日志的条数

获取慢查询日志长度
slowlog len

相关参数:
记录的慢查询的阈值(单位微秒)
slowlog-log-slower-than
默认值10000us即10ms,对于高ops场景建议设置1ms

慢查询日志存放的上限个数
slowlog-max-len
在线上环境中建议调大,比如到1000

save bgsave的区别

save同步回写
是一种阻塞主进程的连接方式
执行save时,客户端无法连接redis

bgsave异步回写
在执行时,会fork一个redis子进程
执行不影响redis对外连接,运行完成后会通知主进程来关闭子进程
这个子进程需要的内存与主进程一致,也就是双倍的内存

redis-cli info运行状态

redis-cli info会返回八大Server、Clients、Memory、Persistence、Stats、Replication、CPU、Keyspace 8个部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# Server
redis_version:5.0.5 # 版本
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:c6c0379eeb4e9ac
redis_mode:standalone
os:Linux 3.10.0-1160.108.1.el7.x86_64 x86_64 # 内核版本
arch_bits:64
multiplexing_api:epoll
atomicvar_api:atomic-builtin
gcc_version:4.8.5 # gcc版本
process_id:5686 # redis的PID
run_id:6f44cf692f2927c19eaa320f8690f25d057f8969
tcp_port:6379
uptime_in_seconds:52145 # 运行时间
uptime_in_days:0 # 运行天数
hz:10
configured_hz:10
lru_clock:8786470
executable:/root/redis-server
config_file:

# Clients
connected_clients:1 # 连接的客户端数
client_recent_max_input_buffer:2
client_recent_max_output_buffer:0
blocked_clients:0 # 阻塞的客户端数

# Memory
used_memory:912264 #redis分配器分配的内存总量
used_memory_human:890.88K
used_memory_peak:912264 #redis消耗内存峰值
used_memory_peak_human:890.88K
used_memory_lua:37888 # lua脚本占用的内存
used_memory_lua_human:37.00K

mem_fragmentation_ratio:3.07 #内存碎片比率
mem_fragmentation_bytes:1784912
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:libc
active_defrag_running:0
lazyfree_pending_objects:0

# Persistence 持久化状态
loading:0
rdb_changes_since_last_save:0 #上次rdb保存后改变key的次数
rdb_bgsave_in_progress:0 #当前是否在进行bgsave操作
rdb_last_save_time:1720010357 #上次保存rdb文件的时间戳
rdb_last_bgsave_status:ok #上次保存的状态
rdb_last_bgsave_time_sec:-1 #上次保存的耗时
rdb_current_bgsave_time_sec:-1 #保存rdb花费的时间
rdb_last_cow_size:0 #是否开启了aof功能
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok #
aof_last_cow_size:0

# Stats
total_connections_received:3 #连接过客户端总数量
total_commands_processed:4 #执行过的命令总数量
instantaneous_ops_per_sec:0
total_net_input_bytes:76
total_net_output_bytes:26170
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0 #过期的key总数量
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0 #删除过的key总数量
keyspace_hits:0 #命中的key数量
keyspace_misses:0 #未命中的key的数量
pubsub_channels:0 #使用中的频道数量
pubsub_patterns:0 #使用中的模式数量
latest_fork_usec:0
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0 #优化碎片的次数
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

# Replication 角色
role:master #当前是master还是slave

# CPU
used_cpu_sys:24.848952 #系统占用的cpu时间
used_cpu_user:16.777310 #用户占用的cpu时间
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000

# Keyspace
各个数据库的key的数量

对于内存的监控,为used_memory(redis分配的内存)和 used_memory_peak(内存消耗峰值)设定报警阈值
对于rdb文件的监控,为rdb_last_save_time(最近一次save操作时间),rdb_changes_since_last_save(举例上次save的时间)监控来计算丢失的数据量

内存不足导致数据丢失

硬件配置为4核,8G内存。redis持久话方案是RDB。redis使用的最大内存配置为6GB,在一次重启之后,redis只恢复了部分数据,这时查看redis.log文件。看见了如下的错误
[23635] 25 Jul 08:30:54.059【 # Can’t save in background: fork: Cannot allocate memory
fork就说明使用bgsave

重启后redis启动时的警告:
WARNING overcommit_memory is set to 0!
Background save may fail under low memory condition.
To fix this issue add ‘vm.overcommit_memory = 1’ to /etc/sysctl.conf and
then reboot or run the command ‘sysctl vm.overcommit_memory=1’ for this to take effect.

原因
设置maxmemory为6G,使用bgsave时fork子进程,内存使用量最大到达12G
如果要过量使用内存,需要设置vm.overcommit_memory = 1,并运行sysctl vm.overcommit_memory=1,此时他会使用交换内存
解决
修改maxmemory小于物理内存的一半;增加物理内存

CATALOG
  1. 1. 编译安装
  2. 2. redis参数
  3. 3. redis操作
  4. 4. save bgsave的区别
  5. 5. redis-cli info运行状态
  6. 6. 内存不足导致数据丢失