安全性设置

设置客户端操作密码


redis安装好后,默认情况下登录客户端和使用命令操作时不需要密码的。某些情况下,为了安全起见,我们可以设置在客户端连接后进行任何操作
之前都要进行密码验证。修改redis.conf进行配置。找到# requirepass foobared这一行,在下面添加”requirepass密码”一行设置密码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#######################SECURITY ##############################

......

# Warning: since Redis is pretty fast an outside user can try up to

# 150k passwords per second against a good box. This means that you should

# use a very strong password otherwise it will be very easy to break.

#

# requirepass foobared

requirepass redis129



# Command renaming.

设置好密码后,有两种方式授权客户端进行操作

客户端授权方式


(1)登录时使用-a 参数指定客户端密码,如下:
1
2
3
4
5
6
7
[root@localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.2.129 -p 6379 -a redis129

192.168.2.129:6379> keys *

1) "myzset"

192.168.2.129:6379>

(2)登录客户端后使用auth命令进行授权,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# /usr/local/redis/bin/redis-cli -h 192.168.2.129 -p 6379

192.168.2.129:6379> keys *

(error) NOAUTH Authentication required.

192.168.2.129:6379> auth redis129

OK

192.168.2.129:6379> keys *

1) "myzset"

192.168.2.129:6379>

主从复制


主从复制,即主服务器与从服务器之间数据备份的问题。即在主服务器上增加一个KEY,在从服务器上可以获取它的值。从服务器只能读,不能写。redis支持简单且易用的主从复制(master-slave replication)功能,该功能可以让从服务器
(slave server)成为主服务器的精确复制品。

主从复制的特点


(1)一个主服务器可以有多个从服务器
(2)不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器。
(3)redis支持异步复制和部分复制,主从复制过程中不会阻塞主服务器和从服务器。
(4)主从复制功能可以提升系统的伸缩性和功能,如让多个从服务器处理只读命令,使用复制功能来让主服务器免于频繁的执行持久化操作。

主从服务器过程


(1)从服务器将向主服务器发送一个SYNC命令。
(2)主服务器接到SYNC命令后开启一个后台子进程并开始执行BGSAVE,并在保存操作执行期间,将所有新执行的写入命令都保存到一个缓冲区里面。
(3)当BGSAVE执行完毕后,主服务器将执行保存操作所得的.rdb文件发送给从服务器,从服务器接收这个.rdb文件,并将文件中的数据载入到内存中。
(4)主服务器会以redis命令协议的格式,将写命令缓冲区中积累的所有内容都发送给从服务器。

配置从服务器


redis配置一个从服务器非常简单,只要在从服务器的配置文件redis.conf中增加主服务器的IP地址和端口号就可以。如果主服务器设置了客户端
密码,还需要在从服务器中配置主服务器密码。如下:
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
##########################REPLICATION ###############################



# Master-Slave replication. Use slaveof to make a Redis instance a copy of

# another Redis server. A few things to understand ASAP about Redis replication.

#

......

# slaveof <masterip> <masterport>

slaveof 192.168.2.129 6379

# If the master is password protected (using the "requirepass" configuration

# directive below) it is possible to tell the slave to authenticate before

# starting the replication synchronization process, otherwise the master will

# refuse the slave request.

#

# masterauth <master-password>

masterauth redis129

事务与锁


redis的事务支持相对简单,MULTI、EXEC、DISCARD和WATCH这四个命令是redis事务的基础。

事务开启与取消


MULTI开启一个事务。当客户端发出了MULTL命令时,客户端和服务端的连接进入了一个事务上下文的状态。MULTI执行之后,客户端可以继续向
服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
EXEC顺序执行事务队列中的命令:
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
192.168.2.129:6379> multi

OK

192.168.2.129:6379> set name "zhangsan"

QUEUED

192.168.2.129:6379> set age 20

QUEUED

192.168.2.129:6379> exec

1) OK

2) OK

192.168.2.129:6379> keys *

1) "age"

2) "name"

192.168.2.129:6379>

DISCARD取消事务。当执行DISCARD命令时,事务会被抛弃。事务队列会被清空,并且客户端会从事务状态中退出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
192.168.2.129:6379> multi

