投稿    登录
欢迎光临 www.huangdc.com

twemproxy + redis + sentinel 实现redis集群高可用

技术杂谈 huangdc 18851℃ 0评论

本文主要描述使用 twemproxy + redis + sentinel + 脚本 实现redis集群的高可用,篇幅有点长(实战配置文件/命令)

先贴个本文主要标题列表哈

  • redis简介
  • sentinel 功能
  • twemproxy特性
  • twemproxy + redis + sentinel 实现redis集群高可用架构图
  • 实战一 :环境部署
  • 实战二 :redis 主从配置
  • 实战三 :sentinel 配置
  • 实战四 :twemproxy 配置

 

redis

Redis 是完全开源免费的,遵守BSD协议,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件,是一个高性能的key-value数据库。

前面有篇文档写到了redis简介及安装和压测数据:http://www.huangdc.com/246

 

redis sentinel 

redis sentinel 是redis 官方推荐的redis 高可用(HA)解决方案

sentinel 的功能:

  • 监控(Monitoring),sentinel 时刻监控着redis master-slave 是否正常运行
  • 通知(Notification),sentinel 可以通过api 来通知管理员,被监控的redis master-slave 出现了问题
  • 自动故障转移(Automatic failover),当redis master 出现故障不可用状态,sentinel 会开始一次故障转移,将其中一个 slave 提升为新的master ,将其他的slave 将重新配置使用新的master同步,并使用Redis的服务器应用程序在连接时收到使用新的地址连接
  • 配置提供者(Configuration provider) ,sentinel 作为在集群中的权威来源,客户端连接到sentinel来获取某个服务的当前Redis主服务器的地址和其他信息。当故障转移发生时,Sentinel 会报告新地址。

 

twemproxy (nutcraker)

Twemproxy,也叫nutcraker。是一个twtter开源的一个redis 和memcache 快速/轻量级代理服务器;Twemproxy是一个快速的单线程代理程序,支持Memcached ASCII协议和更新的Redis协议
Twemproxy 通过引入一个代理层,可以将其后端的多台 Redis 或 Memcached 实例进行统一管理与分配,使应用程序只需要在 Twemproxy 上进行操作,而不用关心后面具体有多少个真实的 Redis 或 Memcached 存储

twemproxy 的特性:

  • 支持失败节点自动删除
    – 可以设置重新连接该节点的时间
    – 可以设置连接多少次之后删除该节点
  • 支持设置HashTag
    – 通过HashTag可以自己设定将两个key哈希到同一个实例上去
  • 减少与redis的直接连接数
    – 保持与redis的长连接
    – 减少了客户端直接与服务器连接的连接数量
  • 自动分片到后端多个redis实例上
    – 多种hash算法:md5、crc16、crc32 、crc32a、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、hsieh、murmur、jenkins
    – 多种分片算法:ketama(一致性hash算法的一种实现)、modula、random
    – 可以设置后端实例的权重
  • 避免单点问题
    – 可以平行部署多个代理层,通过HAProxy做负载均衡,将redis的读写分散到多个twemproxy上。
  • 支持状态监控
    – 可设置状态监控ip和端口,访问ip和端口可以得到一个json格式的状态信息串
    – 可设置监控信息刷新间隔时间
  • 使用 pipelining 处理请求和响应
    – 连接复用,内存复用
    – 将多个连接请求,组成reids pipelining统一向redis请求
  • 并不是支持所有redis命令
    – 不支持redis的事务操作
    – 使用SIDFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SUNION and SUNIONSTORE命令需要保证key都在同一个分片上。

 

twemproxy + redis + sentinel 高可用架构

 

redis20160309162514

  • 前端使用twemproxy (主备节点)做代理,将其后端的多台Redis实例分片进行统一管理与分配
  • 每一个分片节点的redis slave 都是redis master的副本且只读
  • redis sentinel 持续不断的监控每个分片节点的master,当master出现故障且不可用状态时,sentinel 会通知/启动自动故障转移等动作
  • sentinel 可以在发生故障转移动作后触发相应脚本(通过 client-reconfig-script 参数配置 ),脚本获取到最新的master来修改 twemproxy 配置并重启 twemproxy

 

实战一 :环境部署

实验环境:(简单化用三台主机)

ip 系统 部署软件 twemproxy服务 redis服务 sentinel服务
192.168.16.23 CentOS 6.7 redis
twemproxy
192.168.16.23:14500 _ 192.168.16.23:26379
192.168.16.22 CentOS 6.7 redis _ 192.168.16.22:4500
192.168.16.22:4501
192.168.16.22:26379
192.168.16.24 CentOS 6.7 redis _ 192.168.16.24:4500
192.168.16.24:4501
192.168.16.24:26379

实验架构图:

redis20160309180825

安装redis

分别在三台服务器都安装 redis  (192.168.16.22,192.168.16.23,192.168.16.24 )

安装twemproxy

在 192.168.16.23 服务器安装 twemproxy

安装twemproxy 前,需要安装autoconf,automake,libtool 软件包

1、编译安装autoconf

2、编译安装automake

3、编译安装libtool

4、编译安装twemproxy

注意:如果没有安装libtool 的话,autoreconf 的时候会报错,如下:

 

实战二 : redis 主从配置

1、创建目录环境

 

192.168.12.22:4500 -> 192.168.12.24:4500 (主->从)

192.168.12.22:4501 -> 192.168.12.24:4501 (主->从)

2、在 192.168.12.22 配置 192.168.12.22:4500  redis master

在192.168.12.22 配置master文件 /data/nosql/redis_4500/redis.conf  ,文件内容如下: