开发者社区> 问答> 正文

云数据库Memcache版日常诊断

问题描述:
云数据库Memcache版日常诊断


解决过程:
一、连接问题
1、让用户在ecs上telnet 云Memcache的端口,排查是否是网络或者白名单问题
2、使用杜康查看详细信息
     http://ocs.alibaba-inc.com
3、通过telnet登录用户的云Memcache,通过命令做简单操作,进一步排查.
因为云Memcache只支持memcached的数据api , 统计类的api不支持,例如使用memcached源码包工具memcached-tool,连接是不行的

具体排查过程
a)  telnet 01ab161d1e06449d.m.cnhzaliqshpub001.ocs.aliyuncs.com 11211
    输入鉴权信息

这就表示鉴权成功,用户的密码是争取的
b) 进一步get,set或者是cas看是否可以操作内容。这里顺带学习一下ITM memcache的CAS命令(稍微复杂点)

CAS命令介绍:
CAS 协议解决这种并发修改问题。有线程试图修改当前 key-value 对的 value 时,先由 gets 方法得到 item 的版本号,操作完成提交 数据时,使用 cas 方法谨慎变更,如果在本地对 item 操作过程中这个 key-value 对在Memcached server 端被其它线程更改过,就放弃此次修改 (乐观锁)
<cas> <key> <flags> <exptime> <bytes> <cas unique>"r"n
<data block>"r"n
说明
<command name> 是 set、add或者replace。<key>是客户端要求服务器存储数据的关键字。
<flags>是一个16位的无符号整数,服务器将它和数据一起存储并且当该数据被检索时一起返回。客户端可能使用该数值作为一个位图来存储特殊数据信息;这个字段对服务器不是透明的。
<exptime>是超时时间。如果值为0表示该数据项永远不超时(但有时候该数据项可能被删除以为其他数据腾出空间);如果值不为0,可能是绝对的UNIX时间,也可能是自现在开始的偏移值,它保证客户段在这个超时时间到达后,客户端将取不到该数据项。
<bytes>是随后数据的字节数,不包括终结符”"r"n”。<bytes>有可能是0,它后面将是一个空的数据块。
<data block>是真正要存储数据流。
<cas unique>是对应该版本item的唯一标识符,需通过gets接口获取后再传入cas命令。
输出信息说明:
    - STORED:保存成功后输出。
    - ERROR:保存出错或语法错误。
    - EXISTS:在最后一次取值后另外一个用户也在更新该数据。
    - NOT_FOUND:Memcached 服务上不存在该键值。
在telnet里面执行如图:

从上面的图可以看到,云Memcache是正常的。
二、程序问题
各种语言排查不尽相同,PHP程序问题的排查举例
1)先用用户执行测试程序,看是否成功。拷贝如下语句
<?php
$connect = new Memcached;  //声明一个新的memcached链接
$connect->setOption(Memcached::OPT_COMPRESSION, false); //关闭压缩功能
$connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true); //使用binary二进制协议
$connect->addServer('01ab161d1e06449d.m.cnhzaliqshpub001.ocs.aliyuncs.com', 11211); //添加OCS实例地址及端口号
$connect->setSaslAuthData('01ab161d1e06449d', 'Aliyun2015'); //设置OCS帐号密码进行鉴权,如已开启免密码功能,则无需此步骤
$connect->set("hello", "world");
echo 'hello: ',$connect->get("hello");
$connect->quit();
?>
输出hello world则说明云数据库Memcache连接没有问题
如果不行,需要检查
a) php.ini文件要加载memcached,并且开启sasl,添加
extension=memcached.so
memcached.use_sasl = 1
b) PHP程序需要确保ibmemcached和memcached都要支持sasl,且版本 libmemcached 至少 1.0.16 php memcached的版本 是2.2.0 以上,
可以运行phpinfo()或者如下命令查看
php -m 查看加载的模块
php -i |grep memcached看看加载的memcached.so
ldd php使用的memcached.so可以看到应该依赖哪个sasl库
注意: PHP操作memcached服务有两个扩展 memcache 和 memcached。安装PHP默认是老的memcache ,不支持cas,所以要装memcached扩展,memcached扩展是基于libmemcached


展开
收起
阿里云柳璃 2015-12-16 18:46:18 10093 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
云数据库十大经典案例 立即下载
云数据库超大流量峰值保障最佳实践 立即下载
ApsaraDB云数据库助力优架产品升级和架构变革 立即下载