易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 4717|回复: 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.35) K) d/ w9 C5 z' |+ a2 x- L
shell> ./configure --with-memcached=/usr/local/bin/memcached* E4 j& U4 |- _5 Y/ ~0 \- H
shell> make && make install
, y- N0 f" p! G* |! D. J9 ^" Wshell> echo "/usr/local/lib" >> /etc/ld.so.conf
$ x7 S7 i& W5 g" w: Y' }shell> ldconfig
3)安装memcached_functions_mysql
- P3 @! k: t" m% Ishell> tar zxvf memcached_functions_mysql-0.9.tar.gz' n) z3 V' a' N" Z0 Q% P
shell> cd memcached_functions_mysql-0.92 n$ Q2 \7 J7 |- E* U- a: u( g# S
shell> ./configure --with-mysql=/usr/local/mysql51/bin/mysql_config --with-libmemcached =/usr/local/
6 r( ?5 g/ R* fshell> make && make install
4)拷贝lib文件到mysql的plugin下面
. z( j3 r* |( Dshell> 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;6 {1 j! r2 T0 P0 F# |
+------------------------------+-----+---------------------------------+----------+
. s0 ]! P9 b/ \( z| name                         | ret | dl                              | type     |
6 N. {  e, M! v& h! U+------------------------------+-----+---------------------------------+----------+
" p2 E3 W$ Y0 Z! [| memc_add                     |   2 | libmemcached_functions_mysql.so | function |
- W5 X! I- W4 ~# C5 {| memc_add_by_key              |   2 | libmemcached_functions_mysql.so | function |
  z$ w9 J4 @' X9 g& @& @* d0 \| memc_servers_set             |   2 | libmemcached_functions_mysql.so | function |
2)添加trigger,看是否向memcache里insert、update等
具体的语句,我们可以参照:
1)memcached_functions_mysql-0.9/sql 目录下的trigger_fun.sql
! c5 n6 q8 F  \; p+ P0 N2 ?
我们还必须注意以下几点:
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." p! W- [1 k0 m# q- x
以下为相关软件,包括其版本和下载地址:
1 g% g# a; q  ~
mysql-5.1.30 下载2 h3 L; M  H, ^& `; ]. w& z2 N
memcached-1.2.6 下载& j6 x, b6 b& a( M
libevent-1.4.7-stable 下载9 y1 o& }1 Y! Q. x
memcached_functions_mysql-1.1 下载& {$ Q# [, Z2 k. }- L5 {! f5 ^* C; b
libmemcached-0.26 下载
/ u# n% ?& _4 n$ s
& T2 [# S+ E- k4 T( V$ B
编译安装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>  5 a' s1 a, m; A, K/ u
( y4 P  v: g0 ]2 ^4 q

; [' m3 ^7 b2 |1 L) m8 j
! q1 Z* @, r5 A2 `$ e0 N7 \: `
省略列出安装memcached和libevent的相关命令,具体可按照实际情况安装,测试时我将libevent默认安装,memcached安装于/usr/local/memcached目录下。5 P3 T$ J8 @  }; d
启动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>  
    0 g4 c$ y3 |. F/ n' [$ C
3 O8 W+ K* p/ u6 _  e

( q/ o' x# f* E) ^6 H

4 p- {1 q3 M7 g5 }, ~1 j5 E1 U
编译安装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>  - V5 o. G) D. T0 @2 c: V5 E# r5 W' V
6 ]( q# i2 l$ @7 v
  \8 j7 p- w/ O& j% J+ E( J
/ [; {$ S/ u& {2 ^
编译安装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>  & I" a4 V( c7 N5 z' |( P% X

) l) F& B, x8 M: _0 j- ?8 v/ {  M6 N9 A
5 s9 K1 s& e2 _9 Q& l  Z" r: x
编译完成后将编译好的库文件复制到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 {; j" v' r2 d. T. O. d" b

% S1 |: m4 }4 L! K% |2 b- z" m4 z  v8 H

+ g. ?3 E  |6 Q, ]3 C% V
进入memcached_functions_mysql的源码目录,在目录下有相关添加UDF的SQL文件用于初始化。

' X7 e! S/ q/ l3 t* u
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql
% ]5 k6 V# r; O/ L0 J- i或者运行memcached_functions_mysql源码目录下utils/install.pl这个perl脚本,把memcache function作为UDF加入mysql。
2 h  c: S5 [/ F8 R/ R: b
[root@localhost ~]# mysql <sql/install_functions.sql
检查安装是否成功
' n( R  e& `" v* [5 U
mysql> select name,dl from mysql.func;

, F- e. a9 p# N; `. U% v9 J( O6 U0 m( B: v( I  M& t" B+ j0 G, `
二. 测试用例设计情况:
(1).新建两张表:urls和results,用来更新urls表里面的内容,让系统自动更新memcached的内容。results用来记录更新memcached失败的记录。
( ?$ f! J( C* c9 {. [sql语句如下:0 h% T- Q' n! B/ b
use tests;
; @5 ]" z5 @# z2 f5 M# Ydrop table if exists urls;
1 X+ {  ?. ^5 ?CREATE TABLE `urls` (: T3 w$ r7 g2 `. o7 B
  `id` int(10) NOT NULL,! p" Q8 E; n) x3 `  y$ {
  `url` varchar(255) NOT NULL DEFAULT '',, W  P& R+ c. c
  PRIMARY KEY (`id`)
- f$ Q1 Z5 w9 g5 S% Q0 H1 c);
drop table if exists results;
( x" r$ k) V/ O9 PCREATE TABLE `results` (6 P+ U2 V& N1 G: {  l2 l
  `id` int(10) NOT NULL,
. c4 r6 F* g/ K- y) U  `result` varchar(255) NOT NULL DEFAULT 'error',
) u) ?% ~, S5 B7 a9 J$ |  `time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
% m" }9 D5 P- c4 Z  j  PRIMARY KEY (`id`)# I7 q3 N' s8 Y' S. U
);
) F* x! @4 M9 g! s+ m
(2). 建立三个trigger.
当向urls表里面插入数据时,对memcached执行set操作,trigger如下:9 _* o5 T% c  W5 H, `7 G
DELIMITER //
$ p+ o3 n; B; t6 @DROP TRIGGER IF EXISTS url_mem_insert;) F3 J- z( l* ^/ @7 F
CREATE TRIGGER url_mem_insert
# X( s  R  y8 f( K8 g" g2 l$ i/ x0 xBEFORE INSERT ON urls4 J% u8 i9 v& R0 c, m7 F6 s8 F; W
FOR EACH ROW BEGIN; s: k. F- \: \$ h( Q* n% u, X
    set @mm = memc_set(NEW.id, NEW.url);! M. w. G" i" z" R
    if @mm <> 0 then
* |/ b, O1 o3 ^4 e8 e; ?' [    insert into results(id) values(NEW.id);. S; D+ S$ m% e& t- _. ]  l
    end if;
END //
. L" [& I' T% P) sDELIMITER ;
5 Y  R; S; H2 P8 P9 Q8 C- o/ p/ z1 `
当对urls表里面的数据进行更新时,对memcached执行replace操作,trigger如下:
DELIMITER //
5 |# e: a" f, n0 dDROP TRIGGER IF EXISTS url_mem_update;1 k  s* ~: e+ g8 x. `3 z
CREATE TRIGGER url_mem_update
5 Q' D( T. R& K6 |& ]" ~. U3 Q8 v: U: iBEFORE UPDATE ON urls
! Y( y) s3 d4 w% QFOR EACH ROW BEGIN5 q4 j; y! S# g; [/ c
    set @mm = memc_replace(OLD.id,NEW.url);
6 D) O9 `7 p0 T, Q    if @mm <> 0 then1 y7 \9 I5 b' a' ]
    insert into results(id) values(OLD.id);# G, ^7 s/ r8 [5 f" Q5 r
    end if;
END //# o" v4 v/ ]8 O( i
DELIMITER ;
* n8 [% ]4 d/ G- f7 l1 m
当对urls表里面的数据进行删除操作时,对memcached执行delete操作,trigger如下:
DELIMITER //* l- K: m" [! p$ O* n. N
DROP TRIGGER IF EXISTS url_mem_delete;/ c- l- R" l, D" r% B% o. M
CREATE TRIGGER url_mem_delete. s( K( m# c& H; V* f
BEFORE DELETE ON urls! B% }. s) N9 @0 r$ G9 Q
FOR EACH ROW BEGIN
3 r6 r' v5 W& i. j, r    set @mm = memc_delete(OLD.ID);6 K8 ^7 V3 _" B9 ?* y5 f! |7 S
    if @mm <> 0 then- ?# I( A- N5 P- c" o, e0 y, D0 s
    insert into results(id) values(OLD.id);0 i( T( x+ G% l0 K0 g
    end if;
END /// O' o' h$ M) W2 f7 B# {- t
DELIMITER ;
2 ~% y. Z# K5 ~
(3). 设置memcached相关参数
设置同时UDF操作的memcaced的机器IP和端口:
mysql> SELECT memc_servers_set('192.168.3.184:11900');( |+ K6 I% v4 _! ~. u! k2 y
+---------------------------------------+
2 b! v; S  ^  {| memc_servers_set('192.168.3.184:11900') |- K* _8 X# x; t, ]6 Q* c
+---------------------------------------+
1 j1 ]' l' k- Z! @+ u* ?|                                     0 |
: X! K; \$ I& B: o+---------------------------------------+# ]0 K+ F9 }% D
1 row in set (0.00 sec)
8 b# T1 P( u; O+ V
mysql> select memc_server_count();8 r0 C7 f9 Y- `$ Q
+---------------------+
; m: S6 y  `+ q3 [6 {| memc_server_count() |
5 i+ ?. q0 ^; R) F) B7 _- _* o+---------------------+8 T) u# N6 e0 G  X  j& f3 w0 `' C
|                   1 |
) B4 ^( m" N  Q2 R4 T) c+---------------------+4 ~  D! k5 G4 R. p5 X; J8 |
1 row in set (0.00 sec)

" {7 r7 _9 Z/ d6 H- H在mysql命令行列出可以修改memcached参数的行为:. x& F3 V' V7 Y  v: ^* h: w5 R1 S
mysql> select memc_list_behaviors()/G
6 G) y" R; t  R( W5 P*************************** 1. row ***************************( t6 }. H) l) G& F4 {
memc_list_behaviors():- ^* I# B. `$ G/ K- A7 R
MEMCACHED SERVER BEHAVIORS
! ~7 @6 Z( u4 e$ V2 F9 k* xMEMCACHED_BEHAVIOR_SUPPORT_CAS
) O; c5 {4 ^  J0 V1 v4 ~MEMCACHED_BEHAVIOR_NO_BLOCK
+ h5 ^3 `' s+ E- LMEMCACHED_BEHAVIOR_TCP_NODELAY
, G! \  i9 @  s% x% {5 s6 wMEMCACHED_BEHAVIOR_HASH
  O( a0 n, g& d1 vMEMCACHED_BEHAVIOR_CACHE_LOOKUPS( g; a; P0 ~7 }& o
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
2 L0 V, z) ~0 s5 u( H! B/ hMEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE" c$ ], M& H  I" d
MEMCACHED_BEHAVIOR_BUFFER_REQUESTS
. ?9 g7 A  r4 u/ x/ \MEMCACHED_BEHAVIOR_KETAMA
/ ]9 c2 z+ q) @9 b8 t# R- |4 YMEMCACHED_BEHAVIOR_POLL_TIMEOUT
  T  k9 ?. O) N4 O7 C$ ^MEMCACHED_BEHAVIOR_RETRY_TIMEOUT/ c: ?, @8 Q5 g5 h6 {) q! r1 _0 }
MEMCACHED_BEHAVIOR_DISTRIBUTION
% ~5 ~4 d5 h2 a+ tMEMCACHED_BEHAVIOR_BUFFER_REQUESTS3 a) \/ n& W$ \) E: }9 y" [+ V- u" Y
MEMCACHED_BEHAVIOR_USER_DATA
. J" ]2 a7 M" ?# A2 kMEMCACHED_BEHAVIOR_SORT_HOSTS
2 N1 `' P9 B9 O  |& g  qMEMCACHED_BEHAVIOR_VERIFY_KEY
. S, z: O! u0 b7 I# p( yMEMCACHED_BEHAVIOR_CONNECT_TIMEOUT' Y3 j) K  V) w. |6 W% B
MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED) g1 a) T* `$ y( S
MEMCACHED_BEHAVIOR_KETAMA_HASH' w# \0 S' x* O2 y: F
MEMCACHED_BEHAVIOR_BINARY_PROTOCOL( l1 ]7 `; E/ B: P8 x
MEMCACHED_BEHAVIOR_SND_TIMEOUT
7 M1 q& `3 k' c6 \# z2 z" |1 wMEMCACHED_BEHAVIOR_RCV_TIMEOUT
' n0 _/ S3 K: b* R: d+ p+ ZMEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT
8 h8 k3 K( a, X8 q  y8 e  DMEMCACHED_BEHAVIOR_IO_MSG_WATERMARK
( b3 G) Z& j5 A4 \& y2 KMEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK
1 row in set (0.00 sec)
; ^/ ]5 |4 w2 T5 k
设置MEMCACHED_BEHAVIOR_NO_BLOCK为打开状态,这样在memcached出现问题时(不能连接时)- c3 \7 ?6 A* ?
数据继续插入到mysql中,报错提示,如果不设置此值,如果memcached失败,mysql需要等到timeout3 s; @" w3 ~+ T9 W; \' n' ^
才可以插入到表中。
; v: C7 s5 |& x. O5 k5 Q7 umysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1');
! m$ P4 B1 B0 x' C& d+ p- m+--------------------------------------------------------------+5 P  O. n( e8 j
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK','1') |- G5 f0 @/ S8 N6 H
+--------------------------------------------------------------+( @6 Z3 d$ t' p2 b8 w% S
|                                                            0 |/ P  X, B! u' V: E/ R( I
+--------------------------------------------------------------+1 r* ?" X9 }! T2 N
1 row in set (0.00 sec)

7 `% L2 ^# g. A! |' F7 I
mysql> select memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1');
$ ]7 M0 A$ U5 @2 [+ K+-----------------------------------------------------------------+$ W" t9 |( L! E$ f
| memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY','1') |- f% f) Z% ?& ^8 S1 g0 Q
+-----------------------------------------------------------------+5 d3 o# H) A$ K0 f* N8 T8 d9 q( t
|                                                               0 |
7 ?5 c% I% I* j: |! Z+-----------------------------------------------------------------+
& p4 D  w- Z! V" \; ~1 row in set (0.00 sec)
6 T# u/ N' F+ l* W
* a* U" G/ l, h. O; o
三. 简单的功能测试:

7 h; Y8 k* E- T1. 向表urls里面插入数据,然后查memcached是否也set进数据:
mysql> insert into urls (id,url) values (1, 'http://www.sina.com.cn');' d. z4 n4 {# M9 |) o% K" e" i# X# w
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select memc_get('1');  
" u* l# l2 g( x! m7 j0 N( F. R+------------------------+
9 M8 w- h+ |) W6 q& T5 O! \| memc_get('1')          |
* B; Y% J: g. i! c5 [7 J0 B8 t5 ^+------------------------+- P, K2 s; o. Z, |  }% w
| http://www.sina.com.cn |* U$ O, x5 `3 x8 P; H7 q: Y
+------------------------+
3 i) y/ _2 u  \4 a' h9 ^1 row in set (0.00 sec)
4 T; |+ ]4 }- r% X9 O3 y
1> telnet 192.168.3.184 11900
1 v/ N6 p5 @$ b2 aTrying 192.168.3.184...* d0 I; @' E/ K2 a$ A& i& T  i* l
Connected to 192.168.3.184 (192.168.3.184).! h: ?7 @' a( ]) n7 m  L
Escape character is '^]'." a1 p% c% \: O- l" c& X) ^$ c
get 1* J- G2 A9 |* e6 A
VALUE 1 0 22
4 B% B: a, F6 G, x  Y* A  g7 Bhttp://www.sina.com.cn6 X) n5 f7 X3 i
END

