開發人員學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服務器端工具,體積相當小僅僅就一個網頁,需要的可以從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三處博客發佈,本人會負責在此四處答疑。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章