您当前的位置是:  首页 > 新闻 > 国内 >
 首页 > 新闻 > 国内 >

Kamailio/OpenSIPS学习笔记-使用Memcache提升注册性能

2018-03-30 09:44:12   作者:james.zhu   来源:Asterisk开源派   评论:0  点击:


  Memcache 是开源软交换模块是用来支持SIP注册和请求时使用的功能之一。大家知道,通常情况下,一般用户的系统会使用数据库来进行注册和请求的发送。如果通过数据库查询的话,会产生大量的查询数据,频率过搞的话,可能会引起数据库负载的问题。对比频繁的数据库查询,某些环境中,内存查询方式是一个效率比较高的方式。今天的讲座中,我们使用两种方式来演示如何使用数据库查询和内存查询方式来支持软电话的注册流程。
  1、在配置此示例前,用户实现保证数据库安装配置成功,加载了必须的Memcache 模块。Memcache 目前可以支持三中操作方式,包括
  store - cache_store()  // 保存数据
  fetch - cache_fetch() // 获取数据
  remove - cache_remove()  // 删除数据
  在此讲座中,我们仅使用了前面2种方式。
  2、在进行测试之前,我们需要修改cfg 配置文件,几个需要注意的地方是:
  ## 加载缓存模块
  loadmodule "cachedb_local.so"
  ##调用功能
  modparam("auth","username_spec","$avp(userspec)")
  modparam("auth","password_spec","$avp(passwd)")
  modparam("auth","calculate_ha1",1)
  modparam("auth_db", "load_credentials", "$avp(passwd)=password")
  ##保存缓存数据,注册密码
  # 判断是否有已保存在缓存中的密码 ?
  if(cache_fetch("local","passwd_$tu",$avp(passwd))) {
  $avp(userspec) = $tU;
  xlog("SCRIPT: stored password is $avp(passwd)\n"); // 打印日志
  # $avp(userspec) 包含用户名
  # $avp(passwd) 包含用户密码
  if (!pv_www_authorize("")) {
  # authentication failed -> do challenge
  www_challenge("", "0");
  exit;
  };
  } else {
  # 通过数据库查询认证查询
  # 此数据库获取密码
  if (!www_authorize("", "subscriber")) {
  # authentication failed -> do challenge
  www_challenge("", "0");
  exit;
  };
  # 数据库查询后,保存密码
  xlog("SCRIPT: storing password <$avp(passwd)>\n");
  # 设置密码生命周期为20 分钟;
  cache_store("local","passwd_$tu","$avp(passwd)",1200);
  }
  3、配置成功以后,用户可以通过软电话来进行测试注册流程。测试方法如下:
  首先注册软电话,打印mysql 日志,观察是否是通过数据库进行查询?使用命令:tail /var/log/mysql/mysql.log 和 ngrep –p –q –W byline port 5060
  注册以后,互相呼叫,然后退出注册。
  然后再重新注册,考察,SIP账号是否是通过内存查询来获得密码?
  如果测试成功的话,可以看到第一次注册使用的是数据库查询方式,第二次是使用的内存查询方式。注意,这里没有对密码错误的操作。
  4、在文章开始时,我们就简单说明了数据库查询和内存查询的一些区别。内存查询方式比数据库查询相对比较快,如果注册用户在1000人以上,或者更多的用户,我们就可以看到实际的测试效果。根据官方说明,通过数据库查询结合内存查询可以大幅降低查询次数(可以降低大约83%),从而增加了系统的稳定性,降低了系统的负载。
  不使用 Memory Caching
  1000 users, per day : 1000 * 3 * 24 = 72000 queries per day for auth
  使用Memory Caching
  1000 * 0.5 * 24 = 12000 queries per day for auth
  需要读者注意的是对密码错误的管理,如果用户输入错误的密码,数据库需要重新更新,可能需要同时删除内存中密码数据,保证用户可以及时成功登录系统。
  5、在本章节中,我们简单介绍了如何通过数据库结合内存查询方式来实现注册请求的流程。通过以上cfg配置,在大型系统的应用中,读者可以进一步优化数据库查询的负载,降低查询次数,从而来实现系统的稳定性。
  参考资料:
  http://www.opensips.org/Documentation/Tutorials-MemoryCaching
  关注微信公众号:asterisk-cn,获得有价值的行业分享
  freepbx 技术论坛:www.ippbx.org.cn
  Asterisk, freepbx技术文档: www.freepbx.org.cn
  融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题