云视频会议系统私有化实践

news2024/11/23 23:52:36

caf1a629aa655abaebfc929011f826c3.gif 点击上方“LiveVideoStack”关注我们

fc965065ab219104fa8d18b618a1137f.png

▲扫描图中二维码或点击阅读原文

了解音视频技术大会更多信息

编者按:云视频会议系统支持多服务器动态集群部署,并提供多台高性能服务器,大大提升了会议稳定性、安全性、可用性。视频会议为用户大幅提高沟通效率,提升内部管理水平,已广泛应用在政府、交通、运营商、教育、企业等各个领域。本次LiveVideoStack特别邀请到了来自Cybrook的吴荣华老师,为我们从私有化、混合云、运维与部署等方面,分享他和团队在云视频会议系统私有化的实践经验。

文/吴荣华

整理/LiveVideoStack

4a11afd50be4d89c7e0e3c7f252272c1.jpeg

先简单介绍下我自己。我叫吴荣华,是踪视通的联合创始人与工程副总。我最早是在GIPS公司任职,GIPS全称是Global IP Solutions,它是一个瑞典的公司。行业外的大家可能不是特别熟悉,但做RTC的可能都有了解,公司的主要产品是实时音视频 SDK。叫做Voice Engine和Video Engine,可以说当时几乎所有大厂都在用我们的SDK,包括QQ、gtalk、hangouts,yahoo messager等等。后来Google想要做WebRTC,所谓WebRTC就是把RTC的技术做到web里,换句话说就是做到浏览器里,这样的话web app只要调用简单的Javascript API就可以做RTC了,所以Google就买了GIPS公司,我也就加入到了Google团队里。WebRTC基本上就是在我们原来的Voice Engine和Video Engine基础上做出来的。如果熟悉WebRTC代码的朋友可能还知道现在还有个文件叫做Video Engine就是原来我们的名字。再后来我从Google离职,联合创立了现在的公司叫Cybrook,目前我们主要在旧金山的硅谷和苏州有研发团队,国内的公司就叫踪视通,我们主要专注于实时音视频的应用和技术,我们的主打的产品是叫TeamLink的一个云视频会议系统,目前在全球 200 多个国家有近千万的用户。

我今天分享的题目是云视频会议系统的私有化实践。

ded7258fbf389b2205162fb91913ed1b.jpeg

我们公司的主打产品是云视频会议系统,当我们在拓展国内市场的时候,我们发现国内的用户对于私有化的需求是很大的,所以我今天主要想给大家分享一下我们在从云视频会议系统到给客户做私有化部署过程中的一些经验和心得,希望对大家有所帮助。我的分享会分为三部分:前面两部分会介绍几个比较典型的客户需求,然后看看我们是如何解决这些需求的,第三部分会分享一下,怎么给用户做私有化部署以及后续的运维。

01 私有化

ea3ed8dec829377013b96d10142ec599.jpeg

那我们先进入第一部分,私有化。讲私有化之前,我们首先需要知道为什么用户需要私有化部署,也即公有云服务有什么问题。上方是一个简单的示意图,大概有这么几方面的问题:首先是并发性,主要是内网出入口带宽的限制。假设说有一个公司内部有很多员工都在使用云视频会议,我们知道云视频会议相对来说是一个需要较多带宽的一个应用,如果很多人同时使用的话,我们可以想见出口的网络带宽就会变得非常的拥堵。这不但会影响云视频会议的效果,而且也会影响其他需要使用网络的同事,这是云视频会议的其中一个问题;第二个问题是对于一个语音视频会议系统,它的网络传输是通过公网的,但我们知道公网的稳定性不是特别有保障,所以这种情况下,如果客户对于视频会议网络的画质有特别高的要求的话,有可能是无法满足的;第三个问题就是安全性。因为云视频会议系统的会议数据是要传输到云端服务器去做缓存和处理的,所以对于安全性要求特别高的客户也是一个问题。当然,我们也知道云视频会议系统有很多好处,一个比较显著的优点就是它特别方便,你自己不需要任何维护,基本上只需要下载一个APP,随时随地有网络就可以开会了。

那么我们要如何去解决公有云架构的问题呢?

100dac2ff52324629d00f75f9191a418.jpeg

我们想到的第一个的方案是做全私有化的部署,基本上就是把所有需要的服务器在私网里面部署,因为客户端和服务器都在内网,我们就不需要再使用出口带宽了,所以出口带宽就不是问题。第二个,因为内网的网络环境相对来说更加地稳定和高速,所以画质也会有保障。再者,因为数据并没有出内网,实现了物理上的隔绝,所以安全性上也更高。

