马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
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
! X" }7 n1 \7 g# nshell> ./configure --with-memcached=/usr/local/bin/memcached
; k( S: V( ~+ U: h; t% Nshell> make && make install& e& h; |& S: V3 t3 d7 Y9 @: ^
shell> echo "/usr/local/lib" >> /etc/ld.so.conf
. M e" R. X9 t6 V% Pshell> ldconfig 3)安装memcached_functions_mysql
' @* N$ T5 ~1 v# Y3 xshell> tar zxvf memcached_functions_mysql-0.9.tar.gz
: ^8 f4 K* c+ yshell> cd memcached_functions_mysql-0.9
* U" ^2 s- e0 ~% p3 E$ G6 ?/ Cshell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/, u: H4 e! \3 k7 {8 T% f A* B
shell> make && make install 4)拷贝lib文件到mysql的plugin下面
. l6 i* |$ x+ o' U7 \2 y" R, kshell> 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;0 t* d5 q4 x9 S, _, K
+------------------------------+-----+---------------------------------+----------+
) ?) z* I; p7 E2 A. X; e3 l| name | ret | dl | type |
5 G; |/ s+ B. z9 F p/ ?. G+------------------------------+-----+---------------------------------+----------+
2 M2 V0 S7 C) b3 n| memc_add | 2 | libmemcached_functions_mysql.so | function |
; t0 R& E% y. z& x, ?; x6 o| memc_add_by_key | 2 | libmemcached_functions_mysql.so | function |+ K+ ~9 G2 v. ]7 z* \ n8 ~+ Z3 h
| memc_servers_set | 2 | libmemcached_functions_mysql.so | function | 2)添加trigger,看是否向memcache里insert、update等 具体的语句,我们可以参照: 1)memcached_functions_mysql-0.9/sql 目录下的trigger_fun.sql # v, Y9 R+ }2 V" X" ], | y! c
我们还必须注意以下几点: 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./ I: x8 d, [" j! j: K0 \
以下为相关软件,包括其版本和下载地址:
E9 L1 I2 r( I; k( Amysql-5.1.30 下载# [7 _% c, t$ U* J
memcached-1.2.6 下载/ b% x9 T" i u" j& k
libevent-1.4.7-stable 下载
0 {1 a9 u+ i1 e6 jmemcached_functions_mysql-1.1 下载. r2 E6 t/ M) a f0 b$ d. d5 h
libmemcached-0.26 下载 ) X# i/ Q7 H6 |6 s
- t( o7 F. ?) T% s) `编译安装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> , N1 [, |: p6 P! K5 A0 P
4 o N* Y( c: I0 M6 F3 { J; ~# O9 x
2 r2 r1 ~2 Q% Q& Q v# n
. X- O) v' y/ ~) v5 C0 f省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。( ]4 i- v) F1 J1 A8 ?& V
启动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>
# i: I% K4 }' f, _) @8 S, |
7 L: ^' I% Y) C: T% [% _" [2 X' a
% ]6 k1 Z) Q( J7 H" ]) ^
! E0 Z2 c Q3 a, p8 J. c编译安装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>
3 S; I6 Z+ O& f; e7 `9 i* h# G + V; z( p) z1 ?5 Q
1 w8 E2 w r4 R' b4 L( i+ ]2 m: [5 \
/ f7 y* I6 i( Z: G: }编译安装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>
) T! b+ n O$ H/ Y* ?
- M5 t/ @/ ~8 w' `7 N6 j
- N- N; n0 k6 f9 o( O+ ~
" V# M1 c9 N3 I4 g" ~编译完成后将编译好的库文件复制到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>
7 N: v" F$ M6 d$ q 1 N' G6 t6 \' ^6 ?4 ]
4 c/ x: H* j: r. W4 G, P
% y0 r* U" \* I5 l0 K) T# J. P& \
进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。 ' j5 I0 \4 ^" e7 Z( d" @
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql$ b1 I$ E* ^7 P5 @1 a7 A
或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。
+ T" J/ e- r/ H: ?3 y+ r[root@localhost ~]# mysql <sql/install_functions.sql 检查安装是否成功 : K5 H. _, Z6 Y/ Z+ t
mysql> select name,dl from mysql.func;
7 J% _+ a* G" s8 o% d1 W
: p4 d7 z& P* u! L3 K4 a二. 测试用例设计情况: (1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。0 i9 B3 h3 l8 V/ A3 w3 `
sql语句如下:7 | E- S' K/ ?3 ~1 A* n
use tests;
# Y6 N6 L4 [( H; ]drop table if exists urls;! y3 ^1 c* R/ l' h# e
CREATE TABLE `urls` (
1 C6 ?$ c/ ~# ?) \" e `id` int(10) NOT NULL,
( ^' L# m1 f: K. c1 O, Y `url` varchar(255) NOT NULL DEFAULT '',
7 z* L2 y; d4 B/ h2 n: Z! P3 C PRIMARY KEY (`id`)) q: A0 O2 @- x0 j+ ^/ L9 g
); drop table if exists results; Y ~5 Y/ x* j( ^( `( @1 z
CREATE TABLE `results` (
7 t( v4 E1 o5 k/ b6 L: d! G `id` int(10) NOT NULL,4 p, q7 f/ M: W5 J. z8 e* c
`result` varchar(255) NOT NULL DEFAULT 'error',$ @" [" j- L! L6 Y1 ^: E
`time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
3 F! d8 N2 f" d PRIMARY KEY (`id`)& ]' p* E: b' @* g/ _+ P" \
);
2 V/ I0 H+ V" |2 I6 ~* X- v% X* }# Y8 t(2). 建立三个trigger.
当向urls表里面插入数据时,对memcached执行set操作,trigger如下:; e" U. t8 _! s- ^, |* r& G
DELIMITER //
1 X0 [' k k' L1 N$ IDROP TRIGGER IF EXISTS url_mem_insert;
: c5 K+ [6 R% J4 ^8 KCREATE TRIGGER url_mem_insert
$ U& i& Q( O1 eBEFORE INSERT ON urls4 x+ M6 g7 J$ V7 V; ?* Y9 j- x( F
FOR EACH ROW BEGIN( ]' `$ l8 d: h7 G. E, v x1 |0 t9 C
set @mm = memc_set(NEW.id, NEW.url);
& J" T$ G- F& \7 J$ g if @mm <> 0 then
" J" v4 M# @6 r1 l$ B( A3 I) E insert into results(id) values(NEW.id); d4 m e$ ?2 a# o
end if; END //
6 i$ w2 c5 f- X, `- J! C8 iDELIMITER ; / }3 {2 |% n) w( l p! j* F' n
当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下: DELIMITER //3 f% n+ D3 {1 h
DROP TRIGGER IF EXISTS url_mem_update;9 ]3 _; q" V) a% x6 n+ _" k7 S
CREATE TRIGGER url_mem_update. ^$ r7 x& U' ` I# E- Q
BEFORE UPDATE ON urls
3 w) r r7 d5 a( d7 Q' q, GFOR EACH ROW BEGIN
, o% `, E# q/ b" u set @mm = memc_replace(OLD.id,NEW.url);, D8 Z7 j& Z& o7 g% F, Z# |
if @mm <> 0 then, q6 Y! z& l! U4 B* o
insert into results(id) values(OLD.id);* O. A: s2 _- }# N
end if; END //
( y! \; q. [) t5 K, p6 d7 jDELIMITER ;
5 ], w# v1 f, h6 i当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
DELIMITER //
8 ^3 R3 D% {# A" }DROP TRIGGER IF EXISTS url_mem_delete;" r- c% M/ m4 s" c
CREATE TRIGGER url_mem_delete* C# o( X; n+ b$ y6 G
BEFORE DELETE ON urls5 p# n1 z3 C4 J7 v$ N
FOR EACH ROW BEGIN* k) M Z) v6 R7 X( [
set @mm = memc_delete(OLD.ID);6 X9 n Q# P8 F& V* Q f& z! V3 J
if @mm <> 0 then1 @/ l* |/ `6 F' c9 s* p7 G+ e; a
insert into results(id) values(OLD.id);% ]( E, B+ k! h( e1 a
end if; END //
. \7 n* M, i- D# r! _DELIMITER ;
( W/ |5 b) y6 ~+ Y(3). 设置memcached相关参数
设置同时UDF操作的memcaced的机器IP和端口: mysql> SELECT memc_servers_set('192.168.3.184:11900');
6 ?8 R6 R2 ^9 ~. W+---------------------------------------+) G3 u9 [5 Q& J
| memc_servers_set('192.168.3.184:11900') |8 q1 [, \) N+ y% n- v! J- ~
+---------------------------------------+
! F! f" e0 S0 v! R5 h| 0 |2 ~7 c) b1 J! }& m, f3 Z; y
+---------------------------------------+3 i' P, U7 P, h+ k9 D9 l2 I# U
1 row in set (0.00 sec) / E) ]. \% _- u: d9 A0 b `! b2 w' n
mysql> select memc_server_count();
0 e5 S- j) H/ p; H. V' z+---------------------+
; c2 |3 B9 H! r9 V& || memc_server_count() |. b: K# g9 a# K' J
+---------------------+
Q) s, N: S; G% s; o: @% W7 n& I4 K| 1 |
! Y/ ~! K) r+ D- `* w* v+---------------------+
* p& ]0 [1 T s- y1 row in set (0.00 sec) ) O- r* W. ` D, E' R6 D
在mysql命令行列出可以修改memcached参数的行为:+ P; L7 ?: e7 h! c
mysql> select memc_list_behaviors()/G
8 C- R" {( e: D- A5 s*************************** 1. row ***************************
" ^" k5 k+ u: b% j6 q9 Y: C% e4 Umemc_list_behaviors():
9 X, j: u* ]. t; B& o; ?) D0 O2 _MEMCACHED SERVER BEHAVIORS
9 F% `1 p: {! H5 C$ gMEMCACHED_BEHAVIOR_SUPPORT_CAS8 T3 L9 j1 Y0 f& T
MEMCACHED_BEHAVIOR_NO_BLOCK' F! J- T( |) F# R" A* s1 i
MEMCACHED_BEHAVIOR_TCP_NODELAY
, |4 P2 @5 X7 a3 i' r/ b b& d4 AMEMCACHED_BEHAVIOR_HASH
) M' H: Y6 c1 P, N7 w. V0 ZMEMCACHED_BEHAVIOR_CACHE_LOOKUPS
1 ~! z" R0 H. h2 Y( v/ @' e0 dMEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE) j* H6 l, n [% B
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
U) i6 e, K$ r" u, b7 dMEMCACHED_BEHAVIOR_BUFFER_REQUESTS
3 [7 X$ \, L- ^( ^MEMCACHED_BEHAVIOR_KETAMA
: [, d; d6 L4 N+ d6 F0 p! PMEMCACHED_BEHAVIOR_POLL_TIMEOUT
, p/ _) u; V) R+ LMEMCACHED_BEHAVIOR_RETRY_TIMEOUT
3 k) {% J2 v: l% Z/ zMEMCACHED_BEHAVIOR_DISTRIBUTION# S* t8 W" z9 f* z! a" F* h) H0 o% U% O
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
5 W& R# Y2 W3 wMEMCACHED_BEHAVIOR_USER_DATA8 c1 s* W# Z, t2 S7 m" R3 l
MEMCACHED_BEHAVIOR_SORT_HOSTS+ Y0 Q! P8 u! S( M
MEMCACHED_BEHAVIOR_VERIFY_KEY
2 m" B+ S" h( ^) o! E1 k; MMEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
d$ Z" t9 X' s3 B) x# bMEMCACHED_BEHAVIOR_KETAMA_WEIGHTED
) b, l, B2 e0 h9 P5 }- ]MEMCACHED_BEHAVIOR_KETAMA_HASH8 e. \* m* @% r5 p" G( n& V
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
" T8 E4 c1 [: M, N% q( `/ |- LMEMCACHED_BEHAVIOR_SND_TIMEOUT
6 k" B! T2 i5 vMEMCACHED_BEHAVIOR_RCV_TIMEOUT
: J2 [( U+ @' g6 Q' M/ \MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
; c2 `, b( a# Y9 G# pMEMCACHED_BEHAVIOR_IO_MSG_WATERMARK# L2 m0 T$ m' V0 f+ ?$ F& }
MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK 1 row in set (0.00 sec)
* u" V& \$ ^( a设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)
8 l' a" L9 n) U' g0 A* \数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout" [" q' L. g6 B3 Z: Y* A
才可以插入到表中。6 ]& K( g3 g, _8 h O
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');
' x) c5 w% f0 t7 W+--------------------------------------------------------------+( m- h6 ]$ P. H0 d/ t& w s
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |& O2 x3 c- {5 e1 L6 G
+--------------------------------------------------------------+9 K! ^ H( z; k3 |0 N
| 0 |. w( h. w7 R. u; v* x
+--------------------------------------------------------------+8 u; C5 U7 \4 e5 J& T# |
1 row in set (0.00 sec) h( ^' b9 h3 C2 Z1 c
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');/ w8 m2 X* F. S- F$ C+ h
+-----------------------------------------------------------------++ C' {, W) x- u. ~$ s: |
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |
& t3 q, f! `+ t) J$ V7 F( Q+-----------------------------------------------------------------+8 l2 l+ K+ S! u/ F3 }( m1 T
| 0 |1 o/ n- ?2 @( F) q0 q6 \* N
+-----------------------------------------------------------------+; q$ j/ e# k8 q3 }8 r
1 row in set (0.00 sec) . K! ]5 C Z6 O" {, b; x+ _
- w; {, r c5 ~" s: o; O/ x3 ?
三. 简单的功能测试:
, _) ^1 C. S) K$ L1. 向表urls里面插入数据,然后查memcached是否也set进数据:
mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');) I6 Y: b, t; b
Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select memc_get('1');
" e1 ^+ d/ S- n6 ]& l; j( @+ z+------------------------+3 \" ^( Z5 S7 A8 K
| memc_get('1') |7 F) _- R/ v5 s& P& a
+------------------------+3 |7 Q. z6 b3 c0 E5 @1 I
| http://www.sina.com.cn |6 }' D- t/ R# M( Z8 t
+------------------------+4 R4 |- v' p7 ~- H2 k
1 row in set (0.00 sec)
, @$ g( D% F+ Q! {1 z1> telnet 192.168.3.184 11900
$ D& r8 V, p1 R* Q. H/ _Trying 192.168.3.184...
1 A: W+ V9 [$ YConnected to 192.168.3.184 (192.168.3.184)., R3 `0 k2 d3 l+ S7 n
Escape character is '^]'.4 Q% u6 N8 h/ n" B; \0 d
get 1
; Q$ e* h3 t/ H* s0 BVALUE 1 0 227 |% ^3 L4 C% g6 Z0 B0 k( D
http://www.sina.com.cn
' m+ C T5 V B6 t0 O. a- {# i0 SEND, y% i* X& K {: g
2.更新表urls里面的数据,然后查询memcached里面是否也更新:3 B2 e6 S2 O( h: F6 y, @; I* |
mysql> update test.urls set url='http://blog.sina.com.cn' where id=1;7 Y3 _" A& @" x2 o/ b
Query OK, 1 row affected, 1 warning (0.00 sec)
3 y% ^( u: o0 M S' w+ IRows matched: 1 Changed: 1 Warnings: 0 4 x& r. T( l8 O$ v$ L( B' |/ \
mysql> select memc_replace('1','http://blog.sina.com.cn'); ( n7 }. d7 c: [: b
+---------------------------------------------+
! k/ X4 k# J% || memc_replace('1','http://blog.sina.com.cn') |
% t6 o3 U/ P: o! o3 O# U+---------------------------------------------+7 `) p5 m$ C1 S6 I
| 0 |9 h* y3 k; O; B v" V: e5 ~/ S
+---------------------------------------------+
7 q, _5 I% X. E& w2 B1 row in set (0.00 sec) mysql> select memc_get('1'); 0 Z% s6 t6 B$ o: [/ C$ q L3 H/ w, o
+-------------------------+
" k- m h, v1 P" \3 i| memc_get('1') |
5 u) J1 o: `9 m: v1 f! m+-------------------------+) A. d% `4 `; e0 l
| http://blog.sina.com.cn |
, u8 D5 w2 l, s, L! `8 K+-------------------------+
3 H5 c7 }0 b' K, W7 Y4 }. `1 row in set (0.00 sec) ) z% |% P# h/ b7 ]* s* ~& Z
1> telnet 192.168.3.184 11900
9 E0 Y1 h4 k% y- X$ }9 R& |Trying 192.168.3.184...
3 }- d% n6 O @. Q2 l; Y$ ~Connected to 192.168.3.184 (192.168.3.184).
9 N7 [. m0 U7 v7 o% u8 `Escape character is '^]'.
3 _9 G3 T3 o: F9 g: zget 17 e4 K6 q0 _9 N: G5 W+ s( O
VALUE 1 0 23
5 ]) b9 X$ L `# y$ q% N/ O0 Ohttp://blog.sina.com.cn. U/ F w2 O) L: B6 Z O h
END
1 l' p+ p! |7 _* p& z# x6 v3.删除表urls里面的数据,然后查memcached是否也删除:
- g# k* }- v vmysql> delete from test.urls where id=1;
: f2 I; B# V2 E( _# IQuery OK, 1 row affected, 1 warning (0.00 sec)
! Y4 z) @, U9 ~9 q5 xRows matched: 1 Changed: 1 Warnings: 0
mysql> select memc_get('1'); 0 r8 Z' N7 A% D( Q5 L9 k9 |
+---------------+' ?* `! [$ j' b, k
| memc_get('1') |# |7 F" K6 r3 g% H7 ]9 e1 [
+---------------+
, L+ a! r0 e; \| NULL |
! L& x' ?. j, N% C+---------------+
* u/ k- x1 n" g! g5 ]% ?! m1 row in set (0.00 sec)
7 S ?9 R" @% Z2 w1> telnet 192.168.3.184 11900" B. V' N6 }1 k( h5 c& [- |
Trying 192.168.3.184...
1 i/ T7 a; ^" W. W9 P* g5 Z, h1 QConnected to 192.168.3.184 (192.168.3.184).
& V" \, d" d3 d7 n& E5 `Escape character is '^]'.
: Y/ V3 N' Z ~' w( ?7 kget 1
3 n z8 K* e3 xEND : u( M3 c6 I5 o4 D9 R0 g; |& y/ _
/ V8 ^" [5 S, x. v0 x& M四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。 每条记录的平均长度是:17K 单独向表urls里面插入10万条记录需要的时间为:75秒
A. z7 X6 |* F! Z! P: N' S单独对表urls里面更新10万条记录需要的时间为:70秒) C3 P0 n+ o! x1 f& C0 [
单独对表urls里面删除10万条记录需要的时间为:105秒 同时进行30万数据的insert,update, delete操作需要时间为:241秒 上面操作都没有memcached失败情况:
& U. y. t& ~7 O! fmysql> select * from results;+ M0 T+ b E; m4 g
Empty set (0.00 sec)
- Y: F7 H: V. z: `5 T1 v测试脚本如下:
插入脚本:' g4 h6 j3 b- c: f1 S6 v0 {
0> more a.php J! a: M/ u/ p 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");" e7 k: o2 w, x& `. W v
//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {
1 d ^9 ~. b$ q6 b$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');";( L' t& f* M( J% f) w) Y6 T
mysql_query($sql) or die(mysql_error());
$ {" Z9 @# H) x" W} echo "/n";
3 g" V$ Z( ^- F: `; Oecho date("Y-m-d H:i:s"); ?> 更新脚本:+ _4 f5 G5 v3 C5 {6 F% q
0> more b.php
6 f! I' g+ j' `- ?+ 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");
; _1 C& e( y7 |# @/ Y! V//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {
6 v4 M8 ~5 x7 M/ J3 q& A' r$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 B' I# X Y( @mysql_query($sql) or die(mysql_error());
$ r4 S1 V: _; \5 k, W) ~9 x} echo "/n";6 y1 L$ M1 A8 b! V+ h
echo date("Y-m-d H:i:s"); ?> 删除脚本:
. R# J6 @! V: E; w0> more c.php' s+ d l4 J9 P. E
<?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");
# P+ T) {3 f& s; E* ^+ o d* F" [. R//mysql_query($sql) or die(mysql_error()); for ($i=1; $i<=100000; $i++) {
' D$ ~7 a6 W6 R# e w$sql="delete from test.urls where id=$i;";9 r) N3 |& l$ i" t) l- r3 I
mysql_query($sql) or die(mysql_error()); 9 |3 `. i- I% o2 D( i: n. R. ^
} echo "/n"; j- t0 }1 v& m7 K% L( C
echo date("Y-m-d H:i:s"); ?>
, M1 ?7 ?: n6 f$ s& F4 m) b
3 _* q) R1 L! M' [五. 结论:; V8 T% M0 o7 h/ B
测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。
& W/ ?9 {, L1 _1 y适合项目应用相对比较小的场合。
优点:
$ Z: T ]0 Y2 S/ {% Z! ?触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。 缺点:1 U+ \3 Z( p* `& ?0 {
1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))0 r5 b* j" F9 x% u6 [& h
2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)). $ w! u7 L) n1 n6 n @
真正的线上环境比这个复杂很多。我想到的需要考虑的问题:
) R9 Z( y# v; T- h/ ]" X1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。9 s. }: b$ I, T( o' S k: i
2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。& P- Y. m" M9 Z3 e& G; u: s z
所以前期规划好,在memcached里面存那两列(key-value)是关键。1 o# k4 `4 s0 ?/ U2 L7 ~! s
3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。
* B6 z) w; b# @. @5 {. K4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到
# H+ r5 `( S8 k! I9 o4 Y7 M一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。! e$ ^* B, E/ F) e* W6 \3 U0 |
5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。
7 z! o$ ?" c6 i8 o |