[Linux] キャッシュ データベース Memcached、Memcached のインストール、Memcached アプリケーション インスタンスの構成

1. キャッシュとは何ですか

キャッシュとは高速なデータ交換が可能なメモリのことで、メモリよりも先にCPUとデータのやり取りを行うため、非常に高速です。

パフォーマンス分析から:

CPU キャッシュ > メモリ > ディスク > データベース

パフォーマンスの観点から見ると、メモリは CPU とディスクの間にあり、実際にはメモリは CPU とディスクの間の橋渡しとなります。バッファとキャッシュはメモリの異なる表現である 次に、バッファとキャッシュについての理解を簡単に分析します。


1.1 バッファとキャッシュ

1.1.1 バッファ:

バッファとは、まだディスクに「書き込まれていない」もので、翻訳すると、「バッファはディスクに書き込まれます」となります。バッファは、メモリとハード ドライブ (または他の I/O デバイス) 間のデータ交換の速度を上げるように設計されています。バッファは、遅いハンドオーバーと速いハンドオーバーの問題を解決するためにデータをバッファリングします。速い速度では、バッファを介してデータをビットごとに遅い領域に渡す必要があります。例: メモリからハードディスクへのデータの書き込みは、直接書き込まれず、特定のサイズにバッファリングされてからハードディスクにフラッシュされます。


1.1.2 キャッシュ:

キャッシュとは、ディスクから「読み取られて」、後で使用するために保存されているものです。直訳すると、「キャッシュとは、ディスクからデータを読み取り、後で使用するために保存すること」ですキャッシュはデータの再利用を実現します。遅いデバイスは頻繁に使用されるデータをキャッシュにキャッシュする必要があります。キャッシュされたデータにより、高速なデバイスに高速の伝送速度を提供できます。たとえば、ハードディスクからデータを読み取り、メモリのキャッシュ領域に置くと、将来同じリソースに再びアクセスする速度が大幅に速くなります。


1.1.3 バッファとキャッシュの特性

  • 共通点すべてメモリに属し、データは一時的なものであり、電源を切ると失われます。
  • 相違点: (最初の 2 点を理解してください。後の 2 点は興味があれば理解していただけます)
    • A.buffer は書き込まれるデータ、cache は読み取られるデータです。
    • B. バッファ データの損失はデータの整合性に影響しますが、ソース データには影響しません。キャッシュ データの損失はデータの整合性には影響しませんが、パフォーマンスに影響します。
    • C. 一般に、キャッシュが大きいほどパフォーマンスは向上しますが、あるレベルを超えるとキャッシュが大きくなり、パフォーマンスが低下します。バッファーの場合、十分な量であれば、スペースが大きいほどパフォーマンスへの影響は少なくなります。キャッシュが小さすぎる場合、またはキャッシュがない場合、プログラム ロジックには影響しません (ただし、同時実行性の高いキャッシュが小さすぎるか失われ、システムがビジー状態になる場合を除きます)。バッファが小さすぎるため、ネットワーク パケット損失が発生するなど、プログラム ロジックに影響を与えることがあります。
    • D. キャッシュはアプリケーションに対して透過的であり、アプリケーションを作成する人はキャッシュの有無を気にする必要はなく、アプリケーションの完了後にキャッシュにアクセスできます。もちろん、開発者は明示的にキャッシュを使用することもできます。バッファはアプリケーションを作成する人によって設計される必要があり、プログラムの一部です。

1.2 Linux システムでメモリ キャッシュを表示する方法

1.2.1 cat /proc/meminfo

動的に更新される仮想ファイルを表示します。内容は比較的充実しており、記憶に関する多くの情報を閲覧できます。


1.2.2 メモリを簡単に確認する無料の方法

こちらもよく使うコマンドです。-h より人道的な表示メモリユニット -m M の形式で表示


1.2.3 トップ

top コマンドは、実行中のプログラムのリソース使用量の統計をリアルタイムで提供します。メモリ使用量とサイズに応じて並べ替えることができます。 

トップコマンドを直接終了します Ctrl+C

ショートカットキー:shift+m​​ メモリ使用率で並べ替え SHIFT+P CPU使用率で並べ替え


1.2.3 サール

