Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何做高并发和高可用? #63

Open
nonocast opened this issue Jun 29, 2020 · 0 comments
Open

如何做高并发和高可用? #63

nonocast opened this issue Jun 29, 2020 · 0 comments

Comments

@nonocast
Copy link
Owner

nonocast commented Jun 29, 2020

定义

  • 高可用 (HA: High Availability) - 假设每运行100个时间单位,100个时间单位服务都可用,则可用性为100%,如果有5个时间单位服务时效,则可用性降至95%,提升高可用的基本理念:通过集群建立冗余。
  • 高并发 (High Concurrency) - 并发数量和响应时间评价当前负载能力,提升高并发的基本理念:垂直扩展(Scale Up)与水平扩展(Scale Out)。提升单台机器的性能称之为垂直扩展,所以我们更多的关注于水平扩展。
  • 集群:同样的事情分多个人同时做(多台不同的服务器中部署相同应用或服务模块,构成一个集群,通过负载均衡设备对外提供服务)
  • 分布式:一件事情分几个人做不同的部分 (即多台不同服务器部署不同服务模块, 通过远程调用协同工作对外提供服务)

私有化实现

以最简单的hello world为例,GET /返回hello world

  • 多机单主负载均衡: 假设2台服务器(A和B), 即A上的Nginx中upstream中同时配置A和B的service地址, 向外发布A的IP地址
  • 多机多活无负载均衡: 假设2台服务器(A和B), 同时在A和B上通过keepalived建立VIP(virtual ip address),向外发布VIP地址,此时当A down的时候,VIP会立即指向B,形成热备份
  • 多机多主负载均衡: 结合上述两条,首先建立VIP, 然后每台服务器upstream都指向2台服务即可

当然服务器不差钱的时候,可以安排5台服务器:

  • 2台服务器做VIP,形成Nginx负载均衡集群
  • 3台服务器做worker,形成服务集群
  • 在Nginx中的upstream中配置3个worker服务地址即可

WebSocket, Socket & MQTT 长连接

对于集群长连接需要借助带集群的消息队列来解决信息互通,比如Kafka, RabbitMQ,此外WebSocket则需要在Nginx中增加负载均衡的相应配置即可。

redis & mongodb

可以在2台或多台服务器上配置集群

  • redis: Sentinel (哨兵)
  • mongodb: Replica Set

云端实现

TODO: 待补充

度量

TODO: 待补充

监控

集群后存在大量日志在所难免,这是就需要用到ELK,统一采集日志到后台,或者直接用SaaS日志服务。

TODO: 待补充

参考阅读

@nonocast nonocast changed the title 如何做高可用? (草稿) 如何做高并发和高可用? Jul 3, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant