Skip to main content

high-availability

High availability architecture and implementation for fault-tolerant distributed systems

معلومات المصدر

المستودع
ffsshhttiikk/opencode-agents-skills
آخر نشاط في المصدر
٢٨ فبراير ٢٠٢٦ في ٢٢:٥٥
لغة SKILL.md المكتشفة
الإنجليزية
النجوم
٣
التفرعات
٢

خيارات التثبيت

يُحدَّد Prompt الذي يراجع المصدر أولًا بشكل افتراضي. يمكنك التبديل إلى أمر مباشر أو تنزيل نسخة محلية.

مراجعة ملفات المصدر

اقرأ SKILL.md وأي ملفات مرافقة يعرضها SkillsMP قبل أن تقرر التثبيت.

عرض SKILL.md

SKILL.md
تعليمات المصدر · معاينة للقراءة فقط
name
high-availability
description
High availability architecture and implementation for fault-tolerant distributed systems
license
MIT
compatibility
opencode
metadata
{"audience":"architects","category":"systems-administration"}
## What I do - Design high availability architectures - Implement load balancing strategies - Configure failover clustering - Set up database replication - Design multi-region deployments - Implement circuit breakers - Create health checks and redundancy - Configure session and state management - Design for horizontal scaling - Implement chaos engineering ## When to use me When designing fault-tolerant systems, implementing high availability infrastructure, or architecting for uptime requirements. ## Core Concepts - Active-active and active-passive configurations - Load balancing algorithms and strategies - Failover mechanisms and detection - Database replication (master-slave, multi-master) - Consensus algorithms (Raft, Paxos) - Circuit breaker patterns - Service mesh architectures - DNS-based failover - CDN and edge caching - Disaster recovery vs high availability ## Code Examples ### Load Balancer Configuration ```nginx # Nginx HA configuration upstream backend { least_conn; server 10.0.1.10:8080 max_fails=3 fail_timeout=30s; server 10.0.1.11:8080 max_fails=3 fail_timeout=30s; server 10.0.1.12:8080 max_fails=3 fail_timeout=30s backup; keepalive 32; } server { listen 443 ssl http2; server_name app.example.com; ssl_certificate /etc/ssl/certs/app.crt; ssl_certificate_key /etc/ssl/private/app.key; ssl_protocols TLSv1.2 TLSv1.3; # Health check endpoint location /health { proxy_pass http://backend; proxy_connect_timeout 5s; proxy_read_timeout 10s; health_check interval=5 passes=2 fails=3; } location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # Circuit breaker proxy_next_upstream error timeout http_503 http_504; proxy_connect_timeout 10s; proxy_send_timeout 60s; proxy_read_timeout 60s; } # Rate limiting limit_req_zone $binary_remote_addr zone=api:10m rate=100r/s; location /api/ { limit_req zone=api burst=20 nodelay; proxy_pass http://backend; } } ``` ```haproxy # haproxy.cfg global log 127.0.0.1 local0 maxconn 4096 daemon tune.ssl.default-dh-param 2048 defaults log global mode http option httplog option dontlognull timeout connect 5000ms timeout client 50000ms timeout server 50000ms retries 3 frontend http-in bind *:80 bind *:443 ssl crt /etc/ssl/certs/ acl is-health-check src 10.0.0.0/8 use_backend health if is-health-check default_backend app-servers backend app-servers balance roundrobin option httpchk GET /health http-check expect status 200 server app1 10.0.1.10:8080 check inter 5s rise 2 fall 3 server app2 10.0.1.11:8080 check inter 5s rise 2 fall 3 server app3 10.0.1.12:8080 check inter 5s rise 2 fall 3 backup # Stickiness stick-table type ip size 200k expire 30m stick on src # Circuit breaker http-request track-sc0 src acl conn_fail sc1_conn_fail gt 3 acl mark_remove sc1_marked_remove lt 1 http-request silent-drop if conn_fail mark_remove backend health server health1 10.0.0.1:9090 check ``` ### Database HA Configuration ```yaml # PostgreSQL Patroni configuration restapi: listen: 0.0.0.0:8008 connect_address: 10.0.1.10:8008 authentication: username: admin password: ${PATRONI_PASSWORD} etcd: host: 10.0.1.20:2379 protocols: http cacert: /etc/ssl/certs/ca.crt key: /etc/ssl/private/patroni.key cert: /etc/ssl/certs/patroni.crt bootstrap: dcs: ttl: 30 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 master_start_timeout: 300 synchronous_mode: false pg_hba: - host replication replicator 10.0.1.0/24 md5 - host all all 0.0.0.0/0 md5 postgresql: listen: 0.0.0.0:5432 connect_address: 10.0.1.10:5432 authentication: replication: username: replication password: ${REPLICATION_PASSWORD} superuser: username: postgres password: ${SUPERUSER_PASSWORD} parameters: max_connections: 200 shared_buffers: 4GB work_mem: 64MB maintenance_work_mem: 1GB effective_cache_size: 12GB synchronous_commit: on synchronous_standby_names: '*' pg_rewind: username: postgres password: ${SUPERUSER_PASSWORD} ``` ### Circuit Breaker Implementation ```python import asyncio from enum import Enum from dataclasses import dataclass from typing import Callable, Any import time class CircuitState(Enum): CLOSED = "closed" OPEN = "open" HALF_OPEN = "half_open" @dataclass class CircuitBreakerConfig: failure_threshold: int = 5 success_threshold: int = 2 timeout_seconds: float = 60.0 sampling_window: int = 60 class CircuitBreaker: def __init__(self, name: str, config: CircuitBreakerConfig = None): self.name = name self.config = config or CircuitBreakerConfig() self.state = CircuitState.CLOSED self.failures = 0 self.successes = 0 self.last_failure_time = 0 self._lock = asyncio.Lock() async def call(self, func: Callable, *args, **kwargs) -> Any: async with self._lock: if self._should_open(): self.state = CircuitState.OPEN self.last_failure_time = time.time() if self.state == CircuitState.OPEN: if self._timeout_elapsed(): self.state = CircuitState.HALF_OPEN else: raise CircuitOpenError(f"Circuit breaker {self.name} is open") return await self._execute(func, *args, **kwargs) async def _execute(self, func: Callable, *args, **kwargs) -> Any: try: result = await func(*args, **kwargs) await self._on_success() return result except Exception as e: await self._on_failure() raise async def _on_success(self): async with self._lock: if self.state == CircuitState.HALF_OPEN: self.successes += 1 if self.successes >= self.config.success_threshold: self.state = CircuitState.CLOSED self.failures = 0 self.successes = 0 async def _on_failure(self): async with self._lock: self.failures += 1 if self.state == CircuitState.HALF_OPEN: self.state = CircuitState.OPEN self.last_failure_time = time.time() self.successes = 0 def _should_open(self) -> bool: return (self.state == CircuitState.HALF_OPEN and self.failures >= self.config.failure_threshold) def _timeout_elapsed(self) -> bool: return time.time() - self.last_failure_time > self.config.timeout_seconds # Usage circuit = CircuitBreaker("database", CircuitBreakerConfig( failure_threshold=3, timeout_seconds=30 )) async def get_user(user_id: int): async with circuit: return await database.query("SELECT * FROM users WHERE id = ?", user_id) ``` ### Health Check Aggregation ```python from typing import Dict, List from dataclasses import dataclass from enum import Enum import asyncio class HealthStatus(Enum): HEALTHY = "healthy" DEGRADED = "degraded" UNHEALTHY = "unhealthy" @dataclass class ComponentHealth: name: str status: HealthStatus latency_ms: float message: str details: dict = None class HealthChecker: def __init__(self): self.checks = {} def register_check(self, name: str, check_func: callable): self.checks[name] = check_func async def check_all(self) -> Dict[str, ComponentHealth]: results = {} tasks = [] for name, check_func in self.checks.items(): tasks.append(self._run_check(name, check_func)) for result in await asyncio.gather(*tasks, return_exceptions=True): if isinstance(result, Exception): results["unknown"] = ComponentHealth( name="unknown", status=HealthStatus.UNHEALTHY, latency_ms=0, message=str(result) ) else: results[result.name] = result return results async def _run_check(self, name: str, check_func: callable) -> ComponentHealth: start = time.time() try: if asyncio.iscoroutinefunction(check_func): result = await check_func() else: result = check_func() latency_ms = (time.time() - start) * 1000 return ComponentHealth( name=name, status=HealthStatus.HEALTHY if result else HealthStatus.DEGRADED, latency_ms=latency_ms, message="Check passed" if result else "Check returned unhealthy" ) except Exception as e: return ComponentHealth( name=name, status=HealthStatus.UNHEALTHY, latency_ms=(time.time() - start) * 1000, message=str(e) ) def aggregate_status(self, healths: Dict[str, ComponentHealth]) -> HealthStatus: statuses = [h.status for h in healths.values()] if any(s == HealthStatus.UNHEALTHY for s in statuses): return HealthStatus.UNHEALTHY elif any(s == HealthStatus.DEGRADED for s in statuses): return HealthStatus.DEGRADED return HealthStatus.HEALTHY # Usage checker = HealthChecker() checker.register_check("database", lambda: db.health_check()) checker.register_check("redis", lambda: redis.ping()) checker.register_check("external_api", external_api.health_check) async def health_endpoint(): healths = await checker.check_all() status = checker.aggregate_status(healths) return {"status": status.value, "components": healths} ``` ## Best Practices - Design for failure - assume components will fail - Use active-active for true high availability - Implement proper health checks at multiple levels - Keep configurations version-controlled - Test failover procedures regularly - Monitor SLIs and SLOs actively - Use circuit breakers to prevent cascade failures - Maintain proper capacity buffers - Document failure modes and runbooks - Consider geographic redundancy for disaster recovery
عرض على GitHub