博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis详解(四)
阅读量:6497 次
发布时间:2019-06-24

本文共 8573 字,大约阅读时间需要 28 分钟。

一、Redis常见问题处理二、Reids主从版本案例分享三、Redis集群版参考四、Redis性能测试五、Redis监控指标六、Redis产品设计理念

一、Redis常见问题处理

1.1 Redis获取所有的key和value

#!/bin/bash#登陆方式log="/home/admin/redis-2.8.17/src/redis-cli -a adeafgsd231234 -h 10.0.53.126  -p 6379"#获取db_numdb_num=$($log info Keyspace |grep db |wc -l )db_save=$($log info Keyspace |grep db   |awk -F"[b|:]" '{print $2}' )echo "the db have at least values is $db_save ..."echo "\n"echo "================Begin================================="lunxun_db() {for i  in $(echo "keys *" | $log -n $1| awk -F"\"" '{print $1}') ;    do        value=$(echo "get $i" | $log -n $1 );        echo -e  "key:$i\t values:$value" ;done}for fix in $($log info Keyspace |grep db   |awk -F"[b|:]" '{print $2}' ); do     echo -e "\n"    echo -e "the key-value of $fix is ..."    echo -e "==============================================="    lunxun_db $fix     echo done

或者使用可视化工具:

1.2 Redis访问慢

查看redis.log

查看info信息
connected_clients:162
used_memory_human:40.16G
used_memory_peak_human:40.19G
键数量:17495840 ,499key/ms
slowlog:/opt/csr/kvstore/bin/redis-cli -p port slowlog get 100
很多LREM的,需要修改业务代码 //左侧remove后面的数据需要重新排列,建议从右侧删除提高性能
默认的数据类型是list。测试发现对于数据量大的list结构在删除单个ID时性能非常差。建议将索引的数据类型强制设置为set结构。

127.0.0.1:6379> CONFIG GET slowlog-log-slower-than127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 100000127.0.0.1:6379> CONFIG SET slowlog-max-len 1000127.0.0.1:6379> SLOWLOG LEN //查看slowlog总条数127.0.0.1:6379> SLOWLOG GET //查看slowlog

1.3 appendonly.aof占满磁盘空间

直接echo,对新写入的数据会重新aof,但是如果此时redis挂了就不能及时恢复了

1.4 Jedis常见问题

Jedis就是集成了redis的一些命令操作,封装了redis的java客户端。

参考:

二、Reids主从版本案例分享

需求:固定Master地址

架构模型:VIP-->负载均衡-->Primarty/[Slave1,Slave2]

2.1 Master配置

bind地址为192.168.1.16;slaveof 没有这个配置,其他和Slave1配置一样

2.2 Slave1配置

1)redis.conf

daemonize yespidfile "/var/run/redis.pid"port 6379tcp-backlog 1024bind 192.168.1.15timeout 0tcp-keepalive 0loglevel noticelogfile "redis.log"databases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename "dump.rdb"dir "/home/admin"masterauth "testforauth"slave-serve-stale-data yesslave-read-only yesrepl-disable-tcp-nodelay noslave-priority 100requirepass "testforauth"maxclients 30000appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yesslaveof 192.168.1.11 6379

2)redis-sentinel配置

port 26379dir "/tmp"sentinel monitor redis_cluster 192.168.1.11 6379 2sentinel down-after-milliseconds redis_cluster 5000sentinel failover-timeout redis_cluster 15000sentinel auth-pass redis_cluster adeafgsd231234sentinel config-epoch redis_cluster 5sentinel leader-epoch redis_cluster 5sentinel known-slave redis_cluster 192.168.1.15 6379sentinel known-slave redis_cluster 192.168.1.16 6379sentinel known-sentinel redis_cluster 192.168.1.15 26379 befe42471a9a7c36d5619f244b80c0ee086a660dsentinel known-sentinel redis_cluster 192.168.1.16 26379 4ed8c9c23ea17c386f90258873c185bfe9242153sentinel current-epoch 5

启动server:/home/admin/redis-$VERSION/src/redis-server /home/admin/conf/redis.conf

启动sentinel:nohup /home/admin/redis-$VERSION/src/redis-sentinel /home/admin/conf/sentinel.conf > sentinel.log 2>&1 &

2.3 Slave2配置

同Slave1配置,只是bind地址变了而已

slaveof和master一样

配置文件说明:

https://raw.githubusercontent.com/antirez/redis/4.0/redis.confhttps://raw.githubusercontent.com/antirez/redis/3.0/redis.conf https://raw.githubusercontent.com/antirez/redis/2.8/redis.confhttps://raw.githubusercontent.com/antirez/redis/2.6/redis.confhttps://raw.githubusercontent.com/antirez/redis/2.4/redis.conf

三、Redis集群版参考

参考:

四、Redis性能测试

#./redis-benchmark -hUsage: redis-benchmark [-h 
] [-p
] [-c
] [-n
[-k
] -h
Server hostname (default 127.0.0.1) -p
Server port (default 6379) -s
Server socket (overrides host and port) -a
Password for Redis Auth //密码 -c
Number of parallel connections (default 50) //并行连接 -n
Total number of requests (default 100000) //sum 请求 -d
Data size of SET/GET value in bytes (default 2) //数据大小 -dbnum
SELECT the specified db number (default 0) //指定db -k
1=keep alive 0=reconnect (default 1) //是否启用保持连接 -r
Use random keys for SET/GET/INCR, random values for SADD //随机数个数 Using this option the benchmark will expand the string __rand_int__ inside an argument with a 12 digits number in the specified range from 0 to keyspacelen-1. The substitution changes every time a command is executed. Default tests use this to hit random keys in the specified range. -P
Pipeline
requests. Default 1 (no pipeline). -e If server replies with errors, show them on stdout. (no more than 1 error per second is displayed) -q Quiet. Just show query/sec values --csv Output in CSV format -l Loop. Run the tests forever -t
Only run the comma separated list of tests. The test names are the same as the ones produced as output. -I Idle mode. Just open N idle connections and wait.Examples: Run the benchmark with the default configuration against 127.0.0.1:6379: $ redis-benchmark Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1: //并行20,共100k请求 $ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20 Fill 127.0.0.1:6379 with about 1 million keys only using the SET test: // $ redis-benchmark -t set -n 1000000 -r 100000000 Benchmark 127.0.0.1:6379 for a few commands producing CSV output: $ redis-benchmark -t ping,set,get -n 100000 --csv Benchmark a specific command line: $ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0 Fill a list with 10000 random elements: $ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__ On user specified command lines __rand_int__ is replaced with a random integer with a range of values selected by the -r option.

1.主从1G和32的,集群是16G和256G的

经测试主从1G和32的的qps为9W 集群是16G和256G的qps为11w 。
2.测试案例

./redis-benchmark -h m/s实例地址 -p 6379 -c 500 -n 1000000 -r 100000 -t set,get //测试多个kset: 95k request per second Get: 94k request per second  //32G m/s  (master/slave)97K 97K //256G集群版3.加上-a后32G主从,正常的qps。主从的qps正常在8~10w,但是受环境影响较大集群8~10w*DB个数  //现场环境为256G,16c32G主从:[set]75k  [get]90k256G集群版:[set]92k [get]93k 4.调大-n 杜康上发现qps集中在其中6个db上5.调整-c 为500多开几个benchmark 开了12个benchmark值在8.8--9.5 那就是12*9.5 总数才是QPS值6.在执行lpush和lrange命令时候,所有的操作好像都集中到了一台机器,这俩命令执行的时候性能就下来了这个和redis-benchmark的实现有关,测试期间lpush只会操作一个key,所以只会打到一个节点上

redis-benchmark -h 192.168.1.1 -p 6379 -c 9000 -n 10000000 -r 100000 -t set,get

redis-benchmark -h 192.168.1.1 -p 6379 -c 9000 -n 10000000 -r 100000 -t set,get -a fuckBMC123 -e

五、Redis监控指标

Keys: 后端Redis所有db的key个数的总和,对于集群实例会汇聚后端所有的节点的数据    String: append,mget字符串登陆相关命令的调用次数    Hashes: 调用hget,hedel等操作hash类型的命令调用次数统计    Lists: 调用blpop,brpop等操作list数据类型的命令调用次数统计    Sets: 操作set数据类型的命令的调用次数    Zset: 操作set数据类型的命令的代用次数(有序)    HyperLog: 操作hyperlog数据类型的命令的调用次数    Pub/sub: 调用publish,subscribe等操作pub/sub功能的相关命令统计    Translation: 使用watch,multi,exec等事务相关的调用次数统计    Expires: 当前设置了过期数据的key的个数的总和    ExpiredKeys: 历史过期掉的Key的个数,这个值是历史过期掉的key的个数的总和,所以是不包含当前设置了过期key同时没有过期掉的值,同时他是一个历史累加值,也不是一个当前已经过期的key的个数,另外这个值如果做了一次主备切换会以新的主库为准    EvictedKeys: 历史淘汰掉的Key的个数,这个值是历史上因为内存满被淘汰掉了Key的个数的总和,所以他不是一个当前淘汰的每秒的key的个事,同时由于他是一个历史值,对于主备切换这个值会以新的主库为准    UsedMemory: 当前内存的使用值,这个值由于刚创建出来的时候有一定的元信息,所以对于主从实例这个值最小是30MB,另外对于集群实例这个数据的初始值会是30MB乘以节点数,目前最小会是200MB    InFlow: 后端Redis入口当前每秒的流量值,单位为KBytes/s    OutFlow: 后端Redis出口流量当前每秒的流量值,单位为KBytes/s    ConnCount: 当前Redis的客户端连接个数    FailedCount: 对于主从版本,目前这个值没有意义,因为客户端直接连接到后端DB,对于集群版本的实例该统计项标识Proxy到Redis的操作失败数目,包括超时、连接断开等异常引起的操作异常的数目,该值有部分版本的Redis为一个历史值,对于这种情况如果FaileCount没有增加则没有问题,目前新版本都为每秒的一个统计均值,后续会都升级成每秒的统计均值    TotalQps: 当前Redis的每秒操作次数    CpuUsage: 当前Redis后端的Cpu使用率    其他监控项:用户可以点击其他监控项查看到可以添加对不同操作命令的一个访问次数的监控,比如可以查看set每秒的次数,可以选择String监控项就可以看到set的每秒的监控项

六、Redis产品设计理念

6.1 涉及一个Redis产品需要涉及的问题

1) HA高可用组件:对Redis实例运行状态监测,如有异常主动进行主备切换,保证高可用
2) 备份系统:对落盘文件进行备份,建议使用三备份文件系统存储
3) 任务流控制系统:对Redis整个生命周期管理,包括创建,释放,变更配置,主备切换,健康检查等。
4) 监控系统:有一定的日志收集和处理agent,对实例性能信息收集,包括各种状态数据
5) 集群功能实现:使用开源或者自研组件对redis 分片集群机制支持。并在dns-->[db1,db2,db3,db4....],每一个dbX都是主备机制,有高可用机制

推荐站点

转载于:https://blog.51cto.com/hmtk520/2325201

你可能感兴趣的文章
条款03 尽可能使用const
查看>>
【转】那些年我们一起清除过的浮动
查看>>
python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法...
查看>>
【每天一道算法题】时间复杂度为O(n)的排序
查看>>
NLog的介绍使用
查看>>
Haproxy+Rabbitmq中的问题
查看>>
字符串变量小议
查看>>
232. Implement Queue using Stacks
查看>>
Poj(1469),二分图最大匹配
查看>>
和菜鸟一起学linux之V4L2摄像头应用流程【转】
查看>>
spin_lock、spin_lock_irq、spin_lock_irqsave区别【转】
查看>>
删除 mac 垃圾桶内清除不掉的文件
查看>>
【响应式编程的思维艺术】 (5)Angular中Rxjs的应用示例
查看>>
/bin/bash^M: bad interpreter: No such file or dire
查看>>
python xml rpc
查看>>
Java设置以及获取JavaBean私有属性进阶
查看>>
db2表结构导出导入,数据库备份
查看>>
策略模式
查看>>
第二 周作业总结
查看>>
OrderOnline——项目概述
查看>>