1.前言

上一篇讲述了持续集成工具Jenkins的使用,本篇讲述现在比较流行的两个NoSQL数据库Memcached和Redis的安装和使用。


Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的HashMap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。做过Java或C#中Web应用的可以把它类比于application这个对象,相当于一个内存中的字典,可以实现根据key到value的快速映射查询,所不同的是application对象中缓存的数据只能供同一个进程内的其它对象访问,而Memcached可以提供给跨服务器的其它进程访问。

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

总体说来,同为Key-Value类型的存储系统,Memcached与Redis有几个大的不同之处:

身份验证:Memcached不支持身份验证,Redis支持简单身份验证;

持久化:Memcached不支持持久化,Redis支持持久化;

存储类型:Memcached进支持string(字符串),Redis支持string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。

内存占用:在Memcached中所有没有过期的数据都会在内存中保存,而在Redis中并不是所有数据一直保存在内存中,Redis会根据一定算法将不常用的value写入到硬盘中(与key有关的数据会一直保存在内存中);

分布式:Memcached本身没有带分布式功能,需要客户端实现分布式算法(比较常用的是一致性哈希算法,consistent hashing),而Redis的分布式由服务器端来实现。

事务性:Memcached本身没有事务的概念,但是可以通过CAS协议来保证一致性;Redis引入数据库中的事务概念来保证数据的完整性和一致性。


本人在项目中都用过这两种NoSQL,下面讲一讲它们的安装和使用。


2.准备

2.1.libevent-2.1.8

这是Memcached的依赖库,需要在编译安装Memcached之前编译安装好,下载地址为:https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz。

2.2.Memcached

官方网址为:http://memcached.org/,最新版为1.5.2,下载地址:http://memcached.org/files/memcached-1.5.2.tar.gz。

2.3.Redis

官方网址为:https://redis.io/,最新版本为4.0.2,下载地址为:http://download.redis.io/releases/redis-4.0.2.tar.gz。

2.4 PHP版Memcached管理程序memcache

注意这个不是指Memcached程序,而是一个用PHP编写的Memcached服务器端工具,体积相当小仅仅就一个网页,需要的可以从https://gitee.com/zhoufoxcn/MemcachedMonitor.git下载,那一个php网页即是。另一个ASPX文件是本人写过的一个单网页版ASP.NET服务器端程序。

注:还有一个比较有名的PHP网页管理程序叫MemAdmin,网址是:http://www.junopen.com/memadmin/,下载地址为:http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz,安装的时候需要安装PHP memcache扩展,过程稍微复杂一些,但功能也多一些。

2.5.PHP版Redis管理程序phpRedisAdmin

这是一个php脚本编写的redis管理工具,git版本库地址为:https://github.com/erikdubbelboer/phpRedisAdmin,这个工具还需要另外一个php库支持,它的git版本库地址为https://github.com/nrk/predis.git,具体做法就是将predis库放在phpRedisAdmin目录下的vendor子目录下即可。当然也可以使用Redis Desktop Manager,这个一个非Web管理工具,支持常见的操作系统。

提示:在安装过程中经常会遇到提示运行make test,在编译安装Redis时如果你运行make test会得到提示“You need tcl 8.5 or newer in order to run the Redis test”,可以通过命令“yum install –y tcl”来安装。

3.编译安装

假定libevent-2.1.8-stable.tar.gz、memcached-1.5.2.tar.gz及redis-4.0.2.tar.gz都下载后放在服务器/root目录下。

3.1编译安装libevent

首先检查有没有安装libevent

rpm -q libevent

如果有,则运行如下命令卸载:

rpm -e --nodeps libevent-2.0.21-4.el7.x86_64


接着就运行下面的命令来编译安装libevent了。

cd /root

tar zxvf libevent-2.1.8-stable.tar.gz

cd libevent-2.1.8-stable

./configure --prefix=/usr/local/libevent/

make && make install

如果没有错误则编译安装成功,安装目的路径为:/usr/local/libevent。


测试libevent是否安装成功:

ls -al /usr/local | grep libevent

3.2编译安装Memcached

运行如下命令对Memcached进行编译安装:

cd /root

tar -xvf memcached-1.5.2.tar.gz

cd memcached-1.5.2

./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent/

make && make install

如果没有错误,则编译安装成功,安装目的路径为:/usr/local/memcached,通过如下命令查看:

[root@common ~]# ls -an /usr/local/memcached/

total 0

drwxr-xr-x   5 0 0  45 Oct 21 15:58 .

