|
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# V+ h* `; G! T2 q; ^. `
shell> ./configure --with-memcached=/usr/local/bin/memcached3 Q0 N7 H6 z3 ~* o2 v- n0 \
shell> make && make install h2 c2 x- O! K. E" v
shell> echo "/usr/local/lib" >> /etc/ld.so.conf A# X' s) F8 O, e
shell> ldconfig 3)安装memcached_functions_mysql( D" |) M3 M' j5 a& x2 p& h) [. S
shell> tar zxvf memcached_functions_mysql-0.9.tar.gz
' w9 C% V/ x- \' W% u5 [2 l+ _) e7 Qshell> cd memcached_functions_mysql-0.99 C! B m9 O. A; G0 C6 X" c
shell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/
; P9 |+ A0 {3 e) J( v9 q1 vshell> make && make install 4)拷贝lib文件到mysql的plugin下面
) v3 ^2 D3 S# l h) Y7 ?) bshell> 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;
* `* d6 ~$ A% ~0 C- M0 u+------------------------------+-----+---------------------------------+----------+
* ?2 j8 G U! h2 c$ W9 k! R, n| name | ret | dl | type |
9 \8 m% [; @6 c' X+ m* }+------------------------------+-----+---------------------------------+----------+- T( o* [/ g' j4 m8 `
| memc_add | 2 | libmemcached_functions_mysql.so | function |" T# s, A1 ]/ ~$ n. Z
| memc_add_by_key | 2 | libmemcached_functions_mysql.so | function |! T; u4 f+ s( @9 O9 y7 G, I
| 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 x. `& D/ k$ G6 Y我们还必须注意以下几点:
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. @& X) [. v" ~4 i A) A+ h
以下为相关软件,包括其版本和下载地址: # I& [1 W7 q# J4 a: b7 V) N& c
mysql-5.1.30 下载; R& V% K3 w, s
memcached-1.2.6 下载3 ?: _9 @5 V) p9 U2 N H
libevent-1.4.7-stable 下载
0 O4 X& ^ q' n" `memcached_functions_mysql-1.1 下载7 o/ B! |$ o, @/ ]' C' E0 \4 Y
libmemcached-0.26 下载 4 {4 F9 y7 p# \. o% t: L& l2 H
& S6 E* l% G- z+ ~+ m3 D) h$ q编译安装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>
8 J% o4 r) X2 Y0 a* T5 E
/ x* l) }' E5 w z% G
* M$ ?9 Z" }0 ~: k; i3 s
3 _0 c% k1 z+ C7 ~; N省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。
5 Z7 K* u7 W( o6 O启动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>
9 q& C/ C! q6 d7 Q7 H( M5 M a- j- }* D% e/ C6 k$ J7 n
6 C; Z4 t# t# Z" m% e8 B8 t+ s
; p4 F- n0 W4 H6 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>
# }7 F3 Y& Z' h. J$ V# N
5 a% V( y) z: M7 }& O+ _5 t% A# ~- s
1 }. I# r1 V1 v% ~
编译安装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>
* Y3 d& V$ [2 W" B4 Q
! B! N5 e% Q0 ?6 s. w: d
% J; F* \4 d$ X1 s* d- ~+ `' C6 v3 K& h0 L
编译完成后将编译好的库文件复制到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>
1 U m( U+ x6 ?; {* @! {2 V( k+ b
; v( ?! b1 _/ O4 K3 @5 ?1 `5 p7 u. D( b8 ]4 o& W& v
: l, Z @, H H3 h进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。 8 {0 r7 r/ k) \/ q* I) @2 e! O
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql
! U9 u( `% ]1 i% O+ b; s4 A5 o( b或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。
7 X6 a) ^1 }. K% o3 f[root@localhost ~]# mysql <sql/install_functions.sql 检查安装是否成功 ' J, z$ h: v4 ]0 G
mysql> select name,dl from mysql.func; ; \# ] o/ O* H8 t/ o
8 X* m3 Z4 R4 y4 e% G# g
二. 测试用例设计情况: (1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。0 X( B0 g" X+ C' `& @
sql语句如下:
0 \' S) A7 M5 N4 I1 f4 b/ }use tests;
' w0 Z) v$ @ E: F* Z7 O" h) gdrop table if exists urls;8 o% @" ?8 V1 c4 K4 K1 k
CREATE TABLE `urls` (
O* v. {. m! q. v7 B `id` int(10) NOT NULL,
$ p- ^6 p' A0 e9 P& L- u9 Z `url` varchar(255) NOT NULL DEFAULT '',6 k4 B( n2 O* g( d7 j
PRIMARY KEY (`id`)
+ ?9 A# K- G# R; w. z); drop table if exists results;
; Z+ ]7 c+ V3 X) ? M# ?# |2 Y! J6 l+ SCREATE TABLE `results` (' ^6 W! X3 K7 o* d: b
`id` int(10) NOT NULL, @7 X# T" A3 g8 ]! o, Y9 v
`result` varchar(255) NOT NULL DEFAULT 'error',0 ]4 w0 d$ p& O2 g0 }9 N
`time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,5 z8 h1 T- C3 t# J- r( p2 R( E7 I
PRIMARY KEY (`id`)
& l, |4 K( `% V3 G0 z0 s. V2 d);
0 [% Y+ d0 p( v( n9 ]3 R(2). 建立三个trigger.
当向urls表里面插入数据时,对memcached执行set操作,trigger如下:
3 b3 f0 g* F: ~0 d/ CDELIMITER //
7 Q; o2 G4 S! E- _2 vDROP TRIGGER IF EXISTS url_mem_insert;/ q- P. E7 `3 A# k4 d$ H+ a4 Z; Q
CREATE TRIGGER url_mem_insert- X `( I+ Y8 w4 K* z5 \. T" C3 y
BEFORE INSERT ON urls5 t" B* C7 S0 R
FOR EACH ROW BEGIN0 w0 L3 u8 E+ e; q. s
set @mm = memc_set(NEW.id, NEW.url);
( x% I# N; F; F6 }: ]: K% C1 j if @mm <> 0 then
! Q4 \" z# I' p0 X insert into results(id) values(NEW.id);2 B. n3 @; P$ w1 @ u1 G
end if; END //' J6 j) l4 A0 i1 O' D
DELIMITER ; 0 D5 u2 d; H2 e0 J8 h
当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下: DELIMITER //
/ R S; E* D1 W5 X+ s, QDROP TRIGGER IF EXISTS url_mem_update;0 W. P' f* J4 L, e) V2 C
CREATE TRIGGER url_mem_update0 p9 [: m$ t! \
BEFORE UPDATE ON urls
( e% s& |8 M5 B* ?# _- eFOR EACH ROW BEGIN! ]$ F$ s8 k6 L
set @mm = memc_replace(OLD.id,NEW.url);3 p) c& [$ U& n7 ?+ J: L" m F" s$ i
if @mm <> 0 then
- y7 P3 s2 a* O0 K: ~: x insert into results(id) values(OLD.id);( _( E9 D: f! N/ B* a
end if; END //; d+ K8 s: K* K+ O
DELIMITER ;
- w3 Q" F' p* w7 m1 H" x, r* ~; b/ c0 t! C当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
DELIMITER //
. X) r1 A2 D+ ~DROP TRIGGER IF EXISTS url_mem_delete;7 F! c, h5 z1 P( O0 b4 F5 p
CREATE TRIGGER url_mem_delete, E+ T- {) B* i! _& k3 ^ |
BEFORE DELETE ON urls l! c: n1 B9 Z0 e1 t5 k
FOR EACH ROW BEGIN
6 [# [ p% `7 ]* Y set @mm = memc_delete(OLD.ID);, h- A, r! i$ ~! t# a
if @mm <> 0 then
$ {9 {2 M/ D' q7 A insert into results(id) values(OLD.id);! |5 O3 P- S: k# `5 I
end if; END //6 w- K; s. H" M# X, p
DELIMITER ; * Z1 T5 H/ N2 ~) y# N, o( j
(3). 设置memcached相关参数 设置同时UDF操作的memcaced的机器IP和端口: mysql> SELECT memc_servers_set('192.168.3.184:11900');
- x; X8 q$ m" S0 \! l1 {+---------------------------------------+5 K. y! `4 ^% O
| memc_servers_set('192.168.3.184:11900') |. ~6 p6 z) c0 \; h
+---------------------------------------+( e7 z) C% h$ l7 v$ n
| 0 |
, n: A5 }$ T9 `3 E+---------------------------------------+4 `$ q- D: R( N# C# T
1 row in set (0.00 sec)
3 C. _6 v6 N- bmysql> select memc_server_count();
% u$ {0 @# V( J6 J. O8 P+---------------------+9 B1 V1 w, @8 ]) V# g
| memc_server_count() |
8 [* c( y; X- c3 V+---------------------+8 O4 ~' r8 Q* g! p" U2 Y6 M- i
| 1 |
6 K. D6 y6 A' l) ^% R& ]+---------------------+
# N/ w- ?2 m- O$ J! N+ w1 row in set (0.00 sec)
! E/ `* p3 o& X( O在mysql命令行列出可以修改memcached参数的行为:! [# O& _1 B M4 R3 ^) j- I0 i8 Q8 ?
mysql> select memc_list_behaviors()/G# D5 [& {) B9 b2 }7 U
*************************** 1. row ***************************
- o u2 c3 i ]memc_list_behaviors():' J$ z% ~7 X1 }% c
MEMCACHED SERVER BEHAVIORS: n# Z+ s! ]! [9 G, Z- _
MEMCACHED_BEHAVIOR_SUPPORT_CAS
( V1 n& |0 h/ \6 ZMEMCACHED_BEHAVIOR_NO_BLOCK0 r! u: h2 V" ^# Y; I
MEMCACHED_BEHAVIOR_TCP_NODELAY; p5 `8 e- d& o/ Y0 n
MEMCACHED_BEHAVIOR_HASH
/ ^6 v( ]$ `5 C9 x KMEMCACHED_BEHAVIOR_CACHE_LOOKUPS6 b& T$ X. v% I1 F0 v; s
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE. H; Q; L# i) E; i
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE* t- v" {4 m D) L6 F
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
S9 |# m8 [, c& v+ T' eMEMCACHED_BEHAVIOR_KETAMA
" X7 M! r6 }+ gMEMCACHED_BEHAVIOR_POLL_TIMEOUT0 k4 k# V$ Q* O4 q: z$ m
MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
1 [5 J9 H" T4 \MEMCACHED_BEHAVIOR_DISTRIBUTION b0 {: {2 }; _& U( T0 ]
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
9 d3 L7 n' x i1 v: J. d4 N- GMEMCACHED_BEHAVIOR_USER_DATA
+ \' b3 H% @1 q& }) j8 A& KMEMCACHED_BEHAVIOR_SORT_HOSTS
0 v! k; c, q; W' tMEMCACHED_BEHAVIOR_VERIFY_KEY
" ]4 R/ ~1 D3 D$ }* W2 kMEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
* J2 e3 W3 ~: o- AMEMCACHED_BEHAVIOR_KETAMA_WEIGHTED% P0 a+ u( ^! o' b
MEMCACHED_BEHAVIOR_KETAMA_HASH5 T8 o% m2 n4 K# `3 N7 w
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL! G& F1 d6 R9 {+ O- W2 }
MEMCACHED_BEHAVIOR_SND_TIMEOUT3 t6 X3 B p5 y' t% f% v4 |
MEMCACHED_BEHAVIOR_RCV_TIMEOUT+ \8 ?- b; M! C! b! R8 k( R& {& D
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
! }% N7 b0 E3 sMEMCACHED_BEHAVIOR_IO_MSG_WATERMARK$ Y' D1 G) x; `+ [+ E
MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
1 row in set (0.00 sec)
) Z! G+ I# w$ H( Y设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)! N# t `" X( K/ G6 O- o2 ]* C5 x/ ~
数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout( K3 u) j, N, q$ a# P" z* Z# h6 }, K
才可以插入到表中。2 p, i3 Y b+ g0 v, w+ [" q* @
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');+ `8 U( H! D( c, z: |7 K) x& n
+--------------------------------------------------------------+& G/ o' U) y8 I" W/ u# F5 p1 Y5 a
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |) P" N; ]: ]* ^, p6 r% i
+--------------------------------------------------------------+
. N) L. L' U# ^7 t4 h4 m0 \| 0 |
, s) ~$ g* l+ F' f* H& n m# Q+--------------------------------------------------------------+
3 f( u2 q' M3 ?) a. A3 J1 row in set (0.00 sec) $ s7 @2 G2 O$ ?0 X' {# p
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');
O1 k0 g" q i ~5 C: i+-----------------------------------------------------------------+% {8 b* I7 E, N" L3 j
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |4 {1 f5 A, v" Z, U# ^9 Q
+-----------------------------------------------------------------+& ]$ E( r) g5 i) T8 B3 Y+ ~ A
| 0 |% A/ ^3 u5 }3 P4 n# Z# u6 i0 `1 z3 i% B
+-----------------------------------------------------------------+
) `& D. k$ G) ]8 ?8 D! \1 row in set (0.00 sec) $ U1 f- A# J1 Z# [; _- E9 h7 ?
& V# e4 `& O7 F+ p5 }3 m
三. 简单的功能测试: # X. N9 O j/ }2 `2 y
1. 向表urls里面插入数据,然后查memcached是否也set进数据: mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');. x" Q T/ s) u; h6 A2 k! L
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select memc_get('1'); $ J1 k4 x# l0 K# x; s/ K! S1 i
+------------------------+
- k) o4 U: j3 }. U# b; J& Y| memc_get('1') |
) C* t/ S. u% f/ {; M3 l$ N+------------------------+
6 z$ \" j- E9 i1 ?5 t0 v% F s| http://www.sina.com.cn |0 I T# j' P+ z0 L0 o- U# _8 e
+------------------------+
( F# ?5 S0 }, r% N. O' k- U% I' }& Z( D1 row in set (0.00 sec)
* _4 r( z: e* T3 U1> telnet 192.168.3.184 11900
2 I. S6 v1 X, w, e4 y- cTrying 192.168.3.184...
i# z6 T+ i* Z1 @Connected to 192.168.3.184 (192.168.3.184).
3 @7 h7 C4 f/ C) R) H! @Escape character is '^]'.* K& N- I9 Z$ e; l( c
get 1
- @$ Z/ _2 ^. S8 wVALUE 1 0 22
8 M3 l' I/ B6 v+ I# Ihttp://www.sina.com.cn
% K5 n; y0 `& P d# S6 OEND
6 y, ^- J' Q/ A9 o6 @7 O7 [2.更新表urls里面的数据,然后查询memcached里面是否也更新:
- k4 Q/ ?" T! ~; @% v0 D% x1 s2 P* q* Tmysql> update test.urls set url='http://blog.sina.com.cn' where id=1;/ b! H) K0 W: Y# M4 V. z+ @+ N' ]9 {
Query OK, 1 row affected, 1 warning (0.00 sec)
0 s* j" G* [8 z8 W% KRows matched: 1 Changed: 1 Warnings: 0
% \( D$ ]+ P% p( R3 h) O9 k
mysql> select memc_replace('1','http://blog.sina.com.cn');
# b D2 A; G# q+---------------------------------------------+1 n: y! r3 }4 n) g L" d
| memc_replace('1','http://blog.sina.com.cn') |, S$ A3 t. K, @. a5 }4 y/ A) K
+---------------------------------------------+
3 ]* o1 N0 X* k, v| 0 |" O. O5 x/ @; x8 a' P
+---------------------------------------------++ L# u |0 S4 x; i$ `" H& A! D
1 row in set (0.00 sec) mysql> select memc_get('1'); $ u6 N" G- P" O4 f9 V
+-------------------------+. A% e9 R3 ^; F, w. @0 w5 e
| memc_get('1') |6 N# n! Q* K9 e: S
+-------------------------+( D- S/ }" c5 h \9 n9 K4 [2 e p* T
| http://blog.sina.com.cn |3 |: {. R8 R- T6 m8 i
+-------------------------+
! g; ~9 `9 R7 k+ m1 row in set (0.00 sec) : _2 T6 K9 L9 [6 W9 T$ `
1> telnet 192.168.3.184 11900* I, d1 q2 ]. E. I# }8 [
Trying 192.168.3.184...
$ r2 b- s. N* CConnected to 192.168.3.184 (192.168.3.184).% \! H0 O( H6 h. a
Escape character is '^]'.
* W! b' C3 y$ W& Jget 1
& }2 G9 B, `9 [0 l7 v* JVALUE 1 0 234 m: j$ r. p( C3 y
http://blog.sina.com.cn+ z( S3 F7 h j6 k2 V, S9 C
END
3 O" r: z, S Q* O5 Y0 r3.删除表urls里面的数据,然后查memcached是否也删除:
% ~* x0 |+ \, r) j9 y2 Umysql> delete from test.urls where id=1;
% P6 i8 q; d; a$ `Query OK, 1 row affected, 1 warning (0.00 sec)+ n/ ~! J( v* T; X n. U1 j
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select memc_get('1');
4 F5 l0 u6 Q, Z6 B" s+---------------+* @; A! U' K& A* R# n: y; B: ]
| memc_get('1') |
% F: H j2 o7 r" L! [+---------------+1 _' D t! Z4 b' X2 m1 ]- v3 ^
| NULL |
% q+ l7 J/ b e& T& D+---------------+
) r( i& _4 @& ~6 U2 ^1 row in set (0.00 sec) 4 G" o2 p/ \) d9 [# \' K2 Y
1> telnet 192.168.3.184 119005 G7 V4 N! P9 O
Trying 192.168.3.184...
- K8 T- w! {. J2 I; fConnected to 192.168.3.184 (192.168.3.184).: O9 h0 c5 ^) R+ r
Escape character is '^]'.
: d+ s) w0 W. j w' r8 {4 Tget 1
# o) i I/ X) ^+ c+ i, zEND : V9 t4 U1 T. t: v
. q& d! @5 C% Q8 `- y- _* M四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。 每条记录的平均长度是:17K 单独向表urls里面插入10万条记录需要的时间为:75秒5 [! y0 [7 W! O2 C5 P X0 L
单独对表urls里面更新10万条记录需要的时间为:70秒
0 C9 P7 i. U+ S* P" h单独对表urls里面删除10万条记录需要的时间为:105秒 同时进行30万数据的insert,update, delete操作需要时间为:241秒 上面操作都没有memcached失败情况:" n2 g- p9 U! _
mysql> select * from results;
- j0 c2 l- X6 {6 M9 k; ?Empty set (0.00 sec) $ K6 J% F8 ]$ o0 d
测试脚本如下: 插入脚本:) A# b/ m, s. B n0 a7 M
0> more a.php
, L& g. z: ~, {; s3 U! Q* p<?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 r$ A3 k* s `
//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {: M R& D; f& h6 l2 @ b$ U7 s
$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');";
! \' v x8 l: H! {2 F% Dmysql_query($sql) or die(mysql_error());
! x9 J' v1 c* U# c: h} echo "/n";
/ M8 H$ F+ r& b# n) mecho date("Y-m-d H:i:s"); ?> 更新脚本:
: F1 w& }* n/ u V0> more b.php1 A5 H, j3 [6 Q# D2 h2 k* p0 t
<?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");
" x; v$ C: N, S: E# m! j- Z//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) { [0 G, _" I& |( q
$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;";
9 ]$ ~ \; i$ q9 D* r8 N# U* B9 @mysql_query($sql) or die(mysql_error());
5 \9 l8 |. Z+ j6 j! i. u6 I} echo "/n";
% o, f2 z3 a. ~& u, j( secho date("Y-m-d H:i:s"); ?> 删除脚本:7 V9 f$ J: J( X6 Z; V- f
0> more c.php
e9 }$ D+ W P# M7 k7 M<?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");% }6 p' W+ H4 h: A/ _
//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {: c4 d$ b- x1 [5 q3 n f, b
$sql="delete from test.urls where id=$i;";
" N: r/ L) t7 Dmysql_query($sql) or die(mysql_error()); 8 k2 a% l w: H" E' D( }
} echo "/n";
, W* ]$ g# ]$ v% F" jecho date("Y-m-d H:i:s"); ?> 7 Y' i* t& w t7 t P6 ]4 o
1 G8 }: {5 f* n% T: @0 ?1 h五. 结论:) x, k5 _% o3 ` N
测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。
D1 I4 Z- I. \* R( l, W& U( @适合项目应用相对比较小的场合。
优点:3 [, ]$ Z# M1 `2 Y4 T( o" r8 v
触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。 缺点:# U. ~! x T3 D/ u! ]
1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))
& Z* p* m( S7 O; O! w3 F) d2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)). / N5 e6 M' h5 E) j: a
真正的线上环境比这个复杂很多。我想到的需要考虑的问题:7 r4 t- \% A3 _3 b4 `
1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。
' s* H% p" `+ s" ^% p, |2 u; q, y q2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。
$ Y. M q b- x+ K, U所以前期规划好,在memcached里面存那两列(key-value)是关键。% J+ X( `, f, j
3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。, y: \& V; n/ w$ @1 H
4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到5 o6 y. a9 J4 t2 ~; B
一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。
2 L9 {/ E* F+ h P* T+ P5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。
# q# l# ]) E; c6 b4 W- q% {, j |