redis 程序运行过程并不会消耗太多的 CPU 和 IO 资源(主要消耗memory),如是在单台机器上如果只启用一个redis实例会造成资源浪费 。同时为了增加可用性,一般也不会在单机上只运行一个redis实例,本篇就介绍下,如何在单上运行多个 redis 实例(运行在不同端口)。

一、redis-server的安装

由于我现网的机器使用的是ubuntu系统,所以这里就以ubuntu为例,可以直接使用apt源安装redis-server

1$ sudo apt-get install redis-server

安装完成后,可以使用dpkg命令查看各文件所在的路径:

 1$ sudo dpkg -L redis-server
 2/.
 3/etc
 4/etc/default
 5/etc/default/redis-server
 6/etc/redis
 7/etc/redis/redis.conf
 8/etc/redis/sentinel.conf
 9/etc/init.d
10/etc/init.d/redis-server
11/etc/logrotate.d
12/etc/logrotate.d/redis-server
13/var
14/var/log
15/var/log/redis
16/var/lib
17/var/lib/redis
18/usr
19/usr/bin
20/usr/bin/redis-server
21/usr/share
22/usr/share/man
23/usr/share/man/man1
24/usr/share/man/man1/redis-server.1.gz
25/usr/share/doc
26/usr/share/doc/redis-server
27/usr/share/doc/redis-server/copyright
28/usr/bin/redis-sentinel
29/usr/share/doc/redis-server/changelog.Debian.gz

其中/usr/bin/redis-server为程序执行文件,/etc/redis/redis.conf为配置文件,/etc/init.d/redis-server为自启动文件 。单实例时,可以通过sudo /etc/init.d/redis-server start 启动。

二、运行多实例redis

默认的配置文件内容为:

 1$ egrep -v '^#|^$' redis.conf
 2daemonize yes
 3pidfile /var/run/redis/redis-server.pid
 4port 6379
 5bind 127.0.0.1
 6timeout 0
 7tcp-keepalive 0
 8loglevel notice
 9logfile /var/log/redis/redis-server.log
10databases 16
11save 900 1
12save 300 10
13save 60 10000
14stop-writes-on-bgsave-error yes
15rdbcompression yes
16rdbchecksum yes
17dbfilename dump.rdb
18dir /var/lib/redis
19slave-serve-stale-data yes
20slave-read-only yes
21repl-disable-tcp-nodelay no
22slave-priority 100
23appendonly no
24appendfilename "appendonly.aof"
25appendfsync everysec
26no-appendfsync-on-rewrite no
27auto-aof-rewrite-percentage 100
28auto-aof-rewrite-min-size 64mb
29lua-time-limit 5000
30slowlog-log-slower-than 10000
31slowlog-max-len 128
32notify-keyspace-events ""
33hash-max-ziplist-entries 512
34hash-max-ziplist-value 64
35list-max-ziplist-entries 512
36list-max-ziplist-value 64
37set-max-intset-entries 512
38zset-max-ziplist-entries 128
39zset-max-ziplist-value 64
40activerehashing yes
41client-output-buffer-limit normal 0 0 0
42client-output-buffer-limit slave 256mb 64mb 60
43client-output-buffer-limit pubsub 32mb 8mb 60
44hz 10
45aof-rewrite-incremental-fsync yes

具体配置文件中参数的意思,可以参看 redis配置文件详解 。假设我们现在要再启动两个redis实例,监听端口分别是6378、6376,只需要复制一份redis.conf配置文件并做下修改再通过redis-server启动即可。

以redis监听6378端口为例,只需要修改如下几部分,其他配置部他仍使用默认即可:

1pidfile /var/run/redis/redis-server6378.pid
2port 6378
3logfile /var/log/redis/redis-server6378.log
4dir /opt/redis6378
5vm-swap-file /opt/redis6378/redis.swap

其中dir存储路径也可以就用默位置/var/lib/redis ,不过dbfilename就不能再用默认的dump.rdb,可以使用dump6378.rdb。不过此处还是建议不同的redis实例存放在不同的路径。

修改完配置文件,通过下面的命令就可以启动新的redis实例:

1# sudo /usr/bin/redis-server /etc/redis/redis6378.conf 

不过这时启动后,通过ps命令查看会发现一个问题,原来的默认redis实例是以redis用户启动,而新的redis实例则会以root用启动。

1yang@crunchbang:/var/lib/redis$ ps auxf|grep redis
2yang      4296  0.0  0.0   8060   864 pts/0    S+   05:41   0:00      |       _ grep redis
3redis     3837  0.0  0.0  35912  1492 ?        Ssl  05:22   0:00 /usr/bin/redis-server /etc/redis/redis.conf
4root      4275  0.0  0.0  35912  1480 ?        Ssl  05:37   0:00 /usr/bin/redis-server /etc/redis/redis6378.conf

通过查看/etc/init.d/redis-server自启动文件会发现,自启动在start时使用的语句为:

1start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS

此处同样,可以依葫芦画瓢。复制sudo cp /etc/init.d/redis-server /etc/init.d/redis6378 ,复制完成后,修改以下几项:

1DAEMON_ARGS=/etc/redis/redis6378.conf
2NAME=redis-server
3DESC=redis6378-server
4RUNDIR=/var/run/redis
5PIDFILE=$RUNDIR/redis-server6378.pid

修改完后,也以redis6378配置文件启动就行了。再通过ps查看,发现同样也会是以redis用户运行的进程。想要再加6376、6375等多个实例,还按上面的方法操作就OK了。