文档章节

odoo 负载均衡

斯文剑客
 斯文剑客
发布于 2015/07/07 14:20
字数 1029
阅读 382
收藏 1

参考:  http://blog.csdn.net/kingppy/article/details/12893395

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客户端的情况进行完整测试。

本文转载自:

斯文剑客
粉丝 23
博文 55
码字总数 9413
作品 0
昌平
程序员
私信 提问
加载中

评论(1)

2
234082230
不错,在odoo10上实现了一下效果很好,交流qq 234082230
快速接入企业微信的 Odoo 模块 - WeOdoo

WeOdoo 快速接入企业微信的 Odoo 模块,快捷使用,基于 Oauth 2.0 安全认证协议,免对接开发配置,支持局域网等内网环境的 Odoo 服务 特性 账号授权绑定 PC 端扫码登录、企业微信端授权登录,...

匿名
01/30
1K
0
北京路远通公司与 Odoo 正式签约实施伙伴!

odoo 实施伙伴 2015-06-18 公司正式与比利时 odoo 公司签定合作协议,将有利于公司更好的服务于客户,提供更全面的支持和实施服务: odoo培训 odoo部署实施 odoo二次开发 odoo云服务 odoo(O...

路远通
2015/08/19
3.4K
2
Odoo11安装,Odoo11生产环境部署:在Ubuntu Server16.04下Odoo11安装

本文使用有sudo权限的odoo用户进行测试 如果是阿里云,可以 1先创建个odoo用户 sudo adduser odoo 2:给root 权限: sudo vi /etc/sudoers 修改文件参考如下: # User privilege specificati...

siweilai
2018/06/26
0
0
Installing Odoo 8 on CentOS 6 with Python 2.7

This tutorial will walk you through the process of installing the latest version of Odoo on CentOS 6. It is intended for those who might not be experienced Linux administrators ......

Ericklee
2015/02/10
0
0
安装Odoo(翻译)

翻译者注: 翻译本文的目的是为了安装Odoo 9.0。本文所描述的安装CentOS为7.x,请注意。本人测试了Aliyun CentOS 7.2的RPM安装过程。 正文 这里有若干方式安装Odoo,或者不完整安装依赖的用户...

抢小孩糖吃
2016/08/16
249
2

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
5
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
8
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部