`

OpenERP 负载平衡

 
阅读更多

 

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

1
2
3
4
5
6
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模块也使用文件系统存储用户登录凭证。如:

1
2
3
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。相关代码如下:

1
2
3
4
5
    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 会检测是否有更新,如有更新将会自动清除缓存并重新载入。相关代码如下:

1
2
3
4
5
6
7
8
    @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客户端的情况进行完

分享到:
评论

相关推荐

    开源ERP_openerp与gunicorn整合方案

    openerp 可以支撑大型ERP项目 openerp 负载均衡 利用gunicorn作负载均衡,可构建可伸缩的ERP系统

    openERP 7.0使用手册 第三章 OpenERP快速入门

    OpenERP 7.0 使用手册第三章 OpenERP 快速入门 OpenERP 是一种开源的企业资源计划(ERP)软件,它可以帮助企业管理其业务操作,包括销售、采购、库存、财务等。下面是 OpenERP 7.0 使用手册第三章 OpenERP 快速入门...

    OpenERP开发基础教程

    OpenERP应用和开发基础,主要讲述OPENERP的系统架构以及基本知识,还有开发的一些基本语法等,非常适合入门者使用。

    openerp教程

    openerp教程

    OpenERP应用和开发基础文档及相关资源

    OpenERP应用和开发基础 OpenERP应用和开发基础(第一章).pdf OpenERP应用和开发基础(第二章).pdf OpenERP应用和开发基础(第三章).pdf OpenERP应用和开发基础(第四章).pdf OpenERP应用和开发基础(第五章).pdf OpenERP...

    openerp应用和开发

    OpenERP应用和开发基础,随着openerp的发展,越来越多的中小企业开始应用此erp系统,免费开源是最大的特点

    openerp 免费下载

    OpenERP是一款优秀的开源ERP软件。开源是说,软件完全公开,您不仅可以自由下载软件,还可以自由下载软件的所有源代码;软件本身没有任何秘密, 没有任何用户数限制,没有任何收费!优秀是说,软件功能丰富,品质...

    OpenERP Installing Ubuntu9.04

    OpenERP Installing Ubuntu9.04

    OpenERP.rar_openERP

    这个压缩包文件“OpenERP.rar_openERP”包含了关于OpenERP的应用和开发基础的详细资料,主要以“OpenERP应用和开发基础_091224.pdf”这本书的形式呈现。 首先,我们要理解OpenERP的核心概念。它是一个模块化的系统...

    OpenERP 文档

    ### OpenERP Web 参考文档知识点详解 #### 一、基础知识与模块构建 **1.1 基础概念** - **OpenERP**: 开源的企业资源计划系统,提供了丰富的功能来满足企业的各种需求。 - **OpenERP Web**: OpenERP 的前端用户...

    使用虚拟机VM运行Linux版OpenERP

    OpenERP、Linux版、虚拟机VM、如何使用虚拟机VM运行Linux版OpenERP

    openerp.zip_openERP

    OpenERP(后更名为Odoo)是一款开源的企业资源规划(ERP)软件,用于管理企业的各种业务流程,包括财务、采购、库存、销售、人力资源等。它采用Python编程语言编写,并使用SQL数据库进行数据存储。本教程将针对...

    OpenERP操作指南

    OpenERP操作指南

    openerp 7.0 allinone part2

    openerp 7.0 allinone 安装包part1

    openERP 7.0使用手册 第五章 采购基本操作

    《OpenERP 7.0使用手册 第五章 采购基本操作》 OpenERP 7.0的采购管理是企业资源规划系统中一个重要的组成部分,它涵盖了从采购需求产生到完成付款的全过程。本章主要讨论了采购的基本操作,包括采购订单的创建、...

    OpenERP应用和开发基础

    OpenERP应用和开发基础OpenERP应用和开发基础

    OpenERP_6.1_web框架指南

    OpenERP_6.1_web框架指南

    Taobao OpenERP Connector.zip

    Taobao OpenERP Connector ,Taobao OpenERP Connector功能:接受淘宝主动通知,自动添加、确认订单、发货等。...

    OpenERP中文开发手册.pdf

    openerp 技术开发文档,快速查找工具

    OpenERP_Technical开发教程

    ### OpenERP技术开发教程:构建现代化商业应用 #### 引言 OpenERP是一款现代的商业应用套件,基于AGPL许可证发布,集成了客户关系管理(CRM)、人力资源(HR)、销售、会计、制造、仓库管理、项目管理等功能。其...

Global site tag (gtag.js) - Google Analytics