10.1 运维脚本

[root@db01 ~]# cat redis_shell.sh

  1. #!/bin/bash
  2. USAG(){
  3. echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
  4. }
  5. if [ "$#" = 1 ]
  6. then
  7. REDIS_PORT='6379'
  8. elif
  9. [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
  10. then
  11. REDIS_PORT="$2"
  12. else
  13. USAG
  14. exit 0
  15. fi
  16. REDIS_IP=$(hostname -I|awk '{print $1}')
  17. PATH_DIR=/opt/redis_cluster/redis_${REDIS_PORT}/
  18. PATH_CONF=/opt/redis_cluster/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
  19. PATH_LOG=/opt/redis_cluster/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.log
  20. CMD_START(){
  21. redis-server ${PATH_CONF}
  22. }
  23. CMD_SHUTDOWN(){
  24. redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
  25. }
  26. CMD_LOGIN(){
  27. redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
  28. }
  29. CMD_PS(){
  30. ps -ef|grep redis
  31. }
  32. CMD_TAIL(){
  33. tail -f ${PATH_LOG}
  34. }
  35. case $1 in
  36. start)
  37. CMD_START
  38. CMD_PS
  39. ;;
  40. stop)
  41. CMD_SHUTDOWN
  42. CMD_PS
  43. ;;
  44. restart)
  45. CMD_START
  46. CMD_SHUTDOWN
  47. CMD_PS
  48. ;;
  49. login)
  50. CMD_LOGIN
  51. ;;
  52. ps)
  53. CMD_PS
  54. ;;
  55. tail)
  56. CMD_TAIL
  57. ;;
  58. *)
  59. USAG
  60. esac

10.2 数据导入导出工具

需求背景
刚切换到 redis 集群的时候肯定会面临数据导入的问题,所以这里推荐使用 redis-migrate-tool 工具来导 入单节点数据到集群里
官方地址:
安装工具:

  1. cd /opt/redis_cluster/
  2. git clone https://github.com/vipshop/redis-migrate-tool.git
  3. cd redis-migrate-tool/
  4. autoreconf -fvi
  5. ./configure
  6. make && make install

创建配置文件

  1. [root@db01 ~]# cat redis_6379_to_6380.conf
  2. [source]
  3. type: single
  4. servers:
  5. - 10.0.0.51:6379
  6. [target]
  7. type: redis cluster
  8. servers:
  9. - 10.0.0.51:6380
  10. [common]
  11. listen: 0.0.0.0:8888
  12. source_safe: true

生成测试数据

[root@db01 ~]# cat input_key.sh
#!/bin/bash
for i in $(seq 1 1000)
do
 redis-cli -c -h db01 -p 6379 set k_${i} v_${i} && echo "set k_${i} is ok"
done

执行导入命令

[root@db01 ~]# redis-migrate-tool -c redis_6379_to_6380.conf

数据校验

[root@db01 ~]# redis-migrate-tool -c redis_6379_to_6380.conf -C redis_check

10.3 分析键值大小

需求背景
redis 的内存使用太大键值太多,不知道哪些键值占用的容量比较大,而且在线分析会影响性能.

安装工具
yum install python-pip gcc python-devel
cd /opt/
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
python setup.py install

使用方法
cd /data/redis_cluster/redis_6380/
rdb -c memory redis_6380.rdb -f redis_6380.rdb.csv

分析 rdb 并导出
awk -F ',' '{print $4,$2,$3,$1}' redis_6380.rdb.csv |sort > 6380.txt

10.4 监控过期键

需求背景
因为开发重复提交,导致电商网站优惠卷过期时间失效
问题分析
如果一个键已经设置了过期时间,这时候在 set 这个键,过期时间就会取消
解决思路
如何在不影响机器性能的前提下批量获取需要监控键过期时间
1.Keys * 查出来匹配的键名。然后循环读取 ttl 时间
2.scan * 范围查询键名。然后循环读取 ttl 时间
Keys 重操作,会影响服务器性能,除非是不提供服务的从节点
Scan 负担小,但是需要去多次才能取完,需要写脚本

脚本内容:

cat 01get_key.sh
#!/bin/bash
key_num=0
> key_name.log

for line in $(cat key_list.txt)
do
   while true
   do
      scan_num=$(redis-cli -h 192.168.47.75 -p 6380 SCAN ${key_num} match ${line}\* count
     1000|awk 'NR==1{print $0}')
      key_name=$(redis-cli -h 192.168.47.75 -p 6380 SCAN ${key_num} match ${line}\* count
     1000|awk 'NR>1{print $0}')
      echo ${key_name}|xargs -n 1 >> key_name.log
      ((key_num=scan_num))
      if [ ${key_num} == 0 ]
      then
      break
      fi
   done
done