本篇文章,Twemproxy增长或剔除Redis节点后对数据的影响是接着”经过Twemproxy代理Redis数据分片方案“这篇文章写的。最好还要懂一致性哈希(ketama)的原理。 |
上一篇文章中,咱们配置了一个twemproxy节点,后面跟着两个Redis节点作的简单测试。下面咱们模拟在Redis运行过程当中新增一个节点,看一看会丢失Key的比例是多少。至于为何会丢失Key呢?最简单的理解就是“取模运算”,原先twemproxy是对两个Redis节点对Key作哈希后存储,一样读取数据的时候也是使用一样的算法,一样的节点数作运算,因此能够正确拿到每一个Key的值。那么如今新增一个节点后,就成了3个节点对Key作哈希运算了,那么会发生什么状况呢?原先存的Key是对2取模,可是新增一个节点后去取Key时变成了对3取模。那么结果确定是一大批Key没法找到。固然,上面说的只是好久以前使用的方法,twemproxy使用的是一致性哈希,仍是那句话,对于一致性哈希在memcached部分有较为详细的介绍了,有兴趣能够看看。redis
下面咱们就实验看看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,写个测试脚本跑一下。bash
[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的分布。tcp
[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节点。memcached
[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。spa
[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有多少个。server
[root@www ~]# bash get.sh | grep "value" | wc -l 647
经过结果,咱们能够看出,当Redis为2个节点时,咱们插入1000个Key,而后新增一个节点后只读取到了647个Key,近似值3/1。若是你了解一致性哈希算法的原理的话,就应该会知道,丢失Key的比例就是新增节点数占总节点数(原有节点+新增节点)的比例。好比原来有8个节点,新增2个节点,丢失Key的比例就是2/10。固然这个只是简单的数据测试。ci