Python 全栈系列217 Nginx负载均衡MongoAgent

2023-11-03

说明

虽然不想在完成量化系统的构建前再去分叉搞别的东西,但是在批量计算指标时需要频繁的使用MongoAgent,而这个服务只能做成单线程异步的,所以计算60万次指标需要2~3天时间。

考虑到之后可能会有重刷的情况,所以我想还是给MongoAgent"扩容"。

内容

1 分析

部件是稳定的:MongoAgent从上一版本推送之后,可能有大半年或者一整年都没有任何的更新,所以我认为做了不至于会返工。

手动分配端口:目前都在采用2字头的端口,所以约定3字头给到类似nginx的服务。

手动启动多个服务:从目前的需求看,提速10倍比较容易满足需求(2~3天 ⇒ 0.3天 = 2.4小时)。另外我服务器的计算核可以认为有10+个,所以正好。

需要1个nginx容器,以及10个mongoagent容器。比较麻烦的是,需要一个个手动启动容器。

未来(等量化的主体完成了)在继续完善架构时,应该优先把容器管理部分先做掉,这样启动分身什么的比较容易。架构还有一部分是web开发环境,以后再说。

2 MongoAgent

简单看了一下MongoAgent的连接管理,MongoAgent当时设计还是依赖pickle文件工作的。

  • 1 每次需要连接新数据库时需要建立connection_hash
  • 2 接口根据连接的信息计算hash,然后看看有没有在数据库中,如果有那么就跳过,否则就存库(24003),也存pickle,然后保存在本地
  • 3 再之后,每次提交操作时都伴随着connection_hash即可。

这些设计当然不那么完善,当初甚至没有考虑使用Redis,不过问题不大。

最简单的方法,就是让所有的分身都挂载一个文件夹,文件夹下面由一个程序获取某些主机的所有connection_hash。

还有一个在线的笨办法,就是将数据库的配置读出来,然后向服务不断的发起建立连接的试探,这样自动化一些。

在指定了端口后,可以精确的向每个mongo_agent发起连接创建。(虽然麻烦了点,但是比较可靠,先这样吧)

因为MA是无状态的服务,所以可以直接在原项目文件下启动,改个端口号就行。

3 Nginx测试

之前配过Nginx进行https的证书转发,现在要做负载均衡

容器方面已经有了,所以主要看配置。

这个是大致的结构,我就不细看了,全局块和events暂时不管。
在这里插入图片描述

主要是在http下进行配置

新的Nginx分配34011端口,测试时可以使用24011和24021两个服务。

先启动一个nginx试一下,镜像随便写一个都行,我只是固定了一个版本放在自己仓库

docker run -it --rm  -p 34011:80 【IMAGE nginx:v1】

内网中发起测试(第二次就不下载index.html了)
在这里插入图片描述
nginx启动成功
在这里插入图片描述
现在迅速挂载对应的目录和配置,进行负载均衡mongoagent.conf

(似乎也可以不配置http模块,直接配置server)

配置如下

events {
    #设置工作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式
    use epoll;
    #定义每个进程的最大连接数,受系统进程的最大打开文件数量限制
    worker_connections  1024;
}


http{

    upstream multi_ma {
            # fair;
            server 172.17.0.1:24021 ;
            server 172.17.0.1:24011 ;
        }

    server {
        listen 34011;
        location / {
            proxy_pass http://multi_ma;
        }

    }

}

