日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

memcache mysql 同步_memcache与mysql数据库同步

發布時間:2025/3/21 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 memcache mysql 同步_memcache与mysql数据库同步 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mysql memcached UDF(用戶自定義函數)和mysql觸發器在更新mysql數據庫的時候,觸發更新memcache。

1、首先介紹mysql memcached UDF安裝

mysql memcached UDF 安裝詳解

2011-03-31 14:19:12|? 分類: php|字號 訂閱

1:mysql memcached UDF 其實就是通過libmemcached來使用memcache的一系列函數,通過這些函數,你能 對memcache進行get, set, cas, append, prepend, delete, increment, decrement objects操作,如果我們通過mysql trigger來使用這些函數,那么就能通過mysql更好的,更自動的管理memcache!

2:安裝方法:

1)安裝memcache

2)安裝libmemcached

shell> cd libmemcached-0.35

shell> ./configure --with-memcached=/usr/local/bin/memcached

shell> make && make install

shell> echo "/usr/local/lib" >> /etc/ld.so.conf

shell> ldconfig

3)安裝memcached_functions_mysql

shell> tar zxvf memcached_functions_mysql-0.9.tar.gz

shell> cd memcached_functions_mysql-0.9

shell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/

shell> make && make install

4)拷貝lib文件到mysql的plugin下面

shell> cp -R /usr/local/lib/libmemcached_functions_mysql.* /usr/local/mysql51/lib/mysql/plugin/

5)添加memcache UDF 函數

在mysql里執行 source install_functions.sql

這樣我們就可以使用mysql memcached UDF 了,我們可以通過下面語句查看是否已經正常安裝

1)查看mysql.func,有很多函數

mysql> select * from mysql.func;

+------------------------------+-----+---------------------------------+----------+

| name???????????????????????? | ret | dl????????????????????????????? | type???? |

+------------------------------+-----+---------------------------------+----------+

| memc_add???????????????????? |?? 2 | libmemcached_functions_mysql.so | function |

| memc_add_by_key????????????? |?? 2 | libmemcached_functions_mysql.so | function |

| memc_servers_set???????????? |?? 2 | libmemcached_functions_mysql.so | function |

2)添加trigger,看是否向memcache里insert、update等

具體的語句,我們可以參照:

1)memcached_functions_mysql-0.9/sql 目錄下的trigger_fun.sql

我們還必須注意以下幾點:

1)mysql 編譯時一定不要帶'--with-mysqld-ldflags=-all-static' 這個參數,因為這樣就限制了mysql 的動態安裝功能了

2)使用時,要觀察mysql.err日志,不知道是有意還是無意,udf更新memcache都會記錄在err日志里,注意清理該日志,否則一下就爆滿了

3)mysql 官網有這樣一句話:

The list of servers used by the memcached UDFs is not persistent over restarts of the MySQL server. If the MySQL server fails, then you must re-set the list of memcached servers.

所以,當我們重啟mysql,我們必須通過select? memc_servers_set('192.168.0.1:11211,192.168.0.2:11211');語句重新注冊memcache服務器!

測試環境在Linux下進行,版本系統為CentOS5.

以下為相關軟件,包括其版本和下載地址:

mysql-5.1.30 下載

memcached-1.2.6 下載

libevent-1.4.7-stable 下載

memcached_functions_mysql-1.1 下載

libmemcached-0.26 下載

編譯安裝MySQL,安裝因個人細好而定,省略許多與測試無關的編譯細節及參數。 [root@localhost ~]#tar xzf mysql-5.1.30.tar_001.gz

[root@localhost ~]#cd mysql-5.1.30

[root@localhost ~]#./configure --prefix=/usr/local/mysql51

[root@localhost ~]#make

[root@localhost ~]#make install

[root@localhost ~]#./scripts/mysql_install_db --user=mysql --skip-name-resolve

[root@localhost ~]#/usr/local/mysql51/bin/mysqld_safe

