分布式学习笔记
简单理解:
数据分布式存储
请求分布式调度
多节点分布式部署
双重备份,热切换
系统的核心:
分布式算子:(例如: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将处理请求和接收请求分开,否则会降低吞吐率和并发量