yesn 发表于 2018-11-4 07:13:31

Twemproxy测试Redis分片主从架构

  Twemproxy 测试架构
  
  1、twemproxy是twitter开发的一个redis代理proxy。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免redis单点故障问题。
  使用Twemproxy 对硬件资源配置较高;在redis性能有一定的损失(twitter测试约20%)用于提高整个系统的HA;
  2、twemproxy部署简单快捷;可以直接在proxy进行读写、并转发请求给后端的redis;但是不适合超大流量系统。做的时候把应用分开、使用LVS集群:实现twemproxy的负载均衡,提高proxy的可用性和可扩张能力;
  优点:
  轻量级的Redis和memcached代理。使用它可以减少缓存服务器的连接数,并且利用它来作分片,性能损耗不会多于20%。其实是因为用了pipeline.首先redis是支持使用pipeline批处理的。
  twemproxy与每个redis服务器都会建立一个连接,每个连接实现了两个FIFO的队列,通过这两个队列实现对redis的pipeline访问。将多个客户端的访问合并到一个连接,这样既减少了redis服务器的连接数,又提高了访问性能。
  缺点:
  虽然可以动态移除节点,但该移除节点的数据就丢失了。redis集群动态增加节点的时候,twemproxy不会对已有数据做重分布.maillist里面作者说这个需要自己写个脚本实现性能上的损耗.
  twemproxy- nutcracker:
  ip:10.207.101.101
  ip:10.207.101.102
  VIP:10.207.101.100
  HA- keepalived
  ip:10.207.101.101
  ip:10.207.101.102
  VIP:10.207.101.100
  Redis
  IP: 10.207.101.101
  Port:6001/6002/6003
  IP: 10.207.101.102
  Port:6001/6002/6003
  3、部署
  wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
  wget https://codeload.github.com/twitter/twemproxy/zip/master
  yum install gcc gcc-c++ tcl ruby -y
  tar -xf autoconf-2.69.tar.gz
  cd autoconf-2.69/
  ./configure
  make &&make install
  unzip unzip master.zip
  cd twemproxy-master
  autoreconf -fvi
  ./configure --enable-debug=full
  make
  make install
  4、配置示例:
  # vim /etc/nutcracker.yml
  alpha:
  listen: 0.0.0.0:22121
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers: --两台redis服务器的地址和端口
  - 10.207.101.101:6001:1
  - 10.207.101.102:6001:1
  #配置都是redis master地址
  注意:

