侯军伟:Redis新浪大运维

Redis简介:

Redis是一个key-value存储系统,它和Memcached很像,支持存储的value类型相对很多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型基本全支持push/pop、add/remove及取交集并集和差集及更丰富的操作,并且这些操作都是原子性的。以此为基础,Redis支持各种不同方式的排序。和memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且以此为基础实现了master-slave(主从)同步。

Redis 是一个高性能的key-value数据库。Redis的出现很大程度补偿了memcached这类key/value存储的不足,在多种场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。

Redis应用:

Redis的一个很大好处就是可以不用整个转入到这个数据库,而是可以沿用之前的MySQL等数据库,而仅在一些特定的应用场景通过Redis的特性提高效率。本文列出了11个这样的Web应用场景,如显示最新的项目列表、删除和过滤、排行榜等相关需求。

运维经验:

 

 

所有的机器的分配必须人工进行分配
人工分配有个问题,大部分场景下我们是将 redis 作为存储使用,所以我们没有设置 maxmemory
但是这样就引入了一个问题,一台 96G 内存的服务器,业务使用了 30G 内存,这个时候我们需要再 部署一个业务,我们能否使用这台机器剩下的内存?
引入了大量的人力成本。
通过外部的辅助系统将原来的一个需要运维人员大量参与的系统转变为一个半自动的系统,从而解放生产力

 

 

 

redis 双写
通过应   用服务器器写入两份来进行。
缺点:
1.        数据的一致性比较欠缺。
2.        当其中一台 master 挂掉之后,后续添加新的 master 进行运维成本比较高。
使用 ruby 编写,通过 NodeManager 检查 redis 服务器的状态,然后更新 zookeeper 中的列表, zookeeper 来维护当前可用服务器列表。
zk 中保存三个列表: master slaves unavailable
NodeManager 通过配置文件读取 node 列表。

每个 node 一个 NodeWatcher 线程,每隔 2 秒钟检查一次 node 的状态( syncing available unavailable
如果 node 连续 max_failures 次失败的话,设置为 unavailable
NodeWatcher   状态存放在 NodeManager 的状态 queue
NodeManager 的一个线程定期的检查 queue 中的状态,对状态进行处理:
1.unavailable
处理时判断 node 是否为 master ,如果为 master 则执行 promote_new_master 将选出新的 master 并对 剩余的 slave 执行 slaveof ,如果是 slave 的话,则从 slave 列表中移除
2.syncing
node 加入到 unavailable 列表中,并从 slave 列表中移除
3.available
判断 node 是否在当前的 available 列表中,如果不在列表中,则加入到 available 列表中。  
可以部署多个 NodeManager ,一个时间只有一个  NodeManager 处于可用状态,多个 NodeManager 注册到 zookeeper 中。  
缺点 :
1    现有代码需要进行改造,以支持通过 zookeeper 来获取可用的服务列表(有现成的客   户端)。
2    没有考虑到多机房的本地化原则(可   以通过增加客户端的判断逻辑来进行)
3    只有一个 active NodeManager 节点,如果该 NodeManager 节点的网络出现问题,则会出现误   作的现象。

你可能感兴趣的:(PHP,Cache)