ホームページ >バックエンド開発 >PHPチュートリアル >拡大する
大規模 Web サイトの最適化 - memcache テクノロジー
メモリ キャッシュ メモリ キャッシュ
memcache は のセットです分散高速キャッシュ システムは、LiveJournal の Brad Fitzpatrick によって開発され、現在、特に一部の Web サイトのアクセス速度を向上させるために多くの Web サイトで使用されています。大規模データベースへのアクセスが頻繁に必要なWebサイトのアクセス速度向上の効果は非常に大きいです。これは、BSD ライセンスに基づいてリリースされた オープン ソース ソフトウェア のセットです。 [百度百科より抜粋]
公式サイト: http://memcached.org/
分散型: 複数の Memcache サーバーがデータを管理する構造。
キャッシュ システム: ユーザーがクエリしたデータをメモリにキャッシュし、次回からメモリから直接取得できるようにします。ディスク IO オーバーヘッドを削減します。
nosql とは何ですか? (SQL リレーショナル データベース)
答え: MySQL はリレーショナル データベースと呼ばれます (主な特徴は、2 次元のテーブル構造 (テーブル内の行と列) であり、テーブル間にリレーションシップがあることです) ( oracle (Java)、db2、sqlserver)
非リレーショナル データ: SQL ステートメントをクエリとして使用しないデータベース (データを保存するシステム) )、厳密な意味での 2 次元テーブルの概念はありません。そのデータ構造はすべて巨大なハッシュ テーブル (キーと値) です。
ハッシュ テーブルの利点: 時間計算量は 0 (1) です。データが増加するにつれて、クエリ時間は桁違いに存在しなくなります ( 1s )が変化します。
ハッシュ テーブルの欠点: ハッシュの衝突 異なるキーが同じ値に対応する
key1 ===MD5(sql) key1 ===MD5(sql) Asion key2 12 key3 shenzhen key4 iphone |
アシオン |
||||||||
key2 |
12 |
||||||||
key3 |
深セン |
||||||||
key4 |
iphone | tr>
使用する場合は、まず nosql データベースから取得します。ない場合は直接返します。 、まず MySQL から取得し、次に memcache にキャッシュし、次回は memcache から直接返します。
1. MemcacheDB はデータを永続化できます。 2. 再キャッシュ もデータ永続性を実現できます
注: NoSQL で実現できるかどうかMySQL (リレーショナルデータベース) を入手しますか?
答え: nosql の存在は、MySQL (リレーショナル データ) を置き換えることを意図したものではなく、リレーショナル データを補足するものです。リレーショナル データベースには独自の機能 (トランザクション、ストアド プロシージャ) があるためです。
Nosql の主な使用シナリオ: ソーシャル ネットワーキング Web サイト (Renren、Xiaonei、Douban)
授業後に学習: C10K 問題とは何ですか? C100K
回答: c10k の意味は、Web サイトの同時実行数が 1w に達すると、Web サイトの全体的な構造が完全に更新されるということであり、これは c10k と呼ばれます。NoSQL データベースによって完全に解決されました。 。しかし、c100kには別の問題がありますか?
アーキテクチャ Web サイト:
http://www.infoq.com/
1.1 memcached ファイルを特定のフォルダーに直接配置します (中国語名のフォルダー | スペースは使用しないでください)
1.2 cmd で次のコマンドを実行します ( を閉じることはできません )。Ctrl C を使用して
memcache port 112 11 を終了できます。
1.3 起動しているか確認し(新しいウィンドウを開く)、以下のコマンドを実行
# netstat -an
selinux をすぐに有効にします
2.1 環境準備
Linux 環境では、gcc、g-c、make (makefile)、cmake、autoconfig (configure)、libtool が必要です。 Linux で他のツール
がインターネット に接続されている場合、次のコマンドを使用します
# yum install- y gcc make cmake autoconfig libtool
-y 対話型確認を使用する必要はありません
2.2 memcached をコンパイルしてインストールします
memcached は
libevent ライブラリに依存しているため、最初にインストールし、それぞれの公式 Web サイトから安定バージョンをダウンロードする必要があります libevent 公式 Web サイト: http://libevent.org/
memcache 公式 Web サイト: http://memcached.org/
まず libevent をコンパイルしてインストールし、次に memcached をコンパイルしてインストールします同時に、memcached をインストールするときに libevent のインストール パスを指定する必要があります
具体的な手順:アップロード
# ./configure --prefix=/usr/local/libevent && make && make install
b. memcache をインストールし、解凍し、コンパイルしてインストールします
# ./configure --prefix=/usr/local/memcached --with- libevent=/usr/local/libevent && make && make install
2.3 Memcached の起動
# /usr/local/memcached/bin/memcached -m 64 -p 11211 -uEveryone -vv
注: この時点では Memcached は正常に起動しますが、情報はコンソールに出力されます。
memcached を バックグラウンド でサービスとして開始する場合は、-d オプション (デーモン バックグラウンド)
# /usr/local を追加するだけです。 /memcached/ bin/memcached -m 64 -p 11211 -uEveryone -d
サーバーが正常に起動するかどうかを確認するにはどうすればよいですか?
# ps axu | memcached
パラメータ情報を表示する必要がある場合は、memcached を使用します-h ヘルプの表示:
Memcached のクライアント/サーバー通信は非常に単純で、テキストベースのプロトコルに似ています。 http プロトコルでは、対話に Telnet を直接使用できます。
Telnet 操作を使用します (終了するには終了します)
# telnet サーバー IP 11211
接続後、ctrl ] を使用して Telnet エコーを開きます
2. 基本コマンド:
memcache の追加、削除、変更、クエリ コマンドを学習します:
add key flag期限切れ長
key: name
flag: 1 memcache文字列として保存します
expire: 有効期限、memcache 時間
length: データ長 (B)
※add add
# add name 1 0 2 # memcache サーバーにキー 2 バイトの名前を追加します。有効期間は長期です。
有効期限の理解方法
キャッシュの有効期間を設定します。3 つの形式があります
最も最近使用されていない原則
※削除 delete
# 削除キー
※replace replace
# replace キーフラグの有効期限の長さ
※get get
# キー取得
※set データに置換がある場合は追加、そうでない場合は
# set key flag 有効期限長
名前は存在します:
年齢は存在しません:
※増分
# 増分 NUMBER
※減少減少
# 減少年齢 NUMBER
※stats 統計情報 memcache サーバー情報
# stats
※flush_all 全データクリア
# flash_all
beta: ベータ版: 一般に小さなバグがいくつかありますが、問題がある場合はユーザーが使用して確認する必要があります。公式にフィードバックを送信できます。その後、修復を行ってください
アルファ: 内部ベータ版: 開発中に内部で使用されたバージョン。一般に、このバージョンには多くのバグがあります。ただし、このバージョンには新しい機能が追加されることがよくあります。 (通常、新しい企業のみがそれを試行します。) アルファ版にはいくつかの補償があります。
stable: 安定版: 基本的にバグがなく、安定して実行できます。
ftp 使用時の注意:
# cls
# cd
# vim .bashrc
Linux ダウンロード最終行モード
# :x 小文字 exit wq
編集モードの Linux
# Z 大文字
# /usr/local/php/bin /phpize 絶対パス phpize
d 設定ファイルを使用します。インストール パスを指定せずにシステム情報を収集するために上記で生成された
# ./configure --with-php-config=/usr/local/php/bin/php-config php 設定ファイル
e. コンパイルとインストールを実行します
# make && make install
注: 上記のコマンドの実行後に構造を表示できます
# ls /usr/local/php/lib /php/extensions/no-debug-non-zts-20090626/
注: Linux で php.ini 設定ファイルの場所を確認するにはどうすればよいですか?
解決策: phpinfo();
注: Linux では、構成ファイルを変更する前に、必ず
php.ini-backup-2016-1- をバックアップしてください。 12
注: .so ファイルとは何ですか?
.so は Linux では共有オブジェクトです。Windows では .dll ファイルと入力します。
注: Linux では、
# pkill -9 httpd
# ps aux | grep httpd
#ps grep httpd
を使用できます。
次のように、上で生成したアドレスを php.ini 設定ファイルに追加します。
extension_dir=/usr/local/php/lib/php/extensions/ no- debug-non-zts-20090626/
extension=memcacahe.so
php に memcache のモジュールがあるかどうかをテストする test.php ファイルを作成します
php は memcache を操作し、値を保存および取得します
注: Memcache は最大値です。 1Mのスペースしかありません。
注: メモリの断片化は常に存在します。問題は、メモリの断片化を最小限に抑えることができる方法だけです。
1. メモリの断片化とは何ですか?
この種のメモリ キャッシュ システムを使用すると、継続的な適用と解放により、使用できない小さなメモリの断片が形成されます。この現象はメモリの断片化と呼ばれます。この小さな赤いブロックは、オペレーティング システムが使用できない領域です。
Memcache はスラブアロケータを使用して管理されます (各スラブクラスのサイズは 1M)
最小単位はチャンク (小さなブロック) と呼ばれます: データを保管する倉庫
複数の小さなユニットがチャンクを形成します: 複数の小さなブロックで構成されます (すべての小さなブロックは同じサイズです)
各スラブ クラスのサイズは 1M です
注: 122 バイトのスラブがいっぱいで、100 バイトのデータが来た場合、どこに保存する必要がありますか?
答え: 144 は間違いなく存在しません。チャンク 122 にまだ存在しており、データ ストレージの実装には LRU アルゴリズムが使用されています。
memcached が開始されると、-f で指定できる特定のサイズに従ってスラブ クラスが編成されます。
デフォルトは 1.25 で、隣接するチャンク間の比率は増加要因です。 Web サイトのビジネスに応じてキャッシュ係数のサイズを調整できます。
各ビジネスが異なり、必要な最小チャンクも異なるためです。データは独自のサイズを設定できるため、このパラメーターを使用すると、システムが自社のビジネスにさらに適応できるようになります。
memcached は内部的にレコードの有効期限が切れているかどうかを監視しませんが、取得時にレコードをチェックします。タイムスタンプを使用して、レコードの有効期限が切れているかどうかを確認します。この動作は遅延有効期限と呼ばれます。したがって、memcached は有効期限の監視時に CPU 時間を消費しないという利点があります。
例: set(name, asion, 0, 3600) は 3600 秒後に期限切れになります。期限切れになった後は、get がクエリされた場合にのみ、期限切れかどうかが検出されます。有効期限が切れた場合は削除してください。
例 # add name 1 8 2 8秒経過すると無効になるのか、存在しないのか?統計による分析
分析: 存在しないのではなく、無効です。次回取得するときにのみ、memcache が有効期限が切れているかどうかを確認します。
memcached は期限切れになったレコードの領域を優先して使用しますが、それでも新しいレコードを追加するときに領域が不足します。スペースを割り当てるための最も最近使用されていない (LRU) メカニズム。
名前が示すように、これは「最も最近使用されていない」レコードを削除するためのメカニズムです。したがって、memcached のメモリ空間が不足している場合 (スラブ クラスから新しい領域が取得できない場合)、最近使用されていないレコードから検索し、新しいレコードにその領域
を割り当てます。キャッシュの実用的な観点から見ると、このモデルは理想的です。
メカキャッシュ内のデータスペース (デフォルトは 64M) がいっぱいの場合、データを保存し続けることができますか?
回答: 期限切れのデータは削除する必要があります。期限切れでない場合は、後でデータを追加するためのスペースを確保するために、最もアクティブでないデータが削除されます。
例: 122Bytes のスラブを例に挙げると、データがいっぱいになったときに 100Bytes のデータが入ってきた場合、どう対処すればよいでしょうか。 (永続的に有効であってもキックされます)
分析: メモリ管理 LRU アルゴリズム 、FIFO アルゴリズム
注: vim で ctrl s を入力すると、ctrl q を使用して
-p リスニング ポートを終了できます。
-l 接続の IP アドレス。デフォルトはローカル マシンです
-d start memcached サービスを開始します
-d restart memcached サービスを再開します
-d stop|shutdown 実行中の memcached サービスをシャットダウンします
-d install memcached サービスをインストールします
-d uninstall memcached サービスをアンインストールします
-u Run as (root として実行する場合のみ有効)
-m 最大メモリ使用量 (MB 単位)。デフォルト 64MB
注: システムが 32 ビットの場合、最大制限は 2G ですが、システムが 64 ビットの場合、制限はありません。
-M 項目を削除する代わりにメモリが枯渇した場合にエラーを返します
-c 同時接続の最大数、デフォルトは 1024 です
-f ブロック サイズ増加率、デフォルトは 1.25 です
-n 最小割り当てスペース、キー値フラグのデフォルトは 48
-h ヘルプを表示します
-v 警告およびエラー メッセージを出力します
-vv はクライアントのリクエストと戻り情報を出力します
-i は memcached と libevent の著作権情報を出力します
保存 : 1. ファイル 2. mysql
質問: フォルダー内にセッション ファイルが多すぎて取得が遅くなる場合、どのように対処すればよいですか?
答え: 階層処理
保存には Memcache を使用、Memcache は分散ストレージを使用します (ストレージには複数の Memcache を使用)
Use memcache セッションの保存
1. php.ini ファイルを変更します。設定情報は次のとおりです
session.save_handler = memcache #representative memcache を使用してセッションを保存します
session.save_path ="tcp://127.0.0.1:11211" # memcache サーバーのアドレスとポートを指定します
テスト
1. セッションを開き、セッションを保存します
Memcache からセッションを取得します
分散型とは何ですか?
単一の memcache のサービス機能には限界があるため、複数の memcache を使用してキャッシュ機能を提供できます。このアーキテクチャは、memcache の 分散キャッシュ (クラスター) キャッシュ システム
それを達成するにはどうすればよいですか? このようにして、さまざまな Memcache サーバーにデータを分散する方法が理解できます。クライアント上で分散を実装します。データを保存する前に、 特定のアルゴリズム に従って、データをその memcache サーバーに保存します。データを取得するときは、以前と同じアルゴリズムに従って、対応するデータを取得します。 . memcache サーバー上のデータを取得
分散アルゴリズム
通常、このハッシュ関数は crc32( key ) % 3
crc32() この関数は文字列を 32 ビット整数に変換できます 欠点: サーバーがダウンした場合、またはサーバーを追加する必要がある場合、現時点では基本的に除数が変更されたため、キャッシュされたデータはすべて無効になります。 ゆるい計算式 ヒット率 = 取得したデータ数 / 総数 1/N N はサーバー数 発生する問題: memcache がダウンすると、キャッシュされたデータが無効になります。 MySQL 負荷が急激に増加します。 このとき、MySQL はクラッシュし、短時間で再び MySQL がクラッシュします (キャッシュの一部が壊れています)。再確立されました)、別のダウンタイム。時間が経つにつれて、MySQL は基本的に安定し、キャッシュ システムが正常に確立されました。キャッシュされたデータが存在しないため、すべてのリクエストを MySQL に転送する必要があります。この現象は memcache 雪崩現象と呼ばれます。 概要:注: memcache がダウンしている限り、データが失われます。ただし、データ損失を最小限に抑え、一貫性のあるハッシュを使用する方法を見つけなければなりません。たとえ 1 台のサーバーがダウンしても、影響を受けるのは 1 台のサーバー上のデータだけです。
仮想ノード: タスクの共有
キャッシュ雪崩現象
キャッシュ時間は同じであり、キャッシュ システムはすべて同時に失敗し、雪崩を引き起こします
あるmemcacheノードのキャッシュデータが無効化されたことにより、他のmemcacheノードのキャッシュヒット率が低下します。キャッシュ内の欠落したデータは MySQL データベースでクエリされます。 この期間中、MySQL サーバーに大きな負荷がかかり、
キャッシュ雪崩現象と呼ばれるダウンタイムが発生しました。
MySQL を再起動後、短時間で再びクラッシュしましたが、MySQL を再起動すると一部のキャッシュ データが確立され、キャッシュが完全に再構築されました。クラッシュしなくなりました。
解決策: キャッシュ時間を範囲 (3 ~ 9 時間) 内のランダムな値に設定して、異なる期間で期限切れになり、再構築作業が異なる時間に割り当てられるようにします。 。
memcache の可用性を高める方法
これを実現するには、答え:
memcache のセキュリティを解決するにはどうすればよいですか?
memcache の設計は非常にシンプルであるため、権限の設定にはまったく制限がありません。なぜ権限を設定しないのでしょうか?
はキャッシュ機能のみが提供されており、イントラネット 192.168.1.110 に配置されます。3. ファイルを使用してセッションファイルを保存する場合、ファイルが多すぎる場合はどうすればよいですか?
一般的に、セッション ファイルの数が 65535 を超えると、この時点でセッションの取得が非常に遅くなり、PHP コードの実行が非常に遅くなります。
答え:
階層処理: 1 つのフォルダー内に A-Z で始まるフォルダーを作成し、その後に A_Z が作成されます
memcache 処理を使用: 単一の memcache の処理能力には制限があります、つまり、分散型 memcache を使用して
を処理する方法 ロード バランシング クラスターも高可用性クラスターであることを理解する方法ですが、実際はそうではありません。キープアライブ メカニズムを提供していないためです。監視メカニズム
ケース:
Memcache の目的は、データをキャッシュし、MySQL への負荷を軽減することです。
一覧ページを書く
拡張機能
Linux に PHP 拡張機能をインストールする一般的な方法extension_dir='上記で生成されたディレクトリ'
extension='NAME.so'