在这里插入图片描述
坑1:挂载nginx的配置文件(会报一些错误[emerg] 1#1: "events" directive is not allowed here in /etc/nginx/conf.d/mongoagent.conf,我一开始没明白)

答案在这,挂载的配置文件不对
在这里插入图片描述
坑2:fair要进行第三方安装才能用。所以我先不使用fair(以后有机会再看吧),应该是可以使用了。

在这里插入图片描述
之后启动多个MA,然后将端口固定就行。计划使用35000~35009这十个端口服务。

4 启动

先按照端口35000~35009启动10个MA,然后修改nginx,配置改为在这10个MA上进行负载均衡。

因为是在当前的MA(24011)上直接挂载启动的,我发现24011生成的连接字典也被同步挂载过来了。

从一般性使用的角度上,还是要写一个程序来全量刷新连接字典。

拿到库里所有的连接记录

ng_ma = 'http://172.17.0.1:34011/'
query_dict = {'connection_hash':None,'filter_dict':{'is_enable':1},'tier1':'MongoAgent','tier2':'mConnections','limits':1000}
recs = req.post(ng_ma + 'query_recs_v2/',json=query_dict).json()['data']

剔除和数据库连接无关的字段

db_conf_list = []
for rec in recs :
    tem_dict = {}
    for k in rec.keys():
        if not k in ['connection_hash','create_time','is_enable']:
            tem_dict[k] = rec[k]
    db_conf_list.append(tem_dict)

做一个嵌套循环,逐个刷新MA的Shard

for i in range(35000,35010):
    tem_ma = 'http://172.17.0.1:%s/'  % i
    for db_conf in db_conf_list:
        resp = req.post(tem_ma + 'add_a_connection/',json ={**db_conf}).json()
        print(resp)

5 总结

这样就好了,比想象中的简单一些。

未来可以通过服务(docker manager)来实现类似的批量启动分身的方法(再通过前端集成管理),这样就比较完美了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 全栈系列217 Nginx负载均衡MongoAgent 的相关文章

  • airflow webserver 命令失败并显示 {filesystemcache.py:224} 错误 - 不允许操作

    我正在 Cent OS 7 上安装 Airflow 我已经配置了 Airflow db init 并检查了 nginx 服务器的状态及其工作正常 但是当我运行airflow webserver命令时 我收到下面提到的错误 2021 03 2
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • 如何设置带有子域和反向代理且不使用启用站点的 nginxconf?

    我读到没有必要使用sites enabled https stackoverflow com questions 41303885 nginx do i really need sites available and sites enabl
  • 当请求太大时,Nginx(我认为)会以错误的权限保存文件

    所以 我对托管和 Linux 等都是完全陌生的 所以如果我说错了 请原谅我 我还在学习 我正在使用 Django 创建一个小型个人网站 我想把它放到网上看看是否一切正常 我从 linode 买了一台便宜的服务器 并使用 Digital Oc
  • Nginx 背后的多个 Meteor 站点

    这个问题与this https stackoverflow com questions 10936242 how can i correct the meteor base url in a nginx reverse proxy conf
  • 我怎样才能重写这个nginx“if”语句?

    例如 我想这样做 if http user agent MSIE 6 0 http user agent MSIE 7 0 etc etc rewrite ROOT ROOT ancient last break 而不是这个 if http
  • 使用 FastCGI 运行 Lua 脚本

    我目前正在尝试找出使用 FastCGI 与 lighttpd 或 Nginx 一起运行 Lua 脚本的方法 我唯一能挖到的是WSAPI http keplerproject github com wsapi 开普勒计划的一部分 但我想知道是
  • 使用 Nginx 或 Apache 来提供动态内容? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在运行 NGINX Docker 容器的 AWS EC2 上启用 HTTPS?

    我在 AWS 上有一个运行 Amazon Linux 2 的 EC2 实例 在上面 我安装了 Git docker 和 docker compose 完成后 我克隆了我的存储库并运行docker compose up让我的生产环境启动 我访
  • Http POST 删除 URL 中的端口

    我有一个用 Django 构建的网络应用程序 我目前正在家里的路由器后面的笔记本电脑上运行它 我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑 我将 Nginx 作为 Apache 的反向代理 使用 mod wsgi 来运行 D
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器
  • 如何修复 Nginx 自动 301 重定向到带有尾部斜杠的相同 URL?

    当我尝试将 Web 应用程序的子目录中的索引文件访问到相同的 URL 但附加了斜杠 时 Nginx 出现了不良行为 它正在重新路由请求 我有一个简单的 Web 应用程序 其中设置了一个根目录和其中的许多子目录 每个子目录中都有一个 inde
  • Nginx merge_slashes 重定向

    我在我的 Java 应用程序中使用 nginx 我的问题是 nginx 正在合并斜杠 我无法将我的网站重定向到正确的版本 例如 http goout cz cs koncerty praha 被合并到 http goout cz cs ko
  • 在 docker 中将 pgadmin 连接到 postgres

    我有一个docker compose与服务文件python nginx postgres and pgadmin services postgres image postgres 9 6 env file env volumes postg
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • Logrotate - nginx 日志不在 docker 容器内旋转

    我有一个运行 nginx 的 docker 容器 它正在将日志写入 var log nginxLogrotate 安装在 docker 容器中 并且 nginx 的 logrotate 配置文件已正确设置 尽管如此 logrotate 仍不
  • 上游太大 - nginx + codeigniter

    我从 Nginx 收到此错误 但似乎无法弄清楚 我正在使用 codeigniter 并使用数据库进行会话 所以我想知道标题怎么会太大 有没有办法检查标题是什么 或者看看我能做些什么来修复这个错误 如果您需要我提供任何conf文件或其他文件
  • Nginx url 限制 502 网关

    我有一个问题 但我接受绕过此功能的其他建议 基本上 我在 get 请求中向我的服务器发送大约 3000 个字符的大行文本 然后服务器将其作为 url 中的参数发送到谷歌翻译 问题 当 url gt 1900 个字符时 Nginx 会抛出 5
  • nginx上传client_max_body_size问题

    我正在运行 nginx ruby on rails 并且有一个简单的多部分表单来上传文件 一切正常 直到我决定限制要上传的文件的最大大小 为此 我设置了 nginxclient max body size to 1m 1MB 并且当该规则被

随机推荐

  • IntersectionObserver实现图片懒加载(超详细!)

    关于IntersectionObserver 官方上说明是提供了一种异步观察目标元素与其祖先元素或顶级文档视窗 viewport 交叉状态的方法 祖先元素与视窗 viewport 被称为根 root 具体的内容可以参考官网解释 https
  • 前端三小时用html和js写一个贪吃蛇游戏,非常简单带讲解,代码可直接用,功能完整

    目录 游戏主体部分 普通模式 游戏主体部分 地狱模式 游戏主页入口 预览图 游戏入口代码 1 html 2 css 3 js 注册页面代码 游戏实现很简单 只写游戏主体的话只要三小时就够了 话不多说 我们直接来看效果预览 转成gif图之后有
  • MATLAB读dat文件中存储的十六进制数

    搞了好久都没搞懂为什么MATLAB里load textread都打不开区区一个十六进制文件 经过不懈的寻找 发现fopen fread就是永远滴神 果然灯下黑 data zeros 1 1000 fid fopen 1 dat rb row
  • 云服务器有比虚拟主机好吗,云服务器有比虚拟主机好吗

    云服务器有比虚拟主机好吗 内容精选 换一换 在高可用部署场景下 ASCS主备节点通过共享盘实现数据同步 本章节指导用户将ASCS主节点的数据盘绑定给ASCS备节点并为ASCS主备节点绑定浮动IP 已在SAP ASCS主备节点之间进行过相互的
  • 大数据学习之Hive——05Hive函数

    一 内置函数 1 数学函数 Return Type Name Signature Description DOUBLE round DOUBLE a 返回对a四舍五入的BIGINT值 DOUBLE round DOUBLE a INT d
  • 网页上文本框禁止复制粘贴怎么破解

    我们首先来介绍如何实现禁止复制 知道了禁止的方式 再破解就容易了 实现禁止复制粘贴 比较简单 直接上代码 h1 本代码在UC手机浏览器上不生效 其它手机浏览器暂未发现问题 PC全部没问题 h1 p p
  • uniapp swiper轮播图片+视频

    1 效果 2 代码展示
  • Java高并发- 锁的优化及 JVM 对锁优化所做的努力

    在高并发环境下 激烈的锁竞争会导致程序的性能下降 所以我们有必要讨论一下有关 锁 的性能问题及注意事项 如 避免死锁 减小锁粒度 锁分离等 一 锁优化 1 1 减小锁持有时间 在锁竞争过程中 单个线程对锁的持有时间与系统性能有着直接的关系
  • docker安装golang

    这里写目录标题 下载golang的Docker镜像 使用Golang镜像 下载golang的Docker镜像 docker search golang 查询Golang的镜像信息 选择使用第一个 执行命令 docker pull docke
  • [Android]ProgressBar进度条

    ProgressBar ProgressBar是进度条控件 ProgressBar的应用场景很多 比如用户登录时 后台发送请求 以及进行等待服务器返回信息等一些比较耗时的操作 这个时候如果没有提示 用户可能会以为程序崩溃了或手机死机了 会大
  • C++容器篇,list容器

    C 容器篇 list容器 1 list的介绍和使用 1 1 list的介绍 list的参考文档 list是C 的容器之一 其本质是双向链表 它是可以在常数时间复杂度内进行插入和删除的序列式容器 list和forword list非常相似 其
  • stm32实现json格式传输/ cjson使用

    cjson是一个开源的C文件 可以实现用C语言生成json格式数据 目录 步骤1 准备工作 步骤2 cjson函数简单讲解 步骤3 一个例子 生成json格式数据 步骤1 准备工作 在keil里添加cjson c和cjson h cjson
  • linux下生成高强度密码的四大神器

    导读 安全是一个大的话题 给服务器设置一个高强度的密码是非常重要的 你可能会疑惑一个高强度的密码究竟是什么样的呢 怎么才能生成一个那样的密码呢 不用担心下面我们将介绍 4 种简单方法让你在 Linux 中生成一个高强度密码 1 在 Linu
  • CentOS 6和CentOS 7的磁盘空间清理

    收集整理了一些在CentOS 6或者CentOS 7服务器中 快速清理磁盘空间的方法 首先 必须先安装yum utils工具组件 yum y install yum utils 1 删除日志文件 find var name log size
  • Struts2+Spring3+Mybatis3开发环境搭建

    本文主要介绍Struts2 Spring3 Mybatis3开发环境搭建 Struts和Spring不过多介绍 MyBatis 是支持普通 SQL 查询 存储过程和高级映射的优秀持久层框架 MyBatis 消除了几乎所有的 JDBC 代码和
  • [开源之美] nanomsg -- 进程间通讯

    认识 nanomsg 这个项目 源于项目内部分享 实际分析和使用一段时间之后 确实觉得项目beautiful 先附上Git地址 nanomsg Git下载地址 nanomsg 的编译 编译很简单 没有其他第三方依赖 根据Git上编译文档可以
  • linux 格式化含义,RMAN备份FORMAT格式中%a的含义

    Oracle文档对 a的描述是 a Specifies the activation IDofthedatabase rman备份并保存 查询 a RMAN gt backup tablespace users format home or
  • Unity使用NavmeshObstacle解决多人寻路终点堵塞问题以及解决NavmeshObstacle打开抖动(瞬移)问题

    不知道为什么 就这个东西 国内各大论坛和网站就是搜不到 最终还是得谷歌 太过基础的就不讲了 问题一 在unity使用navmeshAgent进行多人寻路设置同一个终点后 所有角色都会向对应位置寻路 当前面单位到达后后面单位会一直无法到达导致
  • kiki's game

    http acm hdu edu cn showproblem php pid 2147 Problem Description Recently kiki has nothing to do While she is bored an i
  • Python 全栈系列217 Nginx负载均衡MongoAgent

    说明 虽然不想在完成量化系统的构建前再去分叉搞别的东西 但是在批量计算指标时需要频繁的使用MongoAgent 而这个服务只能做成单线程异步的 所以计算60万次指标需要2 3天时间 考虑到之后可能会有重刷的情况 所以我想还是给MongoAg