分布式学习笔记

简单理解:

数据分布式存储

请求分布式调度

多节点分布式部署

双重备份,热切换

系统的核心:

分布式算子:(例如:sun公司的hash)

对于任意输入,输出均匀分布

输出结果数可控

通信:(cindysocket)

高并发量

多线程

一接口服务器(interfaceServer)

对外提供访问接口并接受请求,一般内置一个http服务器进程

监控各dispatcherserver的工作状态

转发请求到其中一个最优dispatcher中,先查看各dispatcherserver的工作状态(可用简单轮询和随机算法)

二消息分发服务器(dispatcherserver):

接收来自请求服务器的接口

解析请求,提取特征参数(类似于账号的东西,一个帐号会被发布到同一个结点上)

然后对参数执行hash函数,计算出appsrrver,然后再转发appserver

应用服务器(appserver)

执行业务逻辑,等同于集中式系统中草有应用服务器

被划分为多个逻辑组,同一个组中的服务器负载均衡

考虑到数据库双重务份,热切换和负载均衡,才用了多数据库单读多写策略,

对于读,选择一个最优数据库来提供数据,对于写,必须保证操作的事务性

数据库服务器(DBserver)

结点之间的通信

数据以网络格式异步并发传输

分布式算法

辅助函数和变量

PublicString[]getTargetServerIps();//取得目标服务器IP

Publicint[]getTargerServerIds();//取得目标服务器ID

PublicbooleanisServerWorking(index);//检查目标服务器的状态

IntcurrentTargetServerIndex;//当前目标服务器在targetServerIds的index

接口服务器中的轮询算法:

//取得该次请求所要分发的服务器

PublicStringgetTargetServerIp(){

String[]targetServerIps=getTargetServlerIps();

Int[]targetIds=getTargerServerIds();

Intindex=currentTargetServerIndex;

While(!isWorking){

Index=targetServerIds.length()%(currentTargetServerIndex+1);

isWorking=isServerWorking(index);

//无任何服务器可用

If(!isWorkig&&index==currentTargetServerIndex){

Return"0:0";

}

}

currentTargetServerIndex=index;

ReturntargetServerIps[index];

}消息分发服务器分发请求采用hash算法

Publicinthash(byte[]bs){

Inthash=0;

For(inti=0;i<bs.length;i++){

Hash=31*hash+bs[i];

}

Returnhash;

}

//返回根据hash计算出的目标服务器群组

PublicintgetTargerServerGroupIndexByHash(StringhashParam)throwsBtirException{

Byte[]hashinfo=hashParam.getBytes("utf-8");

//由hash值的后两位进行分段的数目,即hash结果数,目标服务器群组的数量

IntframeCount=2;

Intstep=100/frameCount;

Inthash=Math.abs(hash(hashParam)%100);

For(inti=0,beg=0,end=step;i<frameCount;i++){

If(beg<=hash&&hash<end){

Return2*1;

}

Beg=end;

End+=step;

}

Return2*(frameCount-1);

}

//根据轮询算法,计算服务器群组中的最优服务器

PublicStringgetTargetServerIpInGriuo(intgroup){

//组内的轮询算法

Int[]targetServerIds=getTargetServerIds();

Intindex=getTargetServerIndexInGroup(groupIndex);

ReturntargetServerIps[index];

}

Celient构造发送请求

Server接收请求并处理

Client和server之间的通信:

通信协议和技术有很多,如webserviceEJBjms基于javaNIO的socket

采用socket的两个基本标准是:

1服务器上的线程数可控,不要与请求数线性增长

2将处理请求和接收请求分开,否则会降低吞吐率和并发量

相关推荐