本文主要描述使用 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 高可用架构
- 前端使用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 |
实验架构图:
安装redis
分别在三台服务器都安装 redis (192.168.16.22,192.168.16.23,192.168.16.24 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
## 下载 && 解压并安装 wget http://download.redis.io/releases/redis-3.0.6.tar.gz tar zxf redis-3.0.6.tar.gz cd redis-3.0.6 make && make install ## 检查bin文件 及 版本(默认bin文件路径为 /usr/local/bin/ ,也可以在编译时候加上 --prefix 参数自定义目录) [root@vm16-22 ~]# ll /usr/local/bin/redis* -rwxr-xr-x 1 root root 4589115 Feb 23 15:07 /usr/local/bin/redis-benchmark -rwxr-xr-x 1 root root 22177 Feb 23 15:07 /usr/local/bin/redis-check-aof -rwxr-xr-x 1 root root 45395 Feb 23 15:07 /usr/local/bin/redis-check-dump -rwxr-xr-x 1 root root 4698322 Feb 23 15:07 /usr/local/bin/redis-cli lrwxrwxrwx 1 root root 12 Feb 23 15:07 /usr/local/bin/redis-sentinel -> redis-server -rwxr-xr-x 1 root root 6471190 Feb 23 15:07 /usr/local/bin/redis-server [root@vm16-22 ~]# /usr/local/bin/redis-server -v Redis server v=3.0.6 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=a1df4a293d9213e9 |
安装twemproxy
在 192.168.16.23 服务器安装 twemproxy
安装twemproxy 前,需要安装autoconf,automake,libtool 软件包
1、编译安装autoconf
1 2 3 4 5 |
## 下载 && 解压并安装 wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz tar zxf autoconf-2.69.tar.gz ./configure make && make install |
2、编译安装automake
1 2 3 4 5 |
## 下载 && 解压并安装 wget http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz tar zxf automake-1.15.tar.gz ./configure make && make install |
3、编译安装libtool
1 2 3 4 5 6 |
## 下载 && 解压并安装 wget https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz tar zxf libtool-2.4.6.tar.gz cd libtool-2.4.6 ./configure make && make install |
4、编译安装twemproxy
1 2 3 4 5 6 7 8 9 10 |
## 下载 && 解压并安装 wget https://github.com/twitter/twemproxy/archive/master.zip unzip master.zip cd twemproxy-master ## 在twemproxy源码目录执行autoreconf 生成 configure文件等 aclocal autoreconf -f -i -Wall,no-obsolete ## 然后编译安装 ./configure --prefix=/usr/local/twemproxy/ make && make install |
注意:如果没有安装libtool 的话,autoreconf 的时候会报错,如下:
1 2 3 4 5 |
configure.ac:133: the top level configure.ac:36: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. autoreconf: /usr/local/bin/autoconf failed with exit status: 1 |
实战二 : redis 主从配置
1、创建目录环境
1 2 3 4 5 6 7 |
## ## 在192.168.12.22 , 192.168.12.24 创建目录 mkdir -p /data/nosql/{redis_4500,redis_4501,sentinel} ## 在192.168.12.23 创建目录 mkdir -p /data/nosql/sentinel mkdir -p /usr/local/twemproxy/{conf,logs} |
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 ,文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
daemonize yes ##使用daemon 方式运行程序,默认为非daemon方式运行 pidfile "/data/nosql/redis_4500/redis.pid" ##pid文件位置 port 4500 ##监听端口 bind 192.168.16.22 ##绑定ip timeout 0 ## client 端空闲断开连接的时间 loglevel warning ##日志记录级别,默认是notice,我这边使用warning,是为了监控日志方便。 ## 使用warning后,只有发生告警才会产生日志,这对于通过判断日志文件是否为空来监控报警非常方便。 logfile "/data/nosql/redis_4500/redis.log" databases 16 ##默认是0,也就是只用1 个db,我这边设置成16,方便多个应用使用同一个redis server。 ##使用select n 命令可以确认使用的redis db ,这样不同的应用即使使用相同的key也不会有问题。 ##下面是SNAPSHOTTING持久化方式的策略。 ##为了保证数据相对安全,在下面的设置中,更改越频繁,SNAPSHOTTING越频繁, ##也就是说,压力越大,反而花在持久化上的资源会越多。 ##所以我选择了master-slave模式,并在master关掉了SNAPSHOTTING。 save 900 1 #在900秒之内,redis至少发生1次修改则redis抓快照到磁盘 save 300 10 #在300秒之内,redis至少发生100次修改则redis抓快照到磁盘 save 60 10000 #在60秒之内,redis至少发生10000次修改则redis抓快照到磁盘 stop-writes-on-bgsave-error yes rdbcompression yes ##使用压缩 rdbchecksum yes dbfilename "dump.rdb" dir "/data/nosql/redis_4500" ## replication 设置 slave-serve-stale-data yes slave-read-only yes slave-priority 100 ###LIMIT 设置 maxmemory 256mb ##redis最大可使用的内存量,如果使用redis SNAPSHOTTING的copy-on-write的持久会写方式,会额外的使用内存, ##为了使持久会操作不会使用系统VM,使redis服务器性能下降,建议保留redis最大使用内存的一半来留给持久化使用 maxmemory-policy allkeys-lru ##使用LRU算法删除设置了过期时间的key,但如果程序写的时间没有写key的过期时间 ##建议使用allkeys-lru,这样至少保证redis不会不可写入 ##append only mode设置 appendonly no appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 ###slow log 设置 slowlog-log-slower-than 10000 slowlog-max-len 128 ##advanced config设置,下面的设置主要是用来节省内存的 hash-max-ziplist-entries 1024 hash-max-ziplist-value 2048 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 |