工具扩容节点
Redis集群的扩容操作可分为以下几个步骤
1)准备新节点
2)加入集群
3)迁移槽和数据
扩容流程图
在db01上创建2个新节点
mkdir -p /opt/redis_cluster/redis_{6390,6391}/{conf,logs,pid}
mkdir -p /data/redis_cluster/redis_{6390,6391}
cd /opt/redis_cluster/
cp redis_6380/conf/redis_6380.conf redis_6390/conf/redis_6390.conf
cp redis_6380/conf/redis_6380.conf redis_6391/conf/redis_6391.conf
sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf
<1>启动节点
bash redis_shell.sh start 6390
bash redis_shell.sh start 6391
<2>发现节点
redis-cli -c -h db01 -p 6380 cluster meet 10.0.0.51 6390
redis-cli -c -h db01 -p 6380 cluster meet 10.0.0.51 6391
<3>在db01上使用工具扩容
cd /opt/redis_cluster/redis/src//
./redis-trib.rb reshard 10.0.0.51:6380
<4>打印出进群每个节点信息后,reshard命令需要确认迁移的槽数量,这里我们输入4096
How many slots do you want to move (from 1 to 16384)? 4096
<5>输入 6390 的节点 ID 作为目标节点,也就是要扩容的节点,目标节点只能指定一个
What is the receiving node ID? xxxxxxxxx
<6>之后输入源节点的 ID,这里分别输入每个主节点的 6380 的 ID 最后输入 done,或者直接输入 all
Source node #1:all
<7>迁移完成后命令会自动退出,这时候我们查看一下集群的状态
./redis-trib.rb rebalance 10.0.0.51:6380
工具收缩节点
流程说明
(1)首先需要确定下线节点是否有负责的槽
如果是,需要把槽迁移到其他节点 ,保证节点下线后整个集群槽节点映射的完整性
(2)当下线节点不再负责槽或者本身是从节点的时候
就可以通知集群内其他节点忘记下线节点,当所有的节点忘记该节点后可以正常关闭
这里我们准备将刚才新添加的节点下线,也就是 6390 和 6391
收缩和扩容迁移的方向相反,6390 变为源节点,其他节点变为目标节点,源节点把自己负责的 4096 个槽
均匀的迁移到其他节点上,.
由于 redis-trib..rb reshard 命令只能有一个目标节点,因此需要执行 3 次 reshard 命令,分别迁移
1365,1365,1366 个槽.
操作命令:
cd /opt/redis_cluster/redis/src/
./redis-trib.rb reshard 10.0.0.51:6380
How many slots do you want to move (from 1 to 16384)? 1365
输入 6380 的 id
输入 6390 的 id
done
8.12 忘记节点
由于我们的集群是做了高可用的,所以当主节点下线的时候从节点也会顶上,所以最好我们先下线从节
点,然后在下线主节点
cd /opt/redis_cluster/redis/src/
./redis-trib.rb del-node 10.0.0.51:6391 ID
./redis-trib.rb del-node 10.0.0.51:6390 ID
Redis 集群常用命令
集群Cluster
Cluster info 打印集群的信息
Cluster nodes 列出集群当前一直的所有节点node,以及这些节点的相关信息
节点Node
cluster meet {ip} {port}将ip和port所指定的节点添加到集群中,让他成为集群中的一份子
Cluster forget 从集群中移除node_id指定的节点
Cluster replicate 将当前节点设置为node_id指定的节点的从节点
Cluster Saveconfig将节点的配置文件保存到硬盘里面·
槽slot
Cluster addslots 讲一个或多个槽指派给当前节点
Cluster delslots 移除一个或多个槽对当前节点的指派
Cluster flushslots 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点
Cluster setslot node 将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点
那么先让另一个节点删除该槽,然后再进行指派
Cluster setslot Migrating 将本节点的槽迁移到指定的节点、
Cluster setslot Importing 从node_id指定的节点中导入槽slot到本节点
Cluster setslot Stable取消对槽slot的导入import或者迁移migrate
键key
Cluster keyslot 计算键key应该被放置在哪个槽上
Cluster countkeysinslot 返回槽slot目前包含的键值对数量
Cluster getkeysinslot返回.count个slot槽中的键
数据导入导出工具
推荐使用工具: redis-migrate-tool
http://www.oschina.net/p/redis-migrate-tool
安装工具
cd /opt/redis_cluster/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install
创建配置文件
[root@db01 ~]# cat redis_6379_to_6380.conf
[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
生成测试数据
[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
执行导入命令、
redis-migrate-tool -c redis_6379_to_6380.conf
数据校验
redis-migrate-tool -c redis_6379_to_6380.conf -C redis_check
分析键值大小
需求背景
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
监控过期键
需求背景
因为开发重复提交,导致电商网站优惠卷过期时间失效
问题分析
如果一个键已经设置了过期时间,这时候在 set 这个键,过期时间就会取消
解决思路
如何在不影响机器性能的前提下批量获取需要监控键过期时间
1.Keys * 查出来匹配的键名。然后循环读取 ttl 时间
2.scan * 范围查询键名。然后循环读取 ttl 时间
Keys 重操作,会影响服务器性能,会锁服务器,造成服务器阻塞,除非是不提供服务的从节点
Scan 负担小,但是需要去多次才能取完,需要写脚本,游标迭代
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}\* count1000|awk 'NR==1{print $0}')
key_name=$(redis-cli -h 192.168.47.75 -p 6380 SCAN ${key_num} match ${line}\* count1000|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