当然这也是有代价的,首先你需要在公司里有一套服务器并不断地维护,另外一个比较大的问题是外网的用户是无法加入到会议里的。假设有些同事可能在家上班或者出差的话,就会造成很大的不便;另外,因为它是连接的私有服务器,所以一般需要一个定制的客户端或者至少需要在客户端里配置一下才能连接到私有的服务器。

这就是全私有化部署的优缺点,这套方案的特点是比较简单,实际上也可以满足一部分客户的需求,但是实际的客户需求往往会比这个要略复杂一些。

02 混合云

ad379c78bf05a18a5ab3043208304e20.jpeg

所以我们下面进入第二部分,怎么用混合云来解决一些更复杂的需求。

比如这个客户他首先要求能够得到所有私有化部署的好处,同时他还增加了几个额外的需求:第一个,他希望外网的用户也能够很方便地加入会议,这其实是一个很合理的应用场景,例如你有同事在外面出差或者你的合作伙伴开会都需要从外网加入;另外一个要求是比较方便地加入会议,比如我们不能要求用户在外网的时候还要安装VPN才能连到会议里;然后,客户还要求不能占用太多的公司出口带宽,因为如果外网的用户可以连到内网使用服务器的话,就像上图所示,假设有5个用户正在开会,3个用户是在内网,2个用户在外网,我们可以看到,私有服务器需要给每个外网的用户发送一整套的音视频数据,当外网的用户数量增加时,出口带宽的使用就会成倍增加,可能占用太多出口带宽;第三个需求是用户希望不将公司的网络端口直接暴露到公网上,因为可能会有潜在的安全隐患。

讨论最终的方案之前,我们可以先看一看一个典型的视频会议系统都有哪些服务器组成。然后我们再看能不能根据这些服务器各自的特点进行编排,有些部署在内网,有些部署在外网,看能不能解决客户的问题。

200e1e6ef46931eefaa3ab62adaefea8.jpeg

首先我们有一个账号服务器,账号服务器一般是负责用户的登录、注册、用户的好友关系管理以及用户会议号的管理。我们知道如果想要在外网和内网都能够很方便地使用而且能够互联的话,账号服务器应该需要是同一个服务器,否则你在内网使用一个账号,到外网又要使用另外一个账号,这样的话就会很不方便。如果想要加一个好友可能也很复杂。另外这个服务器还有一个特点是它的流量其实不是很大,所以它不会对企业网的出口带宽造成太多的影响,因此我们暂时认为账号服务器应该放在公有云上。

第二种服务器叫做信令服务器,这个做RTC的同学比较清楚。它的主要作用是给通信双方交换一些信令消息,比如说它们可以用什么编解码器,在什么网络端口,用什么加密密钥。这个服务器的特点是它的流量不是特别大,第二个它一般不存储信息,只在真正开会的时候用一下,会议结束以后就不用了。所以这个服务器我们可以认为它只要内网和外网的人都可以连接到,基本上就可以了,是放在公有云上还是在私有云上关系不是特别大,所以我们认为信令服务器是都可以的。

第三个是媒体服务器,这个服务器的主要作用是处理和转发音视频的数据。早先的MCU还有现在的SFU都属于是媒体服务器。绝大部分数据是通过这个服务器进行处理的,可以说这个服务器是一个主要矛盾。如果我们要解决内网的带宽问题的话,我们可能需要在私有云上部署一个媒体服务器,但是我们怎么去解决公有云可以方便连接的问题呢?那我们看一个方案。

96a1f869a9388ea56fb69e5b026972ff.jpeg

这个是我们采用的混合云的架构,这里有几个点,首先我们在公网上部署了一个公网账号服务器,那么用户在内网和外网使用都连接了同一个账号服务器,这个账号还有统一的会议号和好友关系。第二个点就是信令服务器可以在内网,也可以在外网。那我们将其部署在外网,因为如果部署在内网的话,内网的网络防火墙可能就要打开一个额外端口,能够让外网的用户访问,如果把信令服务器也放在云端就没这个问题了。第三个,我们部署了两套媒体服务器,一个媒体服务器在内网,另一个在外网。那么内网和外网的用户分别就近的加入各自的媒体服务器,这样做的好处是内网的防火墙上就只需要开一个口给媒体服务器,不需要将整个端口暴露给整个公网。第二个好处是,因为服务器和服务器之间进行级联,那么音视频的数据的传输就对带宽的使用得到最优化,我们可以看下面的具体分析。

