易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4718|回复: 0
收起左侧

mysql memcached UDF 安装详解

[复制链接]
发表于 2016-8-22 10:51:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

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.357 r* z* t- h7 |( b" B+ M
shell> ./configure --with-memcached=/usr/local/bin/memcached
' J9 ]" K3 m2 A- c1 x4 Ushell> make && make install2 [. G, A- w6 S& @6 [
shell> echo "/usr/local/lib" >> /etc/ld.so.conf- G  E1 ~5 E1 F4 p4 r; C
shell> ldconfig
3)安装memcached_functions_mysql
$ w+ F( J& w' v+ tshell> tar zxvf memcached_functions_mysql-0.9.tar.gz
, l; ^2 C; |! l- \& I3 M6 `3 `shell> cd memcached_functions_mysql-0.9& C% |8 r/ m  s$ a7 U. m
shell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/
+ \; L+ k/ C) x- j/ S, A! Wshell> make && make install
4)拷贝lib文件到mysql的plugin下面
! ^! [% H7 f; G9 }0 G/ Oshell> 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 [; b) d0 s* Z+------------------------------+-----+---------------------------------+----------+
' A: _3 G5 `) I9 d) f| name                         | ret | dl                              | type     |
8 W; b3 @0 ^- O$ ]+------------------------------+-----+---------------------------------+----------++ H8 D! b% z% w7 {7 a
| memc_add                     |   2 | libmemcached_functions_mysql.so | function |
- w1 l- {" w/ [- F' h| memc_add_by_key              |   2 | libmemcached_functions_mysql.so | function |) j: [$ i+ p$ E; B7 y3 v2 C
| memc_servers_set             |   2 | libmemcached_functions_mysql.so | function |
2)添加trigger,看是否向memcache里insert、update等
具体的语句,我们可以参照:
1)memcached_functions_mysql-0.9/sql 目录下的trigger_fun.sql

! A1 R- o1 \& p8 ?  W我们还必须注意以下几点:
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.3 ?# l" Y" S. [# Z: I
以下为相关软件,包括其版本和下载地址:
. Z- r' @+ ]4 Q! [
mysql-5.1.30 下载
* d  r$ Y- F" w. N. ymemcached-1.2.6 下载2 I6 G$ B9 S8 Z/ r0 e; q
libevent-1.4.7-stable 下载+ {# ]: r& }. F" b6 u- L
memcached_functions_mysql-1.1 下载/ \( D' m5 u; F
libmemcached-0.26 下载
: n+ I4 ^9 h1 a- ~% q5 D; k
% }: ~1 B1 r8 u) o* C" K/ U
编译安装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>  
    * m0 r/ `2 |4 x2 _7 v) e

3 J2 a/ `4 U" t  N* f! A$ x6 W: |/ p

6 \3 K# g1 y: _2 a
省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。/ o; P0 j- [7 ]+ t& j3 w, n# X0 {) Q
启动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 ?9 v& H' @/ l2 T0 A" \

6 O6 K. B! C2 u; C% O! x- J; a) ~, L4 S. v4 p
% x+ `+ ^- u) j# }; ]/ r
编译安装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>  
    4 j" T$ Z/ w$ M, l! [* W0 J
& n6 E- P4 i5 }" t

' u8 Q$ ~9 H8 }' r) p6 n

5 w5 h4 J5 a& L2 R* z
编译安装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>  
    * {5 D' ^8 p+ N/ y( p# i

- h) w6 f: a# {, r, ]
1 d8 |4 B2 \! `0 w  n, D7 s

3 r. [; E/ M! s
编译完成后将编译好的库文件复制到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>  
    / H$ j$ N0 [4 R) |5 G+ F
2 o# ]$ t4 B/ Z* m) K

* m7 \* u  ^! ^. g  E" _3 A3 [- A
4 N$ H! l% ~- f1 s" ]
进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。

9 H) _0 J& W: K1 p" l) V/ q( R
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql
4 y  u) s$ T1 |: i或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。
4 V$ ^1 s9 v$ C5 H0 @  x3 ~
[root@localhost ~]# mysql <sql/install_functions.sql
检查安装是否成功

