马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
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( O e0 U4 P( \+ c# S* C3 H
shell> ./configure --with-memcached=/usr/local/bin/memcached: X( f: p: x( C; \/ h6 `. |8 F; ?. s
shell> make && make install
1 r: K2 O9 Z: r& @7 |shell> echo "/usr/local/lib" >> /etc/ld.so.conf% q$ o: _" c( t. c2 v* [
shell> ldconfig 3)安装memcached_functions_mysql
D5 H, [! Y6 A4 C5 _ ^6 qshell> tar zxvf memcached_functions_mysql-0.9.tar.gz' }4 c( [* v0 Z# V
shell> cd memcached_functions_mysql-0.9
& }0 x. u, z% z4 X; ?shell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/
6 N7 o. H( ~) r( rshell> make && make install 4)拷贝lib文件到mysql的plugin下面$ N, D% R8 }. y3 G1 o
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;
' v6 X5 ?% K) Y6 F- g+------------------------------+-----+---------------------------------+----------+1 C: o% s. h1 C# G" P' q! l
| name | ret | dl | type |
5 b, j. s/ K" m8 F. e+------------------------------+-----+---------------------------------+----------+
" A8 B; P% e0 A3 i# l| memc_add | 2 | libmemcached_functions_mysql.so | function |! V0 U8 }; T t
| memc_add_by_key | 2 | libmemcached_functions_mysql.so | function |- o! V4 U3 s. [ y0 O
| memc_servers_set | 2 | libmemcached_functions_mysql.so | function | 2)添加trigger,看是否向memcache里insert、update等 具体的语句,我们可以参照: 1)memcached_functions_mysql-0.9/sql 目录下的trigger_fun.sql 8 W! |% ]$ b1 _! y, _& d- @
我们还必须注意以下几点: 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.' Q* b" p7 ~! R$ l
以下为相关软件,包括其版本和下载地址: # ?! G" m+ P( h8 J1 C2 a& m( h1 B
mysql-5.1.30 下载
" A8 _- w1 S! x# D5 j% i2 Jmemcached-1.2.6 下载( ~9 V' O9 g+ M9 Z0 ]/ C
libevent-1.4.7-stable 下载
6 B* e% b8 @( f; b+ T' ]memcached_functions_mysql-1.1 下载3 g- }% x/ T J- L, t
libmemcached-0.26 下载
, a7 b: v9 I# _; M6 k+ {! o9 _* h0 ?0 ~' G: \+ o
编译安装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> ! w: {$ Z1 e9 J! b
1 b) b! s+ h8 t4 g/ n2 y) Y! R+ H3 ?1 `
# l N+ k1 \8 |) N
省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。4 y& v( V1 l0 x% C
启动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> 8 ~* O- x2 u) }( c, p4 }
( A3 N3 \* e$ l C3 e Z. U5 B
: u* I( Y8 `6 ~! b1 O5 U R
" T1 f( R3 m! x8 L* Y! z" k编译安装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> 0 s/ {& p$ \" E' X4 }7 ^$ u2 B
: Z1 a% }, h+ S1 u4 a! H$ }/ _ d% E3 [! p+ p) g/ x: l+ t
% V* i! J" P# ^, ^' `8 u编译安装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> 6 Z6 b0 J! h6 l3 _" v, W4 e6 Y
; w! N& I! `/ \& W* F+ S3 m- S
- }/ {% s; v0 r+ m# W' D7 F8 I( q7 q& @$ T3 f4 y
编译完成后将编译好的库文件复制到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>
; o$ l, b2 E9 a, V" B: V7 E
1 {7 P! Y- q! v1 W8 k8 s( ?: Z# J! F' O0 Y/ f
6 l# Y3 @( c2 J4 g3 r' z! b; y" {进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。
2 k" g+ O* j1 j) ?% B8 D& h在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql; N6 z+ _8 X) c8 E) }
或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。
' a7 S( @- u" S6 r0 K[root@localhost ~]# mysql <sql/install_functions.sql 检查安装是否成功 ; k& s. m, m7 y" Z( z/ z1 w
mysql> select name,dl from mysql.func;
/ Q8 {4 k& a$ d) ~0 M. G) i
' p% i$ t" v$ n5 b8 Y U2 x; X二. 测试用例设计情况: (1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。
! ?4 I P( t/ Y. L9 ?sql语句如下:
% H' c5 u4 X$ f5 ?. u) M9 K0 Uuse tests;
) o) o1 {( H7 d3 t8 P ]5 j jdrop table if exists urls;% \3 H: O% q. e( J- E' Y
CREATE TABLE `urls` (
' \3 [0 r: {5 P* G$ l7 X `id` int(10) NOT NULL,
- p* o1 m& @* H1 F `url` varchar(255) NOT NULL DEFAULT '',
2 j9 n, I5 w* s8 Z; b2 W PRIMARY KEY (`id`)
2 Q7 x* e& [# i1 f. M$ U/ I" {); drop table if exists results;
/ `0 u* F: `7 R5 h6 Z0 {CREATE TABLE `results` (+ b9 s/ i+ V. T9 m5 H1 C
`id` int(10) NOT NULL,) X8 J7 b: \ f0 Y3 m
`result` varchar(255) NOT NULL DEFAULT 'error',9 h: F& f9 e7 Q. g0 M
`time` timestamp NULL DEFAULT CURRENT_TIMESTAMP," R$ j( E$ N1 N( m) s' B+ E% D
PRIMARY KEY (`id`)
6 ?- X, e2 G V/ \8 \);
( l' [+ j9 R( P0 f+ {1 ?. O. n(2). 建立三个trigger.
当向urls表里面插入数据时,对memcached执行set操作,trigger如下:
5 P5 [6 ~) s; }* |- L8 [1 U x8 NDELIMITER //7 _/ t7 w- ^3 a* B8 s
DROP TRIGGER IF EXISTS url_mem_insert;* U$ h) l C" Q# |
CREATE TRIGGER url_mem_insert
/ I1 c& ^( O7 d/ p4 ~BEFORE INSERT ON urls2 w! E2 e$ P5 w) g
FOR EACH ROW BEGIN
% e. \- X6 i% L4 ]& j set @mm = memc_set(NEW.id, NEW.url);/ j8 m) H4 m1 F/ E! H
if @mm <> 0 then) x8 M, Q/ X m
insert into results(id) values(NEW.id);3 W* X: o8 B c3 I! W4 V X2 H
end if; END //* B1 A# P% r5 \9 O2 P
DELIMITER ; $ ]" s3 z4 s9 S* u8 O! v
当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下: DELIMITER //
0 h& t/ i9 k# I6 W1 `& e( lDROP TRIGGER IF EXISTS url_mem_update;8 R2 ^9 M2 J2 z
CREATE TRIGGER url_mem_update
! Y; c# A% P- r/ @BEFORE UPDATE ON urls
# J: X6 ~ S; hFOR EACH ROW BEGIN$ Z% E' p2 H, V% N) }8 \: q, g: L- m9 w
set @mm = memc_replace(OLD.id,NEW.url);
" \4 C% U" M6 N if @mm <> 0 then' F3 U% c$ |. S/ q6 \" ~1 n. `
insert into results(id) values(OLD.id);& G1 o8 E! h% k, X4 e8 N: @4 |
end if; END //; a2 d Z0 k9 }8 l! k4 i: S! L
DELIMITER ;
( r9 T/ m0 ]$ l4 I8 S- E当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
DELIMITER //2 V0 H! T4 {8 G3 ]
DROP TRIGGER IF EXISTS url_mem_delete;
8 D ^8 r* n) ?7 t7 H# o2 S9 b% vCREATE TRIGGER url_mem_delete
! U6 u& x4 m- p# R7 E) lBEFORE DELETE ON urls
; l5 q& x# _- l' T- N; F: ^FOR EACH ROW BEGIN
; ]+ c# ?1 P# B8 T! K set @mm = memc_delete(OLD.ID);1 H7 x3 R7 o3 F' t
if @mm <> 0 then
6 n: l# ^" M: s7 S% h insert into results(id) values(OLD.id);
K& e5 n$ C' i! Q' P9 ]% h end if; END //9 _* g7 N# {! q F. Q4 ?
DELIMITER ; 7 `1 g g5 _2 a
(3). 设置memcached相关参数 设置同时UDF操作的memcaced的机器IP和端口: mysql> SELECT memc_servers_set('192.168.3.184:11900');! i" F! e- _# k: g9 I( g' [
+---------------------------------------+
& c9 \/ N8 f6 D' ]% n$ {| memc_servers_set('192.168.3.184:11900') |) d1 a8 y- z2 o% b
+---------------------------------------+# m" r. J* d6 g; }5 f$ q
| 0 |) J Z0 `" A- G9 n$ l- E5 I
+---------------------------------------+
6 [$ w; s' M9 P& @" ]9 T1 row in set (0.00 sec)
- i. i5 i5 k8 e; G6 G3 f/ k% Gmysql> select memc_server_count();
- S9 m, [$ k, L% v ?+---------------------+
5 m1 R2 ^1 ~" z% q- W3 _: f% b+ ]| memc_server_count() |
( o: j+ H$ x8 |6 s+ A1 u* b+---------------------+1 H D3 y ?! [
| 1 |$ ~0 v: \ n, C+ F/ p
+---------------------+
8 Z$ G6 f/ V0 b+ u& w( y7 o! d! r1 row in set (0.00 sec)
3 K5 J B0 Y& X在mysql命令行列出可以修改memcached参数的行为:8 P2 c; R% ?1 z# [0 u/ ?
mysql> select memc_list_behaviors()/G
/ m$ {- B. |# r7 @# v3 D" }7 ]' C*************************** 1. row ***************************
: `& x4 e$ }% Z% L! ] Z# \memc_list_behaviors():
% Q8 t, q# e/ c8 q8 R% FMEMCACHED SERVER BEHAVIORS
3 g$ M" ~' _. F' D! i6 Z) pMEMCACHED_BEHAVIOR_SUPPORT_CAS
9 t( ?( M$ v" L( GMEMCACHED_BEHAVIOR_NO_BLOCK2 ^% N0 e- Z6 q$ s! C s: m6 D
MEMCACHED_BEHAVIOR_TCP_NODELAY8 d( \" Q; N# T+ X8 ?' J
MEMCACHED_BEHAVIOR_HASH
! u* z* A5 B/ E' LMEMCACHED_BEHAVIOR_CACHE_LOOKUPS
- e1 [$ v. R& Y4 t" eMEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
; P. C E2 ]$ U5 ~MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE. h! G: ]2 F. a- D
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
( X# A( G, i( E: jMEMCACHED_BEHAVIOR_KETAMA
' q! [2 d2 s7 ^3 m" J3 |7 `+ aMEMCACHED_BEHAVIOR_POLL_TIMEOUT
+ T; B6 K7 l6 W6 w0 ^MEMCACHED_BEHAVIOR_RETRY_TIMEOUT0 {7 E7 x- E+ ]4 |7 n t/ u
MEMCACHED_BEHAVIOR_DISTRIBUTION
1 U/ X) s. g# \, E- Q5 m; d& dMEMCACHED_BEHAVIOR_BUFFER_REQUESTS$ r# f9 `6 N1 @
MEMCACHED_BEHAVIOR_USER_DATA
/ ?9 C4 R# V3 |& c$ C0 y( iMEMCACHED_BEHAVIOR_SORT_HOSTS/ k6 e; B. \$ u8 Y1 r" c
MEMCACHED_BEHAVIOR_VERIFY_KEY9 J+ C; E; ?, c) h0 J( `6 p- T
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
9 M$ L$ d0 z* m TMEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
! O4 U+ z9 e" P" D; e2 ?- T9 xMEMCACHED_BEHAVIOR_KETAMA_HASH
/ X3 c0 p1 e( K! |- u* jMEMCACHED_BEHAVIOR_BINARY_PROTOCOL7 j* ?, r! A* R% G# n& g: I. S
MEMCACHED_BEHAVIOR_SND_TIMEOUT. ^, k6 E& P6 K3 B6 e' x
MEMCACHED_BEHAVIOR_RCV_TIMEOUT* h c" f+ T' `
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT& Z P3 D# O" o! c9 G7 G: b
MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
, I/ c- l4 b$ K: z, u0 xMEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
1 row in set (0.00 sec)
0 ?4 Y# K+ ` ^. S3 A& q设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)
) x+ C4 |7 N+ `/ x O- B数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout6 d \0 j# X' D6 f6 Z$ X
才可以插入到表中。( ^$ ^" ?5 Y2 O* |7 w6 u2 V0 a
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');4 E0 l2 O P% H) r
+--------------------------------------------------------------+
* ^( o" d* `- G2 a3 T| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |
6 M0 P3 p# m. D2 Y7 n! }+--------------------------------------------------------------+
5 g7 m* F4 }/ l0 ~* g| 0 |
2 M4 j: a4 [% }( d9 y. F' i+--------------------------------------------------------------+6 {2 ~4 u+ T# H3 b" @0 r( X
1 row in set (0.00 sec)
% t$ ~: a/ r! p { Y8 v; ^, f) lmysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');7 O; {6 B& ~4 I" k6 b% o' o8 o
+-----------------------------------------------------------------++ I6 M/ F( ?/ Z$ e! E
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |6 q4 x/ l( o. g- y: f4 p
+-----------------------------------------------------------------+: X9 T+ C5 P5 c8 o T
| 0 |9 a6 q! f: v4 D
+-----------------------------------------------------------------+
+ K9 e& K& h& n. X1 row in set (0.00 sec) $ B& u" n( X: @7 Z2 e9 z6 C
, O; P" Z6 L$ d: S* N6 R6 T三. 简单的功能测试:
% s( v* G7 {' V( ?% c
1. 向表urls里面插入数据,然后查memcached是否也set进数据: mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');
* d# E# _9 r$ r2 R' M" YQuery OK, 1 row affected, 1 warning (0.00 sec) mysql> select memc_get('1');
- @0 ~7 p/ u4 l, [1 V% @+------------------------+
5 y. W3 K. n4 Y| memc_get('1') |
& p) \$ U+ N: m- u$ U+------------------------+
9 C3 g ` I1 n4 x/ ?6 S& A" \" B| http://www.sina.com.cn |
% p' s' G$ G8 J* p1 l8 m+------------------------+* j$ y( J+ ?3 m' p" q
1 row in set (0.00 sec)
T: f/ a# _$ f7 J2 s. H, V/ S1> telnet 192.168.3.184 119007 s9 X% e" T1 n N: r
Trying 192.168.3.184...
' s8 v7 a: @; O# M+ F+ a6 UConnected to 192.168.3.184 (192.168.3.184).- J( {3 j) \4 W4 @4 q" n3 V
Escape character is '^]'./ [ l, I( b' ?+ N% X* x4 O
get 1! { i+ v" y1 L
VALUE 1 0 22
) L" Z& Y' i' e6 x! _http://www.sina.com.cn
+ T0 ]# I6 E- X7 w+ YEND% H+ {+ J" e! b% ?* B
2.更新表urls里面的数据,然后查询memcached里面是否也更新:
# o; a5 p/ i* @% `, Q) [. Kmysql> update test.urls set url='http://blog.sina.com.cn' where id=1;' M4 f4 W+ t- ^# P7 x" j& F
Query OK, 1 row affected, 1 warning (0.00 sec); p: S5 j; T% a$ d5 ]+ ?& z
Rows matched: 1 Changed: 1 Warnings: 0
, K% i$ E/ `( U' m. h# `$ Qmysql> select memc_replace('1','http://blog.sina.com.cn');
% L* b/ q# V& ?( g+---------------------------------------------+8 \2 l! t+ n% d P' o/ @& ^& F; b
| memc_replace('1','http://blog.sina.com.cn') |2 ^+ O8 A7 c$ E- z' l! y9 x) _
+---------------------------------------------+! R# D! d5 G% I5 h7 @
| 0 |- K E% w' w5 U, l- S O9 \
+---------------------------------------------+: N5 J! d, W R/ g' y* n
1 row in set (0.00 sec)
mysql> select memc_get('1');
) R0 r( r. ~/ n- h# D9 ?( ~+-------------------------+( ]# q5 U7 @4 ?# g3 ~# e0 Q
| memc_get('1') |" X2 p! A% ^ \0 e; R- i
+-------------------------+/ |$ s& Y* L: L1 `! e6 C# k7 T
| http://blog.sina.com.cn |
' ?* ~* N3 o8 K5 l G+-------------------------+ X+ W9 h5 i% |7 U# Q
1 row in set (0.00 sec) - G, f' A8 T# A, l0 f/ z
1> telnet 192.168.3.184 11900. K( \+ e" ^, s: \2 B) {
Trying 192.168.3.184...
4 e1 k$ a% \* M0 e/ a; m% }Connected to 192.168.3.184 (192.168.3.184).
, `% r6 {8 o, Y2 Q$ v$ \! tEscape character is '^]'.
" h0 y+ H0 N0 v' [1 dget 15 s7 `2 h) X; @
VALUE 1 0 238 n/ r- x5 T- X. F# o3 P) u; g+ \
http://blog.sina.com.cn
1 x) s" e$ J8 l5 J9 J8 p5 SEND $ v: ~6 O' _3 T
3.删除表urls里面的数据,然后查memcached是否也删除:
. H1 `; `/ P& I+ U7 |" Zmysql> delete from test.urls where id=1;* {7 q9 }7 i+ j$ U+ Q. h. q
Query OK, 1 row affected, 1 warning (0.00 sec)$ E9 r, F4 u x K! B& r9 p
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select memc_get('1'); . e N! U7 n! j* Y1 J# z( U! n
+---------------+
' {9 |- O8 Y% a; G| memc_get('1') |) z2 x! z# m+ b4 l
+---------------+
. f7 D+ q( I j/ G& W: o) h| NULL |, ~- e8 b/ t/ s$ h9 }
+---------------+& P. t; B/ Y! U1 C$ u! ~ `7 K
1 row in set (0.00 sec)
" h1 s" |- x0 K1> telnet 192.168.3.184 11900+ I" \% k6 e; f. S, A
Trying 192.168.3.184...! x4 c, Q% E- E# I7 L* A3 z
Connected to 192.168.3.184 (192.168.3.184).
! @4 @+ X) r' N# p1 a: U; \Escape character is '^]'.
q2 Z8 P# M4 I5 F; p" c, ]get 1
_8 ^* u' u' W9 U+ ~END
' S# n6 k+ t) j+ c: n0 P a9 J! C p( P& P5 B6 D1 g5 c
四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。 每条记录的平均长度是:17K 单独向表urls里面插入10万条记录需要的时间为:75秒
) P" K1 c. K- S6 w, [: ~' m! W& o单独对表urls里面更新10万条记录需要的时间为:70秒) [5 `" Q8 b% u2 u! ^: Z9 }
单独对表urls里面删除10万条记录需要的时间为:105秒 同时进行30万数据的insert,update, delete操作需要时间为:241秒 上面操作都没有memcached失败情况:4 s5 `, b1 E V/ V; e( Z: Q$ w
mysql> select * from results;
* M7 r7 a4 j# j' pEmpty set (0.00 sec)
! w1 d. o5 s4 o" S# U0 N% E" ]测试脚本如下:
插入脚本:
3 ~5 r$ E6 @7 F9 B0> more a.php2 T: K' Z: v8 e2 e0 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");0 W: X. Z- o* C' Y1 S8 c0 c0 j
//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {
5 E8 c) L2 O: k$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');";
, X S( E% Y2 m4 A' t9 R }6 ?! mmysql_query($sql) or die(mysql_error());
" I, m9 Z* y! k8 F" s" B} echo "/n";
$ p: H3 k% R& ^. w. [echo date("Y-m-d H:i:s"); ?> 更新脚本:
1 c) n3 z5 X" [3 T* {0> more b.php
3 u% u' T9 U; Y<?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");
, J- e- |4 W5 H! u0 F" E//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {
; v5 K+ C! Q. ~5 J$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;";! e% V, t$ o# z+ f' J
mysql_query($sql) or die(mysql_error()); ) v2 N3 R& H" C8 n
} echo "/n"; j: A* D( u0 n+ }. ]# f
echo date("Y-m-d H:i:s"); ?> 删除脚本:
; r" K( E- }) Y' R+ r, S7 t0> more c.php$ ^+ e1 R+ b7 n# x
<?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) U1 I. c. E. ?% v- {$ Y
//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {, O( l4 ?# d* L( S0 H! R* s( Y! ~
$sql="delete from test.urls where id=$i;";
! c! i1 s1 ?% r8 T& Lmysql_query($sql) or die(mysql_error());
3 d D! T; v( t5 _9 D! C} echo "/n";
+ `9 \- c6 e+ Wecho date("Y-m-d H:i:s"); ?> H: t) @, d: \2 n( M, w: i
# K/ W" h8 b! v) d4 U$ C" ^五. 结论:
" n/ m' M7 F: X, Z5 i测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。, W# D: @* F# }
适合项目应用相对比较小的场合。
优点:
# {. N' X2 r+ }. T1 q; X触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。 缺点:7 p, b5 p2 Q8 i0 Q1 D" p
1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))+ b/ _7 N1 E) j: ~ A- @
2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)).
( L# `" S+ S5 L2 q3 ]真正的线上环境比这个复杂很多。我想到的需要考虑的问题:8 C" p V* Z% }7 J3 V+ e
1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。
3 ?! q( ^# ]! V% I! i9 b& [$ ^2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。; J- F9 A% i3 F+ I9 G: O
所以前期规划好,在memcached里面存那两列(key-value)是关键。' c( v7 ?9 P e8 `" H- k
3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。1 W$ ^3 B0 c; g/ z& \
4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到
# q% f4 J* Z t4 |; F* d4 Z; y一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。 }0 v" h% N+ _' p2 F
5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。 1 d& N) w# P% K9 g2 x1 k
|