drwxr-xr-x. 19 0 0 265 Oct 25 16:42 ..

drwxr-xr-x   2 0 0  23 Oct 21 15:58 bin

drwxr-xr-x   3 0 0  23 Oct 21 15:58 include

drwxr-xr-x   3 0 0  17 Oct 21 15:58 share


可以通过执行如下命令来启动Memcached:

/usr/local/memcached/bin/memcached -u root –d 

可以通过执行如下命令来查看Memcached的运行情况:

ps -ef |grep memcached

或者通过查看端口11211的监听情况:

netstat -anp | grep 11211

3.3编译安装Redis

cd /root

tar xzf redis-4.0.2.tar.gz

cd redis-4.0.2

make

make PREFIX=/usr/local/redis install


注意上面的命令中“PREFIX”要大写,通常在一遍编译安装时是小写的,我在安装的时候也用小写,结果无法安装到/usr/local/redis目录,在/usr/local/redis/bin目录下有6个文件,如下:

[root@common ~]# ls -an /usr/local/redis/bin

total 21768

drwxr-xr-x 2 0 0     134 Oct 25 16:42 .

drwxr-xr-x 4 0 0      28 Oct 25 16:44 ..

-rwxr-xr-x 1 0 0 2450872 Oct 25 16:42 redis-benchmark

-rwxr-xr-x 1 0 0 5742384 Oct 25 16:42 redis-check-aof

-rwxr-xr-x 1 0 0 5742384 Oct 25 16:42 redis-check-rdb

-rwxr-xr-x 1 0 0 2605144 Oct 25 16:42 redis-cli

lrwxrwxrwx 1 0 0      12 Oct 25 16:42 redis-sentinel -> redis-server

-rwxr-xr-x 1 0 0 5742384 Oct 25 16:42 redis-server

在上述文件中,其中:

redis-benchmark:性能测试工具,测试Redis在你的系统及配置下的读写性能;

redis-check-aof:用于修复出问题的aof文件;

redis-check-rdb:用于修复出问题的rdb文件;

redis-cli:Redis的命令行操作工具;

redis-sentinel:Redis的集群管理工具;

redis-server:Redis的服务端启动程序


然后执行如下命令将配置文件移动到redis安装目录下

mkdir /usr/local/redis/etc

cp redis.conf /usr/local/redis/etc

因为默认情况下Redis不是在后台运行,需要更改redis.conf中的配置:

vim /usr/local/redis/etc/ redis.conf

将redis.conf中的“daemonize”改为yes。


通过如下命令可以启动Redis:

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

其中“/usr/local/redis/bin/redis-server”是redis监听程序的路径,“/usr/local/redis/etc/redis.conf”是配置文件路径。

启动成功后就可以看到Redis很独特的启动界面,如下:

01_RedisStart.png

 

4.配置

4.1Memcached配置

4.1.1Memcached常用参数说明

在前面的安装过程中简要介绍了一下如何在命令行下运行Memcached,但大部分都是采用了默认设置,实际上Memcached支持更多灵活设置,下面介绍一下Memcached的启动参数。

Memcached常用参数说明:

-p:设置端口号(默认为:11211)

-U:UDP监听端口(默认为 11211,为 0 时关闭)

-l:绑定地址(默认:所有都允许,即无论内外网或者本机都可访问,因为Memcached不支持身份验证所以有安全隐患,若设置为127.0.0.1就只能本机访问)

-d:独立进程运行

-u:绑定使用指定用于运行进程<username>

-m:允许最大内存用量,单位M (默认为 64 MB)

-P:将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与-d 一起使用

4.1.2将Memcached配置为service

为了省去每次开机后手动启动Memcached的麻烦,在/usr/lib/systemd/system/下创建memcached.service文件,文件内容如下:

[Unit]

Description=memcached 1.5.2

After=network.target

 

[Service]

#PIDFile=/usr/local/memcached/memcached.pid

Type=forking

ExecStart=/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=true

 

[Install]

WantedBy=multi-user.target


然后增加执行权限:

chmod 755 /usr/lib/systemd/system/memcached.service


然后可以执行如下命令来检验是否配置正确:

systemctl enable memcached.service:设置memcached这个service随系统一起启动

systemctl disable memcached.service:禁止memcached这个service随系统一起启动

systemctl start memcached.service:启动memcached这个service

systemctl stop memcached.service:停止memcached这个service


4.2Redis配置

4.2.1Redis常用参数说明

