MySQLの下でInnoDBエンジンの中のMemcachedプラグインを詳しく理解します
9064 ワード
先年、HandlerSocketが世に出て人々の目の前を明るくした.その時、私はまたその使い方のあらすじを紹介した文章を書いた.今でも、いろいろな原因でHandlerSocketは本当に流行していないが、幸いなことにMySQLの公式が啓発され、InnoDBベースのMemcachedプラグインを開発し、やっとMySQLの中でNoSQLの香りが続いた.以前はMemcachedサーバを単独で架設してメモリを浪費しただけでなく、データの不一致を自分で維持しなければならなかった.Memcachedプラグインがあれば、これらの問題は存在せず、MySQL自体のレプリケーション機能を借りて、Memcachedのレプリケーションを変相的に実現したと言えるのは意外な喜びだ.
インストール
文章の整合性を高めるために、ソースコードからMySQLをインストールすることを選びました.注意しなければならないのは、初期のバージョンでメモリ漏れがあったので、最新の安定版をインストールすることをお勧めします.本稿のリリース時まで、最新の安定版は5.6.13で、これを例に説明します.プロセスは簡単です.WITHをアクティブにすれば.INNODB_MEMCACHED:
MySQLのインストールが完了すると、プラグインディレクトリにinnodb_が表示されます.engine.soとlibmemcached.so:
また、Memcachedプラグインをインポートするために必要なテーブル構造も必要です.
準備が整い次第、Memcachedプラグインをアクティブにすることができます(もちろん必要であれば禁止することもできます):
説明:プラグインを再起動する場合は、uninstallを先にしてからインストールすることができます.
Memcachedプラグインに関する構成情報は次のとおりです.具体的には、公式ドキュメントを参照してください.
注意:daemon_memcached_r_batch_sizeとdaemon_memcached_w_batch_size、この2つのオプションはパフォーマンスに大きな影響を及ぼします.簡単に言えば、トランザクションのコミット頻度を制御します.MySQLのデフォルト値はいずれも1です.つまり、毎回コミットされます.これは主にセキュリティを考慮しています.皆さんは自分の状況に合わせて調整することができます.
差は多くありませんが、Memcachedポートの準備ができているはずです.試してみてください.
つまり、MySQLはすでにMemcachedプロトコルに対応しており、Memcachedコマンドを直接使用することができます.コンフィギュレーション
インストール手順ではinnodbという名前のmemcached_config.sqlのスクリプト.innodb_memcacheの3つのテーブル(cache_policies,config_options,containers)を作成します.
cache_policiesはキャッシュポリシーを定義し、次の選択を含む.
innodb_only:InnoDBのみをデータとして格納します.Cache-only:バックエンドストレージとして従来のMemcachedエンジンのみを使用します.caching:どちらも使用し、Memcachedで見つからない場合はInnoDBをクエリーします.
config_optionsは区切り記号を定義します.
separator:Memcachedは単一の値のみを認識し、この区切り記号(|)を使用して複数のフィールドの値を接続します. table_map_delimiter:この区切り記号(.)@table.key.
Memcachedプロトコルでテーブルにアクセスするには、containersで構成する必要があります.
以上のようにtestデータベースのdemo_testテーブルは、c 1によってc 2の値をクエリーし、テーブル構造は以下の通りです.
デフォルトでは1行のデータがあります.
Memcachedプロトコルでアクセスしてみましょう.
また、デフォルトのアクセステーブルを設定してから、後続のクエリーにキー名だけを書くこともできます.
私の例はコマンドラインで実行していますが、PHPなどの書き方を簡単に変更できます.制限
Memcachedプラグインはとても簡単ですが、すべてが完璧ではありません.例えば、テーブルを構成するとき、containersテーブルのフィールドはkey_を除いてcolumnsとvalue_columns以外のフィールド、例えばflags、cas_column,expire_time_columnなども設定しなければなりませんが、元の表に適切なフィールドが見つからない場合が多いので、新しい3つのフィールドに対応するしかなく、味が気持ち悪いです.
さらにcontainersテーブルには、次の制限があります. key_columnsフィールドのタイプはCHARまたはVARCHARで、最大長は250文字でなければなりません. value_columnsフィールドのタイプは、CHARまたはVARCHARまたはBLOBである必要があります.長さは制限されません. cas_columnフィールドのタイプはBIGINTでなければなりません. expiration_time_columnフィールドのタイプはINTでなければなりません. flagsフィールドのタイプはINTでなければなりません.
説明:MySQLバージョンの更新に伴い、これらの制限が変更される可能性がありますので、実際の状況を基準にしてください.実戦
学習結果をユーザーがログインした例で確認してみましょう.
まず、テスト・データベースでユーザー・テーブルを作成します.
次に、いくつかのテストデータを追加します.
次にcontainersでこのテーブルを構成します.
ここではvalue_として複数のフィールド(passwordとemail)を定義します.columnsは、縦線を区切り文字として使用しますが、実際にはスペース、カンマなどの区切り文字を使用しても構いません.innodb_config.cファイルのソースコードには、以下の区切り文字の定義が表示されます.ドキュメントにはこれらの情報は含まれていません.
最後にMemcachedプロトコルを使用してアクセスします.ここでは模様を変えてMGET操作を実行します.
value_を定義した以上columnsのときに複数のフィールドが設定されている場合、データを返すときに自然に複数のフィールドのデータも返され、innodb_に従います.memcache.config_optionsテーブルのseparatorフィールドを区切ると、デフォルトでは縦線になります.フィールドの内容に縦線が含まれている場合は、デフォルト値と競合します.この場合、3つの縦線に変更するなど、separatorの定義を更新することができます.変更後、Memcachedプラグインを再起動することを忘れないでください.
説明:テーブルは構成時にdefaultと命名されるため、リクエスト時にテーブル名を渡す必要はありません.defaultが存在しない場合、名前はアルファベット順に並べられ、1位がデフォルトです.
…
本稿では、Memcachedプラグインを使用する場合、すべての例で読み取り操作が使用されていますが、実際に書き込み操作もサポートされていますが、実際に使用する場合、書き込み操作はSQLで実行する傾向にありますが、MemcachedプラグインはKV形式の読み取り操作のみを処理しており、実際の圧力テストの結果、MemcachedプラグインはSQL方式よりも性能が100%向上していることが分かりました.まだ独立したMemcachedには及ばないが、他の利点を考慮すると、この結果はもう喜ばしい.次の駅、InnoDBのMemcachedプラグイン!みんな準備しておきましょう.
インストール
文章の整合性を高めるために、ソースコードからMySQLをインストールすることを選びました.注意しなければならないのは、初期のバージョンでメモリ漏れがあったので、最新の安定版をインストールすることをお勧めします.本稿のリリース時まで、最新の安定版は5.6.13で、これを例に説明します.プロセスは簡単です.WITHをアクティブにすれば.INNODB_MEMCACHED:
shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> tar zxvf mysql-5.6.13.tar.gz
shell> cd mysql-5.6.13
shell> cmake . -DWITH_INNODB_MEMCACHED=ON
shell> make
shell> make install
shell> cd /usr/local/mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
shell> bin/mysqld_safe --user=mysql &
shell> cp support-files/mysql.server /etc/init.d/mysql.server
MySQLのインストールが完了すると、プラグインディレクトリにinnodb_が表示されます.engine.soとlibmemcached.so:
mysql> SELECT @@plugin_dir;
+------------------------------+
| @@plugin_dir |
+------------------------------+
| /usr/local/mysql/lib/plugin/ |
+------------------------------+
また、Memcachedプラグインをインポートするために必要なテーブル構造も必要です.
mysql> SOURCE /usr/local/mysql/share/innodb_memcached_config.sql
準備が整い次第、Memcachedプラグインをアクティブにすることができます(もちろん必要であれば禁止することもできます):
mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
mysql> UNINSTALL PLUGIN daemon_memcached;
説明:プラグインを再起動する場合は、uninstallを先にしてからインストールすることができます.
Memcachedプラグインに関する構成情報は次のとおりです.具体的には、公式ドキュメントを参照してください.
mysql> SHOW VARIABLES LIKE '%memcached%';
+----------------------------------+------------------+
| Variable_name | Value |
+----------------------------------+------------------+
| daemon_memcached_enable_binlog | OFF |
| daemon_memcached_engine_lib_name | innodb_engine.so |
| daemon_memcached_engine_lib_path | |
| daemon_memcached_option | |
| daemon_memcached_r_batch_size | 1 |
| daemon_memcached_w_batch_size | 1 |
+----------------------------------+------------------+
注意:daemon_memcached_r_batch_sizeとdaemon_memcached_w_batch_size、この2つのオプションはパフォーマンスに大きな影響を及ぼします.簡単に言えば、トランザクションのコミット頻度を制御します.MySQLのデフォルト値はいずれも1です.つまり、毎回コミットされます.これは主にセキュリティを考慮しています.皆さんは自分の状況に合わせて調整することができます.
差は多くありませんが、Memcachedポートの準備ができているはずです.試してみてください.
shell> echo "stats" | nc localhost 11211
つまり、MySQLはすでにMemcachedプロトコルに対応しており、Memcachedコマンドを直接使用することができます.コンフィギュレーション
インストール手順ではinnodbという名前のmemcached_config.sqlのスクリプト.innodb_memcacheの3つのテーブル(cache_policies,config_options,containers)を作成します.
mysql> USE innodb_memcache
mysql> SHOW TABLES;
+---------------------------+
| Tables_in_innodb_memcache |
+---------------------------+
| cache_policies |
| config_options |
| containers |
+---------------------------+
cache_policiesはキャッシュポリシーを定義し、次の選択を含む.
innodb_only:InnoDBのみをデータとして格納します.Cache-only:バックエンドストレージとして従来のMemcachedエンジンのみを使用します.caching:どちらも使用し、Memcachedで見つからない場合はInnoDBをクエリーします.
config_optionsは区切り記号を定義します.
separator:Memcachedは単一の値のみを認識し、この区切り記号(|)を使用して複数のフィールドの値を接続します. table_map_delimiter:この区切り記号(.)@table.key.
Memcachedプロトコルでテーブルにアクセスするには、containersで構成する必要があります.
mysql> 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
以上のようにtestデータベースのdemo_testテーブルは、c 1によってc 2の値をクエリーし、テーブル構造は以下の通りです.
mysql> DESC test.demo_test;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| c1 | varchar(32) | NO | PRI | | |
| c2 | varchar(1024) | YES | | NULL | |
| c3 | int(11) | YES | | NULL | |
| c4 | bigint(20) unsigned | YES | | NULL | |
| c5 | int(11) | YES | | NULL | |
+-------+---------------------+------+-----+---------+-------+
デフォルトでは1行のデータがあります.
mysql> SELECT * FROM test.demo_test;
+----+--------------+------+------+------+
| c1 | c2 | c3 | c4 | c5 |
+----+--------------+------+------+------+
| AA | HELLO, HELLO | 8 | 0 | 0 |
+----+--------------+------+------+------+
Memcachedプロトコルでアクセスしてみましょう.
shell> echo "get @@aaa.AA" | nc localhost 11211
VALUE @@aaa.AA 8 12
HELLO, HELLO
END
また、デフォルトのアクセステーブルを設定してから、後続のクエリーにキー名だけを書くこともできます.
shell> (echo "get @@aaa"; echo "get AA") | nc localhost 11211
VALUE @@aaa 0 14
test/demo_test
END
VALUE AA 8 12
HELLO, HELLO
END
私の例はコマンドラインで実行していますが、PHPなどの書き方を簡単に変更できます.制限
Memcachedプラグインはとても簡単ですが、すべてが完璧ではありません.例えば、テーブルを構成するとき、containersテーブルのフィールドはkey_を除いてcolumnsとvalue_columns以外のフィールド、例えばflags、cas_column,expire_time_columnなども設定しなければなりませんが、元の表に適切なフィールドが見つからない場合が多いので、新しい3つのフィールドに対応するしかなく、味が気持ち悪いです.
さらにcontainersテーブルには、次の制限があります.
説明:MySQLバージョンの更新に伴い、これらの制限が変更される可能性がありますので、実際の状況を基準にしてください.実戦
学習結果をユーザーがログインした例で確認してみましょう.
まず、テスト・データベースでユーザー・テーブルを作成します.
USE `test`
CREATE TABLE `users` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(15) NOT NULL,
`password` VARCHAR(32) NOT NULL,
`email` VARCHAR(50) NOT NULL,
`flags` INT(10) UNSIGNED DEFAULT '0',
`cas_column` BIGINT(20) UNSIGNED DEFAULT '0',
`expire_time_column` INT(10) UNSIGNED DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB;
次に、いくつかのテストデータを追加します.
INSERT INTO `users` (`username`, `password`, `email`)
VALUES
('foo', 'ffffffffffffffffffffffffffffffff', '[email protected]'),
('bar', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', '[email protected]');
次にcontainersでこのテーブルを構成します.
INSERT INTO innodb_memcache.containers (
name, db_schema, db_table, key_columns, value_columns,
flags, cas_column, expire_time_column, unique_idx_name_on_key
) VALUES (
'default', 'test', 'users', 'username', 'password|email',
'flags', 'cas_column', 'expire_time_column', 'username'
);
ここではvalue_として複数のフィールド(passwordとemail)を定義します.columnsは、縦線を区切り文字として使用しますが、実際にはスペース、カンマなどの区切り文字を使用しても構いません.innodb_config.cファイルのソースコードには、以下の区切り文字の定義が表示されます.ドキュメントにはこれらの情報は含まれていません.
static const char* sep = " ;,|
";
最後にMemcachedプロトコルを使用してアクセスします.ここでは模様を変えてMGET操作を実行します.
shell> echo "get foo bar" | nc localhost 11211
VALUE foo 0 47
ffffffffffffffffffffffffffffffff|[email protected]
VALUE bar 0 47
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|[email protected]
END
value_を定義した以上columnsのときに複数のフィールドが設定されている場合、データを返すときに自然に複数のフィールドのデータも返され、innodb_に従います.memcache.config_optionsテーブルのseparatorフィールドを区切ると、デフォルトでは縦線になります.フィールドの内容に縦線が含まれている場合は、デフォルト値と競合します.この場合、3つの縦線に変更するなど、separatorの定義を更新することができます.変更後、Memcachedプラグインを再起動することを忘れないでください.
説明:テーブルは構成時にdefaultと命名されるため、リクエスト時にテーブル名を渡す必要はありません.defaultが存在しない場合、名前はアルファベット順に並べられ、1位がデフォルトです.
…
本稿では、Memcachedプラグインを使用する場合、すべての例で読み取り操作が使用されていますが、実際に書き込み操作もサポートされていますが、実際に使用する場合、書き込み操作はSQLで実行する傾向にありますが、MemcachedプラグインはKV形式の読み取り操作のみを処理しており、実際の圧力テストの結果、MemcachedプラグインはSQL方式よりも性能が100%向上していることが分かりました.まだ独立したMemcachedには及ばないが、他の利点を考慮すると、この結果はもう喜ばしい.次の駅、InnoDBのMemcachedプラグイン!みんな準備しておきましょう.