OpenSIPS-Dispatcher模块详解:优化SIP流量分发的利器

在 OpenSIPS 中,dispatcher 模块用于实现负载均衡和故障转移。通过 dispatcher 模块,你可以将 SIP 请求分发到一组后端服务器(如媒体服务器、代理服务器等),并根据配置的算法和策略动态调整分发逻辑。

  • 模块功能
  • 使用样例
    • 1. 加载模块
    • 2. 配置模块参数
    • 3. 调用方法
    • 4. 样例脚本
    • 5. 测试和验证

在这里插入图片描述

模块功能

主要功能包括:

  • 负载均衡:将 SIP 请求分发到多个后端服务器,分担负载。
  • 故障转移:自动检测后端服务器的可用性,并将请求路由到健康的服务器。
  • 动态更新:支持通过数据库或 MI(Management Interface)动态更新后端服务器列表。
  • 多种算法:支持多种负载均衡算法,如轮询、随机、权重等。

使用样例

对于opensips,使用起来非常简单,引入模块,调用方法,无需额外处理。

1. 加载模块

不需要额外编译,就可以引入

loadmodule "dispatcher.so"

2. 配置模块参数

# 数据库连接 URL
modparam("dispatcher", "db_url", "mysql://opensips:opensips@localhost/opensips")# 健康检查间隔(单位:秒),默认0,关闭检查
modparam("dispatcher", "ds_ping_interval", 10)# 健康检查方法(如 OPTIONS 是默认方法,你也可以选择INFO)
modparam("dispatcher", "ds_ping_method", "OPTIONS")# 健康检查失败阈值,默认3
modparam("dispatcher", "ds_ping_threshold", 3)

注意较新的版本已经移除了对于从文件读取配置的支持,因此DB的方式是必选的
已删除对文本文件(用于 Provisioning Destinations)的支持。现在只有数据库支持(通过数据库表进行预置)可用 - 如果您仍想使用文本文件进行预置,请使用 db_text DB 驱动程序(通过文本文件模拟的数据库)

3. 调用方法

使用的方法很简单 ds_select_dst(set, alg, [flags], [partition], [max_res]),主要看选择的算法参数

算法 ID算法名称描述
“0”hash over callid根据callid hash值进行分配
“1”hash over from uri根据请求 from uri hash值进行分配
“2”hash over to uri根据请求 to uri hash值进行分配
“3”hash over request-uri根据请求 ruri hash值进行分配
“4”weighted round-robin加权轮询 (下一个目标)
“5”hash over authorization-username授权用户名的哈希值(Proxy-Authorization 或 “normal” 授权)。如果未找到用户名,则使用加权轮询。
“6”random (using rand())随机 (使用 rand())
“7”hash over the content of PVs string对 PV 字符串的内容进行哈希处理。注: 仅当设置了参数 hash_pvar 时,此选项才有效
“8”the first entry in set is chosen选择 set 中的第一个条目
“9”The pvar_algo_pattern parameter is used to determine the load on each serverpvar_algo_pattern 参数用于确定每台服务器上的负载。如果未指定参数,则选择集中的第一个条目
“10”The algo_route OpenSIPS route is called for each dispatcher entry in the setid, in order to decide the routing order为 setid 中的每个调度程序条目调用 algo_route OpenSIPS 路由,以确定路由顺序。有关使用示例,请参阅 algo_route 参数
“X”if the algorithm is not implemented, the first entry in set is chosen如果未实现算法,则选择 set 中的第一个条目。
if (!ds_select_dst(1, 0)) {xlog("ERROR: no active destinations found!\n");send_reply(503, "Service Unavailable");exit;
}
...
ds_select_dst(1, 0, , "fs_boxes", 5);
...
ds_select_dst(1, 0, "fUD", "ask_boxes");
...
ds_select_dst(2, 0, "fud", "pstn_gws", 5);
ds_select_dst(3, 1, "fua", "pstn_gws", 2);
...
# using variables
$var(part) = "pstn_gws"
$var(setid) = 1;
$var(alg) = 4;
$var(flags) = "fdu";
$var(max_res) = 2;
ds_select_dst($var(setid), $var(alg), $var(flags), $var(part), $var(max_res));
...

4. 样例脚本

