精晓redis高可用方案

欢迎大家前往腾讯云技术社区,获取越多腾讯海量技术实施干货哦~

通晓并开端搭建redis集群

一对开发人员工作中间只是在行使中行使redis,比如用来做多少结果的缓存。而且现在有成百上千正确的redis客户端工具(redisson),基本上可以不用关爱redis命令就能够达成一定部分的成效。所以可能会对如下那一个标题关怀点不够:

  • 何以容灾?即某个redis节点出了难点何以确保服务的高可用性
  • 如何横向扩容?当数据量更加大时,怎么着缓解单个redis的习性难题
  • 集群至少必要几台机器?或者多少个redis节点
  • 集群搭建都施用什么技艺,哪些工具?

作者: class=”info-item”>雷经纬 

怎么着容灾?

redis提供了基本热备机制,主服务器的数码同步到从服务器,通过哨兵实时监控主服务器状态并负责选举主服务器。当发现主服务器极度时按照早晚的算法重新选举主服务器并将标题服务器从可用列表中去除,最终文告客户端。主从是一对多的树型结构,如下图:

图片 1

导语

正文从从图纸的dhash,ahash,phash,颜色分布向量到基于语义的sift,surf,gist特征,创设一套分层相似图片检测系统。本文致力于零基础单机疾速搭建一个可用的一般图片识别系统。

哨兵

哨兵是sentinel的粤语名称,是redis出的一个高可用架构的工具,自身是一个单独的经过,可以同时监控一个之上的redis集群。

1 背景

相似图片检测的概念是人立刻起来像,比如上面的俩图。

   

诚如图片的检测广泛用于图片去重,仿冒图标检测,图片检索等。本文也是按照图标相似检测的须求去做的,本意是用以打假。不过专家老中医告诉我,打假不如推荐相似app受市场欢迎,并且分歧应用场景下大家办事的笔触也会不相同。不管了,先把一般图片识别出来

哨兵集群

根据高可用的考虑,哨兵自身也是亟需协助集群的,假设唯有一个哨兵就会设有单点难题。

2 检测的规律

图形相似检测无非是提取图片某个维度的性状,按照算法两两测算相似度。(基于机器学习,深度学习的法子则会先构建一个模型,然后将新样本特征输入模型即可。)简单流程可以描述为:

图片 2

检测进程中或者用到的7个基础特征如下:

图片 3

