開發人員學Linux(12):CentOS7安裝配置Memcached和Redis

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伺服器端工具,體積相當小僅僅就一個網頁,需要的可以從gitee.com/zhoufoxcn/Mem下載,那一個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 n

可以通過執行如下命令來查看Memcached的運行情況:

ps -ef |grep memcached

或者通過查看埠11211的監聽情況:

netstat -anp | grep 11211

3.3編譯安裝Redis

cd /rootntar xzf redis-4.0.2.tar.gzncd redis-4.0.2nmakenmake PREFIX=/usr/local/redis installn

注意上面的命令中「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很獨特的啟動界面,如下:

4.配置

4.1Memcached配置

4.1.1Memcached常用參數說明

在前面的安裝過程中簡要介紹了一下如何在命令行下運行Memcached,但大部分都是採用了默認設置,實際上Memcached支持更多靈活設置,下面介紹一下Memcached的啟動參數。

Memcached常用參數說明:

-p:t設置埠號(默認為: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]nDescription=memcached 1.5.2nAfter=network.targetn n[Service]n#PIDFile=/usr/local/memcached/memcached.pidnType=forkingnExecStart=/usr/local/memcached/bin/memcached -d -m 256 -u root -p 11211nExecStop=/bin/kill -s QUIT $MAINPIDnPrivateTmp=truen n[Install]nWantedBy=multi-user.targetn

然後增加執行許可權:

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

然後可以執行如下命令來檢驗是否配置正確:

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]nDescription=RedisnAfter=network.targetnn[Service]nExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.confnExecStop=/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdownnn[Install]nWantedBy=multi-user.targetn

然後增加執行許可權:

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

然後可以執行如下命令來檢驗是否配置正確:

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); t// Admin Usernamendefine(ADMIN_PASSWORD,123456); t// Admin Passwordndefine(DATE_FORMAT,Y/m/d H:i:s);ndefine(GRAPH_SIZE,200);ndefine(MAX_ITEM_DUMP,50);nn$MEMCACHE_SERVERS[] = 127.0.0.1:11211; // add more as an arrayn

主要修改管理員登錄用戶名、密碼和Memcached伺服器信息即可。修改後將其放入任何一可支持php的web環境下,即可在輸入身份驗證信息後查看MemCached伺服器狀態,如下圖所示:

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/即可看到如下界面:

可以從管理界面上對key/value管理,也可以點擊那個藍色的感嘆號按鈕查看Redis伺服器信息,如下圖所示:

上文提到的另一個Redis管理工具Redis Desktop Manager比這個要直觀一點,不過需要根據操作的本地計算機的操作系統類型不同而選擇不同版本。

6.總結

本文主要講述了NoSQL領域的兩個比較常用的應用Memcached和Redis來介紹其安裝和配置過程,並捎帶講述了一下可視化管理界面。其實在NoSQL領域還有其它不錯的解決方案,比如mongodb等。另外,時間有限沒有講如何集群化部署了,見過有人使用Memcached作為集群站點的Session伺服器,大家有興趣可以研究一下。


推薦閱讀:

Redis 性能比 Memcached 好嗎?有哪些網站採用 Redis?使用 Memcached 的出色網站有哪些?
redis、memcache和mongodb各自的優點是什麼,怎麼選擇呢?
Redis 的極限壓力為啥大於 Memcache?
memcached怎麼樣mysql結合使用?

TAG:NoSQL | Redis | Memcached |