( |' T4 d& J$ a4 a8 s2.更新表urls里面的数据,然后查询memcached里面是否也更新:
- D; L1 C( B4 Q3 h0 [% W7 s4 p* K1 Umysql> update test.urls set url='http://blog.sina.com.cn' where id=1;
% `4 |) `; T& a; x. {5 v. n3 XQuery OK, 1 row affected, 1 warning (0.00 sec)
; W) |$ h" [- Q8 L+ F  n1 ORows matched: 1  Changed: 1  Warnings: 0
( F7 s2 n- }- E6 k9 @( R, ~4 d7 ]
mysql> select memc_replace('1','http://blog.sina.com.cn');
  g; o1 v/ l+ I2 c+---------------------------------------------+
+ Z$ d4 B; t8 {, ]6 i' V; Q| memc_replace('1','http://blog.sina.com.cn') |
' w- z2 m" m2 m" {4 z6 E+---------------------------------------------+: T$ E; K, T0 ]9 F$ l# L7 o& N
|                                           0 |9 b' O# m7 D& o7 R
+---------------------------------------------+# z3 L4 Z* j& B& G7 U
1 row in set (0.00 sec)
mysql> select memc_get('1');  
, j" {! \9 b+ v' v) e, o( i% S+-------------------------+: @) X- w2 m, e
| memc_get('1')           |
0 f- h" R* Z) I. p, f+-------------------------+: o4 \/ o" T  b3 x  V% q# B- k  `
| http://blog.sina.com.cn |+ k! t# C7 j" K0 _& ?8 d
+-------------------------+
5 X  Z  G) S9 W6 v' _1 row in set (0.00 sec)
$ n3 g9 z7 N% J
1> telnet 192.168.3.184 11900
1 l4 H* R: D- k! I# k  MTrying 192.168.3.184...
$ D# H6 C- j5 |# c. rConnected to 192.168.3.184 (192.168.3.184).' r  e8 g4 b5 }! L( l( ~) ^- P
Escape character is '^]'.0 U, N- h% X: w, k+ W" W, X
get 1
$ u/ B9 y+ ?' P. v5 v5 jVALUE 1 0 23  B6 f: m: o+ |
http://blog.sina.com.cn
& T$ Z0 u$ V5 x" u0 |8 `/ [! T3 vEND
( p6 r' n5 q9 X/ [& I* k6 B" X
3.删除表urls里面的数据,然后查memcached是否也删除:+ E) z$ w0 I2 w9 X4 v! [3 e4 D
mysql> delete from test.urls where id=1;" N8 }( j: y- \$ ]' n
Query OK, 1 row affected, 1 warning (0.00 sec)4 T4 }* q: }9 q9 `6 |* n
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select memc_get('1');  - u) F" N5 Y9 g4 X' F
+---------------+$ k! M6 a! D; |9 C
| memc_get('1') |, H2 S' s% S) f# f
+---------------+
+ e9 Y% k0 a$ m5 d| NULL          |
9 L+ Y1 H" f  n9 Q' H# n& h8 ~8 F+---------------+$ N6 O3 s. s( X, B
1 row in set (0.00 sec)

4 I! s1 V' D& d. X1> telnet 192.168.3.184 11900) w& r- F4 _( ]4 L+ [2 {
Trying 192.168.3.184...
; e0 a+ f, Q9 I( I! ~. @& Y* L$ }Connected to 192.168.3.184 (192.168.3.184).
$ D7 D( d& |9 ?  P5 DEscape character is '^]'.9 y0 D$ V" g$ P& @. o) q. n
get 18 c7 ~2 r- h6 k% `( p
END
. t2 [- x" z' k& t& x- L7 X$ U% B2 _, I, b

' F* y2 c: q. F' z; K' Z0 N
四. 利用php脚本insert, update,delete表urls里面的数据,进行测试。
每条记录的平均长度是:17K
单独向表urls里面插入10万条记录需要的时间为:75秒  q2 g& d* N8 c' }+ y
单独对表urls里面更新10万条记录需要的时间为:70秒" W2 }1 A: }1 ^( x6 V% i8 `
单独对表urls里面删除10万条记录需要的时间为:105秒
同时进行30万数据的insert,update, delete操作需要时间为:241秒
上面操作都没有memcached失败情况:: q; p6 i/ b2 Q! c
mysql> select * from results;
+ B: ^& I) `( i/ S$ j+ L9 kEmpty set (0.00 sec)

* d& e  {0 l, Y; }5 {) w测试脚本如下:
插入脚本:
0 Y) |+ p# ^* x8 p0> more a.php
1 o5 h- I: x9 L7 M3 I1 g<?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 W1 W0 |7 M- S- j
//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {3 d) d8 Q& V4 R! o. l5 M& h
$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');";# g) O# o1 k: w
mysql_query($sql) or die(mysql_error()); : j: l2 e, N6 c- R7 k3 w' o3 c
}
echo "/n";# B2 ]' w& O* f. d" _
echo date("Y-m-d H:i:s");
?>
更新脚本:
' |3 u! o" v1 B( `0> more b.php
$ K4 T  z. Z: Q# ]. 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");
" x2 k" F% d9 ]# {/ c* X8 ]//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {* t9 T- B" `, y; c& U% Z7 A
$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;";3 _$ \& m$ p* w( L
mysql_query($sql) or die(mysql_error());
- t( ^% }4 X8 ?+ J$ S' z}
echo "/n";
- _7 W' B. D# a7 a& @" u0 x1 Wecho date("Y-m-d H:i:s");
?>
删除脚本:( B8 k9 s4 u& c+ p0 E
0> more c.php9 y: R3 ]3 E+ [, s+ H9 v" r7 V# ^
<?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 l% M& T) W* W: f* \& t9 o
//mysql_query($sql) or die(mysql_error());
for ($i=1; $i<=100000; $i++) {5 B: [' w) t& \; g- Q7 G; _
$sql="delete from test.urls where id=$i;";
: C9 f$ d% E& y* Y" V' Hmysql_query($sql) or die(mysql_error()); ; I% h: q7 `: R; R. }, I, _: ^
}
echo "/n";
+ b# A5 z. J/ M- |4 z; C: lecho date("Y-m-d H:i:s");
?>
& o5 z6 g# D% N* `. i/ {% p# g1 m
1 V" ~7 k4 E, |) l
五. 结论:
+ L6 o0 h" O1 E& a! g) j测试依赖的环境比较多,可能数据会不准确。整体来看速度还不错。0 Z1 @! R: A; o& }2 h2 U
适合项目应用相对比较小的场合。
优点:
( b. Z6 \/ U* t5 A4 ?# w触发器中使用 UDFs 直接更新 Memcached 的内容,减轻了应用程序设计和编写的复杂性。
缺点:
8 E  }/ B! E) M* y1. 如果出现mysql服务重启,需要重新设置连接memcached关系(SELECT memc_servers_set('192.168.3.184:11900'))
. m4 m9 ]/ ]' A! \2. 有可能存在bug问题,导致mysql的crash(测试时没遇到:)).

