データを同期するためにMySQLのトリガーを使用します

リモート同期の間で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/

おすすめ

転載: www.cnblogs.com/chinatrump/p/11416199.html
おすすめ