FastNetMon

Показаны сообщения с ярлыком Zeo. Показать все сообщения
Показаны сообщения с ярлыком Zeo. Показать все сообщения

вторник, 16 марта 2010 г.

Работа с Zeo из Python

Для начала ставим Zope/Zeo: http://phpsuxx.blogspot.com/2010/03/zope-2123-debian-5-lenny.html


#!/usr/bin/env python

from ZEO.ClientStorage import ClientStorage
from ZODB import DB
import transaction

class MyRemoteZODB(object):
def __init__(self, server, port):
server_and_port = (server, port)
self.storage = ClientStorage(server_and_port)
self.db = DB(self.storage)
self.connection = self.db.open()
self.dbroot = self.connection.root()

def close(self):
self.connection.close()
self.db.close()
self.storage.close()

# write data

mydb = MyRemoteZODB('localhost', 8100)
dbroot = mydb.dbroot

dbroot = mydb.dbroot
dbroot['a_number'] = 3
dbroot['a_string'] = 'Gift'
dbroot['a_list'] = [1, 2, 3, 5, 7, 12]
dbroot['a_dictionary'] = { 1918: 'Red Sox', 1919: 'Reds' }
dbroot['deeply_nested'] = { 1918: [ ('Red Sox', 4), ('Cubs', 2) ],1919: [ ('Reds', 5), ('White Sox', 3) ], }

transaction.commit()
mydb.close()

# read data

mydb = MyRemoteZODB('localhost', 8100)
dbroot = mydb.dbroot

for key in dbroot.keys():
print key + ':', dbroot[key]

mydb.close()



Как результат будет примерно такое:

a_list: [1, 2, 3, 5, 7, 12]
a_dictionary: {1918: 'Red Sox', 1919: 'Reds'}
a_string: Gift
Application:
a_number: 3
deeply_nested: {1918: [('Red Sox', 4), ('Cubs', 2)], 1919: [('Reds', 5), ('White Sox', 3)]}


Ну что, нравится? :)) О сокращении стоимости разработки при использовании вот такой штуки мне даже страшно думать! Даже если располагать базы только на SSD это будет все равно дико экономически эффективно.

Источник примеров: http://www.ibm.com/developerworks/aix/library/au-zodb/

воскресенье, 7 марта 2010 г.

Установка Zope 2.12.3 на Debian 5 Lenny из исходников

Официальный сайт Zope2: http://zope2.zope.org/ а вот инструкция по установке http://docs.zope.org/zope2/releases/2.12/INSTALL.html Обращаю внимание, что 2.12 релиз Zope поддерживает как Python 2.5 так и 2.4 http://docs.zope.org/zope2/releases/2.12/WHATSNEW.html так что никаких извращений с установкой в /opt старого Python не требуется.

Ставим easy_install:
apt-get install -y python-setuptools python-virtualenv


Создаем и переходим в виртуальную среду для установки Zope (чтобы не повредить существующую систему, а также не повредить библиотекам самого Zope):
virtualenv /opt/zope212
cd /opt/zope212
source bin/activate


Ставим зависимости:

apt-get install -y gcc python-dev


Запускаем установку:
bin/easy_install zope2


Создаем instance Zope приложения:

bin/mkzopeinstance
Please choose a directory in which you'd like to install
Zope "instance home" files such as database files, configuration
files, etc.

Directory: /opt/zopeinstance
Please choose a username and password for the initial user.
These will be the credentials you use to initially manage
your new Zope instance.

Username: admin
Password:
Verify password:


Переходим в папку инстанса Zope:
cd /opt/zopeinstance/


Создаем юзера для Zope:
useradd zope


Открываем конфиг инстанса:

vi etc/zope.conf


И добавляем в самый низ имя юзера:
effective-user zope


А теперь делаем владельцем всех файлов юзера Zope:

chown zope:zope -R /opt/zopeinstance


Запускаем во отладочном режиме:
bin/zopectl fg
.
daemon process started, pid=1831


Либо запускаем в продакшен-режиме:

bin/zopectl start


Открываем веб-консоль администрирования и логинимся в нее с ранее заданными логином и паролем:
http://xx.xx.xx.xx:8080/manage


Если же Вы хотите поставить Zeo инстанс (распределенная версия хранилища с возможностью конкурентного доступа к ней), то используйте следующий мануал: http://docs.zope.org/zope2/zope2book/ZEO.html

