文档章节

Twemproxy增加或剔除Redis节点后对数据有何影响

linuxprobe16
 linuxprobe16
发布于 02/19 11:16
字数 1065
阅读 5
收藏 0
本篇文章,Twemproxy增加或剔除Redis节点后对数据的影响是接着”通过Twemproxy代理Redis数据分片方案“这篇文章写的。最好还要懂一致性哈希(ketama)的原理。

上一篇文章中,我们配置了一个twemproxy节点,后面跟着两个Redis节点做的简单测试。下面我们模拟在Redis运行过程中新增一个节点,看一看会丢失Key的比例是多少。至于为什么会丢失Key呢?最简单的理解就是“取模运算”,原先twemproxy是对两个Redis节点对Key做哈希后存储,同样读取数据的时候也是使用同样的算法,同样的节点数做运算,所以可以正确拿到每个Key的值。那么现在新增一个节点后,就成了3个节点对Key做哈希运算了,那么会发生什么情况呢?原先存的Key是对2取模,但是新增一个节点后去取Key时变成了对3取模。那么结果肯定是一大批Key无法找到。当然,上面说的只是很久之前使用的方法,twemproxy使用的是一致性哈希,还是那句话,对于一致性哈希在memcached部分有较为详细的介绍了,有兴趣可以看看。

下面我们就实验看看twemproxy增加或剔除节点后对数据的影响范围比例是多少。twemproxy和redis上一章节就配置好了。

[root@www ~]# ps aux | grep nut
root   13266  0.0  17916  2120 ?        Sl   16:22   0:00 /etc/twemproxy/sbin/nutcracker -c 
/etc/twemproxy/conf/nutcracker.yml -p /var/run/nucracker.pid -o /var/log/nutcracker.log -d
[root@www ~]# ps aux | grep redis
root   23092 0.0  36560  2300 ?    Ssl  12:17   0:14 /usr/local/redis/src/redis-server 0.0.0.0:6547               
root   23112 0.0  36560  1580 ?    Ssl  12:17   0:15 /usr/local/redis/src/redis-server 0.0.0.0:6546
[root@www ~]# netstat -nplt | grep -E "(22122|6546|6547)"
tcp        0      0 0.0.0.0:6546     0.0.0.0:*         LISTEN      23112/redis-server 
tcp        0      0 0.0.0.0:6547     0.0.0.0:*         LISTEN      23092/redis-server 
tcp        0      0 0.0.0.0:22122    0.0.0.0:*         LISTEN      13266/nutcracker

下面我们先批量插入1000个Key,写个测试脚本跑一下。

[root@www ~]# cat set.sh 
#!/bin/bash
#
for i in `seq 1 1000`;do
  redis-cli -p 22122 set "key$i$i" "value$i" 
done

执行脚本,然后分别取6546和6547两台主机上看看Key的分布。

[root@www ~]# redis-cli -p 6546
127.0.0.1:6546> KEYS *
................
448) "key932932"
449) "key109109"
450) "key131131"
451) "key271271"
[root@www ~]# redis-cli -p 6547
127.0.0.1:6547> KEYS *
.................
545) "key245245"
546) "key705705"
547) "key455455"
548) "key126126"
549) "key251251"

把twemproxy新增一个Redis节点,下面先增加一个Redis节点。

[root@www ~]# cat /data/redis-6548/redis.conf 
daemonize yes
pidfile /var/run/redis/redis-server.pid
port 6548
bind 0.0.0.0 
loglevel notice
logfile /var/log/redis/redis-6548.log

然后把这个节点(172.16.0.172:6548:1 redis03)加入twemproxy中。

[root@www ~]# cat /etc/twemproxy/conf/nutcracker.yml
redis-cluster:
  listen: 0.0.0.0:22122
  hash: fnv1a_64
  distribution: ketama
  timeout: 400
  backlog: 65535
  preconnect: true
  redis: true
  server_connections: 1
  auto_eject_hosts: true
  server_retry_timeout: 60000
  server_failure_limit: 3
  servers:
    - 172.16.0.172:6546:1 redis01
    - 172.16.0.172:6547:1 redis02
    - 172.16.0.172:6548:1 redis03

