.conf文件。
1. 备份/持久化
Redis有两种备份方式:
- 快照snapshotting:备份当前瞬间在内存中的数据记录
- 只追加文件AOF:当执行写命令后,在一定条件下将执行过的写命令依次保存至文件,将来依次执行这些命令以恢复
快照在数据量大的情况下,保存时可能卡顿,但恢复重启块;AOF备份一般不会造成卡顿,但恢复重启慢,备份文件可能会更大。可以二者同时使用。
以下介绍一些默认配置:
-
save 900 1 save 300 10 save 60 10000
rdbchecksum yes dbfilename dump.rdb1
2
3
4
5
6
7
8
9
10
11
12
13
14
当900秒执行1个写命令时,用快照备份
当300s执行10个写命令时,用快照备份
当60s内执行10000个写命令时,用快照备份
Redis执行save命令时,禁止写命令。
2. `stop-writes-on-bgsave-error yes`
bgsave是异步保存,使用另一个进程,将Redis数据保存到对应的文件中,不会阻塞客户端写入。默认设置下,若bgsave失败,就停止接受写操作。这是为了提醒用户知道数据保存失败。可以使用其他监控程序,就可改为no了。
3.appendonly no appendfilename "appendonly.aof"1
2
3
4
是否对rdb文件检验。rdb文件是Redis持久化的数据文件。若快照备份,用其保存数据。
4.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
106
107
108
109
110
111
112
113
114
115
若开启,则在特定时间执行追加命令。
5. `appendfsync everysec`
设置AOF和Redis命令的同步频率。若always,则同步记录,造成缓慢。everysec表示每秒同步一次。no表示由客户端调用命令执行备份,Redis本身不备份。三者是对安全度与性能的取舍,建议默认每秒。
6. `no-appendfsync-on-rewrite no`
指定是否在后台AOF文件重写期间调用fsync。no表示要调用fsync(无论后台是否有子进程在重写)。Redis后台写rdb文件或重写AOF文件期间会存在大量磁盘I/O,某些Linux系统中调用fsync可能会阻塞。
7. `auto-aof-rewrite-percentage 100`
重写AOF文件的条件,默认100,表示与上次重写的大小相比,当前AOF文件增长量唱过上次文件大小的100%时,触发后台重写。若设置0,则禁用自动重写。
8. `auto-aof-rewrite-min-size 64mb`
触发重写的AOF文件大小。若AOF文件小于该值,即使增量比满足要求,也不会触发自动重写。
9. `aof-load-truncated yes`
写AOF时,最后一条指令可能存在写错的情况,若yes则会log并继续,否则直接回复失败。
# 2. 内存回收策略
当内存到达规定的最大值时,允许配置6中策略中的一种进行淘汰键值。
在`maxmemory-policy`设置回收策略:
1. `volatile-lru`:最近使用最少的淘汰策略,回收超时的键值对
2. `allkeys-lru`:淘汰最少使用。对所有(不仅是超时)的键值对使用
3. `volatile-random`:随机淘汰超时的键值对
4. `allkeys-random`:随机淘汰所有的键值对(不常用)
5. `volatile-ttl`:删除存活时间最短的键值对
6. `noeviction`:不淘汰,内存已满时,读可正常工作,写将返回错误(默认)
LRU和TTL只是近似算法,不会精确记录比较时间值。
配置文件有`max-memeory-samples`参数,默认值3,表示使用LRU或TTL时只在samples个键值对中寻找满足删除条件的键值对。可见,samples越大,删除越准确,但性能降低。
回收会造成系统缓慢,间隔把握同样重要。
# 3. 复制
如海量请求一个服务器难以处理,或需要多个服务器容灾等。我们需要读写分离(当然前提是读操作更频繁的情况下),能减小单台服务器压力。
## 3.1 主从同步基础概念
多台数据服务器汇总,有一个主服务器,只负责写。其余从服务器,只负责同步主服务器的数据,并负责读操作。主服务器写入数据后立刻将写入数据的命令发送给从服务器,使数据同步。应用程序随机读从服务器。任一服务器受损,整个系统都不受影响,主服务器挂掉只需在从服务器中选出一台当主服务器即可。
当然,在具体的数据存储软件中,会对以上思路做出微调。
## 3.2 Redis主从同步配置
主机:配置`dir`:默认“./”;配置`dbfilename`:默认“dump.rdb”;表示默认采用当前目录的dump.rdb文件进行同步。
从机:配置`slaveof server port`,server代表主机,port代表端口。从机Redis重启后就会同步主机数据了。
若不想让从机继续复制主机数据,可在从机使用`slaveof no one`命令。
实际Linux环境中还有一个`bind 127.0.0.1`配置,表示只允许本机访问,改为0.0.0.0,其他服务器就可以访问到了。
## 3.3 Redis主从同步过程
1. 开启主服务器
2. 从服务器启动,读取同步的配置,发送sync命令给主服务器。主服务器接收到,执行bgsave命令备份数据。主服务器不会拒绝客户端的读写,而是将写命令写入缓冲区。从服务器未收到主服务器的备份快照文件时,会根据配置决定使用现有数据响应请求还是拒绝
3. 主服务器完成bgsave后,向从服务器发送备份文件,从服务器丢弃所有现有数据,载入快照文件
4. 主服务器发送完成,从服务器执行写入命令。此时主服务器把bgsave期间缓冲区的写命令也发给从服务器
5. 缓冲区命令发送完成后,主服务器执行一条写命令,就同时向从服务器发送同步写入命令
主从同步中,主服务器需要空间备份,故主服务器使用50%~65%的空间。
多从机同步机制:

