10.1 运维脚本 [root@db01 ~]# cat redis_shell.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 #!/bin/ bash USAG ( ){ echo "sh $0 {start|stop|restart|login|ps|tail} PORT" } if [ "$#" = 1 ]then REDIS_PORT ='6379' elif [ "$#" = 2 -a -z "$(echo " $2"|sed 's#[0-9]##g')" ] then REDIS_PORT ="$2" else USAG exit 0 fi REDIS_IP =$(hostname -I|awk '{print $1}' )PATH_DIR =/opt/ redis_cluster/redis_${REDIS_PORT }/PATH_CONF =/opt/ redis_cluster/redis_${REDIS_PORT }/conf/redis_${REDIS_PORT }.conf PATH_LOG =/opt/ redis_cluster/redis_${REDIS_PORT }/logs/redis_${REDIS_PORT }.log CMD_START ( ){ redis-server ${PATH_CONF } } CMD_SHUTDOWN ( ){ redis-cli -c -h ${REDIS_IP } -p ${REDIS_PORT } shutdown } CMD_LOGIN ( ){ redis-cli -c -h ${REDIS_IP } -p ${REDIS_PORT } } CMD_PS ( ){ ps -ef|grep redis } CMD_TAIL ( ){ tail -f ${PATH_LOG } } case $1 in start) CMD_START CMD_PS ;; stop) CMD_SHUTDOWN CMD_PS ;; restart) CMD_START CMD_SHUTDOWN CMD_PS ;; login) CMD_LOGIN ;; ps) CMD_PS ;; tail) CMD_TAIL ;; *) USAG esac
10.2 数据导入导出工具 需求背景
刚切换到 redis 集群的时候肯定会面临数据导入的问题,所以这里推荐使用 redis-migrate-tool 工具来导 入单节点数据到集群里
官方地址:
安装工具:
1 2 3 4 5 6 cd /opt/redis_cluster/ git clone https : cd redis-migrate-tool/ autoreconf -fvi ./configure make && make install
创建配置文件
1 2 3 4 5 6 7 8 9 10 11 12 [root@db01 ~]# cat redis_6379_to_6380.conf [source] type : singleservers :- 10.0 .0 .51 :6379 [target] type : redis clusterservers :- 10.0 .0 .51 :6380 [common] listen : 0.0 .0 .0 :8888 source_safe : true
生成测试数据
1 2 3 4 5 6 [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
执行导入命令
1 [root@db01 ~]# redis-migrate-tool -c redis_6379_to_6380.conf
数据校验
1 [root@db01 ~]# redis-migrate-tool -c redis_6379_to_6380.conf -C redis_check
10.3 分析键值大小 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 需求背景 redis 的内存使用太大键值太多,不知道哪些键值占用的容量比较大,而且在线分析会影响性能. 安装工具 yum install python-pip gcc python-devel cd /opt/ git clone https : 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 监控过期键 1 2 3 4 需求背景 因为开发重复提交,导致电商网站优惠卷过期时间失效 问题分析 如果一个键已经设置了过期时间,这时候在 set 这个键,过期时间就会取消
1 2 3 4 5 6 解决思路 如何在不影响机器性能的前提下批量获取需要监控键过期时间 1. Keys * 查出来匹配的键名。然后循环读取 ttl 时间2. scan * 范围查询键名。然后循环读取 ttl 时间Keys 重操作,会影响服务器性能,除非是不提供服务的从节点Scan 负担小,但是需要去多次才能取完,需要写脚本
脚本内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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