找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

Linux中国开源社区 技术 查看内容

江南白衣的“关于Redis的常识”

2013-06-30 22:41    收藏: 1    

6. 运维

6.1 安装

  • 安装包制作:没有现成,需要自己编译,自己写rpm包的脚本,可参考utils中的install_server.sh与redis_init_script。
    但RHEL下设定script runlevel的方式不一样,redis_init_script中要增加一句 "# chkconfig: 345 90 10" ,而install_server.sh可以删掉后面的那句“chkconfig --level 345 reis"
  • 云服务:http://garantiadata.com/ 和 http://redistogo.com/ 在Amazon和Heroku上提供云服务,供同样部署在此两者上的应用使用。
  • Chef Recipes:brianbianco/redisio,活跃,同步更新版本。

6.2 部署模型

  • Redis只能使用单线程,为了提高CPU利用率,有提议在同一台服务器上启动多个Redis实例,但这会带来严重的IO争用,除非Redis不需要持久化,或者有某种方式保证多个实例不会在同一个时间重写AOF。
  • 一组sentinel能同时监控多个Master。
  • 有提议说环形的slave结构,即master只连一个slave,然后slave再连slave,此部署有两个前提,一是有大量的只读需求需要在slave完成,二是对slave传递时的数据不一致性不敏感。

6.3 配置

对redif.conf默认配置的修改见附录1。

6.3.1 三条路

  • 可以配置文件中编写。
  • 可以在启动时的命令行配置,redis-server --port 7777 --slaveof 127.0.0.1 8888。
  • 云时代大规模部署,把配置文件满街传显然不是好的做法, 可以用redis-cli执行Config Set指令, 修改所有的参数,达到维护人员最爱的不重启服务而修改参数的效果,而且在新版本里还可以执行 Config Rewrite 将改动写回到文件中,不过全部默认值都会打印出来,可能会破坏掉原来的文件的排版,注释。

6.3.2 安全保护

  • 在配置文件里设置密码:requirepass foobar。
  • 禁止某些危险命令,比如残暴的FlushDB,将它rename成"":rename-command FLUSHDB ""。

6.4 监控与维护

综述: Redis监控技巧

6.4.1 监控指令

Info指令将返回非常丰富的信息。 着重监控检查内存使用,是否已接近上限,used_memory是Redis申请的内存,used_memory_rss是操作系统分配给Redis的物理内存,两者之间隔着碎片,隔着Swap。 还有重点监控 AOF与RDB文件的保存情况,以及master-slave的关系。Statistic 信息还包括key命中率,所有命令的执行次数,所有client连接数量等, CONFIG RESETSTAT 可重置为0。

Monitor指令可以显示Server收到的所有指令,主要用于debug,影响性能,生产环境慎用。

SlowLog 检查慢操作(见2.性能)。

6.4.2 Trouble Shooting支持

  • 日志可以动态的设置成verbose/debug模式,但不见得有更多有用的log可看,verbose还会很烦的每5秒打印当前的key情况和client情况。指令为config set loglevel verbose。
  • 最爱Redis的地方是代码只有2.3万行,而且编码优美,而且huangz同学还在原来的注释上再加上了中文注释——Redis 2.6源码中文注释版 ,所以虽然是C写的代码,虽然有十年没看过C代码,但这几天trouble shooting毫无难度,一看就懂。
  • Trobule shotting的经历证明antirez处理issue的速度非常快(如果你的issue言之有物的话),比Weblogic之类的商业支持还好。

6.4.3 三方工具

官网列出了如下工具,但暂时没发现会直接拿来用的:

  • Redis Live,基于Python的web应用,使用Info和Monitor获得系统情况和指令统计分析。 因为Monitor指令影响性能,所以建议用cron定期运行,每次偷偷采样两分钟的样子。
  • phpRedisAdmin,基于php的Web应用,目标是MysqlAdmin那样的管理工具,可以管理每一条Key的情况,但它的界面应该只适用于Key的数量不太多的情况,Demo
  • Redis Faina,基于Python的命令行,Instagram出品,用户自行获得Monitor的输出后发给它进行统计分析。由于Monitor输出的格式在Redis版本间不一样,要去github下最新版。
  • Redis-rdb-tools 基于Python的命令行,可以分析RDB文件每条Key对应value所占的大小,还可以将RDB dump成普通文本文件然后比较两个库是否一致,还可以将RDB输出成JSON格式,可能是最有用的一个了。
  • Redis Sampler,基于Ruby的命令行,antirez自己写的,统计数据分布情况。

7. Java Driver

7.1 Driver选择

各个Driver好像只有Jedis比较活跃,但也5个月没提交了,也是Java里唯一的Redis官方推荐。

