解析linux下安裝memcacheq(mcq)全過程筆記

來源:互聯網
上載者:User

memcacheQ是一個單純的分布式訊息佇列服務。
一,MEMCACHEQ的應用背景
Web應用中為什
麼會需要訊息佇列?主要原因是由於在高並發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達mysql,直接導致無數的行鎖表鎖,甚至最後請求會堆積過多,從而觸發too manyconnections錯誤。通過使用訊息佇列,我們可以非同步處理請求,從而緩解系統的壓力。在Web2.0的時代,高並發的情況越來越常見,從而使訊息佇列有成為居家必備的趨勢,相應的也湧現出了很多實現方案,像Twitter以前就使用RabbitMQ實現訊息佇列服務,現在又轉而使用Kestrel來實現訊息佇列服務,此外還有很多其他的選擇,比如說:ActiveMQ,ZeroMQ等。

上述訊息佇列的軟體中,大多為了實現AMQP,STOMP,XMPP之類的協議,變得極其重量級,但在很多Web應用中的實際情況是:我們只是想找到一個緩解高並發請求的解決方案,不需要雜七雜八的功能,一個輕量級的訊息佇列實現方式才是我們真正需要的。

二,MEMCACHEQ的特性
1 簡單易用
2 處理速度快
3 多條隊列
4 並發效能好
5 與memcache的協議相容。這就意味著只要裝了memcache的extension就可以了,不需要額外的外掛程式。

三,安裝
MEMCACHEQ依賴於libevent和BerkleyDB。
BerkleyDB用於持久化儲存隊列的資料。 這樣在MEMCACHEQ崩潰或者伺服器掛掉的時候,
不至於造成資料的丟失。這一點很重要,很重要。
它的安裝依賴於BerkeleyDB 和 libevent,所以要先安裝這BerkeleyDB和libevent:
其中libevent如果你安裝過memcached就已經安裝了,如果不確定,就檢查一下吧

1. 先檢查libevent, libevent-devel是否已經安裝:  rpm -qa|grep libevent 輸出中必須包含libevent, libevent-deve, 如果缺失,使用以下命令安裝:
yum install libevent yum
install libevent-devel
注意事項:libevent, libevent-devel優先使用yum安裝源,光碟片鏡像中的rpm包安裝,這樣穩定性和相容性可得到保證,網上流傳的使用源碼安裝libevent的方法會有問題,因為很可能系統已經安裝libevent, 再使用源碼安裝, 必然導致衝突,造成意外問題,所以一定要使用上述命令檢查系統是否已經安裝相應的庫

2. 安裝BerkleyDB
1.tar zxvf bdb-5.3.3.tar.gz
2.cd db-5.3.3/
#需要進入特定作業系統編譯環境,更常規軟體的編譯有些區別
3.cd build_unix/
4. ../dist/configure --prefix=/usr/local/berkeleydb
#如果沒有指定特殊安裝路徑,編譯完成,需要將Berkeley Db運行庫的路徑添加到系統配置裡面
echo "/usr/local/BerkeleyDB.5.3/lib/" >> /etc/ld.so.conf
#重載系統Ld運行庫
ldconfig
5. make & make install
記得改/etc/ld.so.conf檔案,添加/usr/local/BerkeleyDB.5.3/lib啊,不然後面的mcq會安裝錯誤。
而BerkeleyDB就要去下載了
點擊下載Berkeley DB 5.3.21.rar
下面安裝memcacheq,
先下載一個memcacheq-0.2.0.rar
解壓,進目錄
./configure –with-bdb=/usr/local/BerkeleyDB.5.1 –with-libevent=/usr/local/lib –enable-threads
make
make install
關鍵是紅色字型那一步,一定輸入正確,不然make不通過,無法安裝