重新启动twemproxy和redis。

[root@www ~]# /etc/twemproxy/sbin/nutcracker -c /etc/twemproxy/conf/nutcracker.yml -p /var/run/nucracker.pid -o /var/log/nutcracker.log -d
[root@www ~]# /usr/local/redis/src/redis-server /data/redis-6548/redis.conf

做完这些之后,就可以直接去读取数据了,看看我们插入的1000个Key还能正确读到多少个。下面我们提供一个读取小脚本。

[root@www ~]# cat get.sh 
#!/bin/bash
#
for i in `seq 1 1000`;do
  redis-cli -p 22122 get "key$i$i"
done

然后执行脚本,并统计一下能查询到值得Key有多少个。

[root@www ~]# bash get.sh | grep "value" | wc -l
647

通过结果,我们可以看出,当Redis为2个节点时,我们插入1000个Key,然后新增一个节点后只读取到了647个Key,近似值3/1。如果你了解一致性哈希算法的原理的话,就应该会知道,丢失Key的比例就是新增节点数占总节点数(原有节点+新增节点)的比例。比如原来有8个节点,新增2个节点,丢失Key的比例就是2/10。当然这个只是简单的数据测试。

本文转载自:https://www.linuxprobe.com/twemproxy-redis-node.html

linuxprobe16
粉丝 15
博文 905
码字总数 239685
作品 0
河东
私信 提问
(大致了解下)从单机到2000万QPS: 知乎Redis平台发展与演进之路

导读:知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能。本文作者是是该系统的负责人,文...

Ocean_K
2018/09/19
131
0
转载:从单机到2000万QPS: 知乎Redis平台发展与演进之路

转载:从单机到2000万QPS: 知乎Redis平台发展与演进之路 导读:知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系...

meng_philip123
02/24
0
0
知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

本文来自知乎官方技术团队的“知乎技术专栏”,感谢原作者陈鹏的无私分享。 1、引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完...

JackJiang2011
2018/09/18
0
0
知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

本文来自知乎官方技术团队的“知乎技术专栏”,感谢原作者陈鹏的无私分享。 1、引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完...

首席大胸器
2018/09/18
892
0
Redis学习笔记(11)——Redis缓存集群方案

由于单台Redis服务器的内存管理能力有限,使用过大内存的Redis又会使得服务器的性能急剧下降,一旦服务器发生故障将会影响更大范围业务,而Redis 3.0 beta1支持的集群功能还不适合生产环境的...

IT特种兵
2015/03/02
438
0

没有更多内容

加载失败,请刷新页面

加载更多

【Go专家编程】defer这里有个坑

前言 项目中,有时为了让程序更健壮,也即不panic,我们或许会使用recover()来接收异常并处理。 比如以下代码: func NoPanic() {if err := recover(); err != nil {fmt.Println("Recov...

恋恋美食
20分钟前
2
0
20190920笔记

扩展: bashrc和bash_profile http://ask.apelearn.com/question/7719 http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html echo 颜色 http://www.cnblogs.com/lr-ting/archi......

徐-锐
35分钟前
1
0
Shiro整合Redis代码解读

1. shiro默认使用的MemoryConstrainedCacheManager创建MapCache来保存缓存数据。manager和cache对象之间的关系可以参考笔者的另一篇文章,Springboot Redis详解。 2. shiro整合Redis的关键就...

sunranhou
59分钟前
4
0
关闭服务

题目要求 在centos6系统里,我们可以使用ntsysv关闭不需要开机启动的服务,当然也可以使用chkconfig工具来实现。 写一个shell脚本,用chkconfig工具把不常用的服务关闭。脚本需要写成交互式的...

wzb88
今天
6
0
面试官:兄弟,说说 Spring Cloud 的核心架构原理吧

最近在补一些分布式系列的面试内容,提前几个月做做准备吧,你们懂的,也跟大家分享分享。现在分布式系统基本上都是标配了,如果你现在还在玩儿单机,没有接触过这些东西的话,权当是为你打开...

咪咪家的汪汪
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部