技术开发 频道

Redis数据库在新浪微博中的应用

  3.一些技巧分享

  很多应用, 可以承受数据库连接失败, 但不能承受处理慢。一份数据, 多份索引。解决IO瓶颈的唯一途径: 用内存。在数据量变化不大的情况下,优先选用Redis。

  遇到的问题及解决办法

  1.Problem: Replication中断后, 重发-->网络突发流量

  Solution: 重写Replication代码, rdb+aof(滚动)

  2.Problem: 容量问题

  Solution: 容量规划和M/S的sharding功能增加一些配置, 分流, 比如: 四台机器,机器1处理%2=1的, 机器2处理%2=0的.低于内存的1/2使用量, 否则就扩容。我们线上96G/128G内存服务器不建议单实例容量大于20/30G。微博应用中单表数据最高的有2T的数据,不过应用起来已经有些力不从心。每个的端口不要超过20G。测试磁盘做save所需要的时间,需要多长时间能够全部写入。内存越大,写的时间也就越长。单实例内存容量较大后,直接带来的问题就是故障恢复或者Rebuild从库的时候时间较长,对于普通硬盘的加载速度而言,我们的经验一般是redis加载1G需要1分钟。Redis rewrite aof和save rdb时,将会带来非常大且长的系统压力,并占用额外内存,很可能导致系统内存不足等严重影响性能的线上故障。

  reblance: 现有数据按照上述配置重新分发。后面使用中间层,路由HA;注:目前官方也正在做这个事,Redis Cluster,解决HA问题。

  3.Problem: bgsave or bgwriteaof的冰晶问题

  Solution: 磁盘性能规划和限制写入的速度, 比如: 规定磁盘以200M/s的速度写入, 细水长流, 即使到来大量数据. 但是要注意写入速度要满足两个客观限制:符合磁盘速度符合时间限制。

  4.Problem: 运维问题

  Inner Crontab: 能做到把Crontab迁移到Redis内部, 减少迁移时候的压力本机多端口避免同时做,做不到同一业务多端口(分布在多机上), 避免同时做。

  动态升级: 先加载.so文件, 再管理配置, 切换到新代码上把对redis改进的东西都打包成lib.so文件,这样能够支持动态升级自己改的时候要考虑社区的升级。当社区有新的版本,有很好用的新功能时,要能很容易的与我们改进后的版本很好的merge。升级的前提条件是模块化。以模块为单位升级加载时间取决于两个方面: 数据大小,数据结构复杂度。 一般, 40G数据耗时40分钟分布式系统的两个核心问题:一是路由问题,二是HA问题。

  危险命令的处理: 比如: fresh all删除全部数据, 得进行控制运维不能只讲数据备份,还得考虑数据恢复所需要的时间。增加权限认证eg:flashall 权限认证,得有密码才能做。当然,高速数据交互一般都不会在每次都进行权限认证,通用的处理策略是第一次认证,后期都不用再认证。控制hash策略没有key, 就找不到value。不知道hash策略, 就无法得到key。

  Config Dump:内存中的配置项动态修改过, 按照一定策略写入到磁盘中。

  bgsave带来aof写入很慢:fdatasync在做bgsave时, 不做sync aof。

  成本问题:Redisscounter全部变为整型存储, 其余全不要。Redis+SSD顺序自增, table按照顺序写, 写满10个table就自动落地。存储分级: 内存分配问题, 10K和100K写到一块, 会有碎片. Sina已经优化到浪费只占5%以内。

  5.Problem: 分布式问题

  1.Config Server: 命名空间, 特别大的告诉访问, 都不适合用代理, 因为代理降低速度, 但是, Sina用了Config Server放到Zookeeper上最前面是命名服务,后面跟的是无状态的twmemproxy,后面才是Redis。 2.twmemproxy应用不必关心连接失败, 由代理负责重连把Hash算法放到代理商代理后边的升级, 前端不关心, 解决了HA的问题无状态, 多台代理无所谓3.AS --> Proxy -->Redis4.Sina的Redis都是单机版, 而Redis-Cluster交互过于复杂,没有使用做HA的话,一定要配合监控来做,如果挂了之后,后续该如何做;并不是追求单机性能,而是集群的吞吐量,从而可以支持无线扩展。

  经验总结

  提前做好数据量的规划, 减少sharding。只存精细化数据。存储用户维度的数据对象维度的数据要有生命周期特别是数据量特别大的时候,就很有必要来进行划分了。暴露服务的常见过程: IP-->负载均衡-->域名-->命名服务。对于硬件消耗,IO、网络和CPU相比,Redis最消耗的是CPU,复杂的数据类型必定带来CPU消耗。新浪微博响应时间超时目前设置为5s。备份的数据要定期要跑一下生产的数据,用来检查备份数据的有效性。slave挂多了肯定会对master造成比较的影响;新浪微博目前使用的M/S是一拖一,主要用来做容灾;同步时,是fork出一个单独进程来和slave进行同步;不会占用查询的进程。升级到2.6.30以后的linux内核;在2.6.30以上对软中断的问题处理的很好,性能提升效果明显,差不多有15%到30%的差距。Redis不用读写分离,每个请求都是单线程,为什么要进行读写分离。

  更多精彩尽在2014年4月10日-12日在北京五洲皇冠国际酒店举办的第五届中国数据库技术大会,2月29日之前订票可享受7.8折最低票价

Facebook专家:Hadoop不足以处理大数据
▲进入官网了解更多详情

0
相关文章