Linux 統計/監視ツール sar の詳細な紹介:システムのボトルネック問題を判断するには、いくつかの sar コマンド オプションを組み合わせて使用​​する必要がある場合があります。

たとえば:

  • CPU にボトルネックがあると考えられます。sar -u および sar -q deng で確認できます。
  • メモリにボトルネックがある可能性があります。sar -B、sar -r、sar -W などで確認できます。
  • I/O にボトルネックがある可能性があります。これは、sar -b、sar -u、sar -d などで確認できます。

2. memcached の概要

Memcached は、LiveJournal の子会社である Danga Interactive の Brad Fitzpatrick (ブラッド フィッツパトリック) によって開発されたインメモリ データベースで、現在では Facebook や LiveJournal などの企業が Webサービスの品質を向上させるために使用しています現在、このソフトウェアは世界中で人気があり、キャッシュ プロジェクトを作成し、従来のデータベースからの同時負荷圧力を共有するためによく使用されます。

Memcached は、同時に大量のデータ要求に簡単に対処でき、独自のネットワーク構造を備えており、動作メカニズムの面でも、独立してメモリ内に新しい領域を開き、HashTable を確立し、HashTable を効果的に管理できます。

Memcached は、データベースの負荷を軽減するための動的 Web アプリケーション用の高性能分散メモリ オブジェクト キャッシュ システムです。データとオブジェクトをメモリにキャッシュしてデータベースの読み取り回数を減らすことにより、動的なデータベース駆動型の Web サイトの速度が向上します。

Memcached は、キーと値のペアを格納するハッシュマップに基づいています。そのデーモンは C で書かれていますが、クライアントは任意の言語で書くことができ、memcached プロトコルを通じてデーモンと通信します。

公式サイトアドレス:https://memcached.org/

官方介绍: memcached は高性能の分散メモリ オブジェクト キャッシング システムであり、本質的には汎用ですが、元々はデータベースの負荷を軽減して動的 Web アプリケーションを高速化するために使用することを目的としていました。

memcached は、高性能の分散メモリ オブジェクト キャッシング システムであり、本質的には汎用ですが、元々はデータベースをオフロードすることで動的 Web アプリケーションを高速化するために設計されました。


2.1 memcache と memcached

Memcache と Memcached という 2 つの異なる用語が時々登場しますが、なぜ 2 つの名前があるのでしょうか?

実際、Memcache はこのプロジェクトの名前であり、Memcached はサーバー側のメイン プログラム ファイル名です1 つはプロジェクト名、もう 1 つはメイン プログラム ファイル名です。

Memcached は、データをメモリに配置してメモリ アクセスを高速化するキャッシュ テクノロジです。メモリが最も高速であるため、memcached の主な目的は高速化することです。

大きなハッシュテーブル テーブルは memcached で維持され、テーブルはメモリ内にあり、テーブルの構造はキーと値です。

memcached のキーは通常文字列であり、繰り返すことはできませんが、memcached の値は配置できます (文字列、値、配列、オブジェクト、ブール値、バイナリ データ、画像、ビデオ)。


2.2 主に以下の問題を解決します

Web サイトの同時読み取りと書き込みの頻度が高く、大量のデータの処理要件が原因で、従来のリレーショナル データベースがボトルネックになり始めました。

データベースに対する高度な同時読み取りと書き込み

リレーショナル データベース自体は巨大で、処理プロセス (SQL ステートメントの解析、トランザクション処理など) に非常に時間がかかります。リレーショナル データベースで大量の同時読み取りと書き込み (1 秒あたり数万回のアクセス) を実行すると、データベース システムはそれを処理できなくなります。

大量のデータの処理

大規模な SNS (ソーシャル ネットワーク サービス) ウェブサイト (Twitter や Sina Weibo など) では、毎日数千万のデータが生成されます。リレーショナル データベースの場合、数億のデータが含まれるデータ テーブル内の特定のレコードを検索する場合、効率は非常に低くなります。Memcached を使用すると、上記の問題をうまく解決できます


2.3 Memcached データベースの機能

