`
javasee
  • 浏览: 960607 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

分布式hash系统设计

阅读更多

前言:

分布式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,而后再同步到对应数据库的方式,而不要直接使用数据库。

分享到:
评论

相关推荐

    Pegasus:一个分布式KV系统的设计过程.pdf

    根据提供的文件内容,我们可以归纳出以下关于分布式KV(键值)存储系统设计的相关知识点。 ## 分布式KV系统设计的背景与需求 分布式KV系统设计过程起源于对现有系统如HBase、HDFS、ZooKeeper等的深入理解与研究。...

    基于redis的分布式缓存系统架构分析_张威.pdf

    【基于Redis的分布式缓存系统架构分析】 在现代高并发的互联网应用中,为了提高数据访问的速度和系统性能,往往采用缓存技术。基于Redis的分布式缓存系统因其高效、灵活的特点,被广泛应用于大型应用系统中。Redis...

    基于列存储的MapReduce分布式Hash连接算法.pdf

    6. 分布式计算模型的设计:在分布式环境下,如何设计高效的数据分片和聚集策略对提高数据处理效率至关重要。本研究提出了一种基于列存储的分布式计算模型,以实现分片聚集的并行连接。这种模型设计包括了对大数据...

    分布式文件系统综述.pdf

    同时,分布式文件系统还需要高效的数据定位机制,比如通过分布式哈希表(Distributed Hash Table, DHT)等方式,快速定位存储节点,提升系统响应速度和吞吐量。 随着分布式存储技术的发展,对于存储系统的架构设计...

    分布式操作系统算法Demo

    分布式操作系统的关键在于其算法设计,这些算法确保了系统的高效协调、数据一致性以及容错能力。其中,常见的分布式算法包括: 1. **分布式一致性算法**:如Paxos、Raft或Chubby,用于在分布式环境中保持数据的一致...

    分布式系统设计.rar

    分布式系统设计是一个涵盖广泛领域的主题,它涉及到计算机科学与信息技术的核心概念,旨在通过网络连接的多台计算机协同工作,提供高效、可靠且可扩展的服务。本资料“分布式系统设计.rar”深入探讨了这一主题,包括...

    分布式文件系统

    ### 分布式文件系统知识...- **HDFS**: Hadoop分布式文件系统,专为大数据处理设计。 - **NFS**: 网络文件系统,用于局域网内的文件共享。 以上是对分布式文件系统的一些基础知识和发展历程的概述,希望对您有所帮助。

    CCTC 2016 百度王耀-百度的分布式文件系统之路

    - 在分布式文件系统中,Master节点的元信息单点问题和单线程性能瓶颈是常见问题,百度通过将poll机制改为epoll和调整hash桶大小等技术手段改进了性能。 - 此外,使用fuse进行调参以提高系统的性能和稳定性也是百度...

    分布式缓存系统客户端关键技术研究.pdf

    例如,通过分布式Hash表和集群路由算法,客户端可以将请求映射到特定的数据节点进行处理,这样的设计可以保障数据的即时一致性,但同时也可能带来较大的性能开销。异步复制技术可以解决这一问题,允许客户端在复制...

    基于分布式存储系统的数据布局策略研究.pdf

    综上所述,分布式存储系统中数据布局策略的研究,要求对存储目标有明确的认识,并设计出能够满足公平性、冗余、自适应性和时空有效性要求的策略。通过对现有策略的缺陷分析,研究者提出了改进策略,以期达到更好的...

    一款Java分布式KV存储系统源码.zip

    总之,深入研究Java分布式KV存储系统的源码,不仅可以让我们掌握核心的分布式存储技术,还能提升我们在大规模系统设计和优化方面的能力,对于任何希望在云计算、大数据领域发展的开发者来说,都是一次宝贵的学习机会...

    《分布式数据库系统及应用》知识

    #### 第二章 分布式数据库系统设计 **1. 分布式数据库的设计目标** - **本地性或近地性**:减少通信次数和通信量,采用90/10准则进行分片和分布方案的选择。 - **控制数据适当冗余**:提高系统的可靠性和可用性,...

    一种基于分布式文件云存储系统的设计与实现.pdf

    【分布式文件云存储系统设计与实现】 随着云计算技术的快速发展,云存储已成为现代信息技术领域的重要组成部分,它允许用户在远程服务器上存储、管理和访问数据。本文由李慧慧提出了一种基于分布式文件的云存储系统...

    分布式join算子设计

    ### 分布式Join算子设计 #### 一、单机Join的三种实现方法 ##### 1.1 Loop Join(循环嵌套Join) - **基本算法**:Loop Join是一种基于嵌套循环的方式实现Join操作的方法。它通过遍历一个表的所有记录(外层循环)...

    分布式数据库系统中的并行分组聚合实现.pdf

    分布式数据库系统中的并行分组聚合实现涉及的主要知识点包括分布式数据库系统、数据分析、并行计算、哈希分组(Hash GroupBy)技术、分组聚合(GroupBy and Aggregation)操作、以及OceanBase数据库。以下是对这些...

    基于DHT的物联网分布式发现系统.pdf

    物联网(IoT)是一个以互联网为基础,将各种信息传感设备与网络相结合,实现对物体信息的智能识别、定位、跟踪、监控...这种分布式系统的设计理念和实现方法值得我们深入研究,并在未来的物联网应用中进行实践和推广。

    基于.NET的分布式系统用户密码加密方案设计

    ### 基于.NET的分布式系统用户密码加密方案设计 #### 一、加密技术与微软.NET加密算法类 在分布式系统中,为了确保用户数据的安全性,加密技术扮演着至关重要的角色。加密技术主要分为对称加密和非对称加密两大类...

    分布式网络爬虫系统的研究现状.pdf

    例如,基于结构化网络的全分布式网络爬虫系统、采用Hash函数和并行调度策略的爬虫系统、基于地理信息的分布式网络爬虫unicrawl等。同时,市场上也出现了许多分布式爬虫的开源框架和工具,如Grub、HTTrack、...

    饿了么分布式KV设计架构与实践_饿了么.pdf

    【分布式KV设计架构与实践——以饿了么为例】 在快速发展的互联网行业中,传统的数据库由于其扩展性和性能的局限性,已经无法满足日益增长的业务需求。为了解决这一问题,NoSQL数据库应运而生,其中包括各种键值对...

Global site tag (gtag.js) - Google Analytics