Featured image of post kamailio的缓存HTable

kamailio的缓存HTable

HTable 模块

HTable 模块是一个基于内存的键值对存储模块,用于kamailio的缓存。可以定义多个HTable,也可以从数据库中加载数据。 多节点时,也可以使用DMQ方式同步数据。

官方文档地址:htable, 本次测试的kamailio版本是:

version: kamailio 5.8.5 (x86_64/linux)

重要参数介绍

htname=>size=number;autoexpire=number;dbtable=string;

  • htname: 缓存名称
  • size: 缓存大小:2^size, [2, 31]
  • autoexpire: 自动过期时间,单位秒
  • dbtable: 从数据库中加载数据,默认为空,即不加载数据
  • dbmode: 0,不回写数据库;1,当服务停止时,回写数据库,默认0
  • initval: 初始化值,如果key不存在,则返回该值,默认是$null
  • updateexpire: 是否更新过期时间,默认是1,即当值更新后,这个过期时间也重置。
  • dmqreplicate: 如果设置成1,对缓存的任何操作都会通过DMQ进行同步。默认0
  • coldelim: 缓存数据分隔符,默认是,

timer_interval

多长时间检查一次缓存过期数据,默认20秒

enable_dmq

是否开启dmq,默认是0,如果是1,则开启dmq,dmq必须提前加载

dmq_init_sync

如果是1,其他节点启动时,会发出同步请求。

timer_procs

如果设置成1或更大, 这个模块会创建自己的定时进程扫描过期数据。默认是0,使用核心的定时进程扫描过期数据。

重要函数介绍

sht_print()

打印所有的缓存数据到L_ERR日志

sht_rm(htname, itname)

从htname表中删除一个itname数据, 等价于$sht(htname=>itname) = $null

sht_rm_name_re(htable=>regexp)

删除htable表中所有名称匹配regexp的数据

sht_rm_value_re(htable=>regexp)

删除htable表中所有值匹配regexp的数据

sht_rm_name(htable,op,val)

删除htable表中所有名称和val匹配的数据

op:

  • re 作为表达式匹配val
  • sw 前缀

sht_rm_value(htable,op,val)

删除htable表中所有值匹配regexp的数据,op和上面的一样意思。

sht_setxs(htname, itname, itval, exval)

设置htaname表中itname的数据为itval,并设置itname的过期时间为exval字符串的过期时间

sht_setxi(htname, itname, itval, exval)

设置htaname表中itname的数据为itval,并设置itname的过期时间为exval整形的过期时间

sht_reset(htable)

重置htable表

sht_lock(htable=>key)

加锁htable表的key

sht_unlock(htable=>key)

解锁htable表的key

sht_iterator_start(iname, hname)

迭代器开始

sht_iterator_end(iname)

迭代器结束

sht_iterator_next(iname)

下一个迭代器

额外变量

  • $sht(htable=>key) 获取htable表中key的数据,可读和写
  • $shtex(htable=>key) 获取htable表中key的过期时间,可读和写
  • $shtcn(htable=>exp) 获取htable表中key匹配exp的个数
  • $shtcv(htable=>exp) 获取htable表中value匹配exp的个数
  • $shtinc(htable=>key) 自增1
  • $shtdec(htable=>key) 自减1
  • $shtitkey(iname) 当前迭代器的key
  • $shtitval(iname) 当前迭代器的value
  • $shtrecord(attribute) 获取过期的key或者value,用在event_route[htable:expired:table_name]中

实战

172.16.4.111的配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
loadmodule "dmq.so"
modparam("dmq", "server_address", "sip:172.16.4.111:5464")
modparam("dmq", "server_socket", "udp:172.16.4.111:5464")
modparam("dmq", "notification_address", "sip:172.16.4.113:5464")
modparam("dmq", "notification_channel", "peers")
modparam("dmq", "num_workers", 4)
modparam("dmq", "ping_interval", 30)

loadmodule "htable.so"
modparam("htable", "htable", "a=>size=4;autoexpire=7200;dmqreplicate=1;")
modparam("htable", "enable_dmq", 1)
modparam("htable", "dmq_init_sync", 1)
modparam("htable", "timer_procs", 4)

request_route {
    ...
    if(is_method("KDMQ")) {
        dmq_handle_message();
    }
    ...
}

event_route[htable:mod-init] {
    $sht(a=>x) = 1;
    $sht(a=>y) = 2;
    $sht(a=>z) = 4;
    xlog("L_INFO", "htable mod init success\n");
}

172.16.4.113的配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
loadmodule "dmq.so"
modparam("dmq", "server_address", "sip:172.16.4.113:5464")
modparam("dmq", "server_socket", "udp:172.16.4.113:5464")
modparam("dmq", "notification_address", "sip:172.16.4.111:5464")
modparam("dmq", "notification_channel", "peers")
modparam("dmq", "num_workers", 4)
modparam("dmq", "ping_interval", 30)

loadmodule "htable.so"
modparam("htable", "htable", "b=>size=4;autoexpire=7200;dmqreplicate=1;")

request_route {
    ...
    if(is_method("KDMQ")) {
        dmq_handle_message();
    }
    ...
}

如果同步的113机器上没有a的表,那么111机器上同步数据报错: dmq

修改113上的htable为:

1
2
3
4
modparam("htable", "htable", "a=>size=4;autoexpire=7200;dmqreplicate=1;")
modparam("htable", "enable_dmq", 1)
modparam("htable", "dmq_init_sync", 1)
modparam("htable", "timer_procs", 4)

同步成功: dmq

本博客已稳定运行
发表了31篇文章 · 总计55.61k字
本站总访问量 次 · 您是本站第 位访问者
粤ICP备2025368587号-1| 使用 Hugo 构建
主题 StackJimmy 设计