memcached は高速分散キャッシュサーバーとして以下の特徴を持っています。

  • プロトコルは簡単です
    • テキスト行ベースのプロトコルを使用すると、Telnet 経由で Memcached サーバー上のデータに直接アクセスでき、実装が比較的簡単です。
  • libeventに基づくイベント処理
    • libevent は C ベースで開発されたプログラム ライブラリであり、Memcached はこのライブラリを非同期イベント処理に使用します
  • 内蔵メモリの保存方式
    • Memcached には独自のメモリ管理方法があり、非常に効率的です。すべてのデータは Memcached の内蔵メモリに保存されます。保存されたデータがスペースを埋めると、LRU アルゴリズムを使用して未使用のキャッシュ データがクリアされます。期限切れのデータを再利用します。データ メモリ容量はありますが、サーバーを再起動するとデータは失われます
  • 分散 memcached が相互に通信しない
    • 各 Memcached サーバーは相互に通信せず、独立してデータにアクセスします。クライアントの設計により、個別のストレージの特性を備え、多数のキャッシュと大規模なアプリケーションをサポートします。

3. Memcached のインストール

yum インストール (推奨)

Linux システムに memcached をインストールするには、まず依存関係ライブラリをインストールする必要があります。

yum install gcc gcc-c++ libevent-devel

次に、次のコマンドを使用してインストールします (Redhat/Fedora/Centos のみ)

yum install memcached -y

4. Memcached の実行

(1) フォアグラウンド プログラムとして実行します。

ターミナルから次のコマンドを入力して memcached を起動します。

 memcached -u root -p 11211 -m 64m -vv

デバッグ情報がここに表示されます。この方法では、memcached がフォアグラウンドで開始され、TCP ポート 11211 をリッスンし、最大メモリ使用量は 64M になります。デバッグ情報の内容は、主に保存された情報に関するものです。

(2) バックグラウンド サービス プログラムとして実行します。

IPを指定せずに実行します:

 memcached -p 11211 -m 64m -d -u root

実行する IP および PID の保存場所を指定します。

memcached -d -m 64M -u root -l 192.168.0.200 -p 11211 -c 256 -P /tmp/memcached.pid

五、Memcachedの特徴

Memcached は高速分散キャッシュサーバーとして以下のような特徴を持っています。

  • プロトコルは簡単です
    • Memcached のサーバーとクライアントの通信では、.xml などの複雑な形式は使用されず、単純なテキスト行ベースのプロトコルが使用されます。
  • Memcached 接続
    • したがって、Telnet 経由で Memcached にデータを保存したり取得したりすることもできます。以下はサンプルコードです。

         

telnet localhost 11211
Connected to localhost.localdomain(127.0.0.1).
Escape character is '^]'.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)

6. Memcachedの応用例構成

1. アプリケーションインスタンスの構成

1) 基本的な環境構成。3 つのサーバーすべてを実行するのが最善です

①ファイアウォールをオフにします。

systemctl stop firewalld

systemctl disable firewalld

sed -i 's/enforcing/disabled/' /etc/selinux/config

setenforce 0

②同期時間:

yum -y install ntp ntpdate

ntpdate cn.pool.ntp.org

hwclock --systohc

③環境計画:

IPアドレス 環境
192.168.198.142 メモリキャッシュ
192.168.198.147 ウェブ
192.168.198.148 mysql

2) Webサーバーの設定

Webサーバー192.168.198.147 にソフトウェアをインストールし、サービスを開始します

システムのデフォルトの mysql バージョンをアンインストールします

rpm -e mariadb-libs postfix

データベース ソフトウェアをインストールします。データベース ソフトウェアが既にインストールされているために複製される場合は、インストールする必要はありません。

プロセスは省略します。インストールがない場合は、以前の mysql ブログを参照してインストールしてください。

lnmp環境をインストールする

yum install httpd php php-gb php-mysql php-memcache

Apacheサービスを開始する

systemctl restart httpd

sysstemctl enable httpd


3) mysqlデータベースサーバーの設定

mysql サーバー(192.168.198.148)にユーザーを作成します。


mysql8.0 のデフォルトの認証プラグインは caching_sha2_password で、以前の
mysql_navtive_password を置き換え、ユーザーのホスト範囲を % に設定して、すべてのホストが接続できるようにします。