Redis的配置信息存放于redis.conf文件,主要有以下参数:

bind:指定只接受哪些IP的请求,如bind 192.168.1.100 10.0.0.1,默认为bind 127.0.0.1;

port:指定在哪个端口监听,默认为6379;

pidfile:指定pid文件位置,当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件 

daemonize:指定是否以守护进程方式运行服务,默认是no,大多数情况下需要将其改为yes;

timeout:当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能;

loglevel: 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

logfile: 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

databases: 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id

save: 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合,格式为:save <seconds> <changes>,例如默认的配置:

save 900 1

save 300 10

save 60 10000

分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改,当满足上述条件之一都会将数据同步到数据文件

rdbcompression:指定存储至本地数据库时是否压缩数据,默认为yes,开启了节约空间但多占用CPU,关闭了节约CPU但占用较大空间,视情况 选择

dbfilename:指定本地数据库文件名,默认值为dump.rdb,满足save参数指定的条件后数据就会同步到这个文件dir:指定本地数据库存放目录

slaveof:设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步,格式为:slaveof <masterip> <masterport>

masterauth:当master服务设置了密码保护时,slav服务连接master的密码

requirepass:设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭

maxclients:设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

maxmemory:指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

appendonly:指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中,默认为no

appendfilename:指定更新日志文件名,默认为appendonly.aof

appendfsync:指定更新日志条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快);always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全);everysec:表示每秒同步一次(折衷,默认值)

4.2.2将Redis配置为service

为了省去每次开机后手动启动Redis的麻烦,在/usr/lib/systemd/system/下创建redis.service文件,文件内容如下:

[Unit]

Description=Redis

After=network.target


[Service]

ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

ExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown


[Install]

WantedBy=multi-user.target


然后增加执行权限:

chmod 755 /usr/lib/systemd/system/redis.service


然后可以执行如下命令来检验是否配置正确:

systemctl enable redis.service:设置service随系统一起启动

systemctl disable redis.service:禁止service随系统一起启动

systemctl start redis.service:启动service

systemctl stop redis.service:停止service

5.检验配置

5.1Memcached状态查看

将memcache.php解压后放到Web服务器目录(当然服务器得配置支持php),在这里为图省事直接将其放置在/usr/local/nginx-1.12.0/html/nosql/目录(有关php与nginx的编译安装,请看本系列的第5篇及第7篇),然后打开/usr/local/nginx-1.12.0/html/nosql/memcache.php页面,里面包含了登录时的用户名和密码及服务器等配置信息,如下:

define('ADMIN_USERNAME','admin'); // Admin Username

define('ADMIN_PASSWORD','123456');  // Admin Password

define('DATE_FORMAT','Y/m/d H:i:s');

define('GRAPH_SIZE',200);

define('MAX_ITEM_DUMP',50);


$MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array


主要修改管理员登录用户名、密码和Memcached服务器信息即可。修改后将其放入任何一可支持php的web环境下,即可在输入身份验证信息后查看MemCached服务器状态,如下图所示:

02_Memcache.png  

5.2Redis状态查看

将从git版本库获取到的代码上传到/usr/local/nginx-1.12.0/html/nosql/phpRedisAdmin(有关php与nginx的编译安装,请看本系列的第5篇及第7篇,nginx-1.12.0安装在usr/local/nginx-1.12.0),然后启动Redis、Nginx和PHP-FPM,打开http://localhost/nosql/phpRedisAdmin/即可看到如下界面:

03_Redis.png 

可以从管理界面上对key/value管理,也可以点击那个蓝色的感叹号按钮查看Redis服务器信息,如下图所示:

04_Redis_stat.png 

上文提到的另一个Redis管理工具Redis Desktop Manager比这个要直观一点,不过需要根据操作的本地计算机的操作系统类型不同而选择不同版本。

6.总结

本文主要讲述了NoSQL领域的两个比较常用的应用Memcached和Redis来介绍其安装和配置过程,并捎带讲述了一下可视化管理界面。其实在NoSQL领域还有其它不错的解决方案,比如mongodb等。另外,时间有限没有讲如何集群化部署了,见过有人使用Memcached作为集群站点的Session服务器,大家有兴趣可以研究一下。


周金桥

2017-10-30


声明:本文首发于本人个人微信订阅号:zhoujinqiaoIT,其后会同时在本人的CSDN、51CTO及oschina三处博客发布,本人会负责在此四处答疑。

wKiom1j-owzQqrSXAABqxYT8jsM825.jpg