架构师训练营第一期 - 第周五课后 - 作业一
发布于: 2020 年 10 月 23 日
作业一(2 选 1):
用你熟悉的编程语言实现一致性 hash 算法。
编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。
用你熟悉的编程语言实现一致性 hash 算法。
CServer,服务器类,1.保存服务器基本信息 2 生产虚拟节点
Utils 工具类 1.获取数据最近节点,2.节点按照 hash 排序
<?php
namespace lib;
class CServer
{
public $ip;
public $alias;
public $nodes;
public function __construct($alias,$ip){
$this->alias = $alias;
$this->ip = $ip;
}
/**
* @param $nodeSize integer
* @return array
* */
public function makeNode($nodeSize){
$this->nodes = [];
for($i=1;$i<=$nodeSize;$i++){
$this->nodes[]=[
"server"=>$this->alias,
"value"=>hash("sha256",$this->ip."#".$i),
];
}
return $this->nodes;
}
}
复制代码
<?php
namespace lib;
class Utils
{
public static $nodes;
public $currentNode;
/*
* @param $data string
* @return array
*
* */
public static function getRecentNode($data){
$nodeLength = count(Utils::$nodes);
$data = hash("sha256",$data);
$currentNode = null;
foreach(Utils::$nodes as $key=>$node){
if($data>=$node["value"]){
$lastIndex=($key-1+$nodeLength)%$nodeLength;
$currentNode=abs($data-$node["value"])<abs($data-Utils::$nodes[$lastIndex]["value"])?$node:Utils::$nodes[$lastIndex];
break;
}
}
if(Utils::$nodes==null){
$lastIndex =$nodeLength -1;
$currentNode=abs($data-Utils::$nodes[0]["value"])<abs($data-Utils::$nodes[$lastIndex]["value"])?Utils::$nodes[0]:Utils::$nodes[$lastIndex];
}
return $currentNode;
}
public static function sortNodes(){
usort(Utils::$nodes, function($a, $b) {
$al = $a["value"];
$bl = $b["value"];
if ($al == $bl)
return 0;
return ($al > $bl) ? 1 : -1;
});
}
}
复制代码
入口文件
<?php
require ("lib/CServer.php");
require ("lib/Utils.php");
use lib\Utils;
use lib\CServer;
Utils::$nodes = [];
//生产服务器
$servers = [];
for($i=0;$i<10;$i++){
$servers[] = new CServer("server".$i,"192.168.1.10".$i);
}
//生产服务器虚拟节点
foreach($servers as $server){
Utils::$nodes = array_merge(Utils::$nodes,$server->makeNode(10));
}
//虚拟节点,升序排序
Utils::sortNodes();
//获取数据所在的虚拟节点和服务器节点
$data = 1;
$node = Utils::getRecentNode($data);
var_dump($node);
复制代码
执行后结果如下截图
获取的服务器为 server9
划线
评论
复制
发布于: 2020 年 10 月 23 日阅读数: 36
崔
关注
还未添加个人签名 2020.08.28 加入
还未添加个人简介
评论