什么是高可用?
在一家电商公司,大促期间系统崩了,订单下不了,客服电话被打爆。这种场景谁都怕。所谓高可用,就是让系统在面对故障时还能继续提供服务,尽量不中断、少影响。对企业级应用来说,这不只是技术指标,更是业务底线。
从单点故障说起
很多系统一开始部署在一台服务器上,数据库也只有一份。一旦这台机器出问题,整个应用就挂了。这就是典型的单点故障。解决办法不是加配置,而是去掉“唯一”。比如Web服务可以部署多台,前面加个负载均衡器分流。
负载均衡怎么配
常见的做法是用Nginx做反向代理。把用户的请求分散到多个应用实例。配置文件大概长这样:
upstream app_servers {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
location / {
proxy_pass http://app_servers;
}
}
这样即使其中一台应用服务器重启或宕机,其他节点还能顶上。
数据库不能只靠一台
应用可以多实例,数据库却常被忽略。MySQL主从复制是个基础方案,主库负责写,从库同步数据并承担读请求。万一主库挂了,还能手动切到从库。但手动太慢,生产环境建议搭配MHA或使用MySQL Group Replication自动切换。
更进一步的,像PostgreSQL配合Patroni和etcd,能实现自动选主和故障转移,整个过程对应用层几乎透明。
别忘了健康检查
负载均衡器得知道后端哪台机器活着。Nginx可以配合第三方模块,或者直接用HAProxy,它原生支持定期探测节点状态。比如:
backend app_backend
balance roundrobin
option httpchk GET /health
server app1 192.168.1.10:8080 check
server app2 192.168.1.11:8080 check
只要应用提供一个/health接口返回200,HAProxy就能判断它是否正常。
跨机房部署更稳
有些公司只在一个机房部署,结果机房断电,全站瘫痪。真正的高可用要跨机房,甚至跨地域。比如在北京和上海各放一套完整环境,中间通过DNS轮询或智能解析分配流量。用户在北京连不上,自动切到上海节点。
当然,这要求数据也要异地同步。Redis可以用Redis Sentinel或Redis Cluster配合多站点部署,MongoDB则有副本集支持地理分布。
发布更新也不能停机
高可用不只是防硬件故障,还要支持不停机发布。蓝绿部署是个实用方案:两套环境交替上线。先让新版本在“绿”环境跑着,确认没问题,把流量从“蓝”切到“绿”,旧版本下线。
另一种是滚动更新,Kubernetes里很常见。逐个替换Pod实例,保证始终有足够实例处理请求。配置上只需控制maxSurge和maxUnavailable参数就行。
监控和告警要跟上
系统再稳,没人盯着也不行。Prometheus抓指标,Grafana画面板,再配上Alertmanager发钉钉或短信。CPU突然飙到90%、数据库连接数爆满,都能第一时间知道。
关键是要定义清楚阈值。比如API错误率连续5分钟超过1%才告警,避免半夜被误报吵醒。