[*]
[*]  .yml 配置文件中每个参数值对分隔符”:”后需要有一个空格
[*]  不同层次的参数需要缩进区分,最好使用tab键缩进,否则nutcracker进程不能启动。
[*]  在auto_eject_hosts: true的时候,关闭一个redis实例后,写入数据还是提示“(error) ERR Connection refused”。这个与server_retry_timeout参数设置太小有关,默认值30000msec是一个很好的选择。

  5、启动Twemproxy服务
  nutcracker -t nutcracker.yml
  检测配置语法真确会显示OK .
  # nutcracker -t twemproxy/conf/nutcracker.yml
  nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok
  web界面运行启动服务的http://ip:22222查看;
  可以使用nc命令查看 Twemproxy 状态语句:
  # nc 10.207.101.101 22222|python -mjson.tool
  6、设置启动:
  # cat start.sh
  nutcracker -d -c /opt/twemproxy-master/conf/nutcracker.yml -p /opt/twemproxy-master/run/redisproxy.pid -o /opt/twemproxy-master/run/redisproxy.log
  nutcracker 用法与命令选项
  Options:
  -h, –help                        : 查看帮助文档,显示命令选项
  -V, –version                   : 查看nutcracker版本
  -t, –test-conf                  : 测试配置脚本的正确性
  -d, –daemonize            : 以守护进程运行
  -D, –describe-stats         : 打印状态描述
  -v, –verbosity=N            : 设置日志级别 (default: 5, min: 0, max: 11)
  -o, –output=S               : 设置日志输出路径,默认为标准错误输出 (default: stderr)
  -c, –conf-file=S               : 指定配置文件路径 (default: conf/nutcracker.yml)
  -s, –stats-port=N            : 设置状态监控端口,默认22222 (default: 22222)
  -a, –stats-addr=S            : 设置状态监控IP,默认0.0.0.0 (default: 0.0.0.0)
  -i, –stats-interval=N       : 设置状态聚合间隔 (default: 30000 msec)
  -p, –pid-file=S               : 指定进程pid文件路径,默认关闭 (default: off)
  -m, –mbuf-size=N          : 设置mbuf块大小,以bytes单位 (default: 16384 bytes)
  # cat stop.sh
  ps -ef | grep redis | grep -v grep | awk '{print $2}'| sed -e "s/^/kill -9 /g" | sh -
  7、检测进程
  ps -ef | grep nutcracker | grep -v grep
  8、keepalived 部署 HA 静态路由单点故障;
  yum install keepalived -y
  # cat /etc/keepalived/keepalived.conf
  ! Configuration File for keepalived
  global_defs {
  router_id LVS_DEVEL
  }
  vrrp_script check_twem {
  #    script "killall -0 redis"
  script "/etc/keepalived/check_twem.sh"
  interval 2
  weight -3
  fall 3
  rise 2
  }
  vrrp_instance VI_1 {
  state MASTER
  interface eth0
  virtual_router_id 51
  priority 100
  advert_int 1
  authentication {
  auth_type PASS
  auth_pass 1111
  }
  virtual_ipaddress {
  172.27.101.100/24 dev eth0 label eth0:1
  }
  track_script {
  check_twem
  }
  }
  virtual_server 172.27.101.100 22121 {
  delay_loop 6
  protocol TCP
  real_server 172.27.101.101 22121 {
  weight 1
  TCP_CHECK {
  connect_timeout 3
  nb_get_retry 3
  delay_before_retry 3
  connect_port 80
  }
  real_server 172.27.101.102 22121 {
  weight 1
  TCP_CHECK {
  connect_timeout 3
  nb_get_retry 3
  delay_before_retry 3
  connect_port 80
  }
  }
  }
  9、nutcracker 进程检测 - 脚本check_twem.sh
  # cat /etc/keepalived/check_twem.sh
  #!/bin/bash
  twem=$(ps -C nutcracker --no-heading|wc -l)
  if [ "${twem}" = "0" ]; then
  sh /opt/twemproxy-master/start.sh
  sleep 2
  twem=$(ps -C nutcracker --no-heading|wc -l)
  if [ "${twem}" = "0" ]; then
  /etc/init.d/keepalived stop
  fi
  fi
  10、Set测试:
  通过twemproxy测试:
  # redis-cli -h 172.27.101.100 -p 22121 -c 11 -t set -d 11 -l –q
  SET: 38167.94 requests per second
  直接对后端redis测试:
  # redis-cli -h 172.27.101.101 -p 6001 -c 11 -t set -d 11 -l –q
  直接对后端redis测试:
  # redis-cli -h 172.27.101.102 -p 6001 -c 11 -t set -d 11 -l –q
  SET: 53191.49 requests per second
  11、Get测试:
  通过twemproxy测试:
  # redis-cli -h 172.27.101.100 -p 22121 -c 11 -t get -d 11 -l -q
  GET: 37453.18 requests per second
  直接对后端redis测试:
  # redis-cli -h 172.27.101.101 -p 22121 -c 11 -t get -d 11 -l -q
  GET: 62111.80 requests per second
  查看键值分布:
  # redis-cli info|grep db0
  db0:keys=51483,expires=0,avg_ttl=0
  # redis-cli info|grep db0
  db0:keys=48525,expires=0,avg_ttl=0
  12、redis-cli 基本操作;
  Redis 模糊搜索
  keys *
  select 2
  删除所有以user开头的key 可以这样实现:
  # redis-cli keys "user*"
  1) "user1"
  2) "user2"
  # redis-cli keys "user*" | xargs redis-cli del
  (integer) 2
  # 删除成功
  # 批量删除匹配通配符的key用到了Linux中的管道和xargs参数:
  redis-cli keys "s*" | xargs redis-cli del
  # 如果需要制定数据库,需要用到 -n 数据库编号   参数,下面是删除2数据库中s开头的键:
  redis-cli -n 2 keys "s*" | xargs redis-cli -n 2 del
  redis-cli keys "*" | xargs redis-cli del
  # 如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径
  # 如:/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del
  # 删除当前数据库中的所有Key
  flushdb
  # 删除所有数据库中的key
  flushall
  13、测试问题
  read, writev and mbuf
  所有的请求和响应都在mbuf里面,mbuf默认大小是16K(512b-16M),可以使用-m or -mbuf-size=N来配置,每一个连接都会获得至少一个mbuf,这意味着nutcracker支持的并发的连接数依赖于mbuf的大小,小的mbuf可以控制更多的连接,大的mbuf可以让我们读或者写更多的数据导socker buffer。如果并发量很大的场景,推荐使用比较小的mbuf(512 or 1K)
  mbuf-size=N
  每一个客户端连接最好需要一个mbuf,一个服务请求最少是两个连接(client->proxy、proxy->server)所以最少需要两个mbufs 1000个客户端连接的场景计算:1000*2*mbuf=32M,如果每个连接有10个操作,这个值将会是320M,假设连接是10000,那么将会消耗3.2G内存!这种场景下最好调mbuf值比如512b,1000*2*512*10=10M 这个就是当并发量高的场景下使用小的mbuf的原因
  key长度:
  memcached的长度上限是250, redis没有类似限制,但是nutcracker需要key存储在连续的内存里面,而因为所有的请求和响应都在mbuf中,所以redis key的长度将会受限制于mbuf,也就是说如果你的redis实例如果要操作超长的key,你必须把mbuf调大。
  14、简单删除
  # 测试数据
  
  redis> ZRANGE page_rank 0 -1 WITHSCORES
  1) "bing.com"
  2) "8"
  3) "baidu.com"
  4) "9"
  5) "google.com"
  6) "10"
  # 移除单个元素
  redis> ZREM page_rank google.com
  (integer) 1
  redis> ZRANGE page_rank 0 -1 WITHSCORES
  1) "bing.com"
  2) "8"
  3) "baidu.com"
  4) "9"
  # 移除多个元素
  redis> ZREM page_rank baidu.com bing.com
  (integer) 2
  redis> ZRANGE page_rank 0 -1 WITHSCORES
  (empty list or set)
  # 移除不存在元素
  redis> ZREM page_rank non-exists-element
  (integer) 0
  14、命令参考
  http://doc.redisfans.com/

页: [1]
查看完整版本: Twemproxy测试Redis分片主从架构