网上译文:如何在Ubuntu 16.04上安装并配置Redis
原文:How To Install and Configure Redis on Ubuntu 16.04
结合GitHub安装介绍 的添加版(默认安装64位):
内容介绍
Redis是一套内存内键-值存储方案,向来以出色的灵活性、性能与广泛的语言支持能力而著称。今天,我们将共同了解如何在Ubuntu 16.04服务器上安装并配置Redis。
先决条件
要完成本教程,大家首先需要接入一套Ubuntu 16.04服务器。另外,还需要一个非root用户并以sudo权限执行各项命令。关于这部分内容,请参阅Ubuntu 16.04 初始服务器设置指南一文。
准备就绪后,利用sudo用户登入Ubuntu 16.04服务器。
安装Build并测试依赖
为了获取Redis的最新版本,我们将用源码编译安装该软件。在代码下载完成前,我们需要满足构建依赖以至于可以编译该软件。
首先从Ubuntu仓储安装build-essential meta-package。另外还需要下载tcl软件包以用于二进制代码测试。
我们可以通过以下命令更新本地apt软件包缓存并安装依赖:
sudo apt-get update
sudo apt-get install build-essential tcl
Redis 有一些依赖被包含在 deps 目录下。make 命令不会自动的重建依赖,即使以来的源码发生改变。
当用 git pull 命令来更新源码时或者当依赖关系树中的代码以任何其他方式修改时,确保使用一下命令来真正地清理掉所有东西并从头开始重建
make distclean
这个命令将清理掉jemalloc, lua, hiredis, linenoise.
下载、编译并安装Redis
接下来开始构建Redis。
下载并提取源代码
由于我们不需要保留源代码,所以直接在/tmp目录内进行build:
Since we won't need to keep the source code that we'll compile long term (we can always re-download it), we will build in the /tmp
directory. Let's move there now:
cd /tmp
现在下载Redis最新稳定版,大家可以使用一直可用的稳定版下载URL:
curl -O http://download.redis.io/redis-stable.tar.gz
解压tar:
tar xzvf redis-stable.tar.gz
前往Redis解压目录:
cd redis-stable
Build并安装Redis
现在对Redis二进制代码进行编译:
make
编译完成后,运行测试套件以确保built正确:
make test
这一过程通常需要几分钟。完成后,大家可以使用以下命令进行安装:
sudo make install
You can use make PREFIX=/some/other/directory install
if you wish to use a different destination.
关于分配器问题:
在构建 Redis 结束的时候可以通过设置 MALLOC 环境变量来选择一个非默认的内存分配器。Redis默认使用 libc malloc 进行编译链接,除了Linux系统上缺省jemalloc 使用之外。挑选这个默认值是因为jemalloc已经证明比libc malloc更少的碎片问题。
强制使用 libc malloc
make MALLOC=libc
在Mac OS X系统上针对jemalloc进行编译
make MALLOC=jemalloc
make 安装将仅仅会在系统上安装二进制文件,但是不会配置初始化脚本和在合适的地方配置文件。如果你仅仅是想要玩一下就可以忽略配置,使用默认就好;但是如果你安装是为了在生产环境中使用,在Ubuntu 和 Debian 系统上我们有一个脚本专门进行配置的(如果运行以下脚本,默认设置会和原文在名称上有所冲突,但也可更改。如果按照本文逐条设置将不会成功)。
cd utils
./install_server.sh
这个脚本将会问你几个简单的问题,并将设置一切所需,以便将Redis作为后台守护程序正常运行,这将在系统重新启动时重新开始。
你可以通过使用脚本名字/etc/init.d/redis_<portnumber>
开启和停止Redis。
配置Redis
Redis已经安装完成,接下来进行配置。首先创建一个配置目录,这里我们使用/etc/redis目录:
sudo mkdir /etc/redis
将Redis源归档文件内的示例Redis配置文件复制进来:
sudo cp /tmp/redis-stable/redis.conf /etc/redis
而后打开文件并进行调整:
sudo nano /etc/redis/redis.conf
在文件中找到supervised命令。现在其被设置为no。由于我们运行的操作系统使用systemd init系统,因此需要将其变更为systemd:
/etc/redis/redis.conf
. . .
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
# supervised no - no supervision interaction
# supervised upstart - signal upstart by putting Redis into SIGSTOP mode
# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
# supervised auto - detect upstart or systemd method based on
# UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
# They do not enable continuous liveness pings back to your supervisor.
supervised systemd
. . .
下面找到dir目录。此选项指定Redis用于放置持久数据的目录。我们需要挑选合适的位置,并确保Redis有权限写入但普通用户无权查看。
这里我们使用/var/lib/redis目录,稍后进行创建:
/etc/redis/redis.conf
. . .
# 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 /var/lib/redis
. . .
完成后保存并退出。
创建Redis systemd Unit文件
接下来,我们可以创建一个systemd unit文件,从而利用该init系统管理Redis进程。
首先创建并打开/etc/systemd/system/redis.service文件:
sudo nano /etc/systemd/system/redis.service
在这里,我们在[Unit]部分处添加一条描述,定义要求网络在服务启动前必须处于可用状态:
/etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
在[Service]部分,我们需要指定该服务的运作方式。出于安全考虑,我们不应以root方式运行服务。我们应当使用专用用户及群组,并以此调用redis。我们稍后再创建这部分内容。
要启动服务,我们只需要在配置中调用redis-server二进制文件。要将其关闭,则可使用Reids的shutdown命令,其可利用redis-cli加以执行。另外,由于我们希望Redis能够在故障情况下得到恢复,因此需要将Restart指令设定为“always”:
/etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
最后在[Install]部分,我们将systemd定义为在该服务可用时始终关联(即在引导过程中即行启动):
/etc/systemd/system/redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
[Service]
User=redis
Group=redis
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=always
[Install]
WantedBy=multi-user.target
完成后保存并退出。
注: 我不知道为什么我的不能运行错误信息是
sudo systemctl status redis
● redis.service - Redis In-Memory Data Store
Loaded: loaded (/etc/systemd/system/redis.service; disabled; vendor preset:
Active: inactive (dead)
May 30 16:12:35 ubuntu systemd[1]: redis.service: Service hold-off time over,
May 30 16:12:35 ubuntu systemd[1]: Stopped Redis In-Memory Data Store.
May 30 16:12:35 ubuntu systemd[1]: Started Redis In-Memory Data Store.
May 30 16:12:35 ubuntu systemd[1]: redis.service: Service hold-off time over,
May 30 16:12:35 ubuntu systemd[1]: Stopped Redis In-Memory Data Store.
May 30 16:12:35 ubuntu systemd[1]: Started Redis In-Memory Data Store.
May 30 16:12:36 ubuntu systemd[1]: redis.service: Service hold-off time over,
May 30 16:12:36 ubuntu systemd[1]: Stopped Redis In-Memory Data Store.
May 30 16:12:36 ubuntu systemd[1]: redis.service: Start request repeated too q
May 30 16:12:36 ubuntu systemd[1]: Failed to start Redis In-Memory Data Store.
在/etc/systemd/system/redis.service 文件 [Service] 中 加上 Type=forking 后解决。
创建Redis用户、群组与目录
现在我们创建前两个文件所引用的用户、群组与目录。
首先创建reids user与group,命令如下:
sudo adduser --system --group --no-create-home redis
现在创建/var/lib/redis目录:
sudo mkdir /var/lib/redis # 设置这样的一个目录是因为在redis.conf配置文件中设置了该路径为数据存储路径
为redis user与group分配此目录的所有权:
sudo chown redis:redis -R /var/lib/redis
# redis 的日志目录也需要设置,如果设定的话
sudo chown redis:redis /var/log/redis_6379.log(脚本自行设置的名称)
调整权限以确保普通用户无法访问该位置:
sudo chmod 770 /var/lib/redis
启动并测试Redis
现在,我们可以启动Redis服务器了。
启动Redis服务
下面启动此systemd服务:
sudo systemctl start redis
检查服务中是否存在错误:
sudo systemctl status redis
结果应如下所示:
Output
● redis.service - Redis Server
Loaded: loaded (/etc/systemd/system/redis.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2016-05-11 14:38:08 EDT; 1min 43s ago
Process: 3115 ExecStop=/usr/local/bin/redis-cli shutdown (code=exited, status=0/SUCCESS)
Main PID: 3124 (redis-server)
Tasks: 3 (limit: 512)
Memory: 864.0K
CPU: 179ms
CGroup: /system.slice/redis.service
└─3124 /usr/local/bin/redis-server 127.0.0.1:6379
. . .
测试Redis实例功能
要测试服务是否正常起效,首先使用以下命令接入Redis服务器:
redis-cli
在提示符中测试连接情况:
127.0.0.1:6379> ping
输出结果如下:
Output
PONG
大家可以设置需要的返回结果:
127.0.0.1:6379> set test "It's working!"
Output
OK
现在再次检查:
127.0.0.1:6379> get test
取得的则为预存值:
Output
"It's working!"
退出Redis提示符并返回shell:
127.0.0.1:6379> exit
作为最后一步测试,我们重启Redis实例:
sudo systemctl restart redis
现在再次接入客户端并确认测试值仍然可用:
redis-cli
127.0.0.1:6379> get test
返回的值应该仍然为:
Output
"It's working!"
#如果失败可能是因为数据未持久化,重启服务导致数据丢失。
完成后再次返回shell:
exit
确保Redis在引导过程中启用
如果测试圆满成功,接下来要做的是确保Redis在引导过程中自动启用。
具体命令如下:
sudo systemctl enable redis
Output
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /etc/systemd/system/redis.service.
总结
现在大家已经完成了Redis实例的安装与配置。要了解更多与Redis保护相关的内容,请参阅如何在Ubuntu 14.04上保护Redis (从第三步开始)。虽然此文面向Ubuntu 14.04编写,但基本完全适用于16.04版本。
另
一些命令吧:
redis-cli -p 6379 info server # 显示redis信息
/etc/init.d/redis_6379 start/stop/status #
其实 install_server.sh 脚本已经做了上面的工作,只是名称不同。注意保持一下文件在个文件中名称一致,以及权限拥有问题。
以下是我的配置:
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
网友评论