You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7.0 KiB
7.0 KiB
PostgreSQL Wire Protocol Package
This package implements PostgreSQL wire protocol support for SeaweedFS, enabling universal compatibility with PostgreSQL clients, tools, and applications.
Package Structure
weed/server/postgres/
├── README.md # This documentation
├── server.go # Main PostgreSQL server implementation
├── protocol.go # Wire protocol message handlers with MQ integration
├── DESIGN.md # Architecture and design documentation
└── IMPLEMENTATION.md # Complete implementation guide
Core Components
server.go
- PostgreSQLServer: Main server structure with connection management
- PostgreSQLSession: Individual client session handling
- PostgreSQLServerConfig: Server configuration options
- Authentication System: Trust, password, and MD5 authentication
- TLS Support: Encrypted connections with custom certificates
- Connection Pooling: Resource management and cleanup
protocol.go
- Wire Protocol Implementation: Full PostgreSQL 3.0 protocol support
- Message Handlers: Startup, query, parse/bind/execute sequences
- Response Generation: Row descriptions, data rows, command completion
- Data Type Mapping: SeaweedFS to PostgreSQL type conversion
- Error Handling: PostgreSQL-compliant error responses
- MQ Integration: Direct integration with SeaweedFS SQL engine for real topic data
- System Query Support: Essential PostgreSQL system queries (version, current_user, etc.)
- Database Context: Session-based database switching with USE commands
Key Features
Real MQ Topic Integration
The PostgreSQL server now directly integrates with SeaweedFS Message Queue topics, providing:
- Live Topic Discovery: Automatically discovers MQ namespaces and topics from the filer
- Real Schema Information: Reads actual topic schemas from broker configuration
- Actual Data Access: Queries real MQ data stored in Parquet and log files
- Dynamic Updates: Reflects topic additions and schema changes automatically
- Consistent SQL Engine: Uses the same SQL engine as
weed sql
command
Database Context Management
- Session Isolation: Each PostgreSQL connection has its own database context
- USE Command Support: Switch between namespaces using standard
USE database
syntax - Auto-Discovery: Topics are discovered and registered on first access
- Schema Caching: Efficient caching of topic schemas and metadata
Usage
Import the Package
import "github.com/seaweedfs/seaweedfs/weed/server/postgres"
Create and Start Server
config := &postgres.PostgreSQLServerConfig{
Host: "localhost",
Port: 5432,
AuthMethod: postgres.AuthMD5,
Users: map[string]string{"admin": "secret"},
Database: "default",
MaxConns: 100,
IdleTimeout: time.Hour,
}
server, err := postgres.NewPostgreSQLServer(config, "localhost:9333")
if err != nil {
return err
}
err = server.Start()
if err != nil {
return err
}
// Server is now accepting PostgreSQL connections
Authentication Methods
The package supports three authentication methods:
Trust Authentication
AuthMethod: postgres.AuthTrust
- No password required
- Suitable for development/testing
- Not recommended for production
Password Authentication
AuthMethod: postgres.AuthPassword,
Users: map[string]string{"user": "password"}
- Clear text password transmission
- Simple but less secure
- Requires TLS for production use
MD5 Authentication
AuthMethod: postgres.AuthMD5,
Users: map[string]string{"user": "password"}
- Secure hashed authentication with salt
- Recommended for production
- Compatible with all PostgreSQL clients
TLS Configuration
Enable TLS encryption for secure connections:
cert, err := tls.LoadX509KeyPair("server.crt", "server.key")
if err != nil {
return err
}
config.TLSConfig = &tls.Config{
Certificates: []tls.Certificate{cert},
}
Client Compatibility
This implementation is compatible with:
Command Line Tools
psql
- PostgreSQL command line clientpgcli
- Enhanced command line with auto-completion- Database IDEs (DataGrip, DBeaver)
Programming Languages
- Python: psycopg2, asyncpg
- Java: PostgreSQL JDBC driver
- JavaScript: pg (node-postgres)
- Go: lib/pq, pgx
- .NET: Npgsql
- PHP: pdo_pgsql
- Ruby: pg gem
BI Tools
- Tableau (native PostgreSQL connector)
- Power BI (PostgreSQL data source)
- Grafana (PostgreSQL plugin)
- Apache Superset
Supported SQL Operations
Data Queries
SELECT * FROM topic_name;
SELECT id, message FROM topic_name WHERE condition;
SELECT COUNT(*) FROM topic_name;
SELECT MIN(id), MAX(id), AVG(amount) FROM topic_name;
Schema Information
SHOW DATABASES;
SHOW TABLES;
DESCRIBE topic_name;
DESC topic_name;
System Information
SELECT version();
SELECT current_database();
SELECT current_user;
System Columns
SELECT id, message, _timestamp_ns, _key, _source FROM topic_name;
Configuration Options
Server Configuration
- Host/Port: Server binding address and port
- Authentication: Method and user credentials
- Database: Default database/namespace name
- Connections: Maximum concurrent connections
- Timeouts: Idle connection timeout
- TLS: Certificate and encryption settings
Performance Tuning
- Connection Limits: Prevent resource exhaustion
- Idle Timeout: Automatic cleanup of unused connections
- Memory Management: Efficient session handling
- Query Streaming: Large result set support
Error Handling
The package provides PostgreSQL-compliant error responses:
- Connection Errors: Authentication failures, network issues
- SQL Errors: Invalid syntax, missing tables
- Resource Errors: Connection limits, timeouts
- Security Errors: Permission denied, invalid credentials
Development and Testing
Unit Tests
Run PostgreSQL package tests:
go test ./weed/server/postgres
Integration Testing
Use the provided Python test client:
python postgres-examples/test_client.py --host localhost --port 5432
Manual Testing
Connect with psql:
psql -h localhost -p 5432 -U seaweedfs -d default
Documentation
- DESIGN.md: Complete architecture and design overview
- IMPLEMENTATION.md: Detailed implementation guide
- postgres-examples/: Client examples and test scripts
- Command Documentation:
weed db -help
Security Considerations
Production Deployment
- Use MD5 or stronger authentication
- Enable TLS encryption
- Configure appropriate connection limits
- Monitor for suspicious activity
- Use strong passwords
- Implement proper firewall rules
Access Control
- Create dedicated read-only users
- Use principle of least privilege
- Monitor connection patterns
- Log authentication attempts
This package provides enterprise-grade PostgreSQL compatibility, enabling seamless integration of SeaweedFS with the entire PostgreSQL ecosystem.