redis运维工具
redis运维工具
一、Redis 集群常用命令
1.集群(cluster)
CLUSTER INFO #打印集群的信息
CLUSTER NODES #列出集群当前已知的所有节点(node),以及这些节点的相关信息。
2.节点(node)
CLUSTER MEET <ip> <port> #将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> #从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> #将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG #将节点的配置文件保存到硬盘里面。
3.槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] #将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] #移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS #移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id>
#将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> #将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> #从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE #取消对槽 slot 的导入(import)或者迁移(migrate)。
4.键 (key)
CLUSTER KEYSLOT <key> #计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> #返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> #返回 count 个 slot 槽中的键。
二、Redis 运维工具
1.数据导入导出工具
需求背景
刚切换到 redis集群的时候肯定会面临数据导入的问题,所以这里推荐使用 redis-migrate-tool 工具来导 入单节点数据到集群里
官方地址:
http://www.oschina.net/p/redis-migrate-tool
# 1.安装工具
yum install libtool autoconf automake git bzip2 -y
cd /opt/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install
# 2.编写配置文件
cat > 6379_to_6380.conf << EOF
[source]
type: single
servers:
- 10.0.0.51:6379
[target]
type: redis cluster
servers:
- 10.0.0.51:6380
[common]
listen: 0.0.0.0:8888
source_safe: true
EOF
# 3.单节点生成测试数据
redis-server /opt/redis_6379/conf/redis_6379.conf
cat >input_6379.sh<<EOF
#!/bin/bash
for i in {1..1000}
do
redis-cli -c -h db01 -p 6379 set oldzhang_\${i} oldzhang_\${i}
echo "set oldzhang_\${i} is ok"
done
EOF
sh input_6379.sh
# 4.运行工具迁移单节点数据到集群
redis-migrate-tool -c 6379_to_6380.conf
# 5.运行工具验证数据是否迁移完成
redis-migrate-tool -c 6379_to_6380.conf -C redis_check
# 6.数据平均
redis-cli -c -h 10.0.0.51 -p 6380
db01:6380>
337)
db02:6380>
340)
db03:6380>
329)
注意主从关系 如果51:6379是从库 测试数据写不进去 重新指向主库
2.RDB文件迁移到集群
# 1.先把集群的RDB文件都收集起来
- 在从节点上执行bgsave命令生成RDB文件
redis-cli -h 10.0.0.51 -p 6381 BGSAVE
redis-cli -h 10.0.0.52 -p 6381 BGSAVE
redis-cli -h 10.0.0.53 -p 6381 BGSAVE
# 2.把从节点生成的RDB文件拉取过来
mkdir rdb_backup
cd rdb_backup/
scp 10.0.0.51:/data/redis_6381/redis_6381.rdb db01_6381.rdb
scp 10.0.0.52:/data/redis_6381/redis_6381.rdb db02_6381.rdb
scp 10.0.0.53:/data/redis_6381/redis_6381.rdb db03_6381.rdb
# 3.清空数据
redis-cli -c -h 10.0.0.51 -p 6380 flushall
redis-cli -c -h 10.0.0.52 -p 6380 flushall
redis-cli -c -h 10.0.0.53 -p 6380 flushall
# 4.编写配置文件
cat >rdb_to_cluter.conf <<EOF
[source]
type: rdb file
servers:
- /root/rdb_backup/db01_6381.rdb
- /root/rdb_backup/db02_6381.rdb
- /root/rdb_backup/db03_6381.rdb
[target]
type: redis cluster
servers:
- 10.0.0.51:6380
[common]
listen: 0.0.0.0:8888
source_safe: true
EOF
# 5.使用工具导入
redis-migrate-tool -c rdb_to_cluter.conf
# 6.运行工具验证数据是否迁移完成
redis-migrate-tool -c 6379_to_6380.conf -C redis_check
# 7.数据平均
redis-cli -c -h 10.0.0.51 -p 6380
db01:6380>
337)
db02:6380>
340)
db03:6380>
329)
3.分析键值大小
**需求背景 **
redis 的内存使用太大键值太多,不知道哪些键值占用的容量比较大,而且在线分析会影响性能.
# 1.安装命令:
[root@db01 ~]# yum install python-pip gcc python-devel -y
[root@db01 ~]# cd /opt/
[root@db01 ~]# git clone https://github.com/sripathikrishnan/redis-rdb-tools
[root@db01 ~]# cd redis-rdb-tools
[root@db01 ~]# pip install python-lzf
[root@db01 ~]# python setup.py install
# 2.生成测试数据:
[root@db01 ~]# vim txt.txt
乱七八糟写进去
[root@db01 ~]# redis-cli -h db01 -p 6379 set txt $(cat txt.txt)
# 3.执行bgsave生成rdb文件
[root@db01 ~]# redis-cli -h db01 -p 6379 BGSAVE
# 4.使用工具分析:
[root@db01 ~]# cd /data/redis_6379/
[root@db01 /data/redis_6379]# rdb -c memory redis_6379.rdb -f redis_6379.rdb.csv
[root@db01 /data/redis_6379]# ll
-rw-r--r-- 1 root root 39010 Jan 3 16:46 redis_6379.rdb.csv
# 5.过滤分析
[root@db01 /data/redis_6379]# awk -F"," '{print $4,$3}' redis_6379.rdb.csv |sort -r
1328 txt
# 6.将结果整理汇报给领导,询问开发这个key是否可以删除
一些其他工具
# 使用工具将rdb转换成json
[root@db01 /data/redis_6379]# rdb --command json redis_6379.rdb -f redis_6379.rdb.json
[root@db01 /data/redis_6379]# ll
total 208
-rw-r--r-- 1 root root 103018 Jan 3 16:45 redis_6379.aof
-rw-r--r-- 1 root root 26895 Jan 3 16:45 redis_6379.rdb
-rw-r--r-- 1 root root 39010 Jan 3 16:46 redis_6379.rdb.csv
-rw-r--r-- 1 root root 32852 Jan 3 16:53 redis_6379.rdb.json
# 使用工具对比rdb文件差异
[root@db01 /data/redis_6379]# cd /root/rdb_backup
[root@db01 ~/rdb_backup]# rdb --command diff db01_6381.rdb | sort > dump1.txt
[root@db01 ~/rdb_backup]# rdb --command diff db02_6381.rdb | sort > dump2.txt
[root@db01 ~/rdb_backup]# vimdiff dump1.txt dump2.txt
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 10.0.0.51 -p 6380 SCAN ${key_num} match ${line}\* count
1000|awk 'NR==1{print $0}')
key_name=$(redis-cli -h 10.0.0.51 -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
三、内存管理参数
当达到内存使用限制之后redis会出发对应的控制策略
redis支持6种策略:
# 1.noevicition
默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息,此时只响应读操作
# 2.volatile-lru
根据LRU算法删除设置了超时属性的key,直到腾出足够空间为止,如果没有可删除的key,则退回到noevicition策略
# 3.allkeys-lru
根据LRU算法删除key,不管数据有没有设置超时属性
# 4.allkeys-random
随机删除所有key
# 5.volatile-random
随机删除过期key
# 6.volatile-ttl
根据key的ttl,删除最近要过期的key
# 动态配置
config set maxmemory-policy
# 设置内存最大限制
config set maxmemory 2G