OK

192.168.2.129:6379> set name2 "lisi"

QUEUED

192.168.2.129:6379> set age 22

QUEUED

192.168.2.129:6379> discard

OK

192.168.2.129:6379> exec

(error) ERR EXEC without MULTI

192.168.2.129:6379>

乐观锁


WATCH对key值进行锁操作。在WATCH执行之后,EXEC执行之前,有其他客户端修改了key的值,那么当前客户端的事务就会失败。如下:
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
Client1开启watch name并在事务中修改name,但是没有执行exec



192.168.2.129:6379> get name

"huangliu"

192.168.2.129:6379> watch name

OK

192.168.2.129:6379> multi

OK

192.168.2.129:6379> set name lisi

QUEUED



Client2 修改name



192.168.2.129:6379> get name

"huangliu"

192.168.2.129:6379> set name "wangwu"

OK

192.168.2.129:6379> get name

"wangwu"

192.168.2.129:6379>



Client1执行exec



192.168.2.129:6379> exec

(nil)

192.168.2.129:6379>

可见,由于被watch的name已经被client2修改,所以client1的事务执行失败,程序需要做的就是不断重试这个操作,直到没有发生碰撞为止。
对key进行加锁监视的机制类似java多线程中的锁。

持久化机制


redis既可以理解为缓存技术,也可以理解为数据库,因为redis支持将内存中的数据周期性的写入磁盘或者把操作追加到记录文件中,这个过程
叫做redis持久化。redis支持两种方式的持久化,一种是快照方式,也叫RDB。另外一种是追加文件方式。也叫AOF方式。RDB是redis默认持久化方式。

RDB方式


RDB方式是讲内存中的数据以二进制的方式写入名字为dump.rdb文件中。我们对redis进行设置,让它根据设置周期性自动保存数据集。修改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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
######################### SNAPSHOTTING  ################################

#

# Save the DB on disk:

......

# In the example below the behaviour will be to save:

# after 900 sec (15 min) if at least 1 key changed

# after 300 sec (5 min) if at least 10 keys changed

# after 60 sec if at least 10000 keys changed

#

# Note: you can disable saving completely by commenting out all "save" lines.

#

# It is also possible to remove all the previously configured save

# points by adding a save directive with a single empty string argument

# like in the following example:

#

# save ""

#900秒内如果有超过1个key被修改则发起保存快照

save 900 1

#300秒内如果有超过10个key被修改则发起保存快照

save 300 10

#60秒内如果有超过1000个key被修改则发起保存快照

save 60 10000



dump.rdb文件默认生成在%REDIS_HOME%etc目录下(如/usr/local/redis/etc/),可以修改redis.conf文件中的dir指定dump.rdb的保存路径



# The filename where to dump the DB

dbfilename dump.rdb



# The working directory.

#

# The DB will be written inside this directory, with the filename specified

# above using the 'dbfilename' configuration directive.

#

# The Append Only File will also be created inside this directory.

#

# Note that you must specify a directory here, not a file name.

dir ./

AOF方式


RDB方式是周期性的持久化数据,如果未到持久化时间点,Redis因为某些原因而造成故障停机,那么服务器将遗失最近写入,且仍未保存到快照
中的那些数据。所以redis-1.1开始引入了AOF方式。AOF持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来
还原数据集,AOF文件中的命令全部以Redis协议的格式保存,新命令会被追加到文件的末尾。
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
#######################APPEND ONLY MODE #############################

......

# AOF and RDB persistence can be enabled at the same time without problems.

# If the AOF is enabled on startup Redis will load the AOF, that is the file

# with the better durability guarantees.

#

# Please check http://redis.io/topics/persistence for more information.

#启用AOF方式

appendonly yes

#每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全

appendfsync always

#每秒 fsync 一次:足够快(和使用 RDB 持久化差不多),并且在故障时只会丢失 1 秒钟的数据

appendfsync everysec

#从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择

appendfsync no

从上面三种AOF持久化时机来看。为了保证不遗失数据。appendfsync always是最安全的。