前言:
分布式hash系统在高性能分布式领域使用范围非常广泛。我目前正在开发维护的一个
即时通信项目就使用了它,取得了良好的效果,良好的支撑了300w用户1分钟内同时访问。
正文:
目前有1台登录服务器,3台hash服务器,1台配置服务器。当一个包含用户id的报文发到登录服务器时,登录服务器根据这个id来进行hash计算,看属于那台hash服务器的服务对象。经过计算,发现是第一台hash,于是就发送给第一台hash服务器。该服务器收到报文后,直接把该id对应的ip。port等通信信息更新。比如:1-10000个用户id,第一台hash里放1-3000,第二台hash里放3000-6000,第三台hash里放6000-10000。当第一台的1-3000个id访问需求变频繁以后,可以调整。
如何调整呢?首先再配置一台计算机充当hash服务器,安装hash服务端,然后设置“配置服务器”,让“配置服务器”通知“登录服务器”,以后凡是1-2000的都发送到“第四台hash服务器”上而不是“第一台hash服务器”上。这样,“第一台hash”服务器只能收到2000-3000的id,而不会收到1-2000的id了,达到在不用重启服务器的前提下实现了分担压力的作用。“第一台hash服务器”的1-2000的id就不会被更新了,属于冗余,可以逐渐删除掉。
hash算法没什么特殊性,这里就不再给出hash服务器关键代码段,我会在不久公布本系统全部源代码的。
这里给出DHT最为关键的分布式管理机制。
服务器:4台linux 2.6内核操作系统,gcc编译器,c语言,支持tcp/ip协议。
分别为:登录服务器,hash服务器1,hash服务器2,hash服务器3。
1。登录服务器设计:
登录服务器的网络通信程序可以采用udp或tcp协议,由于是即时通信项目,所以采用Udp协议。
用户的客户端通过udp发送报文到“登录服务器”,登录服务器立刻开启线程处理,然后把结果返回给客户端。
struct _PACKET
{
unsigned long id;
...
...
}PACKET;
int hash_num = 0x3;
struct _HASH_SELECT
{
unsigned long hashId;
unsigned long hashIp;
unsigned long hashPort;
...
}HASH_SELECT;
int main()
{
int intsocket_to_manserver = CreateManServer();
int inisocket = CreateTcpClient();
int sock = CreateServer(SOCK_DGRAM, 0);
if(sock <= 0)
printf("Create UDP Socket Server Failed!\n");
while(1)
{
recvlen = 0;
memset(&addr, 0x0, sizeof(struct sockaddr_in));
memset((char *)recvbuffer, 0x0, MAX_BUFFER);
recvlen = recvfrom(sock,
(char *)recvbuffer,
MAX_BUFFER,
0,
(struct sockaddr *)&addr,&len);
if(recvlen <= 0 || len <= 0)
continue;
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if(pthread_create(&thid, &attr, (void *)fp, recvbuffer,!= 0)
{
free(para);
para = NULL;
}
}
close(sock);
if(data != NULL)
free(data);
data = NULL;
}
void fp(char* buffer)
{
(unsigned char*) p = (unsigned char*)buffer;
unsigned long id = ((PACKET*)p->id;
int hashServerId = SelectHashServer(id);//选择hash服务器
char* res = callbackHash(hashServerId,p);//向hash服务器发送报文,收到报文,同步调用
sendto(socket,res,....);//返回客户端
}
int intsocket_to_manserver = CreateManServer();
这条语句的意思是说,登录服务器跟配置服务器建立连接(其中,登录服务器做服务器,配置服务器做客户端)。
用来接收配置服务器发来的更改配置请求。intsocket_to_manserver()是一个阻塞函数,只用启动配置服务器,收到了报文,才会退出。
int inisocket = CreateTcpClient();
这条语句的意思是说,在登录服务器上建立3个对hash服务器的tcp连接。CreateTcpClient会读取放在登录服务器中的一个内存数据结构,包括hash服务器的ip,port等信息。这个数据结构中的数据是从配置服务器中发送过来的。
int hashServerId = SelectHashServer(id);
这条语句的意思是说,根据用户的id选择一个hash服务器,把这个id和buffer发送到那个hash服务器上。选择方法是:除留余数法,将id除以hash服务器的个数,就能定位到一台服务器了。可以根据hashId在HASH_SELECT中得到ip,port等,对这台hash服务器发送就可以了。
2。配置服务器设计:
配置服务器作为客户端同登录服务器和hash服务器相连。向登录服务器发送配置更改指令。当分布式hash系统的某台服务器发生了性能瓶颈,增加服务器后,要通过配置服务器向登录服务器发送指令,更改,增加HASH_SELECT体数据。登录服务器在初始化时就会开启一个线程专门接收来自配置服务器的消息,一旦得到以后,就会更改HASH_SELECT数据结构和hash_num变量的。
3。hash服务器设计:
hash服务器一般人都会设计,不再重复。但是在分布式hash系统中有一些特别地方要注意。不要定时删除hash里的数据元素。有些系统采用定时器每隔一段时间会遍历hash,然后删除时间字段超时的元素。我认为不必要,因为性能是最主要的,本来hash服务器的内存就是存储数据的,不要为了节约内存,非要线程同步操作hash,会造成时间的延迟,得不偿失。删除hash垃圾数据(也叫超时数据)是由配置服务器发指令来操作的,可以删除一部分超时数据,也可以全部删除等。
当配置服务器通知登录服务器改变hash配置时,hash服务器就会出现垃圾数据。比如一个用户id为123456的报文,一直向hash1服务器发送报文,hash1也一直存储着这个报文。但当hash配置改变以后,用户id为123456的报文向hash2服务器发送了,这时hash1里的id为123456就成为垃数据,这个数据元素不会再被更新和读取了。对它予以删除当然会改善其他id查询和更新操作效率,但在删除过程中,也会降低那些操作的效率,我建议不要直接删除,因为在hash配置被改以后,会在hash1上同时出现很多的垃圾id,由于量太大,统一删除会造成hash1上的其他正常id的操作效率大大降低,会出现一段时间的阻塞,互联网用户就会抱怨了。
上面的算法是最为普遍的分布式hash算法。以下说明这个算法的优缺点:
优点:可以在不重启任何服务器的前提下,实现压力的分担,可以随时增加,减少服务器,不会影响用户的使用,实现容易,效果明显。
缺点:对压力的分担可控性差,不够灵活。由于是根据用户id的除法得到hash id的,可能会出现某个地区的用户集中使用系统,而这些id恰巧又集中在了某台hash服务器中,没有达到分担压力的效果。
针对上述缺点,其实还有其他的办法,也就是根据业务来划分hash的方法。
小结:
由于即时通信项目对hash的更新非常频繁,所以没有采用传统的同步数据到不同服务器,然后根据压力找到一个服务器读取的策略,传统的策略适合频繁查询读取,不适合频繁更新。所以分布式hash系统必须采用新的思维方式。另外,有的公司会采用数据库的内存hash表来完成上述任务,但是当压力增大时,数据库本身占用的资源会成为无谓的消耗,因为在类似的项目当中统计需求很少出现,即使有这样的需求,我们可以采用先用分布式hash,而后再同步到对应数据库的方式,而不要直接使用数据库。
分享到:
相关推荐
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
Nginx配置文件中FastCGI相关参数理解
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
Windows下2024Q4版本
功能说明: (a) 管理员;管理员使用本系统涉到的功能主要有主页、个人中心、用户管理、一级分类管理、二级分类管理、电子书管理、下单购买管理、我的书籍管理、留言反馈、系统管理等功能。 (b) 用户;用户进入系统可以实现首页、电子书、通知公告、留言反馈、个人中心、后台管理、在线客服等,登录注册后可以对主页、个人中心、下单购买管理、我的书籍管理、留言反馈等功能进行详细操作。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
cn-visual-studio-2010-ultimate-x86-dvd-532347.z01
城市运行管理的重要性与挑战 城市运行体系是以人为本的服务和经济发展体系,涉及决策、管理和执行三个层次。当前城市运行管理面临城市化快速发展、资源环境制约和社会矛盾突出等挑战。信息技术的发展为城市运行管理提供了重要手段,城市信息化经历了数字化、智能化到智慧化的发展过程。我国城市信息化虽取得进展,但仍处于初级阶段,存在缺乏整体规划、资源浪费和协作效率不高等问题。 智慧城市综合运行管理解决方案 智慧城市运行管理中心(SCOC)是支撑城市运行综合管理的神经中枢,旨在掌控城市运行综合体征,促进服务型政府转型。该中心通过全面整合运行资源,服务城市未来发展,提升城市运行水平和突发事件处置效率。中心纵向提升综合职能,横向贯通专业分工,包括综合管理平台、专业管理平台和业务操作平台,覆盖城市交通、公共安全、生态环境等多个领域。 智慧城市综合运行管理平台的结构与功能 智慧城市综合运行管理平台包括决策支持系统、处置系统、基础设施和监测系统。平台通过综合展现系统、综合应急指挥系统、综合运行业务联动系统等,实现城市运行的综合监测和管理。物联网数据采集系统利用网络通讯技术,实现城市物联网设备的高效运行。平台还包含云计算业务支撑系统、城市基础数据库、视频图像云平台等,以支持城市运行管理的各个方面。 智慧城市综合运行管理解决方案的优势 该解决方案具有三个核心优势:首先,它提供了完整的智慧城市视角,不仅仅是指挥中心或数据中心,而是智慧城市的实际载体。其次,它建立了完整的城市运行联动体系,打通业务部门壁垒,形成有机融合的业务联动平台,提升业务处理效率和服务水平。最后,方案凝聚了多年智慧城市建设咨询经验,为城市运行管理提供了成熟的解决方案。 项目实施建议 智慧城市运行管理中心的建设思路和项目实施建议是方案的重要组成部分,旨在指导城市如何有效实施智慧城市运行管理解决方案,以应对城市运行管理的挑战,提升城市管理的智能化和效率。通过这些建议,城市能够更好地规划和实施智慧城市项目,实现可持续发展。
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
内容概要:本文介绍了一种通过域外渗透手段进入域内网络的技术思路。主要内容涵盖了使用VPN拨入内网,利用nbt.exe、ladon.exe、nmap等工具进行网络扫描,查找域控制器,以及使用bash和PowerShell脚本进行域用户口令暴力破解的方法。同时介绍了几种常用工具如ldapsearch、PowerView和PingCastle的使用方法,以及它们在获取域内信息方面的具体应用场景。 适合人群:网络安全专业人员、红队成员、渗透测试工程师等从事信息安全相关工作的技术人员。 使用场景及目标:帮助安全专家在进行渗透测试时有效地获取域内网络的关键信息,评估域的安全性,识别潜在的安全漏洞,并提出改进建议。 其他说明:文章提供了详细的命令示例和配置指南,适用于Windows和Linux环境,同时也提到了一些需要注意的安全事项,如防止触发安全警报等。
Vue搭建AudioPlaySation(三)
yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值
python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。
功能说明: 古诗词数字化平台的功能已基本实现,主要实现主页、个人中心、用户管理、诗词信息管理、分类管理、诗人信息管理、个人分享管理、系统管理等功能的操作系统。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上 服务器:tomcat7及以上
这个文档中包含了行人数据集约四千张,在train文件中就包含了三千多张数据集。工具是使用了Labelimg进行标注。
中介与调节效应分析素材-精心整理资料.zip