twemproxy部署效率的优化实践

背景介绍

twemproxy是twitter开源出来的一款用于存储集群的反向代理。常见于Redis集群,加入了twemproxy的Redis集群其请求流程可以简化为:用户->twemproxy->Redis,用户只需要与twemproxy建立连接并发送请求,twemproxy通过配置在自身的路由表及均衡策略,将请求转发至相应后端。

本章主要记录一下实习时做的一个twemproxy批量部署脚本,其目的是节省运维人力,提升新建Redis集群速度。

一些前提

公司内的Redis集群并不是使用的纯开源的,而是基于开源代码自研的,其中就包括Redis中控(类似于开源里的sentinel)。

另外有个用于集群管理的paas平台,在使用该脚本进行部署前,已经通过平台将Redis及twemproxy配置写入了Redis中控。主要的信息包括待部署的机器ip、端口、实例路由表(Redis)

解决方案

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
#!/bin/bash
if [[ $# != 2 ]]; then
echo "usage: $0 <proxy_id> <proxy_package>"
exit 1
fi
proxy_id=$1  # 目标proxy组ID
dst_path=$2  # proxy包名,用作部署的基础包环境
base_path=$(cd `dirname $0`; pwd)
if [ ! -d "$base_path/$dst_path" ]; then  # 当前包不存在,退出
    echo "$dst_path not existed"
    exit -1
fi
cnt=$($base_path/redis/bin/redis-cli -h 10.xx.xx.xx -p xx mpget $proxy_id | sed -n '6p')
if [ ! $cnt ]; then                    # proxy组ID不存在,退出
    echo "The proxy group id $proxy_id not existed"
    exit -1
fi
str=$($base_path/redis/bin/redis-cli -h 10.xx.xx.xx -p xx mpget $proxy_id | sed -n '8p') # 从中控server获取proxy信息
i=0
while(($i<cnt))
do
    i=$(($i+1))
    proxy_ins_id=$(echo $str | cut -d , -f $i)
    echo $proxy_ins_id
    proxy_ins_st=$($base_path/redis/bin/redis-cli -h 10.xx.xx.xx -p xx mpiget $proxy_ins_id | sed  -n '6p') # 获取当前实例状态,用于容错
    echo $proxy_ins_st
    if [ 1 -eq $proxy_ins_st ]; then       # 如果当前实例已正常运行,则跳过
        echo "The proxy_ins $proxy_ins_id has running already"
        continue
    fi
    proxy_ins_ip=$($base_path/redis/bin/redis-cli -h 10.xx.xx.xx -p xx mpiget $proxy_ins_id | sed  -n '4p')
    echo $proxy_ins_ip
    ssh $proxy_ins_ip "ls /home/map/$dst_path"
    if [ $? -eq 0 ]; then                # 如果目标机器proxy目录已存在,则跳过
        echo "The /home/map/$dst_path has already existed"
        continue
    fi
    scp -r $base_path/$dst_path $proxy_ins_ip:/home/map/ # 将基础twmeproxy包分发到目的机器上
    echo "-----------------copy_done---------------"
    ssh $proxy_ins_ip "cd /home/map/$dst_path/conf && sed  -i 's/proxy_ins_id.*/proxy_ins_id: '$proxy_ins_id'/g' nutcracker.yml" # 更新路由表配置
    ssh $proxy_ins_ip "cd /home/map/$dst_path && ./nutcracker_control.sh start && sleep 1 && ./nutcracker_control.sh stats"
    echo "******************finish*****************"
done

改进思考

由于工作方向和时间上的问题,没有在twemproxy部署优化上再继续做一些更有意义的事。现在想来也有些感触,在一些问题上没有追求极致的做下去,让我感到很多遗憾。当时有了这样一个微不足道的工具,就已经让组里运维同学有了明显的释放感,但还可以做更多。

  • paas平台与部署脚本联动,当前还是手动在平台设置,再去手动执行部署脚本。但如果把部署本身置于平台内部,成为paas的功能一部分,对用户透明,不是更加方便。
  • 参考成熟的虚拟化paas平台,能够自动实现硬件资源的管理和分配。落实到我们的场景就是,不再需要人工寻找可用的机器和端口,运维同学只需要告诉平台需要的实例数目及部署地域,平台根据一定规则自动找寻可用的硬件资源并自动部署。(事实上这块在实习结束后同事们做的Redis虚拟化工作已经实现了)。