环境介绍:
开发环境:
spring3+tomcat7+maven3+redis-3.0.7
运行环境:
Linux
前言:
项目中引入redis背景:
项目中最初将科目、打印、利润表、资产负债表、现金流量表中以及需要重复使用的相关数据都放入session中,
如果并发访问的用户过多很可能会使服务器面临宕机的危险,另外也与session的根本作用不相符(在服务端存
储用户和服务器会话的一些信息),所以就考虑到了将相关信息放到redis中。
一、什么是redis
redis是一个开源(BSD许可)的内存存储的数据结构服务器.
二、redis优缺点
优点:
1 读写性能优异(读的速度是110000次/s,写的速度是81000次/s)
2 支持数据持久化,支持AOF和RDB两种持久化方式
3 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
4 数据结构丰富:除了支持string类型的value外还支持string、hash、set、sortedset、list等数据结构。
缺点:
1 Redis具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
2 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
3 Redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
4 Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
三、redis的应用场景
1.Counting(计数)
2.Reverse cache(反向cache)
3.Top 10 list
4.Last Index
5.Relation List/Message Queue
6.Fast transaction with Lua
7.Instead of Memcache
四、如何用redis
五、头脑风暴
1、主库与从库的数据时如何传输的
从库初始化的时候(刚启动)加载主库发的快照文件(RDB文件),在向主库发送set相关命令的时候同时
也向从库发送相关命令,从而实现数据实时同步。
2、redis自动重写机制
也就是说经常说的redis重写其实是对AOF重写缓存的重写,而不是对现有AOF文件的重写。
小结
l AOF重写的目的是用更小的体积(即根据LRU原则以及去除没有用的命令,比如多次set 同一个key或者get同一个
key等)来保存数据库状态,整个重写过程基本上不影响Redis主进程处理命令请求;
l AOF重写其实是一个有歧义的名字,实际上重写工作是针对数据库的当前值来进行的,重写过程中不会读写、也不适用原来的AOF文件;
l AOF可以由用户手动触发,也可以由服务器自动触发。
3、redis存储机制
Redis存储机制分成两种Snapshot和AOF。无论是那种机制,Redis都是将数据存储在内存中。
Snapshot工作原理:
是将数据先存储在内存,然后当数据累计达到某些设定的伐值的时候,就会触发一次DUMP操作,将变化的数据一次性写入数据文件(RDB文件),即放入磁盘。
AOF 工作原理: 是将数据也是先存在内存(参照头脑风暴2)
4、redis初始化内存
默认下,redis的配置maxmemory是没有设置的。
# The default is:
# maxmemory-policy noeviction
如果设定了maxmemory,使用redis的时候,redis的内存使用量不能超过设定的值,一旦redis的内存使用量达到了最大值,redis将会尝试按照选择的eviction policy(回收策略)移除相应的keys;
如果redis不能根据回收策略移除keys,或者回收策略设置成noeviction,那么redis将对需要写操作的命令返回错误信息,如SET,LPUSH操作,对GET这样的只读操作会继续响应。
5、如何确认redis占用多大内存了;是否要设置redis内存限制
Redis的INFO – Redis命令可以查看当前内存使用情况。是需要配置maxmemory的,通常来讲实际内存达到最大内存的3/4时就要考虑加大内存或者拆分数据了。
6、master如何知道自己有多少个slave,slave如何知道哪些其他的slave是和自己同属于一个集群的
redis.conf中有一个默认设置:repl-ping-slave-period 10,即从库会按照一个时间间隔向主库发送
PINGs.可以通过repl-ping-slave-period设置这个时间间隔,默认是10秒
7、redis如何设置内存
1 # redis实例最大占用内存,不要用比设置的上限更多的内存。一旦内存使用达到上限,Redis会根据选定的回收策略(参见: 2 # maxmemmory-policy)删除key 3 maxmemory 3gb 4 5 # 最大内存策略:如果达到内存限制了,Redis如何选择删除key。你可以在下面五个行为里选: 6 # volatile-lru -> 根据LRU算法删除带有过期时间的key。 7 # allkeys-lru -> 根据LRU算法删除任何key。 8 # volatile-random -> 根据过期设置来随机删除key, 具备过期时间的key。 9 # allkeys->random -> 无差别随机删, 任何一个key。 10 # volatile-ttl -> 根据最近过期时间来删除(辅以TTL), 这是对于有过期时间的key 11 # noeviction -> 谁也不删,直接在写操作时返回错误。 12 maxmemory-policy volatile-lru
8、redis的master宕掉后的选举策略
- S_DOWN :subjectively down,直接翻译的为"主观"失效,即当前sentinel实例认为某个redis服务为"不可用"状态.
- O_DOWN :objectively down,直接翻译为"客观"失效,即多个sentinel实例都认为master处于"SDOWN"状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为"不可用",将会开启failover.
首先是要下面的条件过滤掉一些节点
一、使用如下条件筛选备选node:
1、slave节点状态处于S_DOWN,O_DOWN,DISCONNECTED的除外
2、最近一次ping应答时间不超过5倍ping的间隔(假如ping的间隔为1秒,则最近一次应答延迟不应超过5秒,redis sentinel默认为1秒)
3、info_refresh应答不超过3倍info_refresh的间隔(原理同2,redis sentinel默认为10秒)
4、slave节点与master节点失去联系的时间不能超过( (now - master->s_down_since_time) + (master->down_after_period * 10))。总体意思是说,slave节点与master同步太不及时的(比如新启动的节点),不应该参与被选举。
5、Slave priority不等于0(这个是在配置文件中指定,默认配置为100)。
1 # slave的优先级是一个整数展示在Redis的Info输出中。如果master不再正常工作了,哨兵将用它来 2 # 选择一个slave提升=升为master。 3 # 优先级数字小的salve会优先考虑提升为master,所以例如有三个slave优先级分别为10,100,25, 4 # 哨兵将挑选优先级最小数字为10的slave。 5 # 0作为一个特殊的优先级,标识这个slave不能作为master,所以一个优先级为0的slave永远不会被 6 # 哨兵挑选提升为master 7 slave-priority 100
二、从备选node中,按照如下顺序选择新的master
1、较低的slave_priority(这个是在配置文件中指定,默认配置为100)
2、较大的replication offset(每个slave在与master同步后offset自动增加)
3、较小的runid(每个redis实例,都会有一个runid,通常是一个40位的随机字符串,在redis启动时设置,重复概率非常小)
4、如果以上条件都不足以区别出唯一的节点,则会看哪个slave节点处理之前master发送的command多,就选谁。
9、redis的哨兵是如何知道master或者slave宕机的以及知道和它一起监控master的哨兵和相关的从库的信息的
分别是通过心跳机制和INFO命令
10、哨兵(sentinel)只设置一个来监控所有的redis服务器可以吗
可以,设置一个或多个都是可以的