リモート同期の間でMemcacheのデータを実行しようとする前に、データが別の場所との間のライン・パフォーマンス・ギャップを介してネットワークの発見と性能試験を含む、メッセージキューに書き込まれると、プロセスをメッセージ処理でGearmanを使用してもオフサイトの場合には、非常に明白ですプロセスを処理するデータトラフィック増加を同期させることは困難であるメッセージの数を増やします。Memcacheのサポートバッチ書き込みがこれを緩和できる可能性があれば、遅延から判断することにより、緑色又はネットワークよりもはるかに高いとの間の異なる場所にあってもよい、Memcacheの低レイテンシは、(深刻なネットワーク遅延の影響を受け、このような要求を読み取り、IOオペレーションを書き込みます問題)。だから、解決策を考えることは、あなたはネットワーク遅延がもたらすの影響に書き込むことを避けることができ、すぐにもう一方の端に同期するデータを渡します、Memcacheのは読んでやると書き込み操作を高遅延ネットワークの使用を避けることです。
他方の端部へのデータの同期のために、同期メソッドBLPOPを使用してスクリプトを使用してデータを読み取るためのRedis考えることが一般的に容易データベース複製機構の数、時間リスト書き込みデータの場合、ループの他端によって行うことができます。これは、プロセスは、より優れたパフォーマンスと安定性だけでなく、保守や監視の必要性を持っている必要があり、難易度は、独自の開発プロセス上のデータを同期する必要性にある、も良い方法です。
それはデータ複製機構に来るとき、私の最初の考えはもう一方の端に同期ブラックホールエンジンbinlogの方法を使用してMySQLのデータであるが、信頼性がRedis--が回復中断コピーよりも高くなって、そこにバイナリログデータの記録は良好です。同期プロセスは、次の2つの方法で実行されるために1がbinlogのオーバーによりコピー処理を読んで、このアプローチの難しさは、まだ別の方法は、トリガを使用することで同様のRedisのを使用して同期することが難しく、自分の同期プロセスを開発する必要があるということです同期、Memcacheのに対応する動作を実行するためにINSERT文を受け、それぞれが、またMySQLはUDFをlibmemcached使用する必要があります。
1. MySQLはUDFをlibmemcachedインストール
UDF MySQLのインストールは非常に簡単です、最初のダウンロード[libmemcached UDFソース](https://launchpad.net/memcached-udfs https://launchpad.net/memcached-udfs)、あまりにも、libmemcached依存しており、新しいバージョンを使用することはできませんこれは、0.31 Centos6の使用が可能です。以下の手順に従ってください ./configure make make install cp /usr/local/lib/libmemcached_functions_mysql.so /usr/lib64/mysql/plugin/ mysql -u root < sql/install_functions.sql
2. [スタート]複数のMySQLインスタンス
テストと最終的な展開を容易にするためには、操作の方法についての記録は、最初の二つのMySQLデータディレクトリを初期化する場合は、MySQLインスタンス以上を使用する必要があります
mysql_install_db --user=mysql --datadir=/var/lib/mysql/3306/ mysql_install_db --user=mysql --datadir=/var/lib/mysql/3307/
そして、唯一のブラックホールエンジンを使用する必要があるため、比較的小さなを設定し、パラメータのほとんどは、あまり意味はありませんが、以下の書類と同様の構成を使用しますが、いくつかのリソースを節約します
[mysqld_multi] mysqld = /usr/bin/mysqld_safe mysqladmin = /usr/bin/mysqladmin [mysqld3306] port = 3306 socket = /var/lib/mysql/3306/mysqld.sock datadir = /var/lib/mysql/3306 key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M log-bin=mysql-bin binlog_format=mixed server-id = 3306 innodb_data_file_path = ibdata1:10M:autoextend innodb_buffer_pool_size = 16M innodb_additional_mem_pool_size = 2M innodb_log_file_size = 5M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 innodb_lock_wait_timeout = 50 [mysqld3307] port = 3307 socket = /var/lib/mysql/3307/mysqld.sock datadir = /var/lib/mysql/3307 key_buffer_size = 16M max_allowed_packet = 1M table_open_cache = 64 sort_buffer_size = 512K net_buffer_length = 8K read_buffer_size = 256K read_rnd_buffer_size = 512K myisam_sort_buffer_size = 8M log-bin=mysql-bin binlog_format=mixed server-id = 3307 innodb_data_file_path = ibdata1:10M:autoextend innodb_buffer_pool_size = 16M innodb_additional_mem_pool_size = 2M innodb_log_file_size = 5M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 innodb_lock_wait_timeout = 50
マルチスタートの例として、以下のように、2つのインスタンスを開始します
mysqld_multi start 3306 mysqld_multi start 3307
3.初期化は、UDFをlibmemcached
手動でMySQLを開始した後libmemcached UDFの初期化、Memcacheのは、対応するサーバを設け、分散ハッシュ法を設定し、次のように初期化スクリプトであります
SELECT memc_servers_set('127.0.0.1:11211,127.0.0.1:11212'); SELECT memc_servers_behavior_set('MEMCACHED_BEHAVIOR_DISTRIBUTION', 'MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA'); SELECT memc_servers_behavior_set('MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED', 1);
上記の必要性は、あなたが初期化が成功したかどうかを確認するためにMySQLの、次のテストを起動するたびに初期化することに注意してください、書かれた説明の成功を返します
SELECT memc_set('abc', '123'); +------------------------+ | memc_set('abc', '123') | +------------------------+ | 1 | +------------------------+ SELECT memc_get('abc'); +-----------------+ | memc_get('abc') | +-----------------+ | 123 | +-----------------+
4. libmemcached UDF変更サポートカスタムフラグ
libmemcached UDFは大きな欠点がMemcacheのフラグ0をパラメータがコード化されたということであり、我々は値も同期中に同期され、元のフラグが必要なので、行動規範の必要性は、ここでしかUDF少し調整をlibmemcached設定方法を変更し、方法の他の変形例も同様です。
diff -Nur memcached_functions_mysql-1.1/src/args.c memcached_functions_mysql-1.1.patched/src/args.c --- memcached_functions_mysql-1.1/src/args.c 2009-11-11 10:56:52.000000000 +0800 +++ memcached_functions_mysql-1.1.patched/src/args.c 2015-09-19 10:11:59.062512226 +0800 @@ -120,6 +120,30 @@ case MEMC_ADD_BY_KEY: case MEMC_REPLACE: case MEMC_REPLACE_BY_KEY: + { + + if (args->arg_count >= max_args - 1) + { + if (args->arg_type[max_args - 2] == STRING_RESULT) + { + container->flags= (uint32_t)atoi(args->args[max_args - 2]); + } + else if (args->arg_type[max_args - 2] == INT_RESULT) + { + container->flags= *((uint32_t*)args->args[max_args -2]); + } + else + { + container->flags= (uint32_t)0; + } + + } + else + { + container->flags= (uint32_t) 0; + } + fprintf(stderr, "flags %dn", (int) container->expiration); + } case MEMC_APPEND: case MEMC_APPEND_BY_KEY: case MEMC_PREPEND: diff -Nur memcached_functions_mysql-1.1/src/common.h memcached_functions_mysql-1.1.patched/src/common.h --- memcached_functions_mysql-1.1/src/common.h 2009-11-15 06:53:23.000000000 +0800 +++ memcached_functions_mysql-1.1.patched/src/common.h 2015-09-19 09:50:30.480512194 +0800 @@ -11,6 +11,7 @@ struct memc_function_st { unsigned int offset; time_t expiration; + uint32_t flags; memcached_st memc; memcached_result_st results; memcached_string_st *stats_string; diff -Nur memcached_functions_mysql-1.1/src/set.c memcached_functions_mysql-1.1.patched/src/set.c --- memcached_functions_mysql-1.1/src/set.c 2009-11-11 10:56:52.000000000 +0800 +++ memcached_functions_mysql-1.1.patched/src/set.c 2015-09-19 10:01:36.611512903 +0800 @@ -30,7 +30,7 @@ unsigned int count; memc_function_st *container; - container= prepare_args(args, message, MEMC_SET, 2, 3); + container= prepare_args(args, message, MEMC_SET, 2, 4); if (container == NULL) return 1; @@ -67,7 +67,7 @@ rc= memcached_set(&container->memc, args->args[0], (size_t)args->lengths[0], args->args[1], (size_t)args->lengths[1], - container->expiration, (uint16_t)0); + container->expiration, container->flags); return (rc != MEMCACHED_SUCCESS) ? (long long) 0 : (long long) 1; }
そう三番目のパラメータで調整memc_set方法はフラグであり、第四パラメータが有効期限であり、ゼロにデフォルトでは合格しません。
5. PHP Memcachedのモジュール、取得した書き込み生データを増加させる方法
PHP memcachedのモジュールは、データの列としてデータを保存する圧縮処理、および同期UDFでは困難と同じアプローチを行うには、あなたが私たちPHPのMemcached、それを取得した後、PHPのMemcachedモジュールに対処する必要がありますので、次のように実装されているこの機能を達成するためにモジュールを増加させる方法であって、getPayload
static zend_function_entry memcached_class_methods[] = { //... MEMC_ME(getPayload, arginfo_getPayload) { NULL, NULL, NULL } }; ZEND_BEGIN_ARG_INFO_EX(arginfo_getPayload, 0, 0, 1) ZEND_ARG_INFO(0, value) ZEND_ARG_INFO(1, flags) ZEND_END_ARG_INFO() static PHP_METHOD(Memcached, getPayload) { zval* zflags = NULL; uint32_t flags; zval* value; char *payload; size_t payload_len; MEMC_METHOD_INIT_VARS; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|z", &value, &zflags) == FAILURE) { return; } MEMC_METHOD_FETCH_OBJECT; if (i_obj->compression) { flags |= MEMC_VAL_COMPRESSED; } if (i_obj->serializer == SERIALIZER_IGBINARY) { flags |= MEMC_VAL_IGBINARY; } payload = php_memc_zval_to_payload(value, &payload_len, &flags TSRMLS_CC); if (zflags != NULL) { convert_to_long(zflags); ZVAL_LONG(zflags, flags); } RETURN_STRINGL(payload, payload_len, 0); }
次のような効果を使用しました
<?php $mem = new Memcached(); var_dump($mem->getPayload(array(), $flags), $flags);
次のように入力します。
string(6) "a:0:{}" int(1)
5.同期トリガデータテーブルボックスを確立します
テーブルに次のように構成され、同期を確立するための表
CREATE TABLE `MemcQueue` ( `k` varchar(250) NOT NULL, `expiration` int(11) NOT NULL, `flags` int(10) unsigned NOT NULL, `v` mediumblob NOT NULL, PRIMARY KEY (`k`) ) ENGINE=BLACKHOLE DEFAULT CHARSET=latin1
ライブラリーからのフリップフロップの設立に
DELIMITER | CREATE TRIGGER queue_trigger AFTER INSERT ON MemcQueue FOR EACH ROW BEGIN SET @mm = memc_set(new.k, new.v, new.flags, new.expiration); END |
6.試験結果
オリジナルリンク大列 https://www.dazhuanlan.com/2019/08/15/5d55107d28e42/