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 的相关文章

  • 如何对 nginx ingress 中的特定 HTTP 方法进行基本身份验证?

    我可以使用基本身份验证创建入口 我遵循 kubernetes ingress nginx 中的模板 apiVersion extensions v1beta1 kind Ingress metadata name ingress with
  • Docker nginx 代理到主机

    简短的介绍 Nginx 运行在 docker 上 如何配置 nginx 以便将调用转发到主机 详细描述 我们有一个 Web 应用程序与几个后端通信 假设为rest1 rest2 和rest3 我们负责rest1 让我们考虑一下我开始rest
  • NGINX 和 Spark Java 之间的跨源通信

    我正在将 NGINX 和 Sparkjava 用于我的 Web 应用程序 我确信我已正确启用所有 CORS 标头 尽管如此 我还是得到了 XMLHttpRequest 无法加载http localhost 3003 platformAPI
  • Nginx 作为负载均衡器,具有 75% 和 25% 加权路由

    我是 Nginx 新手 我有两台服务器 serverA 和 serverB 我希望 75 的请求发送到 serverA 其余 25 的请求发送到 serverB 这可能吗 使用nginx加权路由 stream upstream stream
  • Nginx 在子文件夹中重写 (404)

    我有一个网站主机NGINX曾经工作正常的服务器删除index php在 nginx 站点配置中使用try files 但现在我要在上面添加一个博客 其中 URL 将是www foo com blog 我可以访问博客并使用index php
  • 将 docker-compose.yml 中的包安装到 docker 容器中

    我是 docker 和 docker compose 的初学者 我需要你的帮助 我正在使用 docker compose 制作 PHP NGINX PostgresQL symfony 开发环境 这里是 web image nginx 1
  • 从 git repo 拉取后出现白屏死机(React JS、Nginx)

    每当我从 master 分支执行 git pull 到服务器上时 我所有的 React 文件似乎都消失了 屏幕变成白色 我发现的临时解决方法是 删除浏览器 cookie 缓存和站点历史记录 然后关闭浏览器并重试 删除node modules
  • 在龙卷风 v4+ 下,WebSocket 连接被拒绝并显示 403

    我有一个旧的龙卷风服务器 可以处理普通的 WebSocket 连接 我通过 Nginx 将这些连接从 wss info mydomain com 代理到 wss mydomain com 8080 以便绕过阻止非标准端口的客户代理 最近升级
  • 防止 NGINX 中的一个 WebSocket 连接泛滥?

    我使用这个配置来防止我的服务器上出现类似 DOS 的洪水 limit req zone binary remote addr zone one 10m rate 10r s limit req zone binary remote addr
  • Capistrano + Thin + nginx 不允许用户使用 sudo howto?

    我有一个这样的场景 我想使用 capistrano 部署 ruby on Rails 应用程序 Web 应用程序位于瘦集群上 配置文件存储在 etc thin 下 etc init d thin 中还有一个初始化脚本 因此每当我的服务器需要
  • 将虚拟主机分配给 Docker 端口

    我设置了通配符 DNS 以便对自定义域 foo 的所有 Web 请求都映射到 Docker 主机的 IP 地址 如果我有多个运行 Apache 或 Nginx 实例的容器 每个容器都会将 Apache 端口 80 映射到某个外部入站端口 我
  • 使用 Nginx 自定义错误网关页面

    是否可以在 Nginx 中提供自定义的 Bad Gateway 错误页面 类似于自定义 404 页面 为了显示您的自定义错误页面而不是一般的 错误网关 错误 必须满足三个部分 您必须创建一个名为 500 html 之类的 html 文件并将
  • 静态资源和非静态资源有什么区别?

    我主要是一名前端开发人员 设计师 但最近我一直在探索端到端解决方案 昨天 我使用平均堆栈完成了一个 TODO 应用程序 并想开始探索我的 VPS 的部署选项 话虽这么说 有人建议我使用 nginx 作为反向代理来提供静态资源 不幸的是 我陷
  • Nginx 配置文件在 Elastic Beanstalk 部署期间被覆盖?

    我需要将 p3p 标头添加到标准 Nodejs 和 Nginx Elastic Beanstalk 上的静态资源位置 我创建了一个ebextension脚本如上所解释这个问题 https stackoverflow com question
  • 在同一个 nginx 服务器块上公开多个 api uri

    Goal 我的目标是在同一个 nginx 服务器上设置多个后端 api 容器 http localhost 80 api account gt 调用 http account service 9000 http localhost 80 a
  • nginx 获取静态文件失败,返回 404

    我现在正在 ubuntu 12 上部署带有 nginx 和 Gunicorn 的 django 应用程序 我配置nginx虚拟主机文件如下 server listen 80 server name mydomain com access l
  • Kubernetes - 一个 Ingress 中的多个配置

    我在同一个 Kubernetes 集群中运行不同的应用程序 我希望多个域能够访问我的 Kubernetes 集群 并根据域进行重定向 对于每个域 我想要不同的注释 配置 如果没有注释 我的入口部署如下 apiVersion networki
  • 为什么我需要 Nginx 和 Puma?

    我正在将 Rails 应用程序部署到生产环境中 看起来 Puma 速度很快 可以处理我想要在网络服务器中完成的许多事情 我想知道我是否需要使用 Nginx 如果只使用 Puma 我会错过什么 Nginx 是一个 Web 服务器 puma 是
  • 如何使用 Nginx 将下划线替换为破折号

    我第一次使用Nginx 对它基本上一无所知 我需要将 100 多个 URL 中的 替换为 我想一定有一种简单的方法可以用 Nginx 来做到这一点 但在 Google 上找不到任何东西 Thanks Edit 我的网址例如 http www
  • node.js 本身还是 nginx 前端来提供静态文件?

    是否有更快的基准或比较 将 nginx 放在节点前面并让它直接提供静态文件或仅使用节点并使用它提供静态文件 nginx 解决方案似乎对我来说更易于管理 有什么想法吗 我不得不不同意这里的答案 虽然 Node 可以做得很好 但如果配置正确 n

随机推荐

  • 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