ETCD 压力测试脚本

#!/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}"

相关推荐
S1998_1997111609•X33 分钟前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
KmSH8umpK1 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第七篇
数据库·redis·分布式
BU摆烂会噶2 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain
l1t3 小时前
DeepSeek总结的DuckLake 入门
数据库
Joseph Cooper3 小时前
RAG 与 AI Agent:智能体真的需要检索增强生成吗?
数据库·人工智能·ai·agent·rag·上下文工程
light blue bird3 小时前
主子端台二分法任务汇总组件
前端·数据库·.net·桌面端winform
DevilSeagull4 小时前
MySQL(2) 客户端工具和建库
开发语言·数据库·后端·mysql·服务
小李来了!4 小时前
Navicate/plsql连接Oracle数据库教程
数据库·oracle
苍煜4 小时前
慢SQL优化实战教学
java·数据库·sql
zhaoyong2225 小时前
MySQL 存储过程中字符集与排序规则不匹配导致查询性能下降的解决方案
jvm·数据库·python