省略列出安裝memcached和libevent的相關命令,具體可按照實際情況安裝,測試時我將libevent默認安裝,memcached安裝于/usr/local/memcached目錄下。

啟動memcached. /usr/local/memcached/bin/memcached -d -m 50 -u root -p 11211

編譯安裝libmemcache. [root@localhost ~]#tar xzf libmemcached-0.26.tar.gz

[root@localhost ~]#cd libmemcached-0.26

[root@localhost ~]#./configure --with-memcached=/usr/local/memcached/bin/memcached

[root@localhost ~]# make && make install

編譯安裝Memcache UDFs for MySQL. [root@localhost ~]# tar xzf memcached_functions_mysql-1.1.tar.gz

[root@localhost ~]# cd memcached_functions_mysql-1.1

[root@localhost ~]# ./configure --with-mysql-config=/usr/local/mysql51/bin/mysql_config

[root@localhost ~]# make && make install

編譯完成后將編譯好的庫文件復制到mysql的插件目錄下,以便于加載使用。 cp /usr/local/lib/libmemcached_functions_mysql* /usr/local/mysql51/lib/mysql/plugin/

進入memcached_functions_mysql的源碼目錄,在目錄下有相關添加UDF的SQL文件用于初始化。

在mysql的shell中執行memcached_functions_mysql源碼目錄下的sql/install_functions.sql

或者運行memcached_functions_mysql源碼目錄下utils/install.pl這個perl腳本,把memcache function作為UDF加入mysql。

[root@localhost ~]# mysql

檢查安裝是否成功

mysql> select name,dl from mysql.func;

二. 測試用例設計情況:

(1).新建兩張表:urls和results,用來更新urls表里面的內容,讓系統自動更新memcached的內容。results用來記錄更新memcached失敗的記錄。

sql語句如下:

use tests;

drop table if exists urls;

CREATE TABLE `urls` (

`id` int(10) NOT NULL,

`url` varchar(255) NOT NULL DEFAULT '',

PRIMARY KEY (`id`)

);

drop table if exists results;

