mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-11-04 19:17:46 +01:00
## Key Findings from Enhanced Logging ### Gateway Metadata Response (HEX): 00000000000000014fd297f2000d6b61666b612d6761746577617900002385000000177365617765656466732d6b61666b612d676174657761794fd297f200000001000000085f736368656d617300000000010000000000000000000100000000000000 ### Schema Registry Consumer Log Trace: ✅ [Consumer...] Assigned to partition(s): _schemas-0 ✅ [Consumer...] Seeking to beginning for all partitions ✅ [Consumer...] Seeking to AutoOffsetResetStrategy{type=earliest} offset of partition _schemas-0 ❌ NO FURTHER LOGS - STUCK IN SEEK ### Analysis: 1. Consumer successfully assigned partition 2. Consumer initiated seekToBeginning() 3. Consumer is waiting for ListOffsets response 4. 🔴 BLOCKED - timeout after 60 seconds ### Metadata Response Details: - Format: Metadata v7 (flexible) - Size: 117 bytes - Includes: 1 broker (nodeID=0x4fd297f2='O...'), _schemas topic, 1 partition - Response appears structurally correct ### Next Steps: 1. Decode full Metadata hex to verify all fields 2. Compare with real Kafka broker response 3. Check if missing critical fields blocking consumer state machine 4. Verify ListOffsets handler can receive requests
319 lines
9.5 KiB
YAML
319 lines
9.5 KiB
YAML
# SeaweedFS Kafka Client Load Test
|
|
# Tests the full stack: Kafka Clients -> SeaweedFS Kafka Gateway -> SeaweedFS MQ Broker -> Storage
|
|
|
|
x-seaweedfs-build: &seaweedfs-build
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile.seaweedfs
|
|
args:
|
|
TARGETARCH: ${GOARCH:-arm64}
|
|
CACHE_BUST: ${CACHE_BUST:-latest}
|
|
image: kafka-client-loadtest-seaweedfs
|
|
|
|
services:
|
|
# Schema Registry (for Avro/Protobuf support)
|
|
# Using host networking to connect to localhost:9093 (where our gateway advertises)
|
|
# WORKAROUND: Schema Registry hangs on empty _schemas topic during bootstrap
|
|
# Pre-create the topic first to avoid "wait to catch up" hang
|
|
schema-registry-init:
|
|
image: confluentinc/cp-kafka:8.0.0
|
|
container_name: loadtest-schema-registry-init
|
|
networks:
|
|
- kafka-loadtest-net
|
|
depends_on:
|
|
kafka-gateway:
|
|
condition: service_healthy
|
|
command: >
|
|
bash -c "
|
|
echo 'Creating _schemas topic...';
|
|
kafka-topics --create --topic _schemas --partitions 1 --replication-factor 1 --bootstrap-server kafka-gateway:9093 --if-not-exists || exit 0;
|
|
echo '_schemas topic created successfully';
|
|
"
|
|
|
|
schema-registry:
|
|
image: confluentinc/cp-schema-registry:8.0.0
|
|
container_name: loadtest-schema-registry
|
|
restart: on-failure:3
|
|
ports:
|
|
- "8081:8081"
|
|
environment:
|
|
SCHEMA_REGISTRY_HOST_NAME: schema-registry
|
|
SCHEMA_REGISTRY_HOST_PORT: 8081
|
|
SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: 'kafka-gateway:9093'
|
|
SCHEMA_REGISTRY_LISTENERS: http://0.0.0.0:8081
|
|
SCHEMA_REGISTRY_KAFKASTORE_TOPIC: _schemas
|
|
SCHEMA_REGISTRY_DEBUG: "true"
|
|
SCHEMA_REGISTRY_SCHEMA_COMPATIBILITY_LEVEL: "full"
|
|
SCHEMA_REGISTRY_LEADER_ELIGIBILITY: "true"
|
|
SCHEMA_REGISTRY_MODE: "READWRITE"
|
|
SCHEMA_REGISTRY_GROUP_ID: "schema-registry"
|
|
SCHEMA_REGISTRY_KAFKASTORE_GROUP_ID: "schema-registry"
|
|
SCHEMA_REGISTRY_KAFKASTORE_SECURITY_PROTOCOL: "PLAINTEXT"
|
|
SCHEMA_REGISTRY_KAFKASTORE_TOPIC_REPLICATION_FACTOR: "1"
|
|
SCHEMA_REGISTRY_KAFKASTORE_INIT_TIMEOUT: "120000"
|
|
SCHEMA_REGISTRY_KAFKASTORE_TIMEOUT: "60000"
|
|
SCHEMA_REGISTRY_REQUEST_TIMEOUT_MS: "60000"
|
|
SCHEMA_REGISTRY_RETRY_BACKOFF_MS: "1000"
|
|
# Force IPv4 to work around Java IPv6 issues
|
|
# Enable verbose logging and set reasonable memory limits
|
|
KAFKA_OPTS: "-Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true -Xmx512M -Xms256M"
|
|
KAFKA_LOG4J_OPTS: "-Dlog4j.configuration=file:/etc/kafka/log4j.properties"
|
|
SCHEMA_REGISTRY_LOG4J_ROOT_LOGLEVEL: "INFO"
|
|
SCHEMA_REGISTRY_KAFKASTORE_WRITE_TIMEOUT_MS: "60000"
|
|
SCHEMA_REGISTRY_KAFKASTORE_INIT_RETRY_BACKOFF_MS: "5000"
|
|
SCHEMA_REGISTRY_KAFKASTORE_CONSUMER_AUTO_OFFSET_RESET: "earliest"
|
|
# Enable debug logging for Kafka clients to trace consumer seek/fetch operations
|
|
SCHEMA_REGISTRY_LOG4J_LOGGERS: "org.apache.kafka.clients=DEBUG,org.apache.kafka.common=DEBUG,io.confluent.kafka.schemaregistry.storage=DEBUG"
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:8081/subjects"]
|
|
interval: 15s
|
|
timeout: 10s
|
|
retries: 10
|
|
start_period: 30s
|
|
depends_on:
|
|
schema-registry-init:
|
|
condition: service_completed_successfully
|
|
kafka-gateway:
|
|
condition: service_healthy
|
|
networks:
|
|
- kafka-loadtest-net
|
|
|
|
# SeaweedFS Master (coordinator)
|
|
seaweedfs-master:
|
|
<<: *seaweedfs-build
|
|
container_name: loadtest-seaweedfs-master
|
|
ports:
|
|
- "9333:9333"
|
|
- "19333:19333"
|
|
command:
|
|
- master
|
|
- -ip=seaweedfs-master
|
|
- -port=9333
|
|
- -port.grpc=19333
|
|
- -volumeSizeLimitMB=48
|
|
- -defaultReplication=000
|
|
- -garbageThreshold=0.3
|
|
volumes:
|
|
- ./data/seaweedfs-master:/data
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "wget --quiet --tries=1 --spider http://seaweedfs-master:9333/cluster/status || exit 1"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 10
|
|
start_period: 20s
|
|
networks:
|
|
- kafka-loadtest-net
|
|
|
|
# SeaweedFS Volume Server (storage)
|
|
seaweedfs-volume:
|
|
<<: *seaweedfs-build
|
|
container_name: loadtest-seaweedfs-volume
|
|
ports:
|
|
- "8080:8080"
|
|
- "18080:18080"
|
|
command:
|
|
- volume
|
|
- -mserver=seaweedfs-master:9333
|
|
- -ip=seaweedfs-volume
|
|
- -port=8080
|
|
- -port.grpc=18080
|
|
- -publicUrl=seaweedfs-volume:8080
|
|
- -preStopSeconds=1
|
|
- -compactionMBps=50
|
|
- -max=0
|
|
- -dir=/data
|
|
depends_on:
|
|
seaweedfs-master:
|
|
condition: service_healthy
|
|
volumes:
|
|
- ./data/seaweedfs-volume:/data
|
|
healthcheck:
|
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://seaweedfs-volume:8080/status"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 15s
|
|
networks:
|
|
- kafka-loadtest-net
|
|
|
|
# SeaweedFS Filer (metadata)
|
|
seaweedfs-filer:
|
|
<<: *seaweedfs-build
|
|
container_name: loadtest-seaweedfs-filer
|
|
ports:
|
|
- "8888:8888"
|
|
- "18888:18888"
|
|
- "18889:18889"
|
|
command:
|
|
- filer
|
|
- -master=seaweedfs-master:9333
|
|
- -ip=seaweedfs-filer
|
|
- -port=8888
|
|
- -port.grpc=18888
|
|
- -metricsPort=18889
|
|
- -defaultReplicaPlacement=000
|
|
depends_on:
|
|
seaweedfs-master:
|
|
condition: service_healthy
|
|
seaweedfs-volume:
|
|
condition: service_healthy
|
|
volumes:
|
|
- ./data/seaweedfs-filer:/data
|
|
healthcheck:
|
|
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://seaweedfs-filer:8888/"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 15s
|
|
networks:
|
|
- kafka-loadtest-net
|
|
|
|
# SeaweedFS MQ Broker (message handling)
|
|
seaweedfs-mq-broker:
|
|
<<: *seaweedfs-build
|
|
container_name: loadtest-seaweedfs-mq-broker
|
|
ports:
|
|
- "17777:17777"
|
|
- "18777:18777" # pprof profiling port
|
|
command:
|
|
- mq.broker
|
|
- -master=seaweedfs-master:9333
|
|
- -ip=seaweedfs-mq-broker
|
|
- -port=17777
|
|
- -logFlushInterval=0
|
|
- -port.pprof=18777
|
|
depends_on:
|
|
seaweedfs-filer:
|
|
condition: service_healthy
|
|
volumes:
|
|
- ./data/seaweedfs-mq:/data
|
|
healthcheck:
|
|
test: ["CMD", "nc", "-z", "localhost", "17777"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
start_period: 20s
|
|
networks:
|
|
- kafka-loadtest-net
|
|
|
|
# SeaweedFS Kafka Gateway (Kafka protocol compatibility)
|
|
kafka-gateway:
|
|
<<: *seaweedfs-build
|
|
container_name: loadtest-kafka-gateway
|
|
ports:
|
|
- "9093:9093"
|
|
- "10093:10093" # pprof profiling port
|
|
command:
|
|
- mq.kafka.gateway
|
|
- -master=seaweedfs-master:9333
|
|
- -ip=kafka-gateway
|
|
- -ip.bind=0.0.0.0
|
|
- -port=9093
|
|
- -default-partitions=4
|
|
- -schema-registry-url=http://schema-registry:8081
|
|
- -port.pprof=10093
|
|
depends_on:
|
|
seaweedfs-filer:
|
|
condition: service_healthy
|
|
seaweedfs-mq-broker:
|
|
condition: service_healthy
|
|
environment:
|
|
- SEAWEEDFS_MASTERS=seaweedfs-master:9333
|
|
# - KAFKA_DEBUG=1 # Enable debug logging for Schema Registry troubleshooting
|
|
- KAFKA_ADVERTISED_HOST=kafka-gateway
|
|
volumes:
|
|
- ./data/kafka-gateway:/data
|
|
healthcheck:
|
|
test: ["CMD", "nc", "-z", "localhost", "9093"]
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 10
|
|
start_period: 45s # Increased to account for 10s startup delay + filer discovery
|
|
networks:
|
|
- kafka-loadtest-net
|
|
|
|
# Kafka Client Load Test Runner
|
|
kafka-client-loadtest:
|
|
build:
|
|
context: ../../..
|
|
dockerfile: test/kafka/kafka-client-loadtest/Dockerfile.loadtest
|
|
container_name: kafka-client-loadtest-runner
|
|
depends_on:
|
|
kafka-gateway:
|
|
condition: service_healthy
|
|
# schema-registry:
|
|
# condition: service_healthy
|
|
environment:
|
|
- KAFKA_BOOTSTRAP_SERVERS=kafka-gateway:9093
|
|
- SCHEMA_REGISTRY_URL=http://schema-registry:8081
|
|
- TEST_DURATION=${TEST_DURATION:-300s}
|
|
- PRODUCER_COUNT=${PRODUCER_COUNT:-10}
|
|
- CONSUMER_COUNT=${CONSUMER_COUNT:-5}
|
|
- MESSAGE_RATE=${MESSAGE_RATE:-1000}
|
|
- MESSAGE_SIZE=${MESSAGE_SIZE:-1024}
|
|
- TOPIC_COUNT=${TOPIC_COUNT:-5}
|
|
- PARTITIONS_PER_TOPIC=${PARTITIONS_PER_TOPIC:-3}
|
|
- TEST_MODE=${TEST_MODE:-comprehensive}
|
|
- SCHEMAS_ENABLED=${SCHEMAS_ENABLED:-true}
|
|
- VALUE_TYPE=${VALUE_TYPE:-avro}
|
|
profiles:
|
|
- loadtest
|
|
volumes:
|
|
- ./test-results:/test-results
|
|
networks:
|
|
- kafka-loadtest-net
|
|
|
|
# Monitoring and Metrics
|
|
prometheus:
|
|
image: prom/prometheus:latest
|
|
container_name: loadtest-prometheus
|
|
ports:
|
|
- "9090:9090"
|
|
volumes:
|
|
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
|
|
- prometheus-data:/prometheus
|
|
networks:
|
|
- kafka-loadtest-net
|
|
profiles:
|
|
- monitoring
|
|
|
|
grafana:
|
|
image: grafana/grafana:latest
|
|
container_name: loadtest-grafana
|
|
ports:
|
|
- "3000:3000"
|
|
environment:
|
|
- GF_SECURITY_ADMIN_PASSWORD=admin
|
|
volumes:
|
|
- ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards
|
|
- ./monitoring/grafana/provisioning:/etc/grafana/provisioning
|
|
- grafana-data:/var/lib/grafana
|
|
networks:
|
|
- kafka-loadtest-net
|
|
profiles:
|
|
- monitoring
|
|
|
|
# Schema Registry Debug Runner
|
|
schema-registry-debug:
|
|
build:
|
|
context: debug-client
|
|
dockerfile: Dockerfile
|
|
container_name: schema-registry-debug-runner
|
|
depends_on:
|
|
kafka-gateway:
|
|
condition: service_healthy
|
|
networks:
|
|
- kafka-loadtest-net
|
|
profiles:
|
|
- debug
|
|
|
|
volumes:
|
|
prometheus-data:
|
|
grafana-data:
|
|
|
|
networks:
|
|
kafka-loadtest-net:
|
|
driver: bridge
|
|
name: kafka-client-loadtest
|
|
|