ngx_lua 一致性hash实现

ngx_lua出来很长时间了,但一直没有关注过,最近有一个I/O密集型的项目,用PHP性能严重不足,但是通过C开发扩展成本很大,对需求也不能及时响应,结果尝试了一下lua,结果非常喜人,他的同步非阻塞I/O,协同程序等等,让他的性能无与伦比!

在项目的开发中需要用到consistent hash来保证缓存的可靠性,所以就写了一个hash算法,跟大家分享一下,这是第一版,希望大家多提意见:

详细介绍请看https://github.com/qiaodandedidi/ngx_lua_consistent/wiki

--[[
-- consistent hash
--
-- @author [email protected]
--]]
do
	-- virtual nodes number
	local VIRTUAL_COUNT = 160;
	-- sharding vaitual nodes number
	local CONSISTENT_BUCKETS = 1024;
	-- the table of virtual nodes
	local VIRTUAL_NODE = {};
	-- the talbe of sharding
	local BUCKETS = {};
	-- module of consistent
	local _M = {};
	-- crc32 algorithm
	local crc32 = function(arg) return math.abs(ngx.crc32_long(arg)) end

	--[[
	-- add servers and to generate the ‘BUCKETS‘
	--
	-- @param {table} server all of the servers
	-- ]]
	function _M.add_server(server)
		for i,v in pairs(server) do
			for n=1,math.floor(VIRTUAL_COUNT) do
				local hash_key = v..‘-‘..(n-1);
				table.insert(VIRTUAL_NODE, {v, crc32(hash_key)});
			end
		end
		-- sorting by ‘crc32(hash_key)‘, it means arg[2]
		table.sort(VIRTUAL_NODE, function (arg1, arg2) 
			return (arg1[2] < arg2[2]);
		end);
		-- sharding
		local slice = math.floor(0xFFFFFFFF / CONSISTENT_BUCKETS);
		for i=1, CONSISTENT_BUCKETS do
			table.insert(BUCKETS, i, hash_find(math.floor(slice * (i -1)), 1, #VIRTUAL_NODE));
		end
	end

	--[[
	-- Binary search
	--
	-- @param {float} key the value of we are looking for
	-- @param {float} lo first index
	-- @param {float} hi last index
	-- @return {table} the node 
	--]]
	function hash_find(key, lo, hi) 
		if key <= VIRTUAL_NODE[lo][2] or key > VIRTUAL_NODE[hi][2] then
			return VIRTUAL_NODE[lo];
		end

		local middle = lo + math.floor((hi - lo) / 2);
		if middel == 1 then
			return VIRTUAL_NODE[middle];
		elseif key <=VIRTUAL_NODE[middle][2] and key > VIRTUAL_NODE[middle-1][2] then
			return VIRTUAL_NODE[middle];
		elseif key > VIRTUAL_NODE[middle][2] then
			return hash_find(key, middle+1, hi);
		end
		return hash_find(key, lo, middle-1);
	end

	--[[
	-- get consistent hash value
	--
	-- @param {string} key 
	-- @return {string} node
	--]]
	function _M.get_upstream(key) 
		return BUCKETS[(crc32(key) % CONSISTENT_BUCKETS) + 1][1];
	end

	return _M;
end
时间: 2024-10-28 02:25:39

ngx_lua 一致性hash实现的相关文章

Memecached缓存原理及基本操作、分布式(一致性hash)

原文地址:http://lixiangfeng.com/blog/article/content/7869717 转载请标明此处,谢谢! 缓存是什么?为什么要使用缓存? 缓存,通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度. 缓存工具有哪些?区别在哪里? 缓存工具:Memecached.redis.MongoDB 区别: 性能都比较高:总体来讲,TPS(每秒总事务量)方面redis和memcache差不多,要大于 mongodb: 操作的便利性: a)   

【高并发解决方案】7、一致性hash解读

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用.很多哈希算法都能够满

一致性hash算法

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用.很多哈希算法都能够满足

分布式memcached学习(四)&mdash;&mdash; 一致性hash算法原理

    分布式一致性hash算法简介 当你看到"分布式一致性hash算法"这个词时,第一时间可能会问,什么是分布式,什么是一致性,hash又是什么.在分析分布式一致性hash算法原理之前,我们先来了解一下这几个概念. 分布式 分布式(distributed)是指在多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务. 以一个航班订票系统为例,这个航班订票系统有航班预定.网上值机.旅客信息管理.订单管理.运价计算等服务模块.现在要以集中式(集群,cluster)和分布

分布式算法(一致性Hash算法)

一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Response Time).加权法(Weighted )等.其中哈希算法是最为常用的算法. 典型的应用场景是: 有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均分发到每台服务器上,每台机器负责1/N的服务. 常用的算法是对hash结果取余数 (hash() mod N ):对机器编号

对一致性Hash算法,Java代码实现的深入研究

一致性Hash算法 关于一致性Hash算法,在我之前的博文中已经有多次提到了,MemCache超详细解读一文中"一致性Hash算法"部分,对于为什么要使用一致性Hash算法和一致性Hash算法的算法原理做了详细的解读. 算法的具体原理这里再次贴上: 先构造一个长度为232的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 232-1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 232-1]),接着在

一致性Hash分布算法实例

本文介绍使用PHP实现一致性Hash算法. 创建一个FlexiHash类,他有两个成员变量和三个方法: $serverlist:保存服务器列表. $isSorted:记录服务器列表是否已经排过序. addServer:添加一个服务器到服务器列表中: removeServer:从服务器列表中删除一个服务器: lookup:在当前的服务器中寻找合适的服务器存放数据. [示例]: <span style="font-family:Microsoft YaHei;font-size:18px;&q

一致性hash学习

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用. 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用.很多哈希算法都能够满

memcache的一致性hash算法使用

一.概述 1.我们的memcache客户端(这里我看的spymemcache的源码),使用了一致性hash算法ketama进行数据存储节点的选择.与常规的hash算法思路不同,只是对我们要存储数据的key进行hash计算,分配到不同节点存储.一致性hash算法是对我们要存储数据的服务器进行hash计算,进而确认每个key的存储位置.  2.常规hash算法的应用以及其弊端 最常规的方式莫过于hash取模的方式.比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到hash(K