找回密码
 注册
查看: 4721|回复: 0

mysql memcached UDF 安装详解

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2016-8-22 10:51:11 | 显示全部楼层 |阅读模式
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% @3 |% g& Y1 k+ @& [2 U! R
shell> ./configure --with-memcached=/usr/local/bin/memcached' N. C' ]8 B) o! v. B/ Q$ X; M
shell> make && make install: A5 {" i( J# P' r
shell> echo "/usr/local/lib" >> /etc/ld.so.conf
& d& |$ W7 v  P! e/ q! B) `shell> ldconfig
3)安装memcached_functions_mysql
; ]0 C8 E( X# R, W0 Z4 h+ E. ^shell> tar zxvf memcached_functions_mysql-0.9.tar.gz
! L$ q+ b, P* Ishell> cd memcached_functions_mysql-0.9
( A. O+ O0 o0 E, t% @* f" D; Yshell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/
9 f5 Z1 o. B" I  J; B5 X% G; ?shell> make && make install
4)拷贝lib文件到mysql的plugin下面
  u+ `, j* @9 Y7 `2 ^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;5 s1 c) H$ ^! a- n1 w0 \: H, k
+------------------------------+-----+---------------------------------+----------+
* |$ `3 d" Z( d+ F8 f) M" M| name                         | ret | dl                              | type     |/ h) j2 U* o+ I9 `
+------------------------------+-----+---------------------------------+----------+& a- R! G6 ?( F+ @1 F
| memc_add                     |   2 | libmemcached_functions_mysql.so | function |
7 R2 @6 @+ V7 B| memc_add_by_key              |   2 | libmemcached_functions_mysql.so | function |- S( s0 J6 @4 \" V& A2 N! N* w  n1 [
| memc_servers_set             |   2 | libmemcached_functions_mysql.so | function |
2)添加trigger,看是否向memcache里insert、update等
具体的语句,我们可以参照:
1)memcached_functions_mysql-0.9/sql 目录下的trigger_fun.sql
- \. |+ h- p7 j% G) a
我们还必须注意以下几点:
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服务器!
2、创建mysql的insert,update,delete触发器更新memcache,参考http://blog.csdn.net/jiedushi/article/details/6176940
测试环境在Linux下进行,版本系统为CentOS5.
" j" T* }* l: T. Y以下为相关软件,包括其版本和下载地址:
3 b, t" h5 j& {2 H5 K' P  s
mysql-5.1.30 下载; m8 k- N/ ?4 F: Q5 L! z  M
memcached-1.2.6 下载
+ b. g" _$ \2 e: v- Q! i8 ilibevent-1.4.7-stable 下载
' X% Z2 a4 o9 T( e* w9 t# U* ~+ }memcached_functions_mysql-1.1 下载  {+ @; c7 z" [. N6 v4 b
libmemcached-0.26 下载

( j# @! F3 @1 v5 x2 I# v  W( Y4 |
) O2 ]+ ?% ~9 _3 B8 r7 k
编译安装MySQL,安装因个人细好而定,省略许多与测试无关的编译细节及参数。
  • <span>[</span>root@localhost ~<span>]</span><span>#tar xzf mysql-5.1.30.tar_001.gz</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#cd mysql-5.1.30</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#./configure --prefix=/usr/local/mysql51</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#make</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#make install</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#./scripts/mysql_install_db --user=mysql --skip-name-resolve</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#/usr/local/mysql51/bin/mysqld_safe</span>  
    2 Q7 g: w  L( l) G. l# Z2 Z

; [$ B$ q- ^7 |. }- m4 J- U. i; T" B( _) h+ a7 _# E  d) f, [
' T8 ?$ T3 z2 f( F4 h( D+ f
省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。; i' y( D5 Q! @5 V* f& t6 P
启动memcached.
  • <span>/</span>usr<span>/</span>local<span>/</span>memcached<span>/</span>bin<span>/</span>memcached <span>-</span>d <span>-</span>m <span>50</span> <span>-</span>u root <span>-</span>p <span>11211</span>  
    . n" ^& W: {0 {. G" y% m- H

0 l& Q% t/ i$ Z9 g+ s: ~: E& L. d
- s9 y' `# v7 c! k9 b" @; [8 j& R  K
3 L8 Q; q( R5 t# _; v$ D; v
编译安装libmemcache.
  • <span>[</span>root@localhost ~<span>]</span><span>#tar xzf libmemcached-0.26.tar.gz</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#cd libmemcached-0.26</span>  
  • <span>[</span>root@localhost ~<span>]</span><span>#./configure --with-memcached=/usr/local/memcached/bin/memcached</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># make && make install</span>  
    5 z; k( T; W/ C. u; i
: _" _; ~( [$ c* Z; E) |! ~+ i& k, u
. E8 p2 k# K; ?5 d0 w7 o7 s' N

# O% g! G, J. M& l
编译安装Memcache UDFs for MySQL.
  • <span>[</span>root@localhost ~<span>]</span><span># tar xzf memcached_functions_mysql-1.1.tar.gz</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># cd memcached_functions_mysql-1.1</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># ./configure --with-mysql-config=/usr/local/mysql51/bin/mysql_config</span>  
  • <span>[</span>root@localhost ~<span>]</span><span># make && make install</span>  - q, K8 g  F# Q# ?2 W" t9 B! \2 O$ E: j- d

  f5 n: G7 o; |" ^* u; H
  b' L' W4 ?# R& Z) D
  X$ o4 d/ n* ?; ^8 D
编译完成后将编译好的库文件复制到mysql的插件目录下,以便于加载使用。
  • cp <span>/</span>usr<span>/</span>local<span>/</span>lib<span>/</span>libmemcached_functions_mysql<span>*</span> <span>/</span>usr<span>/</span>local<span>/</span>mysql51<span>/</span>lib<span>/</span>mysql<span>/</span>plugin<span>/</span>  
    ' n; k5 E; U# d; L- Z
/ S. [- X) q+ W. {# T* V7 s

, p+ @$ ?3 L  v5 g7 \9 R

; S* J" ?2 X. g& A# T; d- F% {
进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。
2 E. S' Q" |) \1 w. ^7 N" e
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql
6 D* H, y  ~7 m' B6 G$ h0 n或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。
8 m6 Z! ?- j( R' a% i& r$ k
[root@localhost ~]# mysql <sql/install_functions.sql
检查安装是否成功

; \# A4 S6 d, n* Kmysql> select name,dl from mysql.func;

# o8 P9 t8 @( I1 N
, `0 `6 H, |! V# S2 [
二. 测试用例设计情况:
(1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。( p! }# g5 ?) E& v
sql语句如下:8 |( Q$ O. I$ m* Z
use tests;  P+ S: p9 y, f
drop table if exists urls;
0 E0 ^2 Q5 ~/ z' M  x9 |CREATE TABLE `urls` (
+ l- V4 X2 {" j1 u/ L4 ]  `id` int(10) NOT NULL,
* U9 S  i8 j# d- H- U  `url` varchar(255) NOT NULL DEFAULT '',
* X5 J6 f! W5 Z1 k  M, ?  PRIMARY KEY (`id`)
: x+ w9 n* {- `9 T* S);
drop table if exists results;
8 C5 V6 w) e, l0 Q% ?% ]% SCREATE TABLE `results` (
; l  U; z# f: x3 Y  `id` int(10) NOT NULL,+ j  K0 i, n/ a& Z- D8 B$ @
  `result` varchar(255) NOT NULL DEFAULT 'error',
# w1 [2 @/ g* T  `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
' M5 i3 @9 S" w, \$ a3 g  PRIMARY KEY (`id`)
4 ~. H- P% _1 x* P& l);

! S8 _" ^7 m" V5 P(2). 建立三个trigger.
当向urls表里面插入数据时,对memcached执行set操作,trigger如下:: r$ Q5 }8 H" I1 B9 P3 Q" ~( e4 u
DELIMITER //
% `, M+ E; i8 O2 U$ ?DROP TRIGGER IF EXISTS url_mem_insert;
8 e# U" k# m. y& B# j& f. R- QCREATE TRIGGER url_mem_insert4 m* `1 i9 l& t# K- |
BEFORE INSERT ON urls
) r% A8 A7 ]( I$ [9 L- yFOR EACH ROW BEGIN
3 d6 v; c. u" k# L    set @mm = memc_set(NEW.id, NEW.url);/ v0 E* T$ a, t4 I5 a
    if @mm <> 0 then
2 y) d: _) f4 a6 }/ c- K    insert into results(id) values(NEW.id);
  c5 }( Y4 S# a7 T$ }, z    end if;
END //# x* S: |: Q" t5 f. E
DELIMITER ;

# ?: j/ Q6 X% p& c, S; N当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下:
DELIMITER //
7 U" e7 O, l6 UDROP TRIGGER IF EXISTS url_mem_update;
  W  _- h; {$ R9 R. |CREATE TRIGGER url_mem_update+ d+ ]5 Z$ d; X- E
BEFORE UPDATE ON urls
/ X4 d+ `8 `* o6 T% SFOR EACH ROW BEGIN; p. F0 ]# M9 a! j( s
    set @mm = memc_replace(OLD.id,NEW.url);. }3 c$ p. M9 n9 X" {7 U, L
    if @mm <> 0 then
7 Q% B' K/ [. |& e* o    insert into results(id) values(OLD.id);
# @$ R1 z, Q) R) W9 ]. H8 F' ]" @    end if;
END //
. t& F! v# n# O& |DELIMITER ;
; _; |9 R3 N5 N: j+ l! v
当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
DELIMITER //" U+ Q5 d# c" N) D
DROP TRIGGER IF EXISTS url_mem_delete;
0 ]' T+ Y2 n' I" Y" d( @* X7 ICREATE TRIGGER url_mem_delete
* _% k5 V% f- G+ y" n+ DBEFORE DELETE ON urls. i  g: O8 }1 S8 \: B
FOR EACH ROW BEGIN6 U  E! H$ N& P+ O: l/ j
    set @mm = memc_delete(OLD.ID);
/ o' |' T9 v7 a0 q    if @mm <> 0 then+ M1 s1 f9 V3 z* w
    insert into results(id) values(OLD.id);
* @& j9 N; {8 i+ l! ?: ?    end if;
END //
% O5 k. L5 n- C! ^DELIMITER ;
5 `9 I8 [  y* E" [6 D6 Z
(3). 设置memcached相关参数
设置同时UDF操作的memcaced的机器IP和端口:
mysql> SELECT memc_servers_set('192.168.3.184:11900');
% T# _2 [  C* h, M5 H" G  m, [+---------------------------------------+
6 ]( m; z6 J8 }/ S| memc_servers_set('192.168.3.184:11900') |
9 X/ Z6 O( L+ g% a, _+---------------------------------------+) J% k  U8 u& ?5 p4 O0 Y
|                                     0 |+ X2 ?% U2 n/ J
+---------------------------------------+) m$ l' P( }1 x6 o1 I
1 row in set (0.00 sec)
# i# U9 K5 |& T' F$ o4 \
mysql> select memc_server_count();! B# a+ g5 s6 ]: P& x" g
+---------------------+( h6 d/ i7 L5 w. ]" c- B5 |
| memc_server_count() |9 o1 c" V5 Y! W' l4 R
+---------------------+
. e. _6 J2 E8 \+ E  _|                   1 |; W% e  I" ^) U
+---------------------+
4 P1 t$ P: ]5 u# ^1 row in set (0.00 sec)
. r' O( K: K3 m1 _
在mysql命令行列出可以修改memcached参数的行为:
3 B& `) S, A( C* tmysql> select memc_list_behaviors()/G
& o" y2 U* `: [& a$ U3 u*************************** 1. row ***************************9 `/ g# o) x/ `' h- x) @9 s
memc_list_behaviors():
3 [/ a2 _8 [- C/ o5 LMEMCACHED SERVER BEHAVIORS; v1 i; C% l  P  O* \& i
MEMCACHED_BEHAVIOR_SUPPORT_CAS; x' X9 ?) U4 x3 ^& U: o
MEMCACHED_BEHAVIOR_NO_BLOCK. H% U- H1 J2 O( {4 b; ?# F
MEMCACHED_BEHAVIOR_TCP_NODELAY5 f; p+ d5 i- ~. N) F6 S# F# h
MEMCACHED_BEHAVIOR_HASH
: R- \- q: A% m2 O" u" c/ n  pMEMCACHED_BEHAVIOR_CACHE_LOOKUPS7 E+ c( M# ~! _/ o1 L8 J0 ]
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE" |1 U' C8 U( J& y$ t. s2 _& E+ h: j
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE2 m2 u5 p( `# U; ^4 }' r
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
- v, H6 k- A) T- J3 h; u3 {. sMEMCACHED_BEHAVIOR_KETAMA0 _4 v7 r0 I: j- ]1 h- c& ]5 ]
MEMCACHED_BEHAVIOR_POLL_TIMEOUT
2 v6 h+ b! _6 z& ^0 x0 W3 XMEMCACHED_BEHAVIOR_RETRY_TIMEOUT( N/ Y5 U) y8 T7 F
MEMCACHED_BEHAVIOR_DISTRIBUTION" ]  ^1 B) w& j2 C% u! k- Q3 h
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
/ Y6 B9 ^2 F7 OMEMCACHED_BEHAVIOR_USER_DATA: V2 o! \  |/ o
MEMCACHED_BEHAVIOR_SORT_HOSTS
) p5 i+ ]. H4 _0 i; P1 V- qMEMCACHED_BEHAVIOR_VERIFY_KEY; z  k4 y5 ]% x7 n& h! I$ `
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
. x8 \1 \' {) Q' J5 _6 v4 PMEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
' A4 u& O5 t) T: qMEMCACHED_BEHAVIOR_KETAMA_HASH
, A$ w2 n8 L! t0 G7 m0 L3 }MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: W/ r, o( S/ C
MEMCACHED_BEHAVIOR_SND_TIMEOUT
1 S* d2 e4 j+ p4 P- o0 MMEMCACHED_BEHAVIOR_RCV_TIMEOUT
) W8 d. V4 _; m% r2 P3 S$ iMEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
7 A. c6 R9 p( w& c7 E) ~2 [MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK# A/ m" g; p: y7 }+ L2 V
MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
1 row in set (0.00 sec)
) c; o6 m4 r( L
设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)8 T+ B3 C& S$ ~5 X/ p
数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout; i( E/ R( _2 `
才可以插入到表中。: O! f9 w* B, x
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');
: }: i$ @3 `1 X/ l+--------------------------------------------------------------+
+ G; @; s: G) o| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |
! V) |' y! l6 l3 Q. F5 Z! Q+--------------------------------------------------------------+
; P3 l1 a7 R$ W|                                                            0 |  W$ U0 s4 P/ y+ C5 k+ N
+--------------------------------------------------------------+
* t" U$ {% v6 A6 w  x/ v4 m1 row in set (0.00 sec)

8 ^$ z& m1 M( B
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');
( l* A) m" _0 e) y# J- Z7 u4 N+-----------------------------------------------------------------+* x6 K# @3 O! C: `' O
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |
, j4 R3 T/ j$ H1 \" ?# i2 L) p+-----------------------------------------------------------------+2 w: o; [; X6 d" G& p
|                                                               0 |
$ ]' s! c; K* T9 `; w+-----------------------------------------------------------------+  p# J' \, e" O, w' x8 p- G! ]2 m* E
1 row in set (0.00 sec)

# O. ~/ Q! S6 i

0 z8 j, h$ s# _* s$ i三. 简单的功能测试:

7 C/ o* Z' D3 }! A% R' Q1. 向表urls里面插入数据,然后查memcached是否也set进数据:
mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');
0 D+ s* f0 M; D8 w' {1 H9 W8 Q9 LQuery OK, 1 row affected, 1 warning (0.00 sec)
mysql> select memc_get('1');  
$ x/ m" x) _; Z1 I, y: y+------------------------+
' q, ?! |5 C0 D7 H- i0 U9 Q# x0 S| memc_get('1')          |
* X: Z) \& o" L" P+------------------------+2 V, b2 `( S& ~
| http://www.sina.com.cn |5 b; t. x5 Q5 k7 ?5 y' m
+------------------------+
. a8 p) z# O$ v- A; t, B1 row in set (0.00 sec)
  {, S! d7 }- u4 a* L6 z
1> telnet 192.168.3.184 11900$ R' q2 p& z* Z5 G: |0 k0 [( E9 r
Trying 192.168.3.184...
% @* W4 s( G& `& lConnected to 192.168.3.184 (192.168.3.184).
) O- _, m3 A- t, H5 g  ~; }0 X: u1 MEscape character is '^]'.
& h5 r4 n/ L' [! S' h% D0 Iget 1
6 r8 S' Q- B! T/ I- Q# x4 E* @VALUE 1 0 22
- @" u; t+ n3 v. \http://www.sina.com.cn
1 f% G( }8 S$ V, P: D' ]4 G, xEND

0 v) N1 R( J& O9 B2.更新表urls里面的数据,然后查询memcached里面是否也更新:, }# c4 |' k4 p' Y. R. W
mysql> update test.urls set url='http://blog.sina.com.cn' where id=1;
0 k; X+ ^- O3 b( l# c% q  ZQuery OK, 1 row affected, 1 warning (0.00 sec)
  M% x6 {0 W2 w9 dRows matched: 1  Changed: 1  Warnings: 0

6 j9 i- Z9 t: b7 y0 `& omysql> select memc_replace('1','http://blog.sina.com.cn'); 4 I6 c( s2 B) X# X! _/ p7 n
+---------------------------------------------+
% \/ |4 X& D' h| memc_replace('1','http://blog.sina.com.cn') |
& E' g( p" |; F( ^, h8 W3 X+---------------------------------------------+
$ o2 D* Z3 I  _* J7 ]|                                           0 |9 e/ |( Q! \7 U* p. W3 k
+---------------------------------------------+
! ]0 y! X% i' ?: P! @1 row in set (0.00 sec)
mysql> select memc_get('1');  
' W  y" }$ ~5 I# n, P& J+-------------------------+
! ]3 B' S% ?9 X; W2 x( W| memc_get('1')           |
, c$ @# v9 u5 Y; K. a* @1 L  a" p+-------------------------+0 F# A$ u0 q( y  G5 e  J( q5 z
| http://blog.sina.com.cn |
4 J4 |" D  z6 I& i; f9 r* i+-------------------------+
1 n( h& [3 f; G' P& p1 row in set (0.00 sec)

2 t, o7 @# {/ j* o: s; ^1> telnet 192.168.3.184 11900  i4 g* ]& u; w
Trying 192.168.3.184..., _0 k2 y' {+ h" y. Y. {
Connected to 192.168.3.184 (192.168.3.184).
/ @8 D, Y+ [; x4 F0 [Escape character is '^]'.
) b& N9 R9 ?/ v& b# M) [+ mget 1; l; B; T4 S9 t) h- o. t6 c
VALUE 1 0 23& B/ Z! g. X5 O% R2 N7 R
http://blog.sina.com.cn. C0 X) D  ^9 l0 l5 i+ k2 f
END

. F8 k0 b; [% C& x1 `+ I: A# u3.删除表urls里面的数据,然后查memcached是否也删除:: s* b* l( {; `( Y
mysql> delete from test.urls where id=1;3 ]) z% G$ a! a
Query OK, 1 row affected, 1 warning (0.00 sec)
; L1 N/ W$ f* K% n3 oRows matched: 1  Changed: 1  Warnings: 0
mysql> select memc_get('1');  # T, P& m# |+ W
+---------------+
3 z  a( s* \7 k" u' a5 J| memc_get('1') |
- c: I% N5 U  Q+---------------+
: Y! N4 k4 m0 X. U7 X. A| NULL          |' C: @2 v, f: i: f
+---------------+' w  ?4 v5 m& p2 |" p  c% B
1 row in set (0.00 sec)

/ p& D) O2 e7 b. `1 Q" L1 ~3 g1> telnet 192.168.3.184 11900
3 j! H! g$ R) T" C$ s% VTrying 192.168.3.184...
0 r6 Y# T8 l5 t( ]% k# R4 N0 zConnected to 192.168.3.184 (192.168.3.184).7 y" a! @; P! D1 h) k6 M
Escape character is '^]'.
& {; r" Y) B: a- k/ x& [# w/ F. U( Tget 1
. ^+ V. W2 @. ^3 _3 J6 N& }END

8 F7 _* E3 ~& W( L0 e% ]9 ?  \( z
* C; x& ^! i) `+ u: |
四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。
每条记录的平均长度是:17K
单独向表urls里面插入10万条记录需要的时间为:75秒
! }* M. @0 \$ A& [7 Z$ r单独对表urls里面更新10万条记录需要的时间为:70秒( D7 t0 a# z1 d: K
单独对表urls里面删除10万条记录需要的时间为:105秒
同时进行30万数据的insert,update, delete操作需要时间为:241秒
上面操作都没有memcached失败情况:6 S: A9 \, A( G4 ~8 S; C
mysql> select * from results;
, r5 v* V' M& B8 ~$ LEmpty set (0.00 sec)

. a4 }2 k3 V: o, Z% Z) _测试脚本如下:
插入脚本:
: A% q" b3 @- U& T) i& F! C8 J' n1 h0> more a.php# ]% S" M( t8 G! r7 W* F8 f
<?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");3 m- I9 F0 D/ f  Q. m- N. C2 P
//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {. U0 H7 Y. X% D7 g: o" T, P
$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');";
& ^  D5 [: B- ~; A: E+ U/ X! M  ]4 Umysql_query($sql) or die(mysql_error()); ' R7 @$ t4 o, p) I+ }5 w
}
echo "/n";
" {, O/ L* Y$ m  l8 h1 R% ]echo date("Y-m-d H:i:s");
?>
更新脚本:
" n/ y9 \9 D; ~+ T0 r0> more b.php# m& s1 M1 Q+ J5 o
<?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");" ^9 q+ H- \  o. X2 N
//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {
& {7 p- H4 W$ X- c$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;";
* v! s: v+ w8 l" amysql_query($sql) or die(mysql_error()); 0 g7 O2 Y$ `2 h$ P# Y2 ?  p
}
echo "/n";
9 j7 v; b. b2 \& J; H7 U# D+ g) Y4 ~/ fecho date("Y-m-d H:i:s");
?>
删除脚本:6 O0 B5 l! `& v* P- ~
0> more c.php
: \9 ~, n8 p! B+ I' c& b7 Z5 {<?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");
$ d; ?, }' i$ a' B  G4 x  ~//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {
: l% H- D9 @3 w( I) j" J) j$ |3 I5 l$sql="delete from test.urls where id=$i;";
# i( r- A" T5 l* H; s$ [3 q$ Bmysql_query($sql) or die(mysql_error());
3 r4 m. W1 t9 i. F6 W}
echo "/n";2 S" }( Q4 R  v% E
echo date("Y-m-d H:i:s");
?>

4 M% F0 j. Y4 W; O6 t2 q4 j/ b

& F: c6 X9 |/ n1 ?1 ~+ \% ?$ e9 R五. 结论:
2 |; L. m; F% S1 S测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。- P, I5 W5 S0 {( C. U, f! f
适合项目应用相对比较小的场合。
优点:
9 @2 ^2 o0 u( z' [7 ~触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。
缺点:
4 K- n% n) N: G+ s1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))
7 p4 X9 n3 C# w+ v# [2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)).
6 G# C. B% U4 o$ I5 u5 X
真正的线上环境比这个复杂很多。我想到的需要考虑的问题:0 U& _% W( m1 Z* H
1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。
7 Q0 \0 G* V5 f( ^* y8 C) p% b# P2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。( d" N, [; H9 d
所以前期规划好,在memcached里面存那两列(key-value)是关键。
1 L3 m8 [  }# }6 A8 ^6 ?3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。3 g' K/ @" T# o2 i
4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到1 `2 {6 F, O7 d+ W3 I- {& V! E
一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。
3 U: C3 Y9 Z1 C" p- \$ v3 L5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。
) s- @$ Y) m% x* v! h; q! @
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 02:18 , Processed in 0.025337 second(s), 24 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表