cd7504f7c4f4e66041025e0ffc320561.jpeg

这是带宽的对比图,左边方案里所有的客户端都连到统一的媒体服务器,右边的客户端通过两个媒体服务器进行级联,也就是我们刚刚说的混合云的架构,我们可以看到同样是5人的会议,3人在内网,2人在外网,左边的方案需要使用的出口带宽是右边的两倍,因为它这个服务器需要将音视频数据分别发送给每一个外网客户端,右边只需要发送一份给外网的媒体服务器就可以。而且我们可以预想到,如果外网用户增加的话,左边方案的带宽使用会成倍增加,假如外网用户变成4倍的话,左边方案的带宽就会是右边的4倍。

ffe7ef33d2aea5e35cb07301ae8f32d0.jpeg

我们可以再回顾一下刚才客户的需求。我们认为该方案是比较理想的,它兼顾了私有部署的好处的同时让内、外网用户也能够很方便地使用,而且不占用太多出口带宽,也没有将公司网络端口暴露到公网上。那么有了混合云的架构加上全私有部署的架构,我们已经可以基本满足大部分用户的需求。

31ef5b222e81cddeb4294e63eae908fd.jpeg

当然可能还有一些更复杂的需求,那我们可以在现有的架构的基础上做一些变形,比如这个用户的需求是在不同的点都有办公室,比如他在北京和上海各有办公室,那么我们只需要在混合云部署的架构的基础上,在不同的办公室部署额外的媒体服务器,然后让媒体服务器之间实现级联就可以解决这个问题。

03 部署,运维

我们在前面两部分介绍了几个典型的客户需求以及解决方案,对于私有化部署来说,除了方案以外,很重要的一点是部署和后续运维,因为你不知道客户的情况是怎么样的,差别会非常大。我们进入第三部分来谈一谈我们在部署和运维方面的一些方案。

9be01fd632a717e5fd03bec96ee3f530.jpeg

我们大概知道服务的部署方式经过了这样一个演化过程,最早的时候大家把服务直接部署在硬件服务器上,后来有了虚拟化技术,大家就使用虚拟机部署服务。现在比较流行的是容器化部署,因为容器化部署有很多好处,比如一致性、可管理等。因为我们无法事先知道私有化部署的客户环境,所以服务的可一致性以及可管理就非常重要,那么我们肯定要采用容器化部署。现有服务如果没有容器化的话,首先需要把它进行容器化。

74865a7d441c88ff68cb668dfb1259db.jpeg

第二个,因为我们知道客户环境千差万别,可能有些客户是有自己的机房,有些客户可能就是买一台主机来安装服务,所以我们通常采用容器化加虚拟机的方案。我们一般先在虚拟机里把需要的服务器模块配置好,然后将虚拟机的镜像文件导出来交给客户,客户那边的部署就会比较简单了,他只要启动虚拟机的镜像,然后做一些简单的网络配置,基本上就可以把整个服务跑起来。

eceaf44b407a18787371a8690db59b82.jpeg

服务并不是只有一个服务模块,视频会议系统通常是由多个服务模块构成的,所以我们需要考虑容器的编排,其中一个方案是采用docker compose。只要我们把配置文件写好需要哪些容器,它们之间的依赖关系如何,设置好后只要一个命令,就可以把所有服务都启动起来。我们一般是在虚拟机里把容器都安装好,配置好导出成一个类似OVA的镜像文件,这样一来,客户部署是十分方便的。

db614a77ce14580f460769479c45bc02.jpeg

docker compose比较适合做单机部署,因为它特别简单易用,如果在单机部署时只有一台机器,上面跑多个container,用docker compose配置好就可以。但它的缺点是不太适合多机部署,如果你有多台服务器,用docker compose的话后续管理会比较麻烦,比如你要升级服务就要登录到每一台虚拟机器进行操作,虚拟机之间也没有统一的方法可以查看每一个容器的运行状态,虚拟机之间的容器也没法互相发现。另外一个就是虚拟机的资源利用不充分,因为它是各自配置的,所以即使虚拟机有剩余资源也没办法进行统一的调配。

bb1578c12e4c41f3ef9afad4f5530669.jpeg

所以对于比较复杂的部署,我们通常采用k8s的方式去部署。我们通常制作两个虚拟机的镜像,一个是k8s的nodes,另外一个是docker image的repo。我们把docker镜像放在docker image repo里,然后k8s node的配置指向docker image repo,这样的话启动了以后k8s的node就从docker image repo里拉取相应的image来启动它的服务模块。这个方式比较适合略复杂一些的,特别是多机的部署。