- C7 I6 d! {0 w- C$ J1 _. l真正的线上环境比这个复杂很多。我想到的需要考虑的问题:
; y: W. e1 l5 h* ?8 ]1. 网络因素,mysql和memcached是否放在同一IDC,他们之间的网络性能是否很好。网络性能越好,速度肯定越快,如果使用本机的memcached能适当的减少网络开销。
3 R- o) Z7 I: k8 e2. 插入的数据量,向mysql插入每条记录的size,以及向memcached里面更新的数据size大小。更新mysql,memcached的数据size越大,更新的速度越慢。
$ l7 H! E* Q" f& a所以前期规划好,在memcached里面存那两列(key-value)是关键。
, L0 H5 q' Z% u- [, ?: @3. 延时问题需要考虑,mysql所在机器如果资源使用比较狠,会导致更新memcached慢(出现类似m/s的延时问题)。
: D4 C' \9 \5 O* A: |" g8 R4. 考虑容灾问题,如果两者中有down出现时,需要考虑怎么恢复,当前的测试是这样考虑的:建一张错误表,如果在出现更新mc出现问题时,自动把更新错误的记录插到
: p, _' R: G& Y0 l一张表里面,通过查这张表,可以知道哪些数据在什么时间更新错误,如果应用于生产环境,需要考虑监控和出现问题时恢复工作(写好脚本完善这个工作)。0 ^; B- W' M2 m2 D2 ~+ V
5. mysql自身因素,例如执行的mysql语句效率,以及连接mysql的client程序(php)的连接开销等等。

1 C0 {* B$ h9 w) ^
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 21:31 , Processed in 0.061398 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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