MySQLの下でInnoDBエンジンの中のMemcachedプラグインを詳しく理解します

9064 ワード

先年、HandlerSocketが世に出て人々の目の前を明るくした.その時、私はまたその使い方のあらすじを紹介した文章を書いた.今でも、いろいろな原因でHandlerSocketは本当に流行していないが、幸いなことにMySQLの公式が啓発され、InnoDBベースのMemcachedプラグインを開発し、やっとMySQLの中でNoSQLの香りが続いた.以前はMemcachedサーバを単独で架設してメモリを浪費しただけでなく、データの不一致を自分で維持しなければならなかった.Memcachedプラグインがあれば、これらの問題は存在せず、MySQL自体のレプリケーション機能を借りて、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テーブルには、次の制限があります.
  •     key_columnsフィールドのタイプはCHARまたはVARCHARで、最大長は250文字でなければなりません.
  •     value_columnsフィールドのタイプは、CHARまたはVARCHARまたはBLOBである必要があります.長さは制限されません.
  •     cas_columnフィールドのタイプはBIGINTでなければなりません.
  •     expiration_time_columnフィールドのタイプはINTでなければなりません.
  • flagsフィールドのタイプはINTでなければなりません.

  • 説明: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プラグイン!みんな準備しておきましょう.