#!/bin/bash
etcd 集群手动性能压测
用途:使用基本的 put/get 命令进行性能测试
set -e
ENDPOINTS=""
ETCD_USER=""
ETCD_PASSWORD=""
颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
echo -e "{BLUE}╔════════════════════════════════════════╗{NC}"
echo -e "{BLUE}║ etcd 集群性能压测(手动模式) ║{NC}"
echo -e "{BLUE}╚════════════════════════════════════════╝{NC}"
echo ""
检测是否启用了认证
echo -e "{CYAN}检查是否启用认证...{NC}"
if docker exec etcd1 etcdctl --endpoints=${ENDPOINTS} get /test 2>&1 | grep -q "user name is empty"; then
echo -e "{YELLOW}检测到已启用认证{NC}"
AUTH_PARAMS="--user={ETCD_USER}:{ETCD_PASSWORD}"
else
echo -e "{YELLOW}未启用认证{NC}"
AUTH_PARAMS=""
fi
echo ""
测试 1: 写入性能测试
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{GREEN}测试 1: 写入性能测试{NC}"
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{CYAN}写入 1000 个 key-value 对...{NC}"
START_TIME=$(date +%s.%N)
for i in {1..1000}; do
docker exec etcd1 etcdctl put \
--endpoints=${ENDPOINTS} \
${AUTH_PARAMS} \
/benchmark/test/key{i} "value{i}" > /dev/null 2>&1
每 100 个显示一次进度
if [ $((i % 100)) -eq 0 ]; then
echo -ne "\r{YELLOW}进度: {i}/1000${NC}"
fi
done
END_TIME=$(date +%s.%N)
DURATION=(echo "END_TIME - $START_TIME" | bc)
QPS=(echo "scale=2; 1000 / DURATION" | bc)
echo -ne "\r"
echo -e "{GREEN}✓ 写入完成{NC}"
echo -e " 总耗时: ${DURATION} 秒"
echo -e " QPS: ${QPS} 次/秒"
echo ""
sleep 1
测试 2: 单点读性能测试
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{GREEN}测试 2: 单点读性能测试{NC}"
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{CYAN}读取 1000 次...{NC}"
START_TIME=$(date +%s.%N)
for i in {1..1000}; do
docker exec etcd1 etcdctl get \
--endpoints=${ENDPOINTS} \
${AUTH_PARAMS} \
/benchmark/test/key${i} > /dev/null 2>&1
if [ $((i % 100)) -eq 0 ]; then
echo -ne "\r{YELLOW}进度: {i}/1000${NC}"
fi
done
END_TIME=$(date +%s.%N)
DURATION=(echo "END_TIME - $START_TIME" | bc)
QPS=(echo "scale=2; 1000 / DURATION" | bc)
echo -ne "\r"
echo -e "{GREEN}✓ 读取完成{NC}"
echo -e " 总耗时: ${DURATION} 秒"
echo -e " QPS: ${QPS} 次/秒"
echo ""
sleep 1
测试 3: 范围查询性能
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{GREEN}测试 3: 范围查询性能测试{NC}"
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{CYAN}执行 100 次前缀查询...{NC}"
START_TIME=$(date +%s.%N)
for i in {1..100}; do
docker exec etcd1 etcdctl get \
--endpoints=${ENDPOINTS} \
${AUTH_PARAMS} \
--prefix \
/benchmark/test/ > /dev/null 2>&1
if [ $((i % 10)) -eq 0 ]; then
echo -ne "\r{YELLOW}进度: {i}/100${NC}"
fi
done
END_TIME=$(date +%s.%N)
DURATION=(echo "END_TIME - $START_TIME" | bc)
QPS=(echo "scale=2; 100 / DURATION" | bc)
echo -ne "\r"
echo -e "{GREEN}✓ 范围查询完成{NC}"
echo -e " 总耗时: ${DURATION} 秒"
echo -e " QPS: ${QPS} 次/秒"
echo ""
sleep 1
测试 4: 删除性能
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{GREEN}测试 4: 删除性能测试{NC}"
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{CYAN}删除 1000 个 key...{NC}"
START_TIME=$(date +%s.%N)
for i in {1..1000}; do
docker exec etcd1 etcdctl del \
--endpoints=${ENDPOINTS} \
${AUTH_PARAMS} \
/benchmark/test/key${i} > /dev/null 2>&1
if [ $((i % 100)) -eq 0 ]; then
echo -ne "\r{YELLOW}进度: {i}/1000${NC}"
fi
done
END_TIME=$(date +%s.%N)
DURATION=(echo "END_TIME - $START_TIME" | bc)
QPS=(echo "scale=2; 1000 / DURATION" | bc)
echo -ne "\r"
echo -e "{GREEN}✓ 删除完成{NC}"
echo -e " 总耗时: ${DURATION} 秒"
echo -e " QPS: ${QPS} 次/秒"
echo ""
显示集群状态
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo -e "{GREEN}测试完成 - 集群状态{NC}"
echo -e "{GREEN}═══════════════════════════════════════{NC}"
echo ""
echo -e "{CYAN}集群健康:{NC}"
docker exec etcd1 etcdctl --endpoints={ENDPOINTS} {AUTH_PARAMS} endpoint health
echo ""
echo -e "{CYAN}集群状态:{NC}"
docker exec etcd1 etcdctl --endpoints={ENDPOINTS} {AUTH_PARAMS} endpoint status -w table
echo ""
echo -e "{CYAN}数据库大小:{NC}"
docker exec etcd1 etcdctl --endpoints={ENDPOINTS} {AUTH_PARAMS} endpoint status --write-out=json | \
jq -r '.[] | "\(.Endpoint): \(.Status.dbSize / 1024 / 1024 | floor)MB"' 2>/dev/null || \
docker exec etcd1 etcdctl --endpoints={ENDPOINTS} {AUTH_PARAMS} endpoint status
echo ""
echo -e "{GREEN}════════════════════════════════════════{NC}"
echo -e "{GREEN}所有测试完成!{NC}"
echo -e "{GREEN}════════════════════════════════════════{NC}"