redis 简单配置和集群

下载和编译

redis官网:http://redis.io/
redis中文:http://www.redis.cn/
redis快速上手:http://redis.io/topics/quickstart

下载,解压,编译

1
2
3
4
[root@linux1 Downloads]# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
[root@linux1 Downloads]# tar zxf redis-3.0.7.tar.gz
[root@linux1 Downloads]# cd redis-3.0.7
[root@linux1 Downloads]# make

编译完成之后会在./src目录中生成4个文件

redis-server Redis服务器的daemon启动程序
redis-cli Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
redis-stat Redis状态检测工具,可以检测Redis当前状态参数及延迟状况

初次运行

二进制文件是编译完成后在src目录下。默认端口是6379,运行如下:

1
[root@linux1 redis-3.0.7]# src/redis-server

redis默认运行不是静默的方式,使用ctrl + c停止redis服务

指定配置文件启动redis

1
[root@linux1 src]# ./redis-server ../redis.conf

自带的客户端连接redis服务

1
2
[root@linux1 src]# ./redis-cli
127.0.0.1:6379>

停止redis服务

1
2
3
4
5
6
7
$ ./redis-cli shutdown
$ ./redis-cli -p 6380 shutdown #关闭指定端口的redis服务
$ pkill redis
$ ps -ef | grep redis
$ kill -9 pid

install方式安装

编译安装

1
2
3
4
5
[root@linux2 redis-3.0.7]# mkdir /usr/local/redis
[root@linux2 redis-3.0.7]# make
[root@linux2 redis-3.0.7]# make PREFIX=/usr/local/redis install
[root@linux2 redis-3.0.7]# ls /usr/local/redis
bin

性能测试

使用redis-benchmark测试

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
[root@linux2 bin]# ./redis-benchmark -t GET,SET
====== SET ======
100000 requests completed in 1.68 seconds
50 parallel clients
3 bytes payload
keep alive: 1
94.12% <= 1 milliseconds
99.62% <= 2 milliseconds
99.90% <= 3 milliseconds
99.92% <= 4 milliseconds
99.95% <= 9 milliseconds
100.00% <= 9 milliseconds
59417.71 requests per second
====== GET ======
100000 requests completed in 1.44 seconds
50 parallel clients
3 bytes payload
keep alive: 1
98.93% <= 1 milliseconds
99.91% <= 2 milliseconds
99.95% <= 3 milliseconds
99.97% <= 5 milliseconds
100.00% <= 5 milliseconds
69300.07 requests per second
[root@linux2 bin]# ./redis-benchmark -t GET,SET -q # 精简输出
SET: 70422.54 requests per second
GET: 69735.01 requests per second

redis服务集群配置

使用单机的方式演示集群,多机器类似

创建两个文件夹

用于分别部署masterslave

1
2
3
4
[root@linux1 redis-3.0.7]# mkdir -p /usr/local/redis/bin
[root@linux1 redis-3.0.7]# mkdir -p /usr/local/redis/run
[root@linux1 redis-3.0.7]# mkdir -p /usr/local/redis1/bin
[root@linux1 redis-3.0.7]# mkdir -p /usr/local/redis1/run

复制编译好的文件

将刚才编译好的二进制文件和配置文件,分别复制到刚才创建好的文件夹中

1
2
3
4
5
6
[root@linux1 redis-3.0.7]# cd src/
[root@linux1 src]# cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
[root@linux1 src]# cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis1/bin
[root@linux1 src]# cp ../redis.conf /usr/local/redis/bin
[root@linux1 src]# cp ../redis.conf /usr/local/redis1/bin

配置master

1
2
3
4
5
6
7
8
9
[root@linux1 ~]# cd /usr/local/redis/bin
[root@linux1 bin]# vi redis.conf
daemonize no
设置为后台运行:
daemonize yes
pidfile /var/run/redis.pid
修改pid文件的位置,设置为:
pidfile /usr/local/redis/run/redis.pid