create user 'memcache'@'%' identified by 'Nebula@123';

ALTER USER'memcache'@'%' IDENTIFIED WITH mysql_native_password BY 'Nebula@123';

flush privileges;

 mysqlユーザーテーブルに作成したばかりのユーザー情報を確認します。

select user,host,plugin from mysql.user;


4) Webサーバーテスト

(Web サーバー上で) http 関数をテストします。次の図に示すように、正常です。

 vim /var/www/html/index.html


PHP テスト関数をテストする

vim /var/www/html/index.php  
<?php
phpinfo();
?>


5) Web サーバー上で mysql サーバーが正常に接続されているかどうかをテストします。

 Web サーバー (192.168.198.147) に次のファイルを書き込みます。

vim /var/www/html/mysql.php
<?php
$link=mysql_connect('192.168.198.148','memcache','Nebula@123');

if($link) echo "Success!!";
else echo "Fail!!";
mysql_close();
?>

 書き込み後に保存して終了します。

次に、ブラウザ上で Web サーバーの IP を接続し、「Success!」と表示されます。mysqlサーバーに正常に接続されました。


 6) memcache サービスの構成とテスト

インストールと起動 (インストール前に前述のインストール方法を参照) サービスが正常に起動し、正常にアクセスできる限り、テストは省略されます


7) 機能テスト例 


①Webとmemcache間の接続テスト

バックグラウンドで開いている memcache サービスを使用している場合は、それを強制終了する必要はありません


②コードテスト用Webサーバー(192.168.42.30)

ここでの IP アドレスは memcached 側であり、そのポート番号です。 

<?php
$memcache = new Memcache;
$memcache->connect('192.168.198.142', 11211) or die ("Could not connect");
$version = $memcache->getVersion();
echo "Server's version: ".$version."
";
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");
echo "Store data in the cache (data will expire in 10 seconds)
";
$get_result = $memcache->get('key');
echo "Data from the cache:
";
var_dump($get_result);
?>


③ Web サーバー (Web 側 192.168.198.147) でセッションを設定します。 

 vim /etc/php.ini
session.save_handler = memcache
session.save_path ="tcp://192.168.42.29:11211?
persistent=1&weight=1&timeout=1&retry_interval=15"


④ memcached の可用性をテストします。

 vim /var/www/html/memcache1.php
<?php
session_start();
if (!isset($_SESSION['session_time']))
{
 $_SESSION['session_time'] = time();
}
echo "session_time:".$_SESSION['session_time']."
";
echo "now_time:".time()."
";
echo "session_id:".session_id()."
";
?>


 ⑤ mysql サーバー (192.168.198.148) 上にテスト データベースを作成します。

create database testab1;


use testab1;

create table test1(id int not null auto_increment,name varchar(20) default null,primary key(id))
engine=innodb auto_increment=1 default charset=utf8;

insert into test1(name) values ('tom1'),('tom2'),('tom3'),('tom4'),('tom5');


 memcache ユーザーにライブラリ testab1 の閲覧権限を与える

grant select on testab1.* to memcache@'%';

show grants for memcache@'%';


⑦ Webサーバー上に以下のファイルを作成します。

vim /var/www/html/memcache2.php

$key=md5($query);
if(!$memcache->get($key))
{
 $conn=mysql_connect("192.168.198.148","memcache","Nebula@123"); //数据库节点,地址,用户,密码
 mysql_select_db(testab1);
 $result=mysql_query($query);
 while ($row=mysql_fetch_assoc($result))
 {
 $arr[]=$row;
 }
 $f = 'mysql';
 $memcache->add($key,serialize($arr),0,30);
 $data = $arr ;
}
else{
 $f = 'memcache';
 $data_mem=$memcache->get($key);
 $data = unserialize($data_mem);
}
echo $f;
echo "";
echo "$key";
echo "";
//print_r($data);
foreach($data as $a)
{
echo "number is $a[id]";
echo "";
echo "name is $a[name]";
echo "";
}
?>

注: memcached のキャッシュ時間はデフォルトで 1 分です。1 分後に、memcached はデータベースからデータを再度取得する必要があります。 

おすすめ

転載: blog.csdn.net/weixin_65690979/article/details/130539958
おすすめ