热点问题主要分两种:读热点和写热点。
读热点
读热点最常规的思路是本地cache方案和二级缓存方案。把热点key以某些规则(比如说hash)打散,单个节点维护一份本地的热点cache,比如说热点的key个数为一万个。优先访问本地cache,访问不到再访问二级缓存,比如说memcached,Redis之类的。
当然,这是从业务层面解决热点问题,而不是从分布式缓存框架的层面上解决。
从分布式缓存框架层面解决热点问题的思路是,发现热点,路由热点;
举个例子:在极端情况下,某几个热点key可以把单机的网络吃满。这种情况下,热点key会影响到其他非热点key的访问,再者,分式布缓存选用的内存型机器就显得浪费了。相应的解决方案是,把热点识别出来,放到多台普通机器上,比如说C1机器。客户端访问热点key时,能路由到相应的C1机器。
具体实现是,每个key内部维护一个计数器,统计自身被访问的次数,然后以一定的频率把访问次数上报到路由节点,路由节点根据一定的策略判断其中某些key是热点key,把相应的key拷贝到C1机器上,然后把路由规则下发到客户端。
写热点
写热点一般跟写入的规则有关,比如说,hbase根据rowKey的前缀分配到具体的节点,前缀相同的rowKey容易产生写热点。这种情况,一般会用rowKey求hash值,然后求余机器数,把余数拼到rowKey前面。这样的话,可以把热点打散到各节点。
还有一种情况是,由于某一些特别情况,不能把热点打散的,那常规的做法是合并写入线程,改单次写入变为批量写入,减少写入并发数。
感谢您的来访,获取更多精彩文章请收藏本站。

暂无评论内容