O documento discute a replicação e escalabilidade do ZODB com RelStorage. RelStorage permite armazenar o ZODB em um banco de dados relacional para melhorar o desempenho e escalabilidade quando há muitos clientes Zope conectados à mesma base de dados ZODB. Ele implementa um novo StorageLayer para o ZODB e os dados são armazenados de forma opaca no banco de dados SQL. Benchmarks mostram ganhos de desempenho com RelStorage, especialmente ao usar memcached.
1. Replica¸˜o e escalabidade do ZODB com
ca
RelStorage
Rud´ Porto Filgueiras - rudazz@gmail.com - @rudaporto
a
October 1, 2011
2. Agenda
Motiva¸˜o
ca
ZODB
RelStorage
Benchmarks
Referˆncias
e
Perguntas
3. Motiva¸˜o
ca
Sistemas baseados em Plone / Zope
Grandes portais de conteudo: Imagens, Videos, Audio
Desempenho, escalabilidade e disponibilidade
Facilidade de utilizar infra-estrutura existente
4. ZODB and FileStorage
ACID
Arquivo append-only para armazenar os objetos e transa¸oes
c
NoSQL
Transparencia para armazenamento de objetos Python (tipo
Persistent)
FileStorage: Permite que apenas um processo acesse a base
de dados
5. ZEO: compartilhamento do FileStorage
Criado para permitir o compartilhamento da base de dados
entre multiplos processos
ZRPC: protocolo de rede para comunica¸ao entre o cliente
c
(Zope) e o servidor (ZEO)
Normalmente o ZEO e um processo IO bound
Nao possui (ate a versao 3.10) threads para concorrencia de
acesso de forma que cada cliente fica na sua propria thread
6. RelStorage
O projeto RelStorage criado por Shane Hathaway tem como
objetivo permitir que o ZODB seja armazenado em um backend
relacional:
Desenvolvido com objetivo de melhorar a escalabilidade do
ZODB quando existem muitos Zope clients conectados a uma
mesma base de dados ZODB
Implementa um novo StorageLayer para o ZODB
Os dados sao armazenados de forma opaca no banco de dados
SQL (nao ha como consultar os dados e extrair informacoes
diretamente do banco de dados SQL)
Suporta diferentes bancos de dados: Oracle, MySQL,
PostgreSQL
Suporta ambientes clusterizados e tambem uso de
Memcached para minimizar o overhead no backend e
aumentar o desempenho
7. RelStorage: Instala¸˜o
ca
Instalar bibliotecas de desenvolvimento e pacotes do backend
SQL: psycopg2, MySQL-python, etc
Instalar bibliotecas de desenvolvimento do memcached:
libmemcached-dev
Configurar buildout para instalar pacotes python: pylibmc ou
python-memcached e RelStorage
Alterar configura¸ao da instancia Zope2 para utilizar
c
rel-storage
8. RelStorage: Configura¸˜o Buildout
ca
1 [ buildout ]
2 ...
3
4 eggs =
5 RelStorage
6 psycopg2
7 pylibmc
8 ...
9
10 [ z o p e p y ]
11 # i n s t a l l s a z o p e p y p y t h o n i n t e r p r e t e r t h a t r u n s
12 # w i t h y o u r f u l l Zope e n v i r o n m e n t
13 r e c i p e = z c . r e c i p e . egg
14 e g g s = $ { b u i l d o u t : e g g s }
15 i n t e r p r e t e r = z o p e p y
16 s c r i p t s = z o p e p y z o d b c o n v e r t z o d b p a c k
9. RelStorage: Configura¸˜o Buildout
ca
1 [ instance ]
2 recipe = plone . recipe . zope2instance
3 ...
4 r e l −s t o r a g e =
5 type p o s t g r e s q l
6 dsn dbname=zodb u s e r=r u d a h o s t=l o c a l h o s t
7 b l o b −d i r $ { b u i l d o u t : d i r e c t o r y } / v a r / b l o b s t o r a g e
8 s h a r e d −b l o b −d i r y e s
9 p o l l − i n t e r v a l 60
10 cache −s e r v e r s 127 . 0 . 0 . 1 : 11211
11 r e p l i c a −c o n f dsn dbname=zodb u s e r=r u d a h o s t=o u t r o h o s t
10. RelStorage zodbconvert: migra¸ao do FileStorage
c
Para realizar a migra¸˜o de um ZODB tradicional em FileStorage e
ca
vice-versa, foi criado um utilit´rio chamado zodbconvert. Esse
a
utilit´rio espera como estrada um arquivo de configura¸˜o que
a ca
defina a origem e o destino dos dados, como segue
(zodbconvert.cfg):
1 < f i l e s t o r a g e s o u r c e>
2 p a t h / meu caminho / v a r / f i l e s t o r a g e / Data . f s
3 </ f i l e s t o r a g e>
4
5 < r e l s t o r a g e d e s t i n a t i o n>
6 < p o s t g r e s q l>
7 dsn dbname=zodb u s e r=r u d a h o s t=l o c a l h o s t
8 </ p o s t g r e s q l>
9 </ r e l s t o r a g e>
Executando a migra¸ao: ./bin/zodbconvert zodbconvert.cfg
c
11. Benchmarks: concorrencia = 2
1 ** c o n c u r r e n c y=2 **
2 psql , psql mc , mysql , mysql mc , z e o f s
3 Add 4662 , 3976 , 6100 , 5615 , 3930
4 Update 4673 , 4196 , 5865 , 5102 , 3204
5 Warn 3580 , 18462 , 4142 , 16525 , 3405
6 Cold 3505 , 2504 , 9164 , 3042 , 3441
7 Hot 36200 , 35989 , 36256 , 35941 , 35263
8 S t e a m i n 3643260 , 2538156 , 3179912 , 2710374 , 3530558
12. Benchmarks: concorrencia = 4
1 ** c o n c u r r e n c y=4 **
2 psql , psql mc , mysql , mysql mc , z e o f s
3 Add 5456 , 4405 , 6807 , 7084 , 4188
4 Update 5109 , 4738 , 6442 , 6404 , 3215
5 Warm 3735 , 16860 , 3538 , 16830 , 2884
6 Cold 3490 , 2457 , 7892 , 3162 , 2833
7 Hot 37322 , 39988 , 36288 , 36447 , 35306
8 S t e a m i n 5840123 , 4748044 , 6680157 , 3631432 , 6962945
13. Referˆncias
e
http://pypi.python.org/pypi/RelStorage
http://pypi.python.org/pypi/zodbshootout
http://shane.willowrise.com/archives/how-to-install-plone-
with-relstorage-and-mysql
14. Perguntas?
Contato: Rud´ Porto Filgueiras
a
rudazz@gmail.com
@rudaporto
github.com/rudaporto