写点什么

架构师训练营第一期 - 第周五课后 - 作业一

用户头像
关注
发布于: 2020 年 10 月 23 日

作业一(2 选 1):

  1. 用你熟悉的编程语言实现一致性 hash 算法。

  2. 编写测试用例测试这个算法,测试 100 万 KV 数据,10 个服务器节点的情况下,计算这些 KV 数据在服务器上分布数量的标准差,以评估算法的存储负载不均衡性。


  1. 用你熟悉的编程语言实现一致性 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.08.28 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第一期 - 第周五课后 - 作业一