debug_mode=yes
socket= udp:127.0.0.1:5060udp_workers = 2
check_via = off     # (cmd. line: -v)
dns = off           # (cmd. line: -r)
rev_dns = off       # (cmd. line: -R)# for more info: opensips -h# ------------------ module loading ----------------------------------
mpath="/usr/local//lib64/opensips/modules/"loadmodule "maxfwd.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "rr.so"
loadmodule "sipmsgops.so"
loadmodule "db_mysql.so"
loadmodule "dispatcher.so"loadmodule "proto_udp.so"# ----------------- setting module-specific parameters ---------------
modparam("dispatcher", "db_url", "mysql://root:pass@127.0.0.1:3306/opensips")route {if (!mf_process_maxfwd_header(10)) {send_reply(483, "Too Many Hops");exit;}# 记录路由if (!has_totag()) {record_route();}if(is_method("INVITE")) {  if (!ds_select_dst(1, 4)) {send_reply(503, "Service Unavailable");exit;}}t_relay();
}route[MANAGE_FAILURE] {# 处理失败情况if (t_check_status("5[0-9][0-9]|408")) {ds_mark_dst("b");  # 标记失败的后端服务器t_relay();}
}

5. 测试和验证

在数据库写入分发配置数据,你可以采用页面配置的方法,API请求的方法,或者直接SQL插入的方法

INSERT INTO dispatcher (setid, destination, description)
VALUES
(1, 'sip:192.168.1.10:5060', 'Server 1'),
(1, 'sip:192.168.1.11:5060', 'Server 2'),
(1, 'sip:192.168.1.12:5060', 'Server 3');

启动 OpenSIPS:

/usr/sbin/opensips -f /etc/opensips/opensips.cfg

使用 SIP 客户端(如 Zoiper 或 Linphone)向 OpenSIPS 发送请求,观察请求是否被分发到不同的后端服务器。

使用 opensipsctl 工具查看 dispatcher 状态:

opensipsctl dispatcher list

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14482.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

09vue3实战-----引入element-plus组件库中的图标

09vue3实战-----引入element-plus组件库中的图标 1.安装2.引入3.优化 element-plus中的icon图标组件的使用和其他平台组件(如el-button按钮)是不一样的。 1.安装 npm install element-plus/icons-vue2.引入 在这我们只讲述最方便的一种引入方法------完整引入。这需要从elem…

Docker 部署 GitLab

一、下载镜像 docker pull gitlab/gitlab-ce 二、运行容器 docker run -d --name gitlab-20080 \n -p 20443:443 -p 20080:80 -p 20022:22 \n -v /wwwroot/opt/docker/gitlab-20080/etc:/etc/gitlab \n -v /wwwroot/opt/docker/gitlab-20080/log:/var/log/gitlab \n -v /www…

优惠券平台(十七):实现用户查询/取消优惠券预约提醒功能

业务背景 当用户预约了一个或多个优惠券抢购提醒后,如果不再需要提醒,可以取消预约通知。不过,虽然用户可以取消提醒,但已经发送到 MQ 的消息不会被撤回,消费者在时间点到达时依然会收到消息。此时,我们不…

【个人开发】macbook m1 Lora微调qwen大模型

本项目参考网上各类教程整理而成,为个人学习记录。 项目github源码地址:Lora微调大模型 项目中微调模型为:qwen/Qwen1.5-4B-Chat。 去年新发布的Qwen/Qwen2.5-3B-Instruct同样也适用。 微调步骤 step0: 环境准备 conda create --name fin…

深入理解进程优先级

目录 引言 一、进程优先级基础 1.1 什么是进程优先级? 1.2 优先级与系统性能 二、查看进程信息 2.1 使用ps -l命令 2.2 PRI与NI的数学关系 三、深入理解Nice值 3.1 Nice值的特点 3.2 调整优先级实践 四、进程特性全景图 五、优化实践建议 结语 引言 在操…

大数据学习之SparkSql

95.SPARKSQL_简介 网址: https://spark.apache.org/sql/ Spark SQL 是 Spark 的一个模块,用于处理 结构化的数据 。 SparkSQL 特点 1 易整合 无缝的整合了 SQL 查询和 Spark 编程,随时用 SQL 或 DataFrame API 处理结构化数据。并且支…

k8s的操作指令和yaml文件

一、项目的生命周期 创建----》发布----》更新----》回滚----》删除 1.创建 kubectl create deployment nginx1 --imagenginx:1.22 --replicas3 #基于deployment控制器创建pod,控制器的名称是nginx1,pod使用的镜像是nginx:1.22,pod的数量有3个 2.发布 ku…