配置slave

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@linux1 ~]# cd /usr/local/redis1/bin
[root@linux1 bin]# vi redis.conf
daemonize no
设置为后台运行:
daemonize yes
port 6379
将端口号6379修改为:
port 6380
pidfile /var/run/redis.pid
修改pid文件的位置,设置为:
pidfile /usr/local/redis1/run/redis.pid
# slaveof <masterip> <masterport>
设置master机器的ip和端口号,设置为:
slaveof 127.0.0.1 6379
# masterauth <master-password>
如果master主机设置了密码,设置为:
masterauth <master-password>

启动集群

分别启动masterslave服务

1
2
[root@linux1 bin]# ./redis-server redis.conf
[root@linux1 bin]# ./redis-server redis.conf

查看master服务的信息

1
2
3
4
5
6
7
8
9
10
11
12
[root@linux1 bin]# ./redis-cli
127.0.0.1:6379> info
# Replication #查看此节点的信息
role:master #当前服务的角色是master
connected_slaves:1 #现在有一台`slave`的机器,下面显示的是IP和端口和状态信息
slave0:ip=127.0.0.1,port=6380,state=online,offset=71,lag=1
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70

查看slave服务的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@linux1 bin]# ./redis-cli -p 6380
127.0.0.1:6380> info
# Replication
role:slave #当前服务的角色是slave
master_host:127.0.0.1 #master机器的IP
master_port:6379 #master机器的端口
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:323
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

测试

masterslave现在都没有数据

1
2
3
4
5
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6380> keys *
(empty list or set)

master服务中写入数据

1
2
3
4
5
6
127.0.0.1:6379> set name Jerry.Chen
OK
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"Jerry.Chen"

slave服务中查看数据

1
2
3
4
127.0.0.1:6380> keys *
1) "name"
127.0.0.1:6380> get name
"Jerry.Chen"

redis.conf 配置文件

1
2
[root@linux1 ~]# cd /usr/local/redis/bin
[root@linux1 bin]# vi redis.conf

daemonize

是否后台运行,默认是no,修改为yes,即可以在后台运行了

requirepass

设置redis服务的密码,默认未开启,查找# requirepass foobared,然后修改进行开启密码。如果开启了密码,命令行操作方式

1
2
[root@linux1 bin]# ./redis-server -a foobared
127.0.0.1:6379> auth foobared

pidfile

redis服务的pid文件位置

timeout

请求超时时间

loglevel

log信息级别

logfile

log文件位置

databases

开启数据库的数量,默认是16个

save

保存快照的频率,第一个表示多长时间,第三个表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

appendonly

