Ubuntu14.04でmemcachedを使用してMySQLにNoSQLクエリを追加する方法
序章
memcachedとそのスタンドアロンサーバーの実装をMySQLで使用する一般的な考え方は、 Ubuntu 14.04にMemcacheをインストールして使用する方法など、多くのすばらしい記事で説明されています。 ただし、スタンドアロンサーバーとしてのmemcachedは、MySQLクライアントアクセスレイヤーの前で仲介者として機能し、情報を永続的に保存するオプションなしで、メモリ内でのみ情報を管理します。 これにより、重複するMySQLクエリの結果をキャッシュするなどのタスクに適しています。 これにより、リソースが節約され、ビジーなサイトのパフォーマンスが最適化されます。
ただし、この記事では、別のことについて説明します。 MemcachedはMySQLプラグインとしてインストールされ、MySQLに緊密に統合されます。 通常のMySQLInnoDBテーブルで情報を直接管理するためのNoSQLスタイルのアクセスレイヤーを提供します。 これには、この記事の後半で説明するように、多くの利点があります。
基本的な理解
この記事をフォローできるようにするには、NoSQLとmemcachedとは何かについての基本的な理解が必要です。 簡単に言うと、NoSQLはKey-Valueアイテムの形式で情報を処理します。 この明らかに標準のSQLよりも単純なアプローチは、パフォーマンスとスケーラビリティが優れていることを示しています。これは、大量の情報(ビッグデータ)を処理する場合に特に求められます。
ただし、NoSQLの優れたパフォーマンスは、通常のSQLを置き換えるのに十分ではありません。 NoSQLは単純であるため、複雑な関係を持つ構造化データには適していません。 したがって、NoSQLはSQLの代わりではなく、SQLへの重要な追加です。
memcachedに関しては、NoSQLの一般的な実装と見なすことができます。 その名前が示すように、それは非常に高速で、優れたキャッシュメカニズムを備えています。 そのため、従来のMySQLにNoSQLスタイルを導入するのに最適です。
memcachedプロトコルについてのある程度の理解も必要です。 Memcachedは、次の部分を持つアイテムで機能します。
- key —アイテムのvalueにアクセスするためのキーとなる英数字の値。
- value —重要なペイロードが保持される任意のデータ。
- フラグ—通常、メイン値に関連する追加のパラメーターを設定するために使用される値。 たとえば、圧縮を使用するかどうかのフラグである可能性があります。
- 有効期限—有効期限(秒単位)。 memcachedは当初、キャッシュを念頭に置いて設計されたことを思い出してください。
- CAS値—各アイテムの一意の識別子。
前提条件
このガイドはUbuntu14.04でテストされています。 説明されているインストールと構成は、他のOSまたはOSバージョンでも同様ですが、コマンドと構成ファイルの場所が異なる場合があります。
次のものが必要になります。
- Ubuntu14.04新規インストール
- sudo権限を持つroot以外のユーザー
このチュートリアルのすべてのコマンドは、root以外のユーザーとして実行する必要があります。 コマンドにrootアクセスが必要な場合は、その前にsudo
が付きます。 まだセットアップしていない場合は、次のチュートリアルに従ってください: Ubuntu14.04を使用したサーバーの初期セットアップ。
ステップ1—MySQL5.6をインストールする
MySQLのmemcachedプラグインは、5.6.6以降のバージョンのMySQLで使用できます。 これは、標準のUbuntu 14.04リポジトリからMySQLパッケージ(バージョン5.5)を使用できないことを意味します。 代わりに、次のことを行う必要があります。
- MySQL公式リポジトリを追加します
- MySQLサーバー、クライアント、およびライブラリをそこからインストールします
まず、 MySQL aptリポジトリページに移動し、MySQLリポジトリをUbuntu14.04システムに追加するパッケージをダウンロードします。 ドロップレットに直接パッケージをダウンロードできます。
- wget https://dev.mysql.com/get/mysql-apt-config_0.3.5-1ubuntu14.04_all.deb
次に、dpkg
を使用してインストールします。
- sudo dpkg -i mysql-apt-config_0.3.5-1ubuntu14.04_all.deb
上記のコマンドを実行すると、テキストモードウィザードが表示され、2つの質問が含まれます。
- どのMySQL製品を構成しますか?
Server
で答えてください。 - どのサーバーバージョンを受け取りたいですか?
mysql-5.6
で答えてください。
これらの2つの質問に答えると、インストールする製品に関する最初の質問に戻ります。 一番下の選択肢であるApply
で答えて、選択を確認し、ウィザードを終了します。
新しいMySQLリポジトリができたので、aptキャッシュを更新する必要があります。 Ubuntuにインストールできるパッケージに関する情報。 したがって、MySQLをインストールすることを選択すると、MySQLは新しいリポジトリから取得されます。 aptキャッシュを更新するには、次のコマンドを実行します。
- sudo apt-get update
その後、次のコマンドを使用して、Ubuntu14.04にMySQL5.6をインストールする準備が整います。
- sudo apt-get install mysql-server
上記のコマンドを実行すると、MySQLのroot(管理者)パスワードを選択するように求められます。 便宜上、この時点ではパスワードを設定しないことを選択できます。プロンプトが表示されたら、Enterキーを押してください。 ただし、このサーバーを本番環境に移行することを決定したら、コマンドsudo mysql_secure_installation
を実行して、MySQLのインストールを保護し、rootパスワードを構成することをお勧めします。
インストールプロセスが完了すると、MySQLサーバー5.6がコマンドラインクライアントと必要なライブラリとともにインストールされます。 次のコマンドでクライアントを起動することで確認できます。
- mysql -u root
パスワードを設定する場合は、次のコマンドを使用し、プロンプトが表示されたらMySQLのrootパスワードを入力する必要があります。
- mysql -u root -p
君は見るべきだ:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.25 MySQL Community Server (GPL)
...
MySQLモニター(クライアントターミナル)にいる間に、test
という名前の新しいデータベースを作成します。
- CREATE DATABASE test;
このデータベースは、後でテストのために必要になります。
MySQLクライアントを終了するには、次のように入力します。
- quit
最後に、memcachedプラグインの依存関係として、非同期イベント通知ライブラリの開発パッケージlibevent-dev
もインストールする必要があります。 これを実現するには、次のコマンドを実行します。
- sudo apt-get install libevent-dev
ステップ2—MySQLにmemcachedプラグインをインストールする
memcachedプラグインのインストールの準備をするには、最初にファイル/usr/share/mysql/innodb_memcached_config.sql
にあるクエリを実行する必要があります。 MySQLクライアントを起動します。
- mysql -u root
または、パスワードを設定した場合:
mysql -u root -p
実行します:
- source /usr/share/mysql/innodb_memcached_config.sql;
これにより、プラグインに必要なすべての設定がデータベースinnodb_memcache
に作成され、新しく作成されたデータベースtest
にいくつかのサンプルデータが挿入されます。
その後、次のコマンドを使用して、MySQLターミナルからmemcachedプラグインのインストールを実行できます。
install plugin daemon_memcached soname "libmemcached.so";
MySQLセッションを終了します。
quit
これにより、Ubuntu14.04のディレクトリ/usr/lib/mysql/plugin/
にあるmemcachedプラグインがインストールされます。 このファイルは、MySQLバージョン5.6以降でのみ使用できます。
インストールが完了したら、memcachedプラグインリスナーを構成する必要があります。 memcachedプラグインに接続するために必要になります。 この目的のために、次のようなお気に入りのエディターでファイル/etc/mysql/my.cnf
を開きます。
- sudo vim /etc/mysql/my.cnf
[mysqld]
行のどこかに、次を含む新しい行を追加します。
daemon_memcached_option="-p11222 -l 127.0.0.1"
上記は、ループバックIP127.0.0.1に対してのみ有効になっているポート11222のmemcachedプラグインリスナーを構成します。 これは、Dropletのクライアントのみが接続できることを意味します。 IPに関する部分(-l 127.0.0.1
)を省略すると、新しいリスナーにどこからでも自由にアクセスできるようになり、重大なセキュリティリスクが発生します。 memcachedプラグインのセキュリティについてさらに懸念がある場合は、そのセキュリティドキュメントを確認してください。
memcachedプラグインの新しいリスナープロセスを開始するには、次のコマンドを使用してMySQLサーバーを再起動します。
- sudo service mysql restart
ステップ3—memcachedプラグインをテストする
インストールが成功したことを確認するには、MySQLクライアントから次のMySQLコマンドを実行します(mysql -u root
またはmysql -u root -p
でクライアントを起動します)。
- show plugins;
すべてが正常であれば、出力に次のように表示されます。
| daemon_memcached | ACTIVE | DAEMON | libmemcached.so | GPL |
これが表示されない場合は、MySQLバージョン5.6以降を使用しており、インストール手順に正確に従っていることを確認してください。
次のように、DropletからTelnetを使用して新しいmemcachedプラグインインターフェイスに接続することもできます。
- telnet localhost 11222
成功すると、次のような出力が表示されます。
Connected to localhost.
Escape character is '^]'.
これで、統計用にstats
などの汎用コマンドを実行して、この接続がどのように機能するかを確認できます。 プロンプトを終了するには、キーボードのCTRLと]の組み合わせを同時に押します。 その後、quit
と入力して、Telnetクライアント自体を終了します。
Telnetを使用すると、memcachedプラグインおよびMySQLデータ自体に接続する最も簡単な方法が提供されます。 テストには適していますが、専門的に使用する場合は、PHPやPythonなどの一般的なプログラミング言語ですぐに利用できるライブラリを使用する必要があります。
ステップ4—memcachedプラグインを介してMySQLでNoSQLクエリを実行する
この記事のmemcachedプラグインのインストール部分に戻ると、ファイル/usr/share/mysql/innodb_memcached_config.sql
からステートメントが実行されたことがわかります。 これらのステートメントは、test
データベースに新しいテーブルdemo_test
を作成しました。 demo_test
テーブルには、memcachedプロトコルに準拠した次の列があります。
c1
は、keyフィールドを実装します。c2
は、valueフィールドを実装します。c3
は、flagフィールドを実装します。c4
は、CASフィールドを実装します。c5
はexpirationフィールドを実装します。
テーブルdemo_test
は、テストするテーブルになります。 まず、次のコマンドを使用して、MySQLクライアントでデータベース/テーブルを開きます。
- mysql -u root test
または、MySQLパスワードが設定されている場合:
- mysql -u root test -p
demo_test
テーブルにはすでに1つの行があるはずです。
- SELECT * FROM demo_test;
結果は次のようになります。
+-------------+--------------+------+------+------+
| c1 | c2 | c3 | c4 | c5 |
+-------------+--------------+------+------+------+
| AA | HELLO, HELLO | 8 | 0 | 0 |
+-------------+--------------+------+------+------+
1 rows in set (0.00 sec)
MySQLセッションを終了します。
quit
次に、memcachedNoSQLインターフェイスとtelnetを使用して2番目のレコードを作成しましょう。 TCPポート11222でローカルホストに再度接続します。
- telnet localhost 11222
次に、次の構文を使用します。
set [key] [flag] [expiration] [length in bytes]
[value]
valueは新しい行にある必要があることに注意してください。 また、上記の方法で作業する場合は、レコードごとに値の長さをバイト単位で指定する必要があります。
例として、キーnewkey
、フラグの値0
、有効期限の値0
(期限切れにならない)を使用して新しいアイテム(データベース行)を作成しましょう。 値の長さは12バイトになります。
set newkey 0 0 12
NewTestValue
もちろん、このNoSQLインターフェースを介して値を取得することもできます。 これは、get
コマンドの後に、取得するキーの名前を続けて実行します。 Telnetセッション中に、次のように入力します。
get newkey
結果は次のようになります。
VALUE newkey 0 12
NewTestValue
上記のset
およびget
コマンドは、すべてのmemcachedサーバーで有効です。 これらは、NoSQLスタイルでレコードを挿入および取得する方法のほんの数例です。
次に、コマンドmysql -u root test
またはmysql -u root test -p
を使用してMySQLクライアントに再度接続し、qyeryを実行してdemo_test
テーブルの内容を再度確認します。
- SELECT * FROM demo_test WHERE c1="newkey";
そこに、次のように新しく作成された行が表示されます。
+--------+--------------+------+------+------+
| c1 | c2 | c3 | c4 | c5 |
+--------+--------------+------+------+------+
| newkey | NewTestValue | 0 | 1 | 0 |
+--------+--------------+------+------+------+
ここまでで、memcachedプラグインが接続するデータベースとテーブルをどのように認識し、情報をテーブルの列にマップするのか疑問に思うかもしれません。 答えはデータベースinnodb_memcache
とそのテーブルcontainers
にあります。
次のselectステートメントを実行します。
- select * from containers \G
次のように表示されます。
*************************** 1. row ***************************
name: aaa
db_schema: test
db_table: demo_test
key_columns: c1
value_columns: c2
flags: c3
cas_column: c4
expire_time_column: c5
unique_idx_name_on_key: PRIMARY
1 row in set (0.00 sec)
さまざまなマッピングを作成する方法の詳細と、memcachedプラグインの高度な機能については、memcachedプラグインの内部ページをご覧ください。
MySQLをmemcachedプラグインと統合する利点
上記の情報と例は、memcachedプラグインを介してMySQLをNoSQLと統合することのいくつかの重要な利点の概要を示しています。
- すべてのデータ(MySQLとNoSQL)を1か所に保存できます。 NoSQLデータ用に追加のソフトウェアをインストールして維持する必要はありません。
- 強力なInnoDBストレージエンジンのおかげで、NoSQLデータのデータの永続化、リカバリ、およびレプリケーションが可能です。
- 信じられないほど高速なmemcachedデータアクセスレイヤーを引き続き使用できるため、低速のMySQLクライアントで作業する場合に比べて大量の情報を操作できます。
- NoSQLデータは、MySQLのインターフェースと構文で管理できます。 したがって、左結合などのより複雑なSQLクエリにNoSQLデータを含めることができます。
結論
この記事の終わりまでに、MySQLによって提供されるNoSQLデータを操作するための新しい可能性に精通しているはずです。 これは、MongoDBなどの専用NoSQLサーバーに代わるユニバーサルソリューションではないかもしれませんが、確かにメリットがあります。