解锁 DeepSeek 模型高效部署密码:蓝耘平台全解析

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…

k8s部署rabbitmq

1. 创建provisioner制备器(如果已存在,则不需要) 1.1 编写nfs-provisioner-rbac.yaml配置文件 apiVersion: v1 kind: ServiceAccount metadata:name: nfs-client-provisionernamespace: wms --- kind: ClusterRole apiVersion: rbac.author…

评估大模型(LLM)摘要生成能力:方法、挑战与策略

大语言模型(LLMs)有着强大的摘要生成能力,为信息快速提取和处理提供了便利。从新闻文章的快速概览到学术文献的要点提炼,LLMs 生成的摘要广泛应用于各个场景。然而,准确评估这些摘要的质量却颇具挑战。如何确定一个摘要…

dmd-50

dmd-50 一、查壳 无壳,64位 二、IDA分析 main 下面的内容中数据经过R键转换,你就会知道v41的内容,以及是当v41成立时key是有效的。 v41870438d5b6e29db0898bc4f0225935c0 结合上面的函数知道:v41经过MD5解密后是key 注意是…

关于图像锐化的一份介绍

在这篇文章中,我将介绍有关图像锐化有关的知识,具体包括锐化的简单介绍、一阶锐化与二阶锐化等方面内容。 一、锐化 1.1 概念 锐化(sharpening)就是指将图象中灰度差增大的方法,一次来增强物体的轮廓与边缘。因为发…

全程Kali linux---CTFshow misc入门(38-50)

第三十八题: ctfshow{48b722b570c603ef58cc0b83bbf7680d} 第三十九题: 37换成1,36换成0,就得到长度为287的二进制字符串,因为不能被8整除所以,考虑每7位转换一个字符,得到flag。 ctfshow{5281…

vue3学习四

七 标签ref属性 设置标签ref属性&#xff0c;类似于设置标签id。 普通标签 <template name"test4"> <p ref"title" id"title" click"showinfo">VIEW4</p> <View3/><script lang"ts" setup>…

STM32 软件SPI读写W25Q64

接线图 功能函数 //写SS函数 void My_W_SS(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_4, (BitAction)BitValue); }//写SCK函数 void My_W_SCK(uint8_t BitValue) {GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue); }//写MOSI函数 void My_W_MOSI(uint8_t Bit…

pytest-xdist 进行多进程并发测试

在自动化测试中&#xff0c;运行时间过长往往是令人头疼的问题。你是否遇到过执行 Pytest 测试用例时&#xff0c;整个测试流程缓慢得让人抓狂&#xff1f;别担心&#xff0c;pytest-xdist 正是解决这一问题的利器&#xff01;它支持多进程并发执行&#xff0c;能够显著加快测试…

CLion2024.3.2版中引入vector头文件报错

报错如下&#xff1a; 在MacBook端的CLion中引入#include <vector>报 vector file not found&#xff08;引入map、set等也看参考此方案&#xff09;&#xff0c;首先可以在Settings -> Build,Execution,Deployment -> Toolchains中修改C compiler和C compiler的路…

【RocketMQ 存储】- 同步刷盘和异步刷盘

文章目录 1. 前言2. 概述3. submitFlushRequest 提交刷盘请求4. FlushDiskWatcher 同步刷盘监视器5. 同步刷盘但是不需要等待刷盘结果6. 小结 本文章基于 RocketMQ 4.9.3 1. 前言 RocketMQ 存储部分系列文章&#xff1a; 【RocketMQ 存储】- RocketMQ存储类 MappedFile【Rock…

了解传输层TCP协议

目录 一、TCP协议段格式 二、TCP原理 1.确认应答 2.超时重传 3.连接管理 建立连接 断开连接 4.滑动窗口 5.流量控制 6.拥塞控制 7.延时应答 8.捎带应答 9.面向字节流 10.TCP异常情况 TCP&#xff0c;即Transmission Control Protocol&#xff0c;传输控制协议。人如…

第 26 场 蓝桥入门赛

3.电子舞龙【算法赛】 - 蓝桥云课 问题描述 话说这年头&#xff0c;连舞龙都得电子化&#xff01;这不&#xff0c;蓝桥村的老程序员王大爷突发奇想&#xff0c;用LED灯带和一堆传感器鼓捣出了一条“电子舞龙”&#xff0c;它能根据程序指令在村里的广场上“翩翩起舞”。 广…