df14a385cc8dae3c318e8db2d53b341a.jpeg

使用了k8s以后,升级一个服务,我们只需要把docker image推到repo里,然后登录任意一台的master-node就可以通过kubectl完成升级。管理服务也非常简单,因为k8s是一个集群,所以所有的服务、虚拟机、资源、情况都可以很简单地查看。而且虚拟机的资源能够更充分利用,如果某一台虚拟机有较多的资源,k8s可以自动把某些pod分配到空闲的虚拟机上。因为k8s有自带的负载均衡策略,我们可以利用它的高可用,如果 pod 出问题,那它会自动剔除,创建新的pod。当然这些也不是没有代价的,这种部署需要创建一个k8s的集群,相对比docker compose一台机器就搞定来说,k8s会更复杂一些,所以它比较适合集群化部署。

26c1fd60535ac8cf1b7d8c4f704d5ff4.jpeg

我们给客户部署完了还有后续的运维,如果我们采用k8s就可以用k8s的命令函工具或者用图形的dashboard界面做运维。

fb7726a7e56120eb4d07d89d4ed1b21c.jpeg

当然,为了能够更加定制化,也可以做自己的定制运维平台。因为我们知道k8s提供一整套的HTTP接口,在这个接口的基础上实现定制平台是比较容易的,但如果你采用的是docker compose的方法的话,那可能就需要做一些额外工作,因为它不是特别适合多机的部署。

以上就是我的全部分享内容。主要介绍了一些我们遇到的常见的私有化部署的需求以及我们的方案,另外介绍了一下我们最新的部署和后续的运维,希望对大家能够有所帮助。谢谢大家!


▼识别二维码或猛戳下图订阅课程

48807f59a02a0d2e7e04ea37c19620b5.jpeg

喜欢我们的内容就点个“在看”吧!f5ad8c0add7a006417f349f51e49c5d9.gif

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(Java高级教程)第三章Java网络编程-第一节2:网络编程必备网络知识2之网络协议分层

文章目录一:生活中的协议分层(1)生活中的分层1——汉堡包(2)生活中的分层2——打电话二:网络分层(1)OSI七层模型(2)TCP/IP分层模型三:OSI参考模型…

前端基础(六)_流程控制语句(if、if-else、if-else嵌套、switch)

流程控制语句主要分为 : 顺序结构:即按顺序执行代码 ;条件选择结构 ( 分支语句 ):包括 if-else 以及 switch;循环结构:包括 for循环,while,do-while,for-in 等;其他语句: break 和continue。 一、流程控制…

Java学习(23)Java一维数组概述

什么是数组 数组是相同类型的数据按顺序组成的一种引用数据类型。 数据类型分为基本数据类型和引用数据类型,引用数据类型分为类、接口、数组。要学习的内容 一维数组的声明、创建、初始化、元素的引用、长度。数组声明 语法格式: 数据类型[] 数组名; 数…

卡尔曼滤波原理公式详细推导过程[包括引出]

卡尔曼滤波在很多项目中都有用到,但是对于原理却很少有详细分析,而只是直接应用,在看完b站up主DR_CAN视频推导后自行推导一遍和查看其他资料后进行总结,将从最初的递归算法,利用数据融合,协方差矩阵&#x…

[vp] 2021 山东省赛 CDGHM

目录前言G. Grade Point Average ( 难度有先后)M. Matrix ProblemH. Adventurers GuildD.Dyson BoxC. Cat Virus前言 打满 2个小时30分钟 基本都在做题 体验非常好 传送门 : https://codeforces.com/gym/103118 G. Grade Point Average ( 难度有先后) 题意 : 让你求sum/ns…

UG/NX二开Siemens官方实例解析 4.4 EX_Curve_ProjCurves(创建投影曲线)

前言 本系列文章主要讲解NXOpen UF API(简称ufun函数)的使用,之前看教学视频大都建议用ufun进行开发,这里西门子官方还专门给了一套系列文章来讲,说明官方也是特别推崇ufun。 本人从事二开也有一段时间了,我…

干货 | 测试人职场晋升“潜规则”:15 年经验资深测试经理的职场忠告

大家好,我是云胖虎,有近 15 年工作经验,在测试专业上擅长的方向是自动化测试,测试工具平台开发和探索测试相关的一些领域,也拿到过项目管理和敏捷教练的认证,目前是在某知名金融银行企业担任技术经理。今天…

dataworks调度问题