默认是no,可以写yes。这个选项就是负责是否开启AOF日志的开关。AOF日志,你可以简单理解为MySQL binlog一样的东西,作用就是记录每次的写操作,在遇到断电等问题时可以用它来恢复数据库状态。但是他不是二进制的,而是文本的,一行一行,写得很规范。如果你是一台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
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
############################## 仅追加方式 ###############################
#默认情况下Redis会异步的将数据导出到磁盘上。这种模式对许多应用程序已经足够了,
#但是如果断电或者redis进程出问题就会导致一段时间内的更新数据丢失(取决与配置项)
#
#这种只增文件是可选的能够提供更好的体验的数据持久化策略。
#举个例子,如果使用默认的配置数据fsync策略,在服务器意外断电的情况下redis只会丢失一秒中内的更新数据,
#或者当redis进程出问题但操作系统运转正常时,redis只会丢失一个数据更新操作。
#
#AOF 和 RDB 持久化方式可以同时启动并且无冲突。
#如果AOF开启,启动redis时会加载aof文件,这些文件能够提供更好的保证。
#请在 http://redis.io/topics/persistence 获取更多数据持久化信息。
appendonly no
# 只增文件的文件名称。(默认是appendonly.aof)
# appendfilename appendonly.aof
#调用fsync()函数会通知操作系统真正将数据写入磁盘,而不是等待缓冲区中有更多数据。
#有些操作系统会将数据输出到磁盘,有些操作系统只是ASAP。
#
#redis支持三种不同的方式:
#
#no:不调用,之等待操作系统来清空缓冲区当操作系统要输出数据时。很快。
# always: 每次更新数据都写入仅增日志文件。慢,但是最安全。
# everysec: 每秒调用一次。折中。
#
#默认是每秒中一次,因为它往往是在速度和数据安全两者之间的折中选择。
#如果你可以接受让操作系统去自动清空缓存,你可以将这项配置降低到'no'(如果你可以接受一段时间的数据丢失,默认的rdb就足够了),
#这完全取决与你。如果你想要一个更好的体验或者从相反的角度,使用'always',这样会很慢,但是比'everysec'安全些。
#
#请在下面的文章中获取更多细节知识:
# http://antirez.com/post/redis-persistence-demystified.html
#
#如果你不是很清楚这三项之间的区别,或者不知道哪种适合你的机器,就是用默认吧。
# appendfsync always
appendfsync everysec
# appendfsync no
#当AOF策略设置为'always'或者'everysec'的时候,后台的保存进程会进行很多磁盘I/O操作,
#在某些linux结构中redis会在调用sync()方法时阻塞很长时间。记住,现在还没办法解决这个问题,即使在不同进程中进行调用也会block。
#
#使用如下配置可能会缓解这个问题,这样会在存储大数据或者BIGREWRITEAOF的时候不会在主进程中调用fsync()方法。
#
# 这表示,如果另外一个子进程在进行保存操作,redis的表现如同配置为‘appendfsync no’。
#在实际应用中,这表示在最坏的情景下(使用linux默认配置)可能会丢失30秒日志。
#
#如果你有特殊的情况可以配置为'yes'。但是配置为'no'是最为安全的选择。
no-appendfsync-on-rewrite no
#自动重写只增文件。
#redis可以自动盲从的调用‘BGREWRITEAOF’来重写日志文件,如果日志文件增长了指定的百分比。
#
#它是这样工作的:每次rewrite后redis会记录日志文件的大小。(如果重启后没有重写后的大小,就默认用日志文件大小)
#
# 这个基准日志大小和当前日志大小做比较。如果当前大小比指定的百分比,重写机制就会被触发。
#同时,你也要制定一个重写下线,用来避免增长百分比够了,但是日志文件还很小的情况。
#
#指定百分比为0可以注掉自动重写日志文件功能。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
运行流程

既然是log文件,而且是要用于恢复的,那么我们动动脚趾都能想到,这玩意肯定会越来越大,不管你的应用是大是小,如果AOF文件只增不减的话,那文件将会无限长大,这个问题是所有binlog都会遇到的。而通常遇到这种问题都会有一个rotate方案。就是当日志达到一定大小或者每隔一段时间将日志写到新的一个文件中,旧日志文件可以用来备份或其它。

而Redis的AOF还和rotate略有不同,他用了一种比较简单的方法,就是先给当前的所有数据做一个快照。然后再在这个快照的基础上写接下来的日志。
照快照的好处是,你之前可能用了10w次操作共改变了100条数据(比如在一条数据上进行了多次操作)。那这时你AOF中的10w条写操作记录就变成了100条记录。相当于将前面的执行全部合并了。原本很大AOF变小了。

执行这个操作的命令是:BGREWRITEAOF (background rewrite append only file)

这个快照长什么样呢?基本和一般的写日志没什么两样,也是一条一条的写记录。。比如现在Redis中总共存了3条string类型的数据a=>1,b=>2,c=>3。那这个快照的基本内容就是写入a=>1,写入b=>2,写入c=>3

这时候要用AOF进行恢复的时候,只要先执行了前面几条,就能够恢复当前状态,然后再执行之后来的写操作,就能完全重现数据了。

您的赞赏将鼓励我继续分享!
Fork me on GitHub