下面是啟動
memcacheq -d -r -u root -p21201 -H /data/memcacheq -N -v -L 1024 -B 1024 > /data/mq_error.log 2>&1
這裡不推薦使用root使用者,有些文章裡說不可以,我這裡測試是可以的,不過可能會不安全。
1 下面是啟動時候的參數
使用memcacheq -h 的命令來查看命令列選項
2 這個是正確的啟動memcacheq:memcacheq -d -uroot -r -p11212 -H /home/wwwroot/mcq -N -R -v -L 1024 -B 1024 > /home/wwwlogs/mq_error.log 2 > &1
3 這個不知道為什麼就不行/usr/local/memcacheq/bin/memcacheq -d -l 127.0.0.1 -A 8192 -H /data/memcacheq -B 65535 -N -R -u root
-p <num> TCP監聽連接埠(default: 22201)
 -U <num> UDP監聽連接埠(default: 0, off)
 -s <file> unix socket路徑(不支援網路)
 -a <mask> unix socket存取遮罩(default 0700)
 -l <ip_addr> 監聽網卡
 -d 守護進程
 -r 最大化核心檔案限制
 -u <username> 以使用者身份運行(only when run as root)
 -c <num> 最大並發串連數(default is 1024)
 -v 詳細輸出 (print errors/warnings while in event loop)
 -vv 更詳細的輸出 (also print client commands/reponses)
 -i 列印許可證資訊
 -P <file> PID檔案
 -t <num> 線程數(default 4)
 --------------------BerkeleyDB Options-------------------------------
 -m <num> BerkeleyDB記憶體緩衝大小, default is 64MB
 -A <num> 底層頁面大小, default is 4096, (512B ~ 64KB, power-of-two)
 -H <dir> 資料庫家目錄, default is '/data1/memcacheq'
 -L <num> 日誌緩衝區大小, default is 32KB
 -C <num> 多少秒checkpoint一次, 0 for disable, default is 5 minutes
 -T <num> 多少秒memp_trickle一次, 0 for disable, default is 30 seconds
 -S <num> 多少秒queue stats dump一次, 0 for disable, default is 30 seconds
 -e <num> 達到緩衝百分之多少需要重新整理, default is 60%
 -E <num> 一個單一的DB檔案有多少頁, default is 16*1024, 0 for disable
 -B <num> 指定訊息體的長度,單位位元組, default is 1024
 -D <num> 多少毫秒做一次死結檢測(deadlock detecting), 0 for disable, default is 100ms
 -N 開啟DB_TXN_NOSYNC獲得巨大的效能改善, default is off
 -R 自動刪除不再需要的記錄檔, default is off
測試

三、測試
1.telnet 10.218.31.121 22201
2.stats
2.stats queue
3.set q4  0 0 5
4 hello
5 get q4
6 stats queue
7 delete q4
如果set的時候補成功not_STORED的話,檢查一下你的啟動命令吧,參數沒設定好,如果你是新手,幹翠多看幾個文章,多嘗試啟動命令,換換參數,就行了

四,使用
使用以上命令啟動mq後,(注意上面的-B參數表示messag的body長度不能超過1024 bytes),使用mq時只需要用到兩個命令:set和get:
set <queue name> <flags> 0 <message_len>\r\n
<put your message body here>\r\n
STORED\r\n
get <queue name>\r\n
VALUE <queue name> <flags> <message_len>\r\n
<your message body will come here>\r\n
END\r\n
可以看到,和memcache協議基本一致,只是把key name換成queue name,而且在set的命令中,忽略了expire_time的參數。畢竟mq的資料存放區是存在berkeleyDB中,做了持久化儲存,沒有記憶體的到期時間。
當使用set命令時,就向指定的訊息佇列中寫入了一條新訊息,也就是向BerkeleyDB中新insert了一條資料,當使用get命令時,就從 指定隊列中取出一條新訊息,也就是向BerkeleyDB中delete了一條資料。當使用stats查看一個指定隊列時,可以看到這個隊列一共接收了多 少訊息,其中被取出了多少條。
樣本:

複製代碼 代碼如下:fengbo@onlinegame-10-121:~$ telnet 127.0.0.1 22202
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]'.
set q4 0 0 5
hello
STORED
set q4 0 0 5
world
STORED
stats queue
STAT q4 2/0
END
get q4
VALUE q4 0 5
hello
END
stats queue
STAT q4 2/1
END

上面執行了兩次set的命令,使用stats queue查看時,可以看到q4的隊列中共有訊息2條,已取出0條;當使用get取出第一條後,再此使用stats queue查看,q4中訊息有2條,其中已取出1條。
PHP測試:複製代碼 代碼如下:session_start();
$memcache_obj = new Memcache;
$memcache_obj->connect(‘127.0.0.1′, 11212) or die (“error”);
memcache_set($memcache_obj, ‘k',10, 0, 0);
echo “queue”.memcache_get($memcache_obj, ‘k');
memcache_close($memcache_obj);

注釋:
這個時候會出現這樣的問題
memcacheq: error while loading shared libraries: libdb-5.0.so: cannot open shared object file: No such file or directory
解決辦法:在/usr/lib 下建個 libdb-5.0.so 軟鏈就OK啦
ln -s /usr/local/BerkeleyDB.5.0/lib/libdb-5.0.so /usr/lib/

五,關閉memcacheQ
使用ps命令查查memcacheQ的進程:ps -ef|grep wuf,然後直接將進程kill掉.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.