ホームページ  >  記事  >  バックエンド開発  >  Linux_PHP チュートリアルで memcacheq (mcq) をインストールするプロセス全体に関するメモの分析

Linux_PHP チュートリアルで memcacheq (mcq) をインストールするプロセス全体に関するメモの分析

WBOY
WBOYオリジナル
2016-07-21 15:03:05955ブラウズ

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 TCP リスニング ポート (デフォルト: 22201)
-U < ;num> UDP リスニング ポート (デフォルト: 0、オフ)
-s unix ソケット パス (ネットワークをサポートしません)
-a unix ソケット アクセス マスク (デフォルト: 0700)
-l ; ネットワーク カードの監視
-d デーモン プロセス
-r コア ファイルの制限を最大化します
-u ユーザーとして実行します (root として実行する場合のみ)
-c 最大同時接続数 (デフォルトは 1024)
-v 詳細な出力 (イベント ループ中のエラー/警告を出力)
-vv より詳細な出力 (クライアント コマンド/応答も出力)
-i ライセンス情報を出力
-P PID ファイル
-t ; スレッド数 (デフォルトは 4)
-----------------BerkeleyDB オプション------ -------- -----
-m BerkeleyDB メモリ キャッシュ サイズ、デフォルトは 64MB
-A 基礎となるページ サイズ、デフォルトは 4096、(512B ~ 64KB、パワー) -of-two)
-H

データベースのホーム ディレクトリ、デフォルトは '/data1/memcacheq' です
-L ログ バッファ サイズ、デフォルトは 32KB です
-C チェックポイントまでの秒数、無効の場合は 0、デフォルトは 5 分です
-T memp_trickle の場合は何秒、無効の場合は 0、デフォルトは 30 秒です
-S キュー統計ダンプの場合は何秒、無効の場合は 0は 30 秒です
-e キャッシュの何パーセントを更新する必要がありますか、デフォルトは 60% です
-E 単一の DB ファイルには何ページがありますか、デフォルトは 16*1024、無効の場合は 0
-B メッセージ本文の長さを指定します (単位はバイト)、デフォルトは 1024 です
-D デッドロック検出 (デッドロック検出) を実行するミリ秒数、無効の場合は 0、デフォルトは 100 ミリ秒です
-N DB_TXN_NOSYNC をオンにすると、パフォーマンスが大幅に向上します。デフォルトはオフです
- R は不要になったログ ファイルを自動的に削除します。デフォルトはオフです
テスト

3. テスト
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
if set If正常に保存されていません。起動コマンドが正しく設定されていないことを確認してください。初心者の場合は、Gan Cui がさらにいくつかの投稿を読み、さらに起動コマンドを試し、パラメータを変更すれば問題ありません。

4、
上記のコマンドを使用して mq を開始した後 (上記の -B パラメーターは、メッセージの本文の長さが 1024 バイトを超えてはいけないことを意味することに注意してください)、mq を使用するときに使用する必要があるコマンドは 2 つだけです: setそして取得:
set <キュー名> rn
<ここにメッセージ本文を入力>rn
STOREDrn
get <キュー名>rn
VALUE <キュー名> ; rn
<メッセージ本文がここに来ます>rn
ENDrn
キー名がキュー名に置き換えられることと、expire_time パラメータが異なることを除いて、基本的に memcache プロトコルと同じであることがわかります。 set コマンドでは無視されます。結局のところ、mq のデータ ストレージは BerkeleyDB に保存されます。BerkeleyDB は永続ストレージであり、メモリの有効期限がありません。
set コマンドを使用すると、新しいメッセージが指定されたメッセージ キューに書き込まれます。つまり、新しいデータが BerkeleyDB に挿入されます。 get コマンドを使用した場合、新しいメッセージが指定されたキューから取り出されます。データの一部が BerkeleyDB から削除されました。統計を使用して指定したキューを表示すると、キューが受信したメッセージの数と取り出されたメッセージの数を確認できます。
例:

コードをコピーします コードは次のとおりです:
fengbo@onlinegame-10-121:~$ telnet 127.0.0.1 22202
127.0.0.1 を試行中…
127.0.0 に接続しました.1.
脱出文字は ' ^]' です。
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
統計キュー
STAT q4 2/1
END


上記で set コマンドを 2 回実行しています。統計キューを使用して表示すると、q4 のキューに 2 つのメッセージがあり、最初のメッセージを get で取り出した後、0 個のメッセージが取り出されていることがわかります。 1 つは、統計キューを使用して再度表示します。 q4 メッセージが 2 つあり、そのうち 1 つは取り出されています。
PHP テスト:
コードをコピーします コードは次のとおりです:

session_start();
$memcache_obj = new Memcache;
$memcache_obj->connect('127.0.0.1', 11212) またはdie (“error ");
memcache_set($memcache_obj, 'k',10, 0, 0);
echo "queue".memcache_get($memcache_obj, 'k');
memcache_close($memcache_obj);

注:
この時点でこのような問題が発生します
memcacheq: 共有ライブラリのロード中にエラーが発生しました: libdb-5.0.so: 共有オブジェクトファイルを開けません: そのようなファイルまたはディレクトリはありません
解決策: /usr の下に libdb-5.0 を構築します/lib. したがって、ソフトリンクはOKです
ln -s /usr/local/BerkeleyDB.5.0/lib/libdb-5.0.so /usr/lib/

5 番目に、memcacheQ を閉じます
ps コマンドを使用して memcacheQ プロセスを確認します (ps -ef|grep wuf)。その後、プロセスを直接強制終了します。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327880.html技術記事 memcacheQ は、単純な分散メッセージ キュー サービスです。 1. MEMCACHEQ のアプリケーションの背景 Web アプリケーションにメッセージ キューが必要なのはなぜですか?主な理由は、同時実行性の高い環境では...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。