+ Z( o1 W4 Z: z1 `* |mysql> select name,dl from mysql.func;

7 [' h2 Y/ t* s: k( Z0 E9 D3 w) h! E+ \" T
二. 测试用例设计情况:
(1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。
3 \  U; B/ ~0 o2 Y4 U$ f6 ?$ b3 isql语句如下:6 X( k; L. g; I, j5 t/ u
use tests;6 ?. b/ b9 _# r! z
drop table if exists urls;
0 ^3 ~* S( w8 tCREATE TABLE `urls` (
# T9 s- ^3 J/ W( m. W2 @/ C  `id` int(10) NOT NULL,
9 D6 G/ M2 K- [3 t3 @; [% s& _  `url` varchar(255) NOT NULL DEFAULT '',) d1 R# X/ v- D
  PRIMARY KEY (`id`)2 G+ y  V0 z6 g
);
drop table if exists results;
; C/ t# M% `/ z1 ?% E1 eCREATE TABLE `results` (
- o# j1 ?* B2 v) k" ]3 H  `id` int(10) NOT NULL,
; }7 u, G3 ^  `  e5 J  `result` varchar(255) NOT NULL DEFAULT 'error',
% G! p, I% E% \" m, d+ o  `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
$ F1 u, ~1 |7 B4 M: @/ S8 p  PRIMARY KEY (`id`)
' `: I7 D, A0 U, y);
& t& K+ j( ^. }- {  N
(2). 建立三个trigger.
当向urls表里面插入数据时,对memcached执行set操作,trigger如下:
, U8 x' w0 s4 b8 s; SDELIMITER //- o9 }% B5 j. {5 N
DROP TRIGGER IF EXISTS url_mem_insert;7 L5 Q9 q8 L) @; B/ [
CREATE TRIGGER url_mem_insert$ E. w( a, G0 I, ?
BEFORE INSERT ON urls
! C) V# K/ N6 P! VFOR EACH ROW BEGIN! Q/ L$ I- [* Z; ~8 ~3 o8 W3 T# [
    set @mm = memc_set(NEW.id, NEW.url);
3 i" S/ D/ e% L- [/ ]" ]; Q# Q    if @mm <> 0 then% _" o) C- P4 z0 S9 ^1 i
    insert into results(id) values(NEW.id);
4 Q5 H9 M4 {$ H- G) _# c    end if;
END //
$ v7 X1 k: ~2 e  y' D" DDELIMITER ;

4 L* w4 l' p0 v$ c% K当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下:
DELIMITER //8 S0 y% D6 Q- s' y% g
DROP TRIGGER IF EXISTS url_mem_update;# f" J& ^; x+ z
CREATE TRIGGER url_mem_update
( H* c8 p% ^% U4 |+ _BEFORE UPDATE ON urls! s$ F% z4 {8 B& o% ^2 B
FOR EACH ROW BEGIN' w' J5 i- F# T3 G* F6 h' r+ U' E
    set @mm = memc_replace(OLD.id,NEW.url);' w! o% `+ M! C) k$ s2 Z2 s7 ?% S
    if @mm <> 0 then
3 n6 T* ~+ x: ~7 ~5 S    insert into results(id) values(OLD.id);
1 ^1 c; H+ Y% @    end if;
END //
) X% h8 x, v, {! w5 FDELIMITER ;
+ J# I& x2 I4 G2 z) z+ z3 ]; X
当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
DELIMITER //
; T8 O* X6 \& n" _; v6 uDROP TRIGGER IF EXISTS url_mem_delete;* D3 b+ q) [& |9 a$ J+ j& N
CREATE TRIGGER url_mem_delete
/ I% [% p4 G- d6 u8 A' KBEFORE DELETE ON urls
5 }0 P1 ~' w# y" C3 v+ {9 eFOR EACH ROW BEGIN1 R1 q1 b  x) Y5 t1 L
    set @mm = memc_delete(OLD.ID);8 E( X  f8 m0 Z5 T6 ^8 x
    if @mm <> 0 then& P5 [+ }1 \  Q
    insert into results(id) values(OLD.id);& {0 R# J9 m4 g" ]% r/ ^6 P$ ?2 W
    end if;
END //' E% Y; v) m4 F- ~8 Y$ j3 O
DELIMITER ;
4 a% N5 R/ h' ]% Q4 m
(3). 设置memcached相关参数
设置同时UDF操作的memcaced的机器IP和端口:
mysql> SELECT memc_servers_set('192.168.3.184:11900');& z( \0 M* ?4 S2 q
+---------------------------------------+
2 o/ c9 Z/ I' \  O$ i| memc_servers_set('192.168.3.184:11900') |. h0 o: O( `1 F3 t3 ?7 \
+---------------------------------------+
/ ^+ y6 \5 _, D& c|                                     0 |
/ v  G& S( [/ n8 ~5 a0 u+---------------------------------------+
/ n; y) f: s( ]/ l, U1 row in set (0.00 sec)
6 O" y& a. G2 f/ E  y/ I/ U" ^. b
mysql> select memc_server_count();5 Q7 O9 p! {! I# A( p
+---------------------+
- @3 [5 ?8 a( U| memc_server_count() |; p) W+ ]. ?% P- c% i. I
+---------------------+0 e2 b) ^& k8 o4 f
|                   1 |
) l. E& I+ O, W* A: X. ]1 ]# y+---------------------+
* e9 x* X8 @* J3 B) J& Q1 N3 k1 Y4 j1 row in set (0.00 sec)
! Y% [, S1 V+ K7 ^' d* d8 M
在mysql命令行列出可以修改memcached参数的行为:
4 {; n! k  F7 p$ O8 R* W& Kmysql> select memc_list_behaviors()/G
2 o% I" M8 a% S" |/ Q*************************** 1. row ***************************
- R' h. v) Z/ f2 |2 I. ememc_list_behaviors():" O- }8 m8 G* X9 _
MEMCACHED SERVER BEHAVIORS
( j5 Z) f' e( uMEMCACHED_BEHAVIOR_SUPPORT_CAS
& ]5 R3 G; a' B2 L0 r3 JMEMCACHED_BEHAVIOR_NO_BLOCK
% v4 }; ^' h9 t7 mMEMCACHED_BEHAVIOR_TCP_NODELAY8 Y5 Z. b- [' U
MEMCACHED_BEHAVIOR_HASH5 q, a; s, [( a: B$ b
MEMCACHED_BEHAVIOR_CACHE_LOOKUPS! [8 N, v# j! ?+ y0 h; [) r
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
! E0 L1 K3 o! v5 ^: `: CMEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE
( m( g: g4 T2 SMEMCACHED_BEHAVIOR_BUFFER_REQUESTS5 N- z& z4 c6 W; A- M
MEMCACHED_BEHAVIOR_KETAMA
/ E+ o) O' F& J2 uMEMCACHED_BEHAVIOR_POLL_TIMEOUT$ w6 j0 l( R4 k& q
MEMCACHED_BEHAVIOR_RETRY_TIMEOUT
$ {1 H0 T; Z( A9 {% N0 jMEMCACHED_BEHAVIOR_DISTRIBUTION
- \! ^+ ]- ~# e9 @MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
. r7 X# w( j' G( ^9 i2 xMEMCACHED_BEHAVIOR_USER_DATA
3 G2 \' `: P5 qMEMCACHED_BEHAVIOR_SORT_HOSTS
) x  O- k. F; C: `' gMEMCACHED_BEHAVIOR_VERIFY_KEY1 @- U. O+ k: T, D2 M9 p+ N4 A( @+ \
MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT
' T- ]* ~& t0 K8 ~1 T$ ZMEMCACHED_BEHAVIOR_KETAMA_WEIGHTED; M( ?8 U4 x- G) `6 V
MEMCACHED_BEHAVIOR_KETAMA_HASH
0 X) s( O" o; j- k$ l2 \MEMCACHED_BEHAVIOR_BINARY_PROTOCOL
$ R+ u+ W# `& x3 d" y$ lMEMCACHED_BEHAVIOR_SND_TIMEOUT
/ X: o9 d3 n0 s; nMEMCACHED_BEHAVIOR_RCV_TIMEOUT6 S, ~6 N$ i$ t
MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
  C) Y4 ]& e/ G% kMEMCACHED_BEHAVIOR_IO_MSG_WATERMARK* {8 }  q5 l, c6 ^' F
MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
1 row in set (0.00 sec)
' |- A. z# |6 S& c6 ~2 k
设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)
+ P7 |' ]1 C5 ~; ?; \" B数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout
. `* \( ]0 z/ o% f, t才可以插入到表中。+ A; \) @! {* e0 {
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');( y* L3 u' A6 A
+--------------------------------------------------------------+
  _; U2 p# W6 b. G& O2 h- c! j% R, l$ v- s| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |
( }$ U& I, L0 v+ f' L, Z+--------------------------------------------------------------+! u; O$ m( x. T6 y2 v
|                                                            0 |
& k# r4 P" G1 B: I+--------------------------------------------------------------+& _) h- n$ c, o2 Z- L% Q
1 row in set (0.00 sec)
& n/ |6 B) x+ F5 {  T
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');  G% U3 ~0 Y- q  L) L, \% C
+-----------------------------------------------------------------+
- `5 k; r1 L, x| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |! b9 q: m0 L0 T) T" m; y# z
+-----------------------------------------------------------------++ s( M& B2 u6 ^
|                                                               0 |
2 U5 ]# l7 S# c+-----------------------------------------------------------------+9 Z, Z; m' w# ~
1 row in set (0.00 sec)

( U7 P# L" a9 f  ^/ W: x' d
. ^  H: D# e( K9 I
三. 简单的功能测试:
- Z* f3 N3 o9 |  i
1. 向表urls里面插入数据,然后查memcached是否也set进数据:
mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');5 J! I8 u8 `: s6 A: g4 C
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select memc_get('1');  
* a8 L  G0 \2 s+------------------------+* j0 ?9 Z8 D' z- m3 F* j
| memc_get('1')          |
# m- s" q( s* P- \. q; q+------------------------+/ J5 L* z# c7 S9 G; a( Y
| http://www.sina.com.cn |9 \/ o0 X2 J& R
+------------------------+/ x/ Q1 n& a2 ?6 {1 U
1 row in set (0.00 sec)

2 I% p* ?3 ]! G8 I% M: g1 Q1> telnet 192.168.3.184 119003 F) _4 k* j8 `
Trying 192.168.3.184...% f; ~  L$ p, L: W4 t
Connected to 192.168.3.184 (192.168.3.184).& _, d- t; d& T3 i% n
Escape character is '^]'.
4 v$ R& }" b7 \6 j5 m1 _3 Vget 1( l, D& a, W; z0 r$ I2 e
VALUE 1 0 22
7 A+ Q' H2 C: j$ H! O& uhttp://www.sina.com.cn
5 Y  g/ S$ O) z5 LEND
1 r) s0 Y$ L$ \4 Q- j# f
2.更新表urls里面的数据,然后查询memcached里面是否也更新:: M+ y' I9 s% H' g7 R, b2 D  E; L
mysql> update test.urls set url='http://blog.sina.com.cn' where id=1;9 I. X' t* ]$ |8 j6 M- M5 z3 J
Query OK, 1 row affected, 1 warning (0.00 sec)
7 F/ u) |0 {, }# q" d- j0 u* B8 BRows matched: 1  Changed: 1  Warnings: 0
4 X8 z9 A. a) W1 _( c! j
mysql> select memc_replace('1','http://blog.sina.com.cn'); * W) J7 U. }7 ?* O6 i, v/ V
+---------------------------------------------+
& b$ f6 X3 _0 C' Q4 }3 o( ~3 {| memc_replace('1','http://blog.sina.com.cn') |5 C4 G' H( g+ x" \% Y
+---------------------------------------------+
2 E/ B1 r6 C: k+ @9 ^|                                           0 |
# p- s- ]6 I, }" u4 e$ k: t+---------------------------------------------+5 L9 i1 B4 l) M8 h& ~
1 row in set (0.00 sec)
mysql> select memc_get('1');  
0 S: y1 o: K2 Y$ `+-------------------------+4 E) F: l7 A% B' }7 t
| memc_get('1')           |) l4 L5 O; ^. H# Y8 R: y. c
+-------------------------+% C- E/ g$ K. X7 J) ?) g# M
| http://blog.sina.com.cn |& h; o5 T" Y5 x- ]% Q* q2 S
+-------------------------+
  M. ^( b( W1 k, s/ \1 @% A$ s. c/ r2 h1 row in set (0.00 sec)

( G& h8 w5 f0 ]% i: L( R1> telnet 192.168.3.184 119003 O6 c) o+ a1 g- E9 f
Trying 192.168.3.184...
7 o2 m1 f( \" bConnected to 192.168.3.184 (192.168.3.184).
, ~7 ^8 o) i( ~7 o- T. S" R$ tEscape character is '^]'.
% L$ r$ H! Q* i: U0 X6 iget 1
' S$ c* M# H* ~! hVALUE 1 0 23* O) I) c  b- m- a) o
http://blog.sina.com.cn* }8 f- t, z  {) I
END

0 Z9 }0 n2 \+ _$ p; i) Y3.删除表urls里面的数据,然后查memcached是否也删除:
7 p! q  S  f- n( U7 V! ~mysql> delete from test.urls where id=1;
+ N8 ?1 E  F7 U, Q6 o  w' U! aQuery OK, 1 row affected, 1 warning (0.00 sec)9 ~: |) |1 C' J7 x
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select memc_get('1');  # B% {8 E' [' D) p6 V, a1 N2 }: ]
+---------------+
& b3 F# D+ C9 V. G) ^| memc_get('1') |& J2 Z% n7 `: |- ~0 x- N
+---------------+
  w; \( C# M0 L" g+ h| NULL          |& [$ m2 R7 n! ~  S
+---------------+
/ s0 V2 R7 u9 D  c" R3 M1 row in set (0.00 sec)
9 p7 g; ~( @: h) \! I; e
1> telnet 192.168.3.184 11900. E( R' m; u, ~4 n- h) H
Trying 192.168.3.184...
* ]" r+ ^* L& n5 L' GConnected to 192.168.3.184 (192.168.3.184)." K; {4 y# `, z2 B; E
Escape character is '^]'.1 T/ b0 _* _" `6 `7 f7 R
get 1
! d( j5 @, V( n' c0 v, k+ LEND

9 ?$ p  ]7 ]& @3 k: ]* Q' P# R8 n, F6 b% Q
四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。
每条记录的平均长度是:17K
单独向表urls里面插入10万条记录需要的时间为:75秒
: P2 L" \  P- I2 O3 X* r单独对表urls里面更新10万条记录需要的时间为:70秒+ m9 M- z) s  ^0 |) o
单独对表urls里面删除10万条记录需要的时间为:105秒
同时进行30万数据的insert,update, delete操作需要时间为:241秒
上面操作都没有memcached失败情况:
" U( C+ ]& l9 o  p+ nmysql> select * from results;/ N; }; [0 ]$ k
Empty set (0.00 sec)

' q- f" H1 C/ T* I/ o$ C" \测试脚本如下:
插入脚本:
' y8 n) N- x7 C2 n# @8 G0> more a.php
9 I% O2 _" k- p+ t5 |" k+ e5 m7 f" S<?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");2 i5 g, g6 `  s( [$ W7 r/ L$ b
//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {
" Y" S3 \( {1 V; n$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');";
. `. ^) E' \7 c4 Kmysql_query($sql) or die(mysql_error());
. r; e. ]* ^0 _* r6 a0 l" i5 G}
echo "/n";
6 ]* l& E& E/ c! C4 i( Xecho date("Y-m-d H:i:s");
?>
更新脚本:
) M8 A* o" \9 ?1 E1 l6 Z# e+ m* W/ Z0> more b.php
' F/ T1 S, V; G+ n+ M$ S5 d; Q<?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");
; x4 J- w3 _5 h: I//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {4 G7 y1 F* a" S: i' I3 U6 g' W
$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;";7 R9 K' G. n' S3 a
mysql_query($sql) or die(mysql_error()); + D" @% Z  [! Y
}
echo "/n";
  E, ^# M& ]2 C' J! Q9 x# Q7 _echo date("Y-m-d H:i:s");
