架构师训练营第一期 - 第周五课后 - 作业一
发布于: 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 加入
还未添加个人简介











评论