简单解释下,dhash,ahash,phash是依据基于分块等某种算法得到的依照图片RGB值的某个哈希(其详细描述可参考http://itindex.net/detail/42723 );RGB向量则是将色彩从256256256映射到较小的距离如444,然后计算图片在各种区间的遍布多变一个数组;

SIFT,SURF,GIST则不再是RGB值的某种总括,而是准备打造人能知道的图纸意义,如SIFT,SURF关怀图片关键点(或者精晓为首要的点)的消息,GIST则从自然度,开放度,粗糙度等描述图像。下图是那种专业的图纸处理,很了不起上有没有。

图片 4

哨兵决策

哨兵有一个数额配置,当有些个哨兵同时认为某个主服务不可用时才进行主从切换,比如总共有5个哨兵,当3个哨兵认为劳动不可用时才决定做主从切换。这么做可以避免有些误切换,下降切换花费,比如弹指时的互连网尤其等。

3 怎么着搭建一个冒充图标检测系统

诚如图片的检测可以用于去重,图片检索等。底层技术是基于上文描述的方式,不过在依照目的分歧,又有两样的布局。本工程的初衷是检测图标仿冒,系统结构如下:

图片 5

思路:先把已标位正牌的图标特征(dhash,ahash,phash等)收集起来形成一个特征库,新图标来了则提取其特征去特征库里匹配,固然匹配到了相似度极高的则从来肯定其为仿冒图标;倘使协作到了相似度较高的则转入sift,gist高级特征匹配。

何以横向扩容?

随便redis依然其他一些数据库之类的出品,当单节点的数据容量高达一定上限后,服务对外提供的能力会越加弱。redis在高版本中提供了redis-trib.rb来落实集群效益,也可以运用第三方的工具twemproxy。

4 show me the 效果

上边是局地形似图标示例:

图片 6

图片 7图片 8

图片 9图片 10

图标大小缩放,添新币素,添加文字,颜色块变化等都是可以识其他。仿冒数量不便浮现(/
□ )

去中央化,每个节点都是一致的

redis集群从统筹上并未考虑主旨化,那样可以免止焦点节点的单点等难点。每个节点都能控制所有集群的事态,连接任意的节点都得以访问到所有的key,如同单节点的redis一样。

5 进步品质和功效的关键点,坑

本工程最后在单机完毕了数百万官方图标库,每日新进数十万图标的检测。在营造进度中遇见了广大坑,那么些坑一部分是持筹握算速度(单一图标匹配从300秒下降到0.2秒,鬼知道自家的小心脏经历了什么样),还有的是可辨成效:

1.官方图标特征需先聚类,数百万的表征存储和包容都相比较费心。对官方库聚类后方可形成特点对图标的一对多涉及,而不是保持原有的图标对特色的一对一关系;

2.匹配策略分层,如本工程一开头综合dhash及sift等,参数和方针调整相当复杂。分为两层后(哈希策略过滤,sift精确匹配),每一层的准确率和参数,策略调整格外便宜;

3.哈希值的海明码距离计算耗时较多,在显眼海明码距离限制的景况下得以选取分段匹配而非计算分歧的位数。具体见http://www.cnblogs.com/gantoday/p/6404923.html

4.工程经验上:opencv-python不直接提供sift,surf算法了。可以用opencv-contrib-python那个库。gist可以用pyleargist那些库,其借助安装见http://blog.csdn.net/sensicall/article/details/77803915

集群原理图

协调了然画的,如有了解不对的地点可以提出。

图片 11

6 潜在的立异点

海量图片匹配,第一步必须是生成图片的表征哈希,且改hash必须是一对敏感hash。局部敏感hash的特征是:原始数据一般的景况下,生成的hash值也会尽量的维持相似。从图纸dhash,ahash,phash的算法进度能够认为它们就是一种局地敏感哈希。所以可以用来检测相似。

图片 12

不过在gist特征中,固然图片相似,生成的960维向量的每一个值大约都不比,不直接持有利用它生成局地敏感哈希lsh的尺码。那一个时候须求对向量元素归一化,使得一般图片的绝大部分gist特征相同。这点在pyleargist的法定页面https://pypi.python.org/pypi/pyleargist 下方有证实,但并不曾讲怎么做。有成文说用simhash,可是对于simhash生成进度中的每个维度的权重一笔带过。个人很怀疑不行使归一化就生成simhash的做法。那里待琢磨

key与redis节点的关联

引入了hasy
solt,普通话精通为哈希槽。总共16384个,大家操作的key通过取模算法确认key落在哪些槽上。

HASH_SLOT = CRC16(key) mod 16384

哈希槽与节点之间有肯定关联,所以大家就可以将key分配到某个具体的redis节点上了。

详见的涉及可再研商,不难的例如节点A负责0-5000数码的哈希槽,节点B负责5001-1000

7 总结

现阶段图像处理发展多年,已经提出了种种特征,算法。在工程运用中需求组合自己的现象选取合适的特色(怎么适当?不确定的话就多试试(/
□ )),着重底层数据的品质,优化品质以便急速调动匹配策略。

图片 13

 

一步一步搭建

发端搭建三主三从的集群,系统是ubuntu,采取redis提供的集群工具redis-trib.rb。

  • 安装新型redis
  • 创建redis_cluster目录,并且创办7000到7005那6个目录
  • 将redis目录下的redis.conf复制到地点创造的6个目录中
  • 个别修改redis.conf文件,对6个公文做类似的修改。

    port 7000 //端口7000
    bind 127.0.0.1 //默许ip为127.0.0.1 须求改为其余节点机器可访问的ip
    daemonize yes //后台运行
    pidfile /var/run/redis_7000.pid //pidfile文件对应7000
    cluster-enabled yes //开启集群
    cluster-config-file nodes_7000.conf //集群的计划cluster-node-timeout 15000 //请求超时 默许15秒,可自行安装

bind要求小心的就是急需布置为任何机器可以访问的ip,否则无论是创造集群仍然客户端连接都会有难题。

  • 启动6个redis

    redis-server redis_cluster/7000/redis.conf
    redis-server redis_cluster/7001/redis.conf
    redis-server redis_cluster/7002/redis.conf
    redis-server redis_cluster/7003/redis.conf
    redis-server redis_cluster/7004/redis.conf
    redis-server redis_cluster/7005/redis.conf

  • 创设集群
    redis的src目录下有个redis-trib.rb,将它复制到/usr/local/bin中,然后实施如下脚本:

    redis-trib.rb create –replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

–replicas前面的1代表从服务器的个数,上边可以领略为眼前3个为主服务器,前边七个分级做为从服务器,即三对基本。

推行进程中会碰到提醒需求安装ruby,安装到位之后又会提醒安装 gem redis。

安装gem
redis,折腾了旷日持久,最后发现是因为在国内访问不了某些网站造成通过apt-get
install安装不成事,最终经过下载源码的主意安装成功。

图片 14

双重实施创设集群的台本,出现如下提醒:

图片 15

输入yes,继续

图片 16

足足需要有些个主服务器?
也许是依照某些约定,集群约定唯有当可用节点数大于半数以上时才享有对外提供劳动的力量。首先数量肯定是奇数,其实必须超出1,所以最少的主服务器数量为3。

  • 测试集群
    接连客户端,由于我的兼具节点都是在本地,所以不必要输入ip,但要求加-c的参数。

    redis-cli -c -p 7000

连日成功后,伸张一个key

set mykey 123

有一行提示语,指向到端口7002,那表达就算我们连年的是7000的实例,但经过hash算法最终会将key分配到7002的实例上。

图片 17

再连接7005端口查询下key,测试下是或不是擅自一个实例都得以查询到key

get mykey

显示指向到端口7002

图片 18

相关阅读

把相片唱给您听 :腾讯 AI Lab
国际当先技术邀你「趣」体验

根据图像识其他自动化

都是知识点!更简单的图像匹配特征融合法,你 Get
到了呢?


此文已由作者授权腾讯云技术社区宣布,转发请注解文章出处
原稿链接:https://cloud.tencent.com/community/article/503286

集群要求注意的地点

这块还未仔细琢磨,有些命令在集群下是不协助的,待后续求证。

引用

总结

实际环境的安顿与单机陈设照旧距离相比较大的,但也不复杂,尽管有些开发人员可能一辈子都不会有时机在线上搭建redis集群,但理解redis的高可用可伸张的方案对规划大型系统或者有相比大的接济的,也有助于分析解决线上难点。看了上面的那个,对于本文初步提到的标题就简单通晓了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注