文章目录名词解释月调度关于空跑名词解释 业务日期 定时日期 - 1 自定义参数示例: 月调度 调度详情: 重要 使用补数据功能对月调度任务执行补数据操作时,请注意补数据选择的为业务日期 ,业务日期定时调度日期-1。 例如&#xf…

初始C++(一)

文章目录前言cout的用法cin的用法endl的用法一.命名空间1.:: (域作用限定符)2.命名空间定义3.命名空间的使用4.命名空间的一些其它使用5.全局展开6.部分展开二.缺省参数2.1全缺省2.2半缺省前言 既然这篇文章叫初始C,看我文章的应该和我一样,基本是个小白…

React-Router6路由相关二(路由传参、编程式路由导航、路由相关hooks)(八)

系列文章目录 第一章:React基础知识(React基本使用、JSX语法、React模块化与组件化)(一) 第二章:React基础知识(组件实例三大核心属性state、props、refs)(二&#xff0…

ffmpeg vs2017录制vp9格式的桌面视频

ffmpeg本身不支持vp8,vp9;若要支持,则需要自己事先编译好vpx库,然后在ffmpeg中显式支持vpx库。 windows下采用mingw编译器编译vpx;本人采取的是MSYS2,并且本人编译vpx和ffmpeg时,编译的都是静态库&#xf…

【云原生】在Ubuntu18/20上部署Kubernetes/k8s集群详细教程——亲测可用!!网上其他教程均有问题!

在Ubuntu18/20上部署Kubernetes/k8s详细教程一、设置Docker二、安装Kubernetes第 1 步:添加Kubernetes签名密钥第 2 步:添加软件存储库第 3 步:Kubernetes 安装工具三、部署 Kubernetes步骤 1:准备 Kubernetes 部署步骤 2&#xf…

怎么找回笔记本的数据?笔记本数据恢复,6个教程

“我不小心删除了笔记本电脑里面的重要数据,请问被误删的数据还可以恢复吗?如果可以恢复,我应该怎么恢复笔记本里面的数据?” 很多人在使用笔记本电脑的时候,经常误删一些数据,有时是工作文档,…

我是如何将同事的代码改成DDD风格的

DDD是领域驱动设计的简写。前段时间听群友说行业里少有DDD的代码案例,进而对DDD没有一个感性的认识。我想这是行业里普遍存在的现象吧。所以,就有了写此文的想法。文章标题说的是“同事的代码”,其实只是为了让此文更具传播,没别的…

组件的生命周期、vue2中使用axios、插槽

目录 一、组件的生命周期 1、什么是组件的生命周期 2、生命周期函数 3、生命周期的阶段划分 4、钩子函数 5、keep-alive组件 6、生命周期函数: 二、vue2中使用axios 1、axios:是一个基于Promise的网络请求库。既可以在node.js(服务器…

【MySQL】1. 了解数据库以及MySQL安装

了解数据库和SQL什么是数据库为什么使用数据库MySQL下载,安装,配置客户端连接MySQL方法一方法二SQLSQL分类SQL的基本规则命名规则最后大家好, 我是路不停_。 上学期学校学习了MySQL之后,课后也没有做很多总结,加上课时紧凑,后续考试也是考前草草备考了一下. 最近读了本MySQL必知…

C 程序设计教程(03)—— C 语言的数据类型(一):基本数据类型

C 程序设计教程(03)—— C 语言的数据类型(一):基本数据类型 一、数据类型简介 C 语言提供了丰富的数据类型,每一个常量和变量必须属于某一种数据类型。C 语言中的数据类型如下: &#xff08…

基础数学(八)——期末考试复习

文章目录考试要求考试内容简单复习插值拟合和回归数值积分直接法迭代法非线性方程求根微分方程数值解去年考题第一题,插值(12分)第二题,回归和拟合第三题,数值积分第四题,线性方程组求解第五题,…

MGRE实验配置(华为)

华为ENSP的MGRE实验: 建立好拓扑图 之后就是对各个路由器的配置: R2配置: int s3/0/0 link-protocol hdlc 更改接口为hdlc认证 ip address 12.1.1.2 24 int lo0 ip add 2.2.2.2 24 int s3/0/1 [r2-Serial3/0/1]ip address 23.1.1.2 24 [r2-Se…

【ML】 基本概念

ML 基本概念1. different types of functions2. how to find the function - training data3. unseen during training4. Back to ML Framework4.1 Step1: function with unknown4.2 Step2: define loss from training data4.3 step3: optimization4.4 其他4.4.1 Sigmoid → Re…