# 4. 哨兵模式
主机宕机后,若使用主从切换技术,则需手动选择从服务器切换为主服务器,较为复杂。当下优先考虑哨兵模式。
## 4.1 概述
Redis提供哨兵的命令,其是一个独立的进程,独立运行。哨兵通过发送命令,等待服务器响应,从而监控运行的多个Redis实例。
哨兵检测到主机宕机,自动将从机切换成主机,然后通过发布订阅模式,通知其他从机,修改配置文件,切换对应主机。
实际中还需要多哨兵,监控服务器与其他哨兵,以防单哨兵模式下哨兵出问题。此时若主机宕机,哨兵1检测到,系统此时不会立刻进行故障切换,因为只是哨兵1主观认为主机出问题,称为主观下线。当一定量的哨兵认为主机不可用,哨兵之间就会形成一次投票,结果由一个哨兵发起,进行故障切换failover。切换成功后,通过发布订阅,让所有哨兵切换主机。这个过程称为客观下线。
## 4.2 配置
哨兵配置在sentinel.conf
`sentinel monitor mymaster 192.168.11.128 6379 2`
sentinel monitor是配置一个哨兵的主要内容;mymaster是自定义服务名称;随后是映射服务器和端口欧;最后的2代表当存在两个或以上的哨兵投票认可当前主服务器不可用后,才进行故障切换。
`sentinel auth-pass mymaster pwd`
此项用于配置服务名称及其密码。
```cmd
./redis-sentinel ../setinel.conf
./redis-server ../redis.conf
启动哨兵进程和服务器进程。
启动顺序:主机Redis、从机Redis、哨兵进程
4.3 Java使用哨兵模式
1 | // 连接池 |
哨兵默认超时3min进行投票切换主机。若建立检测后,把主机的Redis服务器关闭,3min后再运行程序,将会观察到主机变化了。
Spring中使用:
1 | <!-- 哨兵--> |
测试代码:
1 | String retVal = (String) template.execute((RedisOperations ops) -> { |
4.4 哨兵模式其他配置项
配置项 | 参数 | 作用 |
---|---|---|
port | 整数 | 启动哨兵进程端口 |
dir | 目录 | 进程服务临时文件夹,默认/tmp,要保证有可写权限 |
sentinel down-after-millisecounds | 整数 | 当Redis服务器ms内无法回答,单个哨兵认为主观下线,默认30000 |
sentinel parallel-syncs | 整数 | 可以有多少服务同步新主机 |
sentinel failover-timeout | 整数ms | 故障切换允许的毫秒数,超过时切换故障失败,默认3min |
sentinel notification-script | 脚本路径 | 检测到监控的Redis实例异常时,调用的报警脚本 |
sentinel down-after-millisecounds只是一个哨兵认为主机不可用的时间,哨兵记录下来,当主观下线的哨兵达到配置数量时,发起投票,切换主机。