我们知道,openGemini集群由ts-sql, ts-store和ts-meta三个组件组成,其中ts-sql负责处理客户端请求,在并发量比较大的业务场景中,通常需要部署多个ts-sql,以分担压力,如下图所示:
这种情况下,客户端需要同时管理多个与ts-sql的连接,以及维护多ts-sql之间的负载均衡,稍显复杂。那么有没有更好的办法?
答案是肯定的。如果在客户端和集群之间设置一个反向代理,那么事情就变得简单多了,客户端仅需要维护与反向代理的连接,其余的工作交由反向代理来完成。如下图所示:
什么是反向代理?
简单来说,反向代理是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
Nginx反向代理
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。除此之外,Nginx作为反向代理服务器,包含多种负载均衡算法(如轮询、最少连接数、IP Hash、Generic Hash、最小时延以及随机算法),可通过设置某个ts-sql权重以此改变其负载,还提供连接数限制,达到流量控制的目的,同时,Nginx具有链路健康自动监测,持续测试ts-sql是否发生故障,一旦发现有ts-sql节点故障,会将失败的ts-sql地址从负载均衡组中移除,待节点被重新拉起后,再自动重新加入。
openGemini搭配Nginx反向代理,非常高效解决了openGemini集群的负载均衡问题,接下来以下图所示部署场景为例,对Nginx的反向代理配置进行详细说明。
环境准备
Nginx安装
https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/
openGemini安装
https://github.com/openGemini/community
Nginx反向代理配置
Nginx的关键配置如下所示:
{
# 设置Nginx并发处理的worker数量,可以为具体数值,也可以设置为auto
# 通常建议为节点CPU的核数
worker_processes auto;
…
events {
# Nginx处理的最大连接数(这里可以进行数据库流控),默认为1024
# 需根据业务实际运行情况进行调整。
worker_connections 1024;
}
http {
…
# 负载均衡默认采用轮询方法
upstream openGemini {
server 192.168.0.1:8086;
server 192.168.0.2:8086;
server 192.168.0.3:8086;
}
server {
# 可按IP:Port形式指定Nginx监听地址和端口,默认是在所有地址监听
# 8086是openGemini ts-sql组件默认的服务监听端口,这里可以修改为其他
listen 8086;
# location 后面的斜线‘/’不能少
location / {
# 这里的openGemini(可修改)与upstream 后面配置的名称(openGemini)
# 需保持一致,否则无法转发
proxy_pass http://openGemini;
}
}
}
}
配置修改后,需要重启Nginx才能生效
测试验证
客户端连接Nginx反向代理
客户端写入数据和查询
总结
至此我们介绍完如何配置Nginx反向代理解决openGemini集群中多个ts-sql节点的负载均衡问题,您可以了解到 Nginx丰富的反向代理功能与 openGemini强大的横向扩展能力。一些更实用的功能(比如动态配置)仅在Nginx Plux(收费)版本提供。需要提醒的是,这套搭配中,Nginx可能成为风险瓶颈,一旦故障,应用将会受到影响,用户可以进一步研究虚拟IP+keeplalived+nginx的方案来实现Nginx的高可靠。
关注openGemini,我们将为您带来更多实用解决方案,同时我们期待与更多伙伴携手,打造更多行业解决方案,共同推动技术创新。
openGemini 官网:http://www.openGemini.org
openGemini 开源地址:https://github.com/openGemini
openGemini 公众号:
欢迎关注~ 诚邀你加入 openGemini 社区,共建、共治、共享未来!