OpenERP 7.0 带来了许多新特性,架构上也有许多改进。其中可配置 worker 参数,可使 OpenERP 运行在多进程模式,突破GIL的限制,有效利用了现代多核CPU的性能。但默认情况下,OpenERP 只能运行于一台服务器,对于提供SAAS服务或并发很大的情况下,单台服务器的性能是有限的。本文介绍实现 OpenERP 负载平衡的方法和原理。

一、架构

┌────────────────────────────────┐
│                                           Nginx                                        │
└────────────────────────────────┘
/                      |                       \
┌────────┐    ┌────────┐    ┌────────┐
│ OE Server   │    │ OE Server  │    │ OE Server   │
└────────┘    └────────┘    └────────┘
\                     |                        /
┌────────────────────────────────┐
│                                  Redis Server                                    │
└────────────────────────────────┘

注:实现负载平衡的关键点在于 cache 和 session 共享。

二、Web 服务器配置

WEB 服务器选择 Nginx + upstream 配置,可参考 “使用Nginx Upstream 部署 OpenERP ” http://my.oschina.net/wangbuke/blog/67450 。

默认情况下,nginx 采用轮询的方式,将请求分发到多个 OE Server 里。建议改为 ip_hash 方式,如:

upstream bakend {
ip_hash;
server 192.168.0.11:8069;
server 192.168.0.12:8069;
}

三、OpenERP 的 Session 和 Cache 处理

3.1 OpenERP Web Session 处理

OpenERP 中的Session 处理默认用FilesystemSessionStore,使用文件系统存储用户 session  。如 openerp/addons/web/http.py

class Root(object):

def __init__(self):

self.session_store = werkzeug.contrib.sessions.FilesystemSessionStore(path)
self.session_lock = threading.Lock()

那么我们只要将OpenERP 中的SessionStore,改为 RedisSessionStore,RedisSessionStore 可参考https://gist.github.com/1451947 。

修改方法,可以直接修改 http.py 文件。
或是和我一样,重写一个库,重载 session_context 方法,这样可以不修改OpenERP的源文件,方便以后升级。

3.2 OpenERP LRU Cache 处理

openerp/tools/cache.py 中 ormcache 和 ormcache_multi 是 OpenERP 中非常重要的缓存类。OpenERP ORM 大部分的方法调用都会经过 @tools.ormcache 或 @ormcache_multi 修饰。经过修饰后,结果会被缓存,这个缓存是存放于内存中。 这个就是OE在加载一次数据后,第二次会明显快很多的原因。还有,通过web 界面翻译OE术语不能实时生效,也是因为缓存没有更新。

可以修改ormcache 和 ormcache_multi 类,以使用 redis 缓存。关键代码如下:

def lookup(self, self2, cr, *args):
key = args[self.skiparg-2:]
key = ‘%s:%s’ % (self.method.__name__, str(key))
#key = md5(key).hexdigest()
hash_name = self.db_key_template % cr.dbname
value = self.redis.hget(hash_name, key)
if value:
self.stat_hit += 1
return loads(value)
else:
self.stat_miss += 1
value = self.method(self2, cr, *args)
self.redis.hset(hash_name, key, dumps(value, HIGHEST_PROTOCOL))
self.redis.expire(hash_name, self.timeout)
return value

缓存的值使用 cPickle 序列化后,将每个键值对存放于 redis 的 哈希表中。

3.3 auth_openid 模块

auth_openid模块也使用文件系统存储用户登录凭证。如:

class OpenIDController(openerp.addons.web.http.Controller):

_store = filestore.FileOpenIDStore(_storedir)

如果您启用了这个模块,那么这里也需要修改为存储在redis中。如果没有启用此模块,则无需理会。

相关实现可参考,https://github.com/bbangert/openid-redis/blob/master/openidredis/__init__.py

四、OpenERP Cron 处理

默认情况下,每个OpenERP Server 实例都会运行一个 cron 进程任务。这里建议只允许一个实例运行CRON。把OpenERP 7.0 的配置参数 max_cron_threads 设置为0 ,即可禁止cron。相关代码如下:

def process_spawn(self):
while len(self.workers_http) < self.population:
self.worker_spawn(WorkerHTTP, self.workers_http)
while len(self.workers_cron) < config['max_cron_threads']:
self.worker_spawn(WorkerCron, self.workers_cron)

五、OpenERP Module RegistryManager 处理

OpenERP Module Registry 主要负责管理OE的对象。一般是安装或更新的模块时候,会根据定义来更新数据库。 在OE多进程模式下,OE会自动管理 Module Registry ,相关的更新信息会存放在数据库里。RegistryManager 会检测是否有更新,如有更新将会自动清除缓存并重新载入。相关代码如下:

@classmethod
def setup_multi_process_signaling(cls, cr):
if not openerp.multi_process:
return

@classmethod
def check_registry_signaling(cls, db_name):
if openerp.multi_process and db_name in cls.registries:

这里,实际上无需做改动,上面只是说明情况。只需让OE运行在多进程模式即可(也就是配置 worker 参数)。

六、完成!

经过以上几个步骤,可以让OpenERP 运行于多台服务器,通过Redis 分布式缓存处理相关的 Cache 和 Session,从而实现 OpenERP 负载平衡。

注:
1、本文仅讨论 OpenERP 负载平衡部署方式,并不涉及 Postgresql 和 Redis 的负载平衡,相应的方法请自行搜索。
2、鉴于OpenERP SA 官方已不再维护 GTK 客户端,并没有对GTK客户端的情况进行完整测试。

Openerp负载平衡相关推荐

  1. windows网络负载平衡

    网络负载平衡的优点 1.网络负载平衡允许你将传入的请求传播到多台服务器上,即可以使用多台服务器共同分担对外的网络请求服务.网络负载平衡技术保证即使是在负载很重的情况下它们也能作出快速响应. 2.网络负 ...

  2. [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上)

    [译]NGINX 和 ZooKeeper,动态负载平衡和部署(上) Aidan Carson · 2016-07-22 11:38 原文:NGINX and ZooKeeper, Dynamic Lo ...

  3. 洛谷P4016 负载平衡问题

    洛谷P4016 负载平衡问题 题目大意: G 公司有 n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只 能在相邻的仓库之间 ...

  4. (译)如何用命令行在windows Azure上安装负载平衡的web Farm虚拟机(linux或其他)...

    我一哥们考虑把他的一些基于linux的网站移到Azure上.如果你现在的网站是node.js, ASP,ASP.NET,或PHP做的,使用Azure web站点是最容易的.我会在这篇文章里向你展示如何 ...

  5. 巧用Win2003负载平衡服务实现LCS2005企业版的部署:LCS2005系列之五

    巧用Win2003负载平衡解决LCS2005企业版部署 在前面的博文中我们介绍了一些LCS2005标准版的部署和使用,今天我们来实现LCS2005企业版的部署.LCS企业版比标准版复杂得多,由于LCS ...

  6. [codevs 1916] 负载平衡问题

    http://codevs.cn/problem/1916/ 题解: 我的思考过程: 样例: 5 17 9 14 16 4 负载平衡问题是一类问题,大意就像题目说的那样,是个很有用的网络流模型.< ...

  7. 在云中使用 MapReduce 和负载平衡

    云计算旨在通过 Internet 提供随需应变的资源或服务,通常视数据中心的规模和可靠性水平而定.MapReduce 是一个为并行处理大量数据而设计的编程模型,它将工作划分为一个独立任务组成的集合.它 ...

  8. 18_clickhouse副本同步与高可用功能验证,分布式表与集群配置,数据副本与复制表,ZooKeeper整合,创建复制表,副本同步机制,数据原子写入与去重,负载平衡策略,案例(学习笔记)

    24.副本同步与高可用功能验证 24.1.分布式表与集群配置 24.2.数据副本与复制表 24.3.ZooKeeper整合 24.4.创建复制表 24.5.副本同步机制 24.6.数据原子写入与去重 ...

  9. Windows Server 2008 R2 负载平衡入门篇

    一.简单介绍负载均衡 负载均衡也称负载共享,它是指负载均衡是指通过对系统负载情况进行动态调整,把负荷分摊到多个操作节点上执行,以减少系统中因各个节点负载不均衡所造成的影响,从而提高系统的工作效率. 在 ...

最新文章

  1. 关于ftp的说法错误的是_斯坦福教授:成长型思维的养成,只需要换个说法,思维是可以训练的!...
  2. (char*)malloc(sizeof(char))有什么用,为什么要这么写——简单介绍指针
  3. vlookup练习_那个vlookup,我总是学不会啊
  4. gdb+zbacktrace找到cpu过高php代码
  5. 【机器学习】监督学习--(分类)决策树①
  6. 统计字符串中每个字符的个数_C++程序设计——统计数字字符个数
  7. onenote 模板_onenote实用?炫酷功能系列篇②:用插件让效率翻倍
  8. angular学习疑问总结
  9. win10安装jdk1.8配置环境变量
  10. Win7系统安装samba服务器,Win7 VirtualBox samba 服务器搭建
  11. Leetcode:799. 香槟塔
  12. 第一章 | 加州房价数据集 | 端到端的机器学习 | 回归问题 | tensorflow2.6+sklearn | 学习笔记
  13. iphone控制中心自定义没有计算机,如何在iPhone上自定义iOS 11控制中心功能
  14. R语言h2o深度学习分类
  15. Consistency = Consensus?
  16. 痞子衡嵌入式:语音处理工具Jays-PySPEECH诞生记 - 索引
  17. android json分页,移动测试之异步任务+JSON解析+ListView分页
  18. android 飞机大战详解
  19. 使用Python给自己的录课视频添加字幕
  20. HTML保姆级教程(三)表单标签

热门文章

  1. JAVA9 新特性 完整使用
  2. STM32CubeIDE修改深色主题
  3. 365 - 表的完整性约束
  4. 【对讲机的那点事】如何利用写频软件预置海能达数字对讲机的加密功能
  5. 微信小程序多选复选框checkbox。微信小程序官方文档bug
  6. charles 抓包图片显示_charles 抓包简单使用
  7. 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现多种手机打电话...
  8. SQL Server2000配远程连接配置
  9. VS1053B 音频编解码器芯片的介绍(二)
  10. UE4 Pixel Streaming像素推流云端部署方案