Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111020
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 397
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-26 15:36
文章分类

全部博文(29)

文章存档

2016年(3)

2015年(13)

2014年(13)

我的朋友

分类: 系统运维

2014-12-31 15:41:11

redis 系统管理

 
参考:http://dmouse.iteye.com/blog/811455

#redis-server:Redis 服务器的daemon启动程序
#redis-cli:Redis 命令行操作工具。 当然,你也可以用telnet 根据其纯文本协议来操作
#redis-benchmark:Redis 性能测试工具, 测试Redis 在你的系统及你的配置下的读写性能
$redis-benchmark -n 100000 –c 50 #模拟同时由50 个客户端发送100000 个SETs/GETs 查询
#redis-check-aof: 更新日志检查
#redis-check-dump: 本地数据库检查


[root@redis3 6379]#  redis-benchmark -h localhost -p 6379 -c 100 -n 100000
100个并发连接,100000个请求,检测host为localhost 端口为6379的redis服务器性能
 
redis-cli redis-cli -h localhost -p 6380 monitor
Dump all the received requests in real time;
监控host为localhost,端口为6380,redis的连接及读写操作
[root@Architect redis-1.2.6]# redis-cli -h localhost -p 6380 monitor
+OK
 
redis-cli -h localhost -p 6380 info
Provide information and statistics about the server ;
提供host为localhost,端口为6380,redis服务的统计信息
[root@Architect redis-1.2.6]# redis-cli -h localhost -p 6380 info
redis_version:2.0.4
redis_git_sha1:00000000
 
redis-stat redis-stat host localhost port 6380 overview
Print general information about a Redis instance;
实时打印出host为localhost,端口为6380,redis实例的总体信息
[root@Architect redis-1.2.6]# redis-stat port 6380 overview
 ------- data ------ ------------ load ----------------------------- - childs -
 keys      used-mem  clients   requests            connections
 1319      5.37M     103       44108021 (+44108021) 810              
 1319      5.38M     103       44108124 (+103)     810              
 1319      5.38M     103       44108225 (+101)     810              
 1319      5.39M     103       44108326 (+101)     810              
 1319      5.40M     103       44108427 (+101)     810              
 1319      5.41M     103       44108528 (+101)     810           
   
redis-stat host localhost port 6380 overview
Measure Redis server latency;
输出host为localhost,端口为6380,redis服务中每个请求的响应时长
[root@Architect redis-1.2.6]# redis-stat port 6380 latency
1: 0.16 ms
2: 0.11 ms
3: 0.15 ms
4: 0.11 ms
5: 0.18 ms
6: 0.14 ms       
 

redis 系统管理相关指令简介
DBSIZE 返回当前数据库key的数量。
INFO 返回当前redis 服务器状态和一些统计信息。
MONITOR 实时监听并返回redis服务器接收到的所有请求信息。
SHUTDOWN 把数据同步保存到磁盘上,并关闭redis服务。
CONFIG GET parameter 获取一个redis配置参数信息。(个别参数可能无法获取)
CONFIG SET parameter value 设置一个redis配置参数信息。(个别参数可能无法获取)
CONFIG RESETSTAT 重置INFO 命令的统计信息。(重置包括:Keyspace 命中数、Keyspace 错误数、处理命令数,接收连接数、过期key 数)
DEBUG OBJECT key 获取一个key 的调试信息。
DEBUG SEGFAULT 制造一次服务器当机。
FLUSHDB 删除当前数据库中所有key,此方法不会失败。小心慎用
FLUSHALL 删除全部数据库中所有key,此方法不会失败。小心慎用
Save 将数据同步保存到磁盘
Bgsave 将数据异步保存到磁盘
Lastsave 返回上次成功将数据保存到磁盘的Unix时戳
Shundown 将数据同步保存到磁盘,然后关闭服务




 
b)系统管理指令
 
redis 127.0.0.1:6379> info  #查看server版本内存使用连接等信息
 
redis 127.0.0.1:6379> client list  #获取客户连接列表
 
redis 127.0.0.1:6379> client kill 127.0.0.1:33441 #终止某个客户端连接
 
redis 127.0.0.1:6379> dbsize #当前保存key的数量
 
redis 127.0.0.1:6379> save #立即保存数据到硬盘
 
redis 127.0.0.1:6379> bgsave #异步保存数据到硬盘
 
redis 127.0.0.1:6379> flushdb #当前库中移除所有key
 
redis 127.0.0.1:6379> flushall #移除所有key从所有库中
 
redis 127.0.0.1:6379> lastsave #获取上次成功保存到硬盘的unix时间戳
 
redis 127.0.0.1:6379> monitor #实时监测服务器接收到的请求
 
redis 127.0.0.1:6379> slowlog len #查询慢查询日志条数
(integer) 3
 
redis 127.0.0.1:6379> slowlog get #返回所有的慢查询日志,最大值取决于slowlog-max-len配置
 
redis 127.0.0.1:6379> slowlog get 2 #打印两条慢查询日志
 