Spring Data Redis的封装并不太必要,因为Jedis已足够简单,没有像Spring Data MongoDB对MongoDB java driver的封装那样大幅简化代码,顶多就是加强了一点点点pipeline和transaction状态下的coding,禁止了一些此状态下不能用的命令。而所谓屏蔽各种底层driver的差异并不太吸引人,因为我就没打算选其他几种driver。有兴趣的可以翻翻它的JedisConnection代码

所以,SpringSide直接在Jedis的基础上,按Spring的风格封装了一个JedisTemplate,负责从池中获取与归还Jedis实例,处理异常。

7.2 Jedis的细节

Jedis基于Apache Commons Pool做的连接池,默认最大连接数只有8,必须自行重新设置。

Jedis的blocking pop函数,应用执行ExecutorService.shutdownNow()中断线程时并不能把它中断,见讨论组。两个解决方法:

  • 不要用不限时的blocking popup,传多一个超时时间参数,如5秒。
  • 找地方将调用blocking popup的jedis保存起来,shutdown时主动调用它的close。

8. Windows的版本

Windows版本方便对应用的本地开发调试,但Redis并没有提供,好在微软提供了一个依赖LibUV实现兼容的补丁,https://github.com/MSOpenTech/redis,但redis作者拒绝合并到master中,微软只好苦憋的时时人工同步。 目前的稳定版是2.6版本,支持Lua脚本。

因为github现在已经没有Download服务了,所以编译好的可执行文件藏在这里:

9. 成功案例

注:下文中的链接都是网站的架构描述文档。

Twitter新浪微博, 都属于将Redis各种数据结构用得出神入化的那种,如何发布大V如奥巴马的消息是它们最头痛的问题。

Tumblr: 11亿美刀卖给Yahoo的图片日志网站,22 台Redis server,每台运行8 - 32个实例,总共100多个Redis实例在跑。有着Redis has been completely problem free and the community is great的崇高评价。Redis在里面扮演了八爪鱼多面手的角色:

  • Dashboard的海量通知的存储。
  • Dashboard的二级索引。
  • 存储海量短链接的HBase前面的缓存。
  • Gearman Job Queue的存储。
  • 正在替换另外30台memcached。

Instagram ,曾经,Redis powers their main feed, activity feed, sessions system, and other services。但可惜目前已迁往Cassandra,说新架构只需1/4的硬件费用,是的,就是那个导致Digg CTO辞职的Canssandra。

Flickr , 依然是asynchronous task system and rudimentary queueing system。之前Task system放在mysql innodb,根本,撑不住。

The Others:

  • Pinterest,混合使用MySQL、Membase与Redis作为存储。
  • StackOverflow ,2 Dell R610 Redis servers for distribute caching layer,好穷好轻量。
  • Youporn.com,100%的Redis,MySQL只用于创建新需求用到的sorted set,300K QPS的大压力。
  • 日本微信 ,Redis在前负责异步Job Queue和O(n)的数据,且作为O(n*t)数据的cache,HBase在后,负责O(n*t)数据, n是用户,t是时间。
  • Discourge,号称是为下一个十年打造的论坛系统, We use Redis for our job queue, rate limiting, as a cache and for transient data,刚好和我司的用法一样。

附录

附录1: 对redis.conf默认配置的修改

Master上

  • daemonize no -> yes ,启动daemonize模式,注意如果用daemon工具启动redis-server时设回false。
  • logfile stdout -> /var/log/redis/redis.log ,指定日志文件
  • 注释掉RDB的所有触发规则,在Master不保存RDB文件。
  • dir ./ -> /var/data/redis,指定持久化文件及临时文件目录.
  • maxmemory,设置为可用内存/2.
  • (可选)appendonly no->yes,打开AOF文件.
  • auto-aof-rewrite-percentage 100, 综合考虑硬盘大小,可接受重启加载延时等尽量的大,减少AOF rewrite频率.
  • auto-aof-rewrite-min-size 64mb,同上,起码设为5G.
  • client-output-buffer-limit slave 256mb 64mb 60. 考虑Traffic及Slave同步是RDB加载所需时间,正确设置避免buffer撑爆client被关掉后又要重新进行全同步。
  • 安全配置,可选。

Slave上

  • 设置RDB保存频率,因为RDB只作为Backup工具,只保留15分钟的规则,设置为15分钟保存一次就够了save 900 1。
  • (可选)slaveof 设置master地址,也可动态设定。
  • repl-timeout 60, 适当加大比如120,避免master实际还没倒掉就认为master倒了。

附录2:版本变更历史

  • 3.0版 2013-6-29,在公司Workshop后修订,提高wiki的可读性而不只是简单的记录知识点。
123
查看其它分页:

最新评论

我也要发表评论

收藏

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。