【发布时间】:2021-02-02 22:01:05
【问题描述】:
我读到了Nginx Fabric Model,它让我注意到重新配置应用程序与 MySQL 和 Redis 的通信方式。如果本地 Nginx 实例可以高效、快速地代理 HTTP 流量,那么现在它也可以代理 TCP 而无需担心网络,甚至在紧急情况下使用数据库从机作为主机,并可能封装数据库分片。所有好处都可以简化应用程序配置及其逻辑,网络(拥塞、延迟、超时、重试)将不再是功能开发的重点。
我使用最新的 Docker 和一组容器:Nginx、Redis、MySQL。我尝试了以下配置:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log info;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream redis {
# prefer first server but limit connections
server 172.17.0.8:6379 weight=2 max_conns=1;
server 172.17.0.3:6379;
}
upstream mysql {
# use second server in case of failure
server 172.17.0.4:3306;
server 172.17.0.5:3306 backup;
}
server {
listen 6379 so_keepalive=on;
proxy_pass redis;
}
server {
listen 3306 so_keepalive=on;
proxy_pass mysql;
}
}
我有一些问题:
日志记录 - 我如何知道哪个端点正在使用,Nginx 重试了多少次特定请求?
实时统计 - 是否可以获得流模块的吞吐量?
从数据库分片的角度来看 - 是否可以根据某些逻辑将请求分派到分片数据库 $remote_addr?
最后一个问题很重要,我找到了模块ngx_stream_map_module 和ngx_stream_split_clients_module 但是$remote_addr 不适合分片,我们可以从HTTP 部分截取cookie 并重用我们没有任何标头的in-stream 部分?我们可以在流部分注入 Lua 代码吗? ngx_stream_ssl_preread_module是这个问题的解决方案吗,如何让它在不加密的情况下进行连接?
【问题讨论】:
-
是的,来自 Nginx 核心团队成员的电子邮件。日志记录:使用 $upstream_addr 扩展 log_format,仅通过 Nginx Plus 进行实时统计,MySQL sharding
-
你可以回答你自己的问题。
-
这个问题很复杂,你最好把它分成三个不同的问题。
标签: mysql performance nginx redis load-balancing