CREATE TABLE `results` (

`id` int(10) NOT NULL,

`result` varchar(255) NOT NULL DEFAULT 'error',

`time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

);

(2). 建立三個trigger.

當向urls表里面插入數據時,對memcached執行set操作,trigger如下:

DELIMITER //

DROP TRIGGER IF EXISTS url_mem_insert;

CREATE TRIGGER url_mem_insert

BEFORE INSERT ON urls

FOR EACH ROW BEGIN

set @mm = memc_set(NEW.id, NEW.url);

if @mm <> 0 then

insert into results(id) values(NEW.id);

end if;

END //

DELIMITER ;

當對urls表里面的數據進行更新時,對memcached執行replace操作,trigger如下:

DELIMITER //

DROP TRIGGER IF EXISTS url_mem_update;

CREATE TRIGGER url_mem_update

BEFORE UPDATE ON urls

FOR EACH ROW BEGIN

set @mm = memc_replace(OLD.id,NEW.url);

if @mm <> 0 then

insert into results(id) values(OLD.id);

end if;

END //

DELIMITER ;

當對urls表里面的數據進行刪除操作時,對memcached執行delete操作,trigger如下:

DELIMITER //

DROP TRIGGER IF EXISTS url_mem_delete;

CREATE TRIGGER url_mem_delete

BEFORE DELETE ON urls

FOR EACH ROW BEGIN

set @mm = memc_delete(OLD.ID);

if @mm <> 0 then

insert into results(id) values(OLD.id);

end if;

END //

DELIMITER ;

(3). 設置memcached相關參數

設置同時UDF操作的memcaced的機器IP和端口:

mysql> SELECT memc_servers_set('192.168.3.184:11900');

+---------------------------------------+

| memc_servers_set('192.168.3.184:11900') |

+---------------------------------------+

|???????????????????????????????????? 0 |

+---------------------------------------+

1 row in set (0.00 sec)

mysql> select memc_server_count();

+---------------------+

| memc_server_count() |

+---------------------+

|?????????????????? 1 |

+---------------------+

1 row in set (0.00 sec)

在mysql命令行列出可以修改memcached參數的行為:

mysql> select memc_list_behaviors()/G

*************************** 1. row ***************************

memc_list_behaviors():

MEMCACHED SERVER BEHAVIORS

MEMCACHED_BEHAVIOR_SUPPORT_CAS

MEMCACHED_BEHAVIOR_NO_BLOCK

MEMCACHED_BEHAVIOR_TCP_NODELAY

MEMCACHED_BEHAVIOR_HASH

MEMCACHED_BEHAVIOR_CACHE_LOOKUPS

MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE

MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE

MEMCACHED_BEHAVIOR_BUFFER_REQUESTS

MEMCACHED_BEHAVIOR_KETAMA

MEMCACHED_BEHAVIOR_POLL_TIMEOUT

MEMCACHED_BEHAVIOR_RETRY_TIMEOUT

MEMCACHED_BEHAVIOR_DISTRIBUTION

MEMCACHED_BEHAVIOR_BUFFER_REQUESTS

MEMCACHED_BEHAVIOR_USER_DATA

MEMCACHED_BEHAVIOR_SORT_HOSTS

MEMCACHED_BEHAVIOR_VERIFY_KEY

MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT

MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED

MEMCACHED_BEHAVIOR_KETAMA_HASH

MEMCACHED_BEHAVIOR_BINARY_PROTOCOL

MEMCACHED_BEHAVIOR_SND_TIMEOUT

MEMCACHED_BEHAVIOR_RCV_TIMEOUT

MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT

MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK

MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK

1 row in set (0.00 sec)

設置MEMCACHED_BEHAVIOR_NO_BLOCK為打開狀態,這樣在memcached出現問題時(不能連接時)

數據繼續插入到mysql中,報錯提示,如果不設置此值,如果memcached失敗,mysql需要等到timeout

才可以插入到表中。

mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');

+--------------------------------------------------------------+

| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |

+--------------------------------------------------------------+

|??????????????????????????????????????????????????????????? 0 |

+--------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');

+-----------------------------------------------------------------+

| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |

+-----------------------------------------------------------------+

|?????????????????????????????????????????????????????????????? 0 |

+-----------------------------------------------------------------+

1 row in set (0.00 sec)

三. 簡單的功能測試:

1. 向表urls里面插入數據,然后查memcached是否也set進數據:

mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');

Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select memc_get('1');

+------------------------+

| memc_get('1')????????? |

+------------------------+

| http://www.sina.com.cn |

+------------------------+

1 row in set (0.00 sec)

1> telnet 192.168.3.184 11900

Trying 192.168.3.184...

Connected to 192.168.3.184 (192.168.3.184).

Escape character is '^]'.

get 1

VALUE 1 0 22

http://www.sina.com.cn

END

2.更新表urls里面的數據,然后查詢memcached里面是否也更新:

mysql> update test.urls set url='http://blog.sina.com.cn' where id=1;

Query OK, 1 row affected, 1 warning (0.00 sec)

Rows matched: 1? Changed: 1? Warnings: 0

mysql> select memc_replace('1','http://blog.sina.com.cn');

+---------------------------------------------+

| memc_replace('1','http://blog.sina.com.cn') |

+---------------------------------------------+

|?????????????????????????????????????????? 0 |

+---------------------------------------------+

1 row in set (0.00 sec)

mysql> select memc_get('1');

+-------------------------+

| memc_get('1')?????????? |

+-------------------------+

| http://blog.sina.com.cn |

+-------------------------+

1 row in set (0.00 sec)

1> telnet 192.168.3.184 11900

Trying 192.168.3.184...

Connected to 192.168.3.184 (192.168.3.184).

Escape character is '^]'.

get 1

VALUE 1 0 23

http://blog.sina.com.cn

END

3.刪除表urls里面的數據,然后查memcached是否也刪除:

mysql> delete from test.urls where id=1;

Query OK, 1 row affected, 1 warning (0.00 sec)

Rows matched: 1? Changed: 1? Warnings: 0

mysql> select memc_get('1');

+---------------+

| memc_get('1') |

+---------------+

| NULL????????? |

+---------------+

1 row in set (0.00 sec)

1> telnet 192.168.3.184 11900

Trying 192.168.3.184...

Connected to 192.168.3.184 (192.168.3.184).

Escape character is '^]'.

get 1

END

四. 利用php腳本insert, update,delete表urls里面的數據,進行測試。

每條記錄的平均長度是:17K

單獨向表urls里面插入10萬條記錄需要的時間為:75秒

單獨對表urls里面更新10萬條記錄需要的時間為:70秒

單獨對表urls里面刪除10萬條記錄需要的時間為:105秒

同時進行30萬數據的insert,update, delete操作需要時間為:241秒

上面操作都沒有memcached失敗情況:

mysql> select * from results;

Empty set (0.00 sec)

測試腳本如下:

插入腳本:

0> more a.php

$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());

mysql_select_db("test",$conn) or die(mysql_error());

//$sql = "show tables";

echo date("Y-m-d H:i:s");

//mysql_query($sql) or die(mysql_error());

for ($i=1; $i<=100000; $i++) {

$sql="insert into urls (id,url) values ($i, 'http://$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i.com');";

mysql_query($sql) or die(mysql_error());

}

echo "/n";

echo date("Y-m-d H:i:s");

?>

更新腳本:

0> more b.php

$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());

mysql_select_db("test",$conn) or die(mysql_error());

//$sql = "show tables";

echo date("Y-m-d H:i:s");

//mysql_query($sql) or die(mysql_error());

for ($i=1; $i<=100000; $i++) {

$sql="update test.urls set url='http://xxxx.$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i.com' where id=$i;";

mysql_query($sql) or die(mysql_error());

}

echo "/n";

echo date("Y-m-d H:i:s");

?>

刪除腳本:

0> more c.php

$conn = mysql_connect("192.168.1.61","test","test") or die(mysql_error());

mysql_select_db("test",$conn) or die(mysql_error());

//$sql = "show tables";

echo date("Y-m-d H:i:s");

//mysql_query($sql) or die(mysql_error());

for ($i=1; $i<=100000; $i++) {

$sql="delete from test.urls where id=$i;";

mysql_query($sql) or die(mysql_error());

}

echo "/n";

echo date("Y-m-d H:i:s");

?>

五. 結論:

測試依賴的環境比較多,可能數據會不準確。整體來看速度還不錯。

適合項目應用相對比較小的場合。

優點:

觸發器中使用 UDFs 直接更新 Memcached 的內容,減輕了應用程序設計和編寫的復雜性。

缺點:

1. 如果出現mysql服務重啟,需要重新設置連接memcached關系(SELECT memc_servers_set('192.168.3.184:11900'))

2. 有可能存在bug問題,導致mysql的crash(測試時沒遇到:)).

真正的線上環境比這個復雜很多。我想到的需要考慮的問題:

1. 網絡因素,mysql和memcached是否放在同一IDC,他們之間的網絡性能是否很好。網絡性能越好,速度肯定越快,如果使用本機的memcached能適當的減少網絡開銷。

2. 插入的數據量,向mysql插入每條記錄的size,以及向memcached里面更新的數據size大小。更新mysql,memcached的數據size越大,更新的速度越慢。

所以前期規劃好,在memcached里面存那兩列(key-value)是關鍵。

3. 延時問題需要考慮,mysql所在機器如果資源使用比較狠,會導致更新memcached慢(出現類似m/s的延時問題)。

4. 考慮容災問題,如果兩者中有down出現時,需要考慮怎么恢復,當前的測試是這樣考慮的:建一張錯誤表,如果在出現更新mc出現問題時,自動把更新錯誤的記錄插到

一張表里面,通過查這張表,可以知道哪些數據在什么時間更新錯誤,如果應用于生產環境,需要考慮監控和出現問題時恢復工作(寫好腳本完善這個工作)。

5. mysql自身因素,例如執行的mysql語句效率,以及連接mysql的client程序(php)的連接開銷等等。

總結

以上是生活随笔為你收集整理的memcache mysql 同步_memcache与mysql数据库同步的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 神马午夜不卡 | 国产毛毛片 | 伊人黄色 | 免费国产a级片 | 美女av免费在线观看 | 久久久999久久久 | 国产尤物av| 色窝窝综合色窝窝久久 | 精品人妻天天爽夜夜爽视频 | 乱淫的女高中暑假调教h | 色综合区| 精品一区不卡 | 91精品小视频 | 久久成人小视频 | 69日影院| 91美女网站 | 国产理论av | 亚洲一区二区在线免费 | 一本色道久久综合亚洲精品小说 | 可以免费在线观看的av | 中文字幕免费高清视频 | 精品人妻一区二区三区日产乱码卜 | 天堂资源中文在线 | 伊人66| 亚洲精品国产a | 蜜臀av粉嫩av懂色av | 无码人妻精品中文字幕 | 超碰人人网 | 欧美激情一区二区三级高清视频 | 三级黄色小视频 | 欧美精品乱码视频一二专区 | 午夜老湿机| 亚洲精品精品 | 欧美乱仑| 亚洲国产精一区二区三区性色 | 亚洲精品无码久久久 | 成人午夜黄色 | 人妻久久久一区二区三区 | 大地资源中文第三页 | 污视频免费在线观看网站 | www.日日干| 国精产品一品二品国精品69xx | mdyd—856冲田杏梨在线 | av永久免费 | 8x8x永久免费视频 | 亚洲大尺度网站 | 美女扒开大腿让男人桶 | 99视频| 国产一区欧美二区 | 久久激情影院 | 女人脱裤子让男人捅 | 国产成人三级一区二区在线观看一 | 精品人妻二区中文字幕 | 99久久久无码国产精品性波多 | 久久免费视频6 | 成年人网站在线 | 理伦毛片| 误杀1电影免费观看高清完整版 | 精品无码av一区二区三区 | 成人精品免费 | 最近中文字幕 | 校霸被c到爽夹震蛋上课高潮 | 国产视频播放 | 18岁禁黄网站 | 午夜色综合 | 欧美亚洲日本一区 | 亚洲欧美偷拍一区 | 综合 欧美 亚洲日本 | 女人下面流白浆的视频 | 免费看的av网站 | 337p日本欧洲亚洲鲁鲁 | 日韩欧美久久精品 | 日本中文字幕一区 | 精品少妇白浆小泬60P | 日日摸日日碰夜夜爽av | 日本免费一区二区三区四区五六区 | 在线成人日韩 | 亚洲av成人精品一区二区三区在线播放 | 香蕉影院在线 | 一本一本久久a久久精品综合麻豆 | 久久精品国产亚洲av久 | 丰满少妇在线观看网站 | 中文字幕影片免费在线观看 | 天天看片天天操 | 天堂av在线免费 | 意大利少妇愉情理伦片 | 奇米影视777第四色 2019中文字幕在线免费观看 | 成年人视频免费在线观看 | 广州毛片| 99精品中文字幕 | 被灌满精子的波多野结衣 | 欧美性一级 | 色综合av综合无码综合网站 | 精品乱码一区内射人妻无码 | 日韩视频二区 | 日本欧美黄色 | 亚洲精品中字 | 日韩电影网站 | 99久久精品国产亚洲 |