Создаем Zeo инстанс:

bin/mkzeoinstance /opt/zeoinstance


Переходим в соотвествующую папку:

cd /opt/zeoinstance


Пробуем запустить:
bin/zeoctl start


Если в ответ получаем:

Error: /opt/zope212/lib/python2.5/site-packages/ZODB3-3.10.0a1-py2.5-linux-x86_64.egg/zdaemon/zdrun.py is not an existing path
(line 41 in file:///opt/zeoinstance/etc/zeo.conf)
For help, use /opt/zope212/lib/python2.5/site-packages/ZODB3-3.10.0a1-py2.5-linux-x86_64.egg/ZEO/zeoctl.py -h


То надо скорректировать путь:
vi etc/zeo.conf


И корректируем строку zdrun следующим образом:

zdrun /opt/zope212/lib/python2.5/site-packages/zdaemon-2.0.4-py2.5.egg/zdaemon/zdrun.py


И после этого повторяем попытку запустить Zeo. В итоге он должен заработать примерно так:

lsof | grep zeo
python 15416 root cwd DIR 0,202 4096 28034842 /opt/zeoinstance
python 15416 root 3w REG 0,202 656 28034853 /opt/zeoinstance/log/zeo.log
python 15416 root 4u unix 0xffff81011d31a080 425909697 /opt/zeoinstance/etc/zeo.zdsock.15415
python 15418 root cwd DIR 0,202 4096 28034842 /opt/zeoinstance
python 15418 root 3w REG 0,202 656 28034853 /opt/zeoinstance/log/zeo.log
python 15418 root 4u REG 0,202 7 28034859 /opt/zeoinstance/var/Data.fs.lock
python 15418 root 5u REG 0,202 0 28034860 /opt/zeoinstance/var/Data.fs.tmp
python 15418 root 6u REG 0,202 4 28034861 /opt/zeoinstance/var/Data.fs
lsof 15455 root cwd DIR 0,202 4096 28034842 /opt/zeoinstance
grep 15456 root cwd DIR 0,202 4096 28034842 /opt/zeoinstance
lsof 15457 root cwd DIR 0,202 4096 28034842 /opt/zeoinstance
bash 19864 root cwd DIR 0,202 4096 28034842 /opt/zeoinstance


Теперь проверим, какое хранилище использует наш Zope инстанс, это файловое хранилище:

lsof | grep zope -i | grep Data.fs
runzope 21553 zope 7u REG 0,202 7 28034847 /opt/zopeinstance/var/Data.fs.lock
runzope 21553 zope 10u REG 0,202 0 28034848 /opt/zopeinstance/var/Data.fs.tmp
runzope 21553 zope 11u REG 0,202 1040426 28034849 /opt/zopeinstance/var/Data.fs
runzope 21553 zope 12r REG 0,202 1040426 28034849 /opt/zopeinstance/var/Data.fs


Теперь необходимо Zope инстанс переключить на Zeo:

cd /opt/zopeinstance/
vi etc/zope.conf


Находим и комментируем диезами (#) там блок:

<zodb_db main>
# Main FileStorage database
</zodb_db>


Чуть ниже находим аналогичный закомментированый блок zodb_db main со вложенным блоком zeoclient и раскомментируем его.

Перезапускаем инстанс:
bin/zopectl restart


Убаеждаемся, что законнектились на Zeo инстанс:

bin/zopectl logtail
------
2010-03-16T02:13:06 INFO ZEO.zrpc.Connection(C) (localhost:8100) received handshake 'Z310'
------
2010-03-16T02:13:06 INFO ZEO.ClientStorage zeostorage Server authentication protocol None
------
2010-03-16T02:13:06 INFO ZEO.ClientStorage zeostorage Connected to storage: ('localhost.localdomain', 8100)
------
2010-03-16T02:13:06 INFO ZEO.ClientStorage zeostorage No verification necessary -- empty cache
------
2010-03-16T02:13:17 INFO Zope Ready to handle requests


Ну и все, теперь у нас есть сторадж Zeo инстанс с поддержкой множественных Zope инстансов :) Также, как вариант, мы можем подключаться к Zeo из своих пользовательских многопоточных приложений.

Выходим из virtualenv:
deactivate