.conf文件。

1. 备份/持久化

Redis有两种备份方式:

  1. 快照snapshotting:备份当前瞬间在内存中的数据记录
  2. 只追加文件AOF:当执行写命令后,在一定条件下将执行过的写命令依次保存至文件,将来依次执行这些命令以恢复

快照在数据量大的情况下,保存时可能卡顿,但恢复重启块;AOF备份一般不会造成卡顿,但恢复重启慢,备份文件可能会更大。可以二者同时使用。

 

以下介绍一些默认配置:

  1.  save 900 1
     save 300 10
     save 60 10000
     
    1
    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.
    rdbchecksum yes dbfilename dump.rdb
    1
    2
    3
    4

    是否对rdb文件检验。rdb文件是Redis持久化的数据文件。若快照备份,用其保存数据。

    4.
    appendonly no appendfilename "appendonly.aof"
    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%的空间。

    多从机同步机制:

    ![多从机同步](Redis-4-配置文件/多从机同步.png)

     

    # 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 连接池
JedisPoolConfig cfg = new JedisPoolConfig();
cfg.setMaxTotal(10);
cfg.setMaxIdel(5);
cfg.setMinIdle(5);
// 哨兵
Set<String> sentinels = new HashSet<Stirng>(Arrays.asList(
"192.168.11.128:26379",
"192.168.11.129:26379",
"192.168.11.130:26379",
));
// 创建连接池
JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels, cfg, "pwd");
// 获取客户端
Jedis jedis = pool.getResource();
// 执行命令
jedis.set("k1", "v1");
String v = jedis.get("k1");

哨兵默认超时3min进行投票切换主机。若建立检测后,把主机的Redis服务器关闭,3min后再运行程序,将会观察到主机变化了。

 

Spring中使用:

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
<!--    哨兵-->
<bean id="sentinelConfig" class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<property name="master">
<bean class="org.springframework.data.redis.connection.RedisNode">
<property name="name" value="mymaster"/>
</bean>
</property>
<property name="sentinels">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="192.168.11.128"/>
<constructor-arg name="port" value="26379"/>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="192.168.11.129"/>
<constructor-arg name="port" value="26379"/>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host" value="192.168.11.130"/>
<constructor-arg name="port" value="26379"/>
</bean>
</set>
</property>
</bean>

<!--另需在connectionConfig中加入:-->
<constructor-arg name="sentinelConfig" ref="sentinelConfig"/>

测试代码:

1
2
3
4
5
String retVal = (String) template.execute((RedisOperations ops) -> {
ops.boundValueOps("key1").set("val1");
String value = (String) ops.boundValueOps("key1").get();
return value;
});

 

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只是一个哨兵认为主机不可用的时间,哨兵记录下来,当主观下线的哨兵达到配置数量时,发起投票,切换主机。