?>
删除脚本:
- I3 f+ v! R$ R5 E1 X% b! ~) G4 X0> more c.php
4 a8 r* Y, n8 R/ i# W<?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");
* F( T/ m2 }4 ]9 {5 n7 B//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {
7 N# z+ ?% H8 {6 Z: `# [- c. \$sql="delete from test.urls where id=$i;";, t- T$ o! n. m
mysql_query($sql) or die(mysql_error());
) S8 H8 u' G7 V! |6 q+ q$ H6 j7 v}
echo "/n";
$ q9 ^# u5 m( {5 r% }echo date("Y-m-d H:i:s");
?>

0 A4 e) F* ]% [) c) o2 J# A

+ B/ x* l8 s8 e7 l! N五. 结论:
3 Z  S  \% O/ D! q0 h( p测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。
" \1 z  v2 A- F+ L; M8 m8 V适合项目应用相对比较小的场合。
优点:
" u! y& ~5 e4 u1 }' @; u; l5 Q触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。
缺点:
1 w. R1 y/ u2 W) H/ {5 s- E( C1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))
! x0 K# d5 P5 o/ u$ O( U2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)).
. s6 c# N0 \7 `" z- C
真正的线上环境比这个复杂很多。我想到的需要考虑的问题:0 }& q* A* Q0 F  g& M% w
1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。: T/ u2 w+ g0 O/ _
2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。
& l( @/ `- Q, U% C所以前期规划好,在memcached里面存那两列(key-value)是关键。# f/ j+ ~) g7 a0 n
3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。
# h, ?! w4 y- t" |3 v( h) f4 \  Z4 [4 c4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到' H' I( O& O6 J2 N
一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。- m5 e& ^/ I0 ^8 x3 n4 A. p
5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。

. H0 G' ?2 O6 u+ k# P$ u. D" q, w
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:34 , Processed in 0.068495 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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