redis 127.0.0.1:6379> slowlog reset #清空慢查询日志信息
 

 
持久化
 
通常Redis 将数据存储在内存中或虚拟内存中,它是通过以下两种方式实现对数据的持久化。
 
          快照方式:(默认持久化方式)
   这种方式就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。客户端也可以使用save 或者bgsave 命令通知redis 做一次快照持久化。save 操作是在主线程中保存快照的,由于redis 是用一个主线程来处理所有客户端的请求,这种方式会阻塞所有客户端请求。所以不推荐使用。另一点需要注意的是,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。如果数据量大的话,写操作会比较
多,必然会引起大量的磁盘IO 操作,可能会严重影响性能。
   注意:由于快照方式是在一定间隔时间做一次的,所以如果redis 意外当机的话,就会丢失最后一次快照后的所有数据修改。
 
          日志追加方式:
 
    这种方式redis 会将每一个收到的写命令都通过write 函数追加到文件中(默认appendonly.aof)。当redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于操作系统会在内核中缓存write 做的修改,所以可能不是立即写到磁盘上。这样的持久化还是有可能会丢失部分修改。不过我们可以通过配置文件告诉
redis 我们想要通过fsync 函数强制操作系统写入到磁盘的时机。有三种方式如下(默认是:每秒fsync 一次)
appendonly yes //启用日志追加持久化方式
#appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
#appendfsync no //完全依赖操作系统,性能最好,持久化没保证
   日志追加方式同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用incr test 命令100 次,文件中必须保存全部100 条命令,其实有99 条都是多余的。因为要恢复数据库状态其实文件中保存一条set test 100 就够了。为了压缩这种持久化方式的日志文件。redis 提供了bgrewriteaof命令。收到此命令redis 将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中,最后替换原来的持久化日志文件。
 
 
 虚拟内存(适用于value 比key 大的情况)
 
 
 Redis 虚拟内存简介
   首先说明下redis 的虚拟内存与操作系统虚拟内存不是一码事,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间。对于redis 这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis 服务器以外。另外的能够提高数据库容量的办法就是使用虚拟内存技术把那些不经常访问的数据交换到磁盘上。如果我们存储的数据总是有少部分数据被经常访问,大部分数据很少被访问,对于网站来说确实总是只有少量用户经常活跃。当少量数据被经常访问时,使用虚拟内存不但能提高单台redis 数据库服务器的容量,而且也不会对性能造成太多影响。
 
    redis 没有使用操作系统提供的虚拟内存机制而是自己在用户态实现了自己的虚拟内存机制。
 
主要的理由有以下两点:
 
1. 操作系统的虚拟内存是以4k/页为最小单位进行交换的。而redis 的大多数对象都远小于4k,所以一个操作系统页上可能有多个redis 对象。另外redis 的集合对象类型如list,set 可能存在于多个操作系统页上。最终可能造成只有10%的key 被经常访问,但是所有操作系统页都会被操作系统认为是活跃的,这样只有内存真正耗尽时操作系统才会进行页的交换。
 
2. 相比操作系统的交换方式。redis 可以将被交换到磁盘的对象进行压缩,保存到磁盘的对象可以去除指针和对象元数据信息。一般压缩后的对象会比内存中的对象小10 倍。这样redis 的虚拟内存会比操作系统的虚拟内存少做很多IO 操作。
 
 
 
Redis被bgsave和bgrewriteaof阻塞的解决方法
 
Redis 的持久化在两种方式: Snapshotting(快照) 和 Append-only file(aof). 在一个采用了 aof 模式的 Redis 服务器上, 当执行 bgrewriteaof 对 aof 进行归并优化时, 出现了 Redis 被阻塞的问题, 此时, Redis 无法提供任何读取和写入操作.
 
按字面理解, bgrewriteaof 是在后台进行操作, 不应该影响 Redis 的正常服务. 原理也确实是这样的, Redis 首先 fork 一个子进程, 并在该子进程里进行归并和写持久化存储设备(如硬盘)的. 按照正常逻辑, 在一台多核的机器上, 即使子进程占满 CPU 和硬盘, 也不应该导致 Redis 服务阻塞啊!
 
其实, 问题就出在硬盘上.
 
Redis 服务设置了 appendfsync everysec, 主进程每秒钟便会调用 fsync(), 要求内核将数据”确实”写到存储硬件里. 但由于子进程同时也在写硬盘, 从而导致主进程 fsync()/write() 操作被阻塞, 最终导致 Redis 主进程阻塞了.
 
解决方法便是设置 no-appendfsync-on-rewrite yes, 在子进程处理和写硬盘时, 主进程不调用 fsync() 操作. 注意, 即使进程不调用 fsync(), 系统内核也会根据自己的算法在适当的时机将数据写到硬盘(Linux 默认最长不超过 30 秒).





阅读(1370) | 评论(0) | 转发(0) |
0

上一篇: LAMP 架构搭建

下一篇:Nginx+Mysql+PHP

给主人留下些什么吧!~~