Added Changes made by prof. buzato.
[dissertmsc.git] / mscMonografia.tex
blob8498ec5ae7be11df24eedd1ed439b7d42e971f37
1 \documentclass[10pt]{article}
3 \usepackage[top=3cm, bottom=3cm, left=3cm, right=3cm]{geometry}
4 \usepackage{todonotes}
5 \usepackage{times}
6 \usepackage[brazil]{babel}
7 \usepackage[latin1]{inputenc}
8 \usepackage{graphicx}
9 \usepackage{url}
10 \usepackage{paralist}
11 \usepackage{hyperref}
12 \usepackage{amssymb}
13 \usepackage{setspace}
14 \usepackage{paralist}
16 \newcommand{\mytitle}{Avaliação do impacto de mecanismos de
17 armazenamento de estado no desempenho de sistemas replicados} %PT
18 \newcommand{\f}{$\blacksquare$}
20 \hypersetup{
21 pdftitle={\mytitle},
22 pdfauthor={Rodrigo E. Lazo Paz},
23 pdfdisplaydoctitle=true,
24 pdfborder=0 0 0
27 \title{\mytitle}
29 \author{
30 Rodrigo E. Lazo Paz\\%\thanks{Grants.} \\
31 IC, Unicamp \\
32 Campinas, Brasil \\
33 {\small \url{rodrigo.lazo@students.ic.unicamp.br}} \\
34 \and
35 Luiz E. Buzato \\ %\thanks{Identificação de projetos aqui.}\\
36 IC, Unicamp \\ Campinas, Brasil \\ {\small
37 \url{buzato@ic.unicamp.br}}
40 \hyphenation{par-ti-cu-lar-men-te}
41 \hyphenation{su-fi-ci-en-tes}
43 \begin{document}
44 \doublespacing
46 \maketitle
48 \begin{abstract}
49 \noindent Nos sistemas distribuídos replicados, a queda e
50 subsequente recuperação de pelo menos uma réplica produz uma
51 degradação no desempenho do sistema devido a dois fatores: (i) a
52 re-distribuição da carga de trabalho entre as réplicas
53 remanescentes, e (ii) o impacto negativo que a re-introdução de um
54 processo falho tem sobre o sistema como um todo, porque a
55 recuperação tem um custo diretamente proporcional ao tamanho do
56 estado persistente que deve ser recuperado. Esse projeto avalia
57 alternativas para o armazenamento do estado persistente que não
58 requerem o uso de memória estável. Por exemplo, é possível que uma
59 réplica mantenha o seu estado na memória principal de um outro
60 computador. É possível ainda que algumas réplicas mantenham seu
61 estado em memória estável local enquanto outras utilizam somente
62 memória volátil. Neste projeto, avaliaremos múltiplas configurações
63 de sistemas distribuídos replicados com armazenamento híbrido,
64 combinando memoria estável local e repositórios remotos localizados
65 em memória volátil de outros computadores, de maneira a tentar
66 minimizar o impacto da recuperação de réplicas falhas no desempenho
67 do sistema replicado. Os resultados serão aplicados na melhora da
68 biblioteca Tréplica para a construção de aplicações de alta
69 disponibilidade, desenvolvida no Laboratório de Sistemas
70 Distribuídos do Instituto de Computação da Universidade Estadual de
71 Campinas.
72 \end{abstract}
75 \newpage
77 \section{Introdução}
78 \label{sec:introduction}
80 Algoritmos distribuídos são aqueles projetados para executar em
81 sistemas compostos por um conjunto interconectado de processos
82 autônomos que trocam informação. O progresso do algoritmo depende de
83 dois elementos: o progresso individual de cada um dos processos e da
84 troca de informação entre eles. Os modelos distintos,
85 i.e.\ suposições, que descrevem características específicas desses
86 elementos do sistema são:
88 \begin{itemize}
89 \item \textit{Modelo de intercomunicação dos processos}, admite duas
90 possibilidades: a troca de mensagens (enviando mensagens
91 ponto-a-ponto ou um-para-varios; mantendo o ordem de envio na
92 recepção ou não), ou a leitura e escrita de variáveis comuns na
93 memoria compartilhada.
94 \item \textit{Modelo temporal}, distingue três possibilidades:
95 \begin{inparaenum} [\itshape a\upshape)]
96 \item \textit{sistemas síncronos}: todos os processos executam cada
97 passo do algoritmo simultaneamente e o tempo de demora é
98 conhecido;
99 \item \textit{sistemas assíncronos}: cada processo pode tomar uma
100 quantidade indeterminada de tempo para executar cada passo do
101 algoritmo;
102 \item \textit{sistemas parcialmente síncronos}, algumas suposições
103 sobre o tempo de demora de algumas operações são possíveis, mas
104 não se garante que os processos executem simultaneamente os passos
105 do algoritmo.
106 \end{inparaenum}
107 \item \textit{Modelo de falhas}, classifica o comportamento dos
108 processos na presencia de falhas em: \textit{falha-e-para}: o
109 processo falha e deixa de participar do sistema;
110 \textit{falha-e-recuperação}: o processo falha, mas, em algum
111 momento no futuro, volta ao sistema; \textit{falha de omissão}: o
112 processo não realiza algumas ações arbitrariamente, e.g.\ enviar uma
113 mensagem; e \textit{falha bizantina}: o comportamento do processo é
114 aleatório. Além dos processos, os canais de comunicação também podem
115 apresentar falhas; por exemplo, no caso da comunicação por troca de
116 mensagens, perder, duplicar ou corromper as mensagens.
117 \end{itemize}
119 É claro que, as combinações distintas dos modelos apresentados, dão
120 lugar a uma multiplicidade de ambientes muito ampla e, portanto, não é
121 possível, ou ao menos prático, desenhar algoritmos distribuídos que
122 sejam capazes de executar em modelo qualquer; é por isso que somente
123 se pode avaliar a correção dos algoritmos sob as condições
124 determinadas por um certo modelo computacional. Por exemplo, um
125 algoritmo desenhado para um sistema síncrono e sem falhas não vai
126 funcionar se for executado por um sistema assíncrono sujeito a falhas
127 arbitrárias. Assim, um modelo determina o arcabouço teórico e prático
128 para o desenvolvimento e aplicação de um algoritmo distribuído.
130 Neste projeto adotamos o modelo assíncrono onde processos falham e
131 depois se recuperam, isto é, se re-integram ao sistema. Nesse modelo é
132 necessário lidar com dois problemas importantes que têm impacto sobre
133 o desempenho do sistema: (i) memória estável e (ii) detecção de
134 falhas. Como essa proposta não desenvolverá novos mecanismos para
135 detecção de falhas, esse estudo e objeto de um outro Mestrado
136 relacionado a este, discutiremos a seguir somente o problema relacionado
137 à necessidade de memória estável.
139 Quando um processo falha, ele perde o seu estado local, isto é, aquele
140 armazenado em memória volátil. Uma maneira de resolver esse problema é
141 supor que periodicamente o processo transfere fotografias de seu
142 estado para memória estável. Assim, após uma falha o processo
143 recém-iniciado pode recompor o seu estado a partir do última
144 fotografia armazenada em memória estável, o último \emph{checkpoint}.
145 Infelizmente, operações de leitura e escrita em memória estável são
146 lentas e custosas e, portanto, devem ser evitadas ao máximo. Isto nos
147 leva diretamente às questões de pesquisa deste projeto:
149 \begin{itemize}
150 \item \emph{O uso de memória estável é sempre necessário para se
151 manter a consistência e tolerância a falhas de sistemas replicados
152 baseados em consenso?}
153 \item \emph{Se o uso de memória estável não é sempre necessário, então
154 que mecanismos e meios alternativos de armazenamento podem ser
155 utilizados para reduzir o custo da recuperação de um processo
156 falho?}
157 \end{itemize}
159 O restante do projeto é organizado da seguinte forma. A próxima seção
160 contextualiza este projeto dentro da pesquisa já realizada no
161 Laboratório de Sistemas Distribuídos sobre replicação ativa. A
162 seção~\ref{sec:teoria} apresenta os fundamentos sobre modelos
163 computacionais no cenário de falha-e-recuperação para algoritmos
164 distribuídos que se comunicam através de \textit{broadcast} de ordem
165 total. A seção~\ref{sec:treplica} apresenta a plataforma Treplica,
166 empregada para os testes e a avaliação de nossa projeto. Na
167 seção~\ref{sec:proposta} são discutidos os argumentos que dão
168 sustentação ao nosso projeto, assim como os modelos que podem ser
169 empregados para ajudar na resposta da nossa pergunta de pesquisa.
170 Finalmente, a seção~\ref{sec:metodologia} apresenta concisamente a
171 metodologia de pesquisa, as etapas a serem cumpridas no projeto e o
172 seu respectivo cronograma.
174 \section{Contexto da Pesquisa}
175 \label{sec:contexto}
176 Esta seção sumariza o contexto dentro do qual este projeto será
177 desenvolvido. Nos últimos quatro anos o Prof. Buzato trabalhou em
178 replicação ativa com o seu aluno de Doutorado, Gustavo M. D. Vieira e
179 o Prof.\ Willy Zwaenepoel, EPFL. O trabalho com o Prof.\ Zwaenepoel
180 foi desenvolvido durante a licença sabática do Prof.\ Buzato,
181 realizada durante 2008 no Instituto de Comunicação e Computação da
182 EPFL, Lausanne, Suiça. Até o momento a pesquisa em replicação resultou
183 nos seguintes trabalhos:
185 \begin{description}
186 \item \textsl{Treplica: Ubiquitous
187 replication}~\cite{vieira08:_trepl}, publicado em 2008 , apresenta
188 detalhadamente a conceição e implementação de Treplica.
190 \item \textsl{Dynamic Content Web Applications: Crash, Failover, and
191 Recovery Analysis}~\cite{buzato09}, mostra o efeito das falhas e
192 recuperações no desempenho de um aplicação Web implementada com
193 Treplica. Neste artigo, a medição do desempenho é baseada no
194 \emph{benchmark} TPC-W aumentado com medidas de disponibilidade. Os
195 resultados mostraram bom desempenho, excelente escalabilidade e
196 disponibilidade ininterrupta. Este artigo foi publicado nos anais da
197 \textsl{39th International Conference on Dependable Systems and
198 Networks (DSN 2009)}, Estoril, Portugal
199 (doi:10.1109/DSN.2009.5270331).
201 \item \textsl{The Performance of Paxos and Fast
202 Paxos}~\cite{vieira09}, caracteriza e compara, em execuções com e
203 sim presencia de falhas, o desempenho dos algoritmos de consenso
204 Paxos e Fast Paxos. Os resultados mostraram que no ambiente LAN
205 Paxos teve um melhor desempenho que Fast Paxos; isto devido às
206 violações de temporização deste último e não, como se poderia
207 intuir, à suposição otimista deste. Esse é o primeiro indício de que
208 é possível considerar modelos parcialmente síncronos para produzir
209 uma versão de Fast Paxos com desempenho melhor. Este artigo foi
210 publicado nos anais do 27º Simpósio Brasileiro de Redes de
211 Computadores e Sistemas Distribuídos (SBRC 2009), Recife, Brasil.
213 \item \textsl{On the Coordinator's Rule for Fast
214 Paxos}~\cite{vieira08b}, mostra uma análise da implementação da
215 regra de consistência do algoritmo Fast Paxos como implementada pelo
216 processo coordenador em função do número de processos no quórum. Com
217 base nesta análise, os autores propuseram uma regra simplificada de
218 consistência interessante para implementação. Este artigo foi
219 publicado no periódico \textsl{Information Processing Letters},
220 volume 107, 2008.
222 \item \textsl{A Recovery Efficient Solution for the Replacement of
223 Paxos Coordinators}~\cite{vieira-tr10a}, mostra uma otimização do
224 procedimento de substituição de um coordenador no algoritmo
225 Paxos. Devido à importancia deste, o processo de substituição pode
226 deter. Mostro-se um procedimento que provoca o mínimo de
227 perturbação. Uma observação interessante é que em sistemas
228 sobrecarregados, ainda na ausência de falhas de processos, a
229 coordenação é trocada frequentemente.
230 \end{description}
232 Os resultados de pesquisa obtidos nos trabalhos listados aqui
233 constituem o contexto que nos motivou à formulação da nossa questão de
234 pesquisa: Qual é o método de armazenamento e recuperação de estado que
235 minimiza o impacto da recuperação de um processo sobre o desempenho do
236 sistema replicado? Antes de nos aprofundarmos na questão é necessário
237 descrever um pouco os conceitos importantes associados à replicação.
239 \section{Fundamentação Teórica}
240 \label{sec:teoria}
242 O fornecimento de um serviço altamente disponível através do uso de
243 processos replicados é uma técnica bem
244 conhecida~\cite{Schneider:1990:IFS:98163.98167}. Existem duas formas
245 de replicação: a ativa ou de máquina de
246 estados~\cite{lamport1978implementation}, onde todos as réplicas
247 recebem e executam as mesmas requisições, no mesmo ordem para
248 garantirem a consistência do estado replicado; e a passiva, onde um
249 único processo recebe todas as requisições, as aplica localmente, e
250 depois transfere um estado resultante para demais réplicas. Na
251 replicação ativa, um dos métodos mais utilizados em sua implementação
252 é baseado em algoritmos de consenso
253 distribuído~\cite{Lamport:1998:PP:279227.279229,
254 Schneider:1990:IFS:98163.98167,Oki:1988:VRN:62546.62549} e o
255 \textit{broadcast} de ordem total~\cite{vieira10:implementing-tr}.
257 Nesta seção discute-se a fundamentação teórica da solução de
258 replicação ativa, no modelo assíncrono com falha-e-recuperação,
259 utilizada nossa nossa proposta de pesquisa. Na
260 seção~\ref{sec:notacao}, definiremos a notação utilizado ao longo do
261 texto além dos modelos computacionais adotados. A
262 seção~\ref{sec:consenso} descreve o problema do consenso e sua solução
263 utilizando o algoritmo Paxos. Na seção~\ref{sec:broadcast}, o
264 \textit{broadcast} de ordem total é definido, e suas caraterísticas
265 detalhadas.
267 \subsection{Modelo do sistema e notação}
268 \label{sec:notacao}
269 O modelo suposto neste trabalho é assíncrono, portanto, não existe
270 suposição nenhuma acerca do tempo de demora da comunicação ou do
271 processamento. Todos os processos no sistema estão conectados, e a
272 comunicação é através da troca de mensagens, as quais se podem perder
273 durante a transmissão. Os processos podem falhar e voltar ao
274 sistema. Após falhar, os processos perdem seu estado atual, mas, têm a
275 possibilidade de armazenar, de maneira persistente, informação
276 suficiente para a recuperação de algum estado anterior.
278 % \begin{table}[h]
279 % \small
280 % \centering
281 % \begin{tabular}{|l|p{5cm}|l|p{5.4cm}|}
282 % \hline
283 % \(\Pi\) & Conjunto de processos. &
284 % \(\mathcal{M}\) & Conjunto de mensagens. \\
285 % \(sender(m)\) & Processo remitente de \(m\). &
286 % \(Dest(m)\) & Conjunto destinatário de \(m\). \\
287 % \(\Pi_{sender}\) & Conjunto de processos que podem enviar mensagens. &
288 % \(\Pi_{dest}\) & Conjunto de processos que podem receber mensagens. \\
289 % \(\mathcal{T}\) & Relógio global. &
290 % \(F(t)\) & Conjunto de processos caídos no tempo \(t\). \\
291 % \(Bom(F)\) & Conjunto de processos bons (em F). &
292 % \(Ruim(F)\) & Conjunto de processos ruins (em F). \\
293 % \textit{Instável}\((F)\) & Conjunto de processos instáveis (em F).& & \\
294 % \hline
295 % \end{tabular}
296 % \caption{Notação}
297 % \label{tab:notacao}
298 % \end{table}
300 % Neste trabalho vamos a seguir a notação utilizada por Défago, Schiper
301 % e Úrban~\cite{Defago:2004}, resumida na tabela~\ref{tab:notacao}. Seja
302 % \(\Pi = \{P_1, \ldots, P_n\}\) um conjunto de \(n\) processos que
303 % conformam o sistema. A comunicação é baseada no envio de mensagens,
304 % tal que \(\mathcal{M}\) é o conjunto de mensagens válidos. Seja \(m
305 % \in \mathcal{M}\) uma mensagem válida em \(\mathcal{M}\), \(sender(m)
306 % \in \Pi \) designa o processo originador da mensagem \(m\), e
307 % \(Dest(m) \subseteq \Pi \) é o conjunto não vazio de processos aos
308 % quais a mensagem \(m\) foi enviada. Além disso, seja \(\Pi_{sender}\)
309 % o conjunto de todos os processos que podem enviar mensagens válidas, e
310 % seja \(\Pi_{dest} \stackrel{\mathrm{def}}{=} \bigcup_{m \in
311 % \mathcal{M}} Dest(m)\) o conjunto de destinos possíveis das
312 % mensagens válidas.
314 Neste trabalho vamos a seguir a notação utilizada por Défago, Schiper
315 e Úrban~\cite{Defago:2004}. Seja \(\Pi = \{P_1, \ldots, P_n\}\) um
316 conjunto de \(n\) processos que conformam o sistema. A comunicação é
317 baseada no envio de mensagens, tal que \(\mathcal{M}\) é o conjunto de
318 mensagens válidos. Seja \(m \in \mathcal{M}\) uma mensagem válida em
319 \(\mathcal{M}\), \(sender(m) \in \Pi \) designa o processo originador
320 da mensagem \(m\), e \(Dest(m) \subseteq \Pi \) é o conjunto não vazio
321 de processos aos quais a mensagem \(m\) foi enviada. Além disso, seja
322 \(\Pi_{sender}\) o conjunto de todos os processos que podem enviar
323 mensagens válidas, e seja \(\Pi_{dest} \stackrel{\mathrm{def}}{=}
324 \bigcup_{m \in \mathcal{M}} Dest(m)\) o conjunto de destinos possíveis
325 das mensagens válidas.
327 Para simplificar a apresentação do modelo, suponha-se a existência de
328 um relógio discreto global \(\mathcal{T}\) com domínio de valores nos
329 números naturais; os processos não têm conhecimento ou contato como
330 ele.
332 A seguinte classificação dos processos em função a seu comportamento
333 de falhas é tomada de Aguilera, Chen e
334 Toueg~\cite{Aguilera:2000:FDC:1035750.1035753}. Seja o padrão de falhas \(F\)
335 uma função de \(\mathcal{T}\) a \(2^\Pi\), tal que \(F(t)\) representa
336 o conjunto dos processos que não estão presentes no sistema no tempo
337 \(t\). Um processo está \textit{ativo no tempo} \(t\) (em \(F\)) se
338 \(p \in F(t)\), e está \textit{inativo no tempo} \(t\) (em \(F\)) no
339 caso contrario. Um processo \textit{cai} no tempo \(t\) se está ativo
340 no tempo \(t-1\) e inativo no tempo \(t\)\footnote{Um processo
341 \textit{cai} no tempo \(t=0\) se está inativo no tempo \(t=0\) }. Um
342 processo se \textit{recupera} no tempo \(t\) se está inativo no tempo
343 \(t-1\) e está ativo no tempo \(t\). Os processos, em função a seu
344 comportamento, podem se classificar como:
346 \begin{itemize}
347 \item \textit{Sempre Ativo}: O processo \(p\) nunca cai.
348 \item \textit{Eventualmente Ativo}: O processo caiu pelo menos uma
349 vez, mas, após algum momento \(t\), o processo mantém-se ativo.
350 \item \textit{Eventualmente Inativo}: O processo caiu pelo menos uma
351 vez, e, após algum momento \(t\), o processo não volta à atividade.
352 \item \textit{Instável}: O processo cai e volta um número infinito de
353 vezes.
354 \end{itemize}
356 Um processo é \textit{bom} (em \(F\)) se é sempre ativo ou
357 eventualmente ativo. Um processo é \textit{ruim} (em \(F\)) se é
358 eventualmente inativo ou instável. Denota-se \(Bom(F)\), \(Ruim(F)\) e
359 \textit{Instável}\((F)\) aos conjuntos de processos (em \(F\)) bons,
360 ruins e instáveis, respetivamente.
362 \subsection{Consenso}
363 \label{sec:consenso}
364 O problema do consenso~\cite{Pease:1980:RAP:322186.322188} é um dos
365 mais fundamentais da área dos algoritmos distribuídos. Considere um
366 conjunto \(\Pi = \{p_1,\ldots,p_n\}\) de \(n\) processos; seja \(V =
367 \{v_1^0, \ldots, v_n^0\}\) o conjunto de estados inicias dos
368 processos, tal que \(v_i^0\) é o valor inicial do processo
369 \(p_i\). Eventualmente cada processo \(p_i\) tem que \textit{decidir}
370 um valor \(decide(p_i) = v_i\), tal que todos os processos corretos
371 concordem neste, e as seguintes propriedades forem
372 satisfeitas~\cite{Aguilera:2000:FDC:1035750.1035753}:
374 \begin{description}
375 \item[Validade uniforme] se um processo decide $v$, então algum
376 processo o propôs, i.e.\ \(\forall p \in \Pi(decide(p) \in V)\).
377 \item[Consenso] Todos os processos \textit{bons} decidem o mesmo
378 valor, i.e.\ \(\exists ! v \in V \forall p \in Bom(F) (decide(p_i) = v)\).
379 \item[Terminação] Se todos os processos \textit{bons} propõem um
380 valor, eventualmente um daqueles é escolhido, i.e.\ \(\exists ! v
381 \in V~\forall p \in Bom(F)~\exists T \in \mathcal{T}~\forall t > T
382 (v^0_p \in V \Rightarrow decide(p) = v)\).
383 \end{description}
385 Existe uma variação mais estrita, o consenso
386 uniforme~\cite{Neiger:1990:AIF:83334.83337}, que impõe restrições às
387 escolhas dos processos \textit{ruins}:
389 \begin{description}
390 \item[Consenso uniforme] Os processos não \textit{decidem} valores
391 distintos, i.e.\ \(\exists ! v \in V~\forall p \in \Pi (decide(p_i) = v)\).
392 \end{description}
394 No caso síncrono sem falhas, o problema é facilmente
395 resolvível~\cite{Lynch:1996:DA:525656}, porém, o resultado de
396 impossibilidade obtido por Fischer, Lynch e Patterson~\cite{fischer85}
397 mostra que o problema não se pode resolver de maneira determinista num
398 sistema distribuído assíncrono com apenas um processo falho. Existem
399 distintas soluções propostas: o uso de aleatorização~\cite{Chor89},
400 definição de problemas mais restritos e suas soluções~\cite{dolev87} e
401 o uso detetores de falhas não
402 confiáveis~\cite{Chandra:1996:WFD:234533.234549,
403 Chandra:1996:UFD:226643.226647}, etc.
405 \paragraph{Algoritmo de consenso Paxos}
406 O algoritmo de consenso Paxos, originalmente proposto por
407 Lamport~\cite{Lamport:1998:PP:279227.279229}, é um dos mais utilizados
408 na prática~\cite{Burrows:2006:CLS:1298455.1298487,
409 Camargos:2007:SMH:1272998.1273036,
410 MacCormick:2004:BAF:1251254.1251262,
411 Saito:2004:FBD:1024393.1024400}. Neste algoritmo, os processos
412 assomem pelo menos um dos seguintes papéis:
413 \begin{inparaenum}[\itshape a\upshape)]
414 \item \textit{proponente}, que propõe valores;
415 \item \textit{receptor}, que escolhe um único valor; e
416 \item \textit{aprendiz}, que aprende o valor escolhido.
417 \end{inparaenum}
419 O algoritmo pode precisar uma ou varias rodadas para alcançar o
420 consenso, cada uma identificada por um número de rodada \(r\). No
421 começo de cada rodada os proponentes eligem um coordenador, quem
422 avalia se a maioria \(\lfloor n/2 \rfloor +1\) dos \(n\) receptores
423 participou da rodada anterior \(r-1\), e, portanto, o consenso foi
424 alcançado. No caso contrario, o algoritmo continua em duas fases com
425 dois passos cada uma:
427 \begin{itemize}
428 \item \textit{Fase 1a}, o coordenador invita aos receptores a
429 participar da rodada \(r\), os quais aceitam somente se não
430 participam de uma rodada \(r' \geq r\). A partir desse momento, os
431 receptores que aceitaram o convite \textit{prometem} não participar
432 em outra rodada, \(r'' < r\).
433 \item \textit{Fase 1b}, os receptores que aceitaram o convite enviam
434 ao coordenador o valor da última proposta que votaram e o número de
435 rodada na qual aquilo aconteceu, ou \textit{nulo} no caso contrario.
436 \item \textit{Fase 2a}, se suficientes respostas forem recebidas pelo
437 coordenador, \(\lfloor n/2 \rfloor +1\), ele escolhe dentro dos
438 valores retornados aquele que poderia ter sido \textit{decidido} em uma
439 rodada \(r' < r\), ou no caso seja \textit{nulo}, escolhe a
440 proposta feita pelos proponentes. Logo, ele pede aos receptores que
441 votem na proposta escolhida.
442 \item \textit{Fase 2b}, após receber o pedido de votar do coordenador,
443 e sempre que não houveram \textit{prometido} participar na rodada
444 \(r\), os receptores votam enviando o número de rodada \(r\) e o
445 valor decidido aos aprendizes.
446 \item O consenso é alcançado no momento que suficientes receptores,
447 \(\lfloor n/2 \rfloor +1\), votam na fase 2b.
448 \end{itemize}
450 Uma caraterística interessante do Paxos é que sua tolerância a falhas
451 fundamenta-se no uso de \textit{quorum} de processos, e não no
452 conhecimento do estado atual deles, como os detetores de falhas. O
453 algoritmo garante que se um valor é eleito, a escolha não muda,
454 portanto um processo que caiu e volta, pode aprendê-lo. Para que isso
455 aconteça, cada participante do algoritmo tem que armazenar
456 persistentemente as rodadas nas quais ele participou e os valores que
457 votou.
459 \subsection{Broadcast de ordem total}
460 \label{sec:broadcast}
461 % seção muito longa?
462 O \textit{broadcast} de ordem total, ou atômico, é uma primitiva de
463 comunicação assíncrona de alto nível que garanta que as mensagens
464 enviadas a um conjunto de processos sejam recebidas, no mesmo ordem,
465 por todos os membros~\cite{Defago:2004}. O problema é definido
466 formalmente em função de duas primitivas, \textit{TO-broadcast}\((m)\)
467 e \textit{TO-deliver}\((m)\), onde \(m \in \mathcal{M}\) e uma
468 mensagem válida. Quando um processo \(p \in \Pi\) executa
469 \textit{TO-broadcast}\((m)\) (respectivamente,
470 \textit{TO-deliver}\((m)\)) diz-se que o processo \(p\)
471 \textit{TO-broadcasts} \(m\) (respectivamente, \textit{TO-delivers}
472 \(m\)). Todas as mensagens têm identificadores únicos, e levam consigo
473 a identidade de seu remetente, denotado \textit{sender}\((m)\). Além
474 disso, supomos que para qualquer mensagem \(m\), e em quaisquer
475 execução, a chamada \textit{TO-broadcasts}\((m)\) é feita uma vez
476 só. Neste contexto, o \textit{broadcast} de ordem total é definido
477 pelas seguintes
478 propriedades~\cite{Chandra:1996:WFD:234533.234549,hadzilacos94}:
480 \begin{itemize}
481 \item \textit{Validade}, se um processo bom \textit{TO-broadcasts} a
482 mensagem \(m\), então ele eventualmente \textit{TO-delivers} \(m\).
483 \item \textit{Acordo uniforme}, se um processo \textit{TO-delivers} uma
484 mensagem \(m\), então todos os processos bons eventualmente
485 \textit{TO-deliver} \(m\).
486 \item \textit{Integridade uniforme}, para qualquer mensagem \(m\),
487 cada processo \textit{TO-delivers} \(m\) no máximo uma vez, se
488 somente se \(m\) foi \textit{TO-broadcast} por
489 \textit{sender}\((m)\) anteriormente.
490 \item \textit{Ordem total uniforme}, se os processos \(p\) e \(q\)
491 \textit{TO-deliver} as mensagens \(m\) e \(m'\), então \(p\)
492 \textit{TO-delivers} \(m\) antes de \(m'\), se somente se \(q\)
493 \textit{TO-delivers} \(m\) antes de \(m'\).
494 \end{itemize}
496 Se a primitiva de comunicação satisfaz todas as propriedades exceto
497 ordem total uniforme é chamada \textit{broadcast} confiável. No caso a
498 primitiva cumpra todas as propriedades prévias, é chamada uniforme,
499 porque impõe restrições ao comportamento de todos dos processos. O
500 broadcast não uniforme só se aplica aos processos bons (propriedades
501 de acordo e integridade não uniformes).
503 % Não gosto do paragrafo, é uma simples enumeração, não é muito
504 % legível.
505 A relação entre o conjunto destino das mensagense, o conjunto de
506 processos do sistema e a presença do remetente como destinatario da
507 mensagem gera a seguinte classificação:
508 \begin{inparaenum}[\itshape a\upshape)]
509 \item Se ambos são iguais, i.e \(\forall m \in \mathcal{M} (Dest(m) =
510 \Pi)\), a primitiva é \textit{broadcast};
511 \item Se o conjunto destino é um subconjunto dos processos, e
512 distintas mensagens têm distintos conjuntos destinos e os remetentes
513 podem não ser destinatários, i.e.\ \(\exists m \in \mathcal{M}
514 (sender(m) \notin Dest(m)) \wedge \exists m_i,m_j \in \mathcal{M}
515 (Dest(m_i) \neq Dest(m_j))\), a primitiva é multicast.
516 \item Se o remitente é membro dos destinatários, i.e.\ \(\forall m \in
517 \mathcal{M} (sender(m) \in Dest(m))\), o grupo é \textit{fechado};
518 \item Se o remitente não precisa pertencer ao grupo destino, i.e.\
519 \(\exists m \in \mathcal{M}(sender(m) \notin Dest(m))\), o grupo e
520 \textit{aberto}.
521 \end{inparaenum}
523 A conformação do conjunto de processos do sistema não precisa ser
524 fixa. Se os processos podem entrar, sair e ser removidos dele, o grupo
525 é \textit{dinâmico}, contraposto ao grupo \textit{estático}, que não
526 permite a mudanca de membros durante a execução. Às distintas
527 configurações ao longo do tempo são
528 \textit{vistas}~\cite{Chockler:2001:GCS:503112.503113}. A primitiva de
529 comunicação equivalente ao \textit{broadcast} confiável nos grupos
530 dinâmicos é a \textit{sincronia de vista}, que cumpre as mesmas regras
531 de validade, integridade uniforme e uma versão de acordo relaxada aos
532 membros atuais. Uma sincronia de vista que cumpre adicionalmente a
533 propriedade de ordem total é o equivalente ao \textit{broadcast} de
534 ordem total nos grupos estáticos.
536 Existem diversos mecanismos pelos quais se pode definir a ordem de
537 entrega das mensagens~\cite{Defago:2004}, porém, em todos são
538 distinguíveis três papéis: remetente (i.e.\ \(p \in \Pi_{sender}\)),
539 destinatário (i.e.\ \(p \in \Pi_{dest}\)) e o sequenciador que define
540 o ordem de entrega das mensagens. Existem as seguintes cinco classes:
542 \begin{itemize}
543 \item \textit{Sequenciador fixo} (e.g.\ Garcia-Molina e
544 Spauster~\cite{garcia2002message}). Um único sequenciador é
545 escolhido. Possui três variantes:
546 \begin{inparaenum}[\itshape a\upshape)]
547 \item \textit{unicast-broadcast}, se o remetente envia as mensagens
548 ao sequenciador, e ele se responsabiliza pela entrega ordenada;
549 \item \textit{broadcast-broadcast}, se o remetente envia as
550 mensagens diretamente aos destinatários e ao sequenciador, e logo
551 este envia a ordem de entrega;
552 \item \textit{unicast-unicast-broadcast}, se o remetente envia as
553 mensagens ao sequenciador, logo este retorna os identificadores de
554 sequencia das mensagens, e finalmente o remetente envia
555 diretamente as mensagens.
556 \end{inparaenum}
557 \item \textit{Sequenciador móvel} (e.g.\
558 Pinwheel~\cite{cristian97:high_performance}). É muito similar ao
559 sequenciador fixo, mas o papel de sequenciador é transferível entre
560 um conjunto de processos. Na literatura, o principio utilizado pelos
561 sequenciadores móveis é equivalente ao \textit{broadcast-broadcast}
562 dos sequenciadores fixos~\cite{Defago:2004}.
563 \item \textit{Baseados em privilégios} (e.g.\ Gopal e
564 Toueg~\cite{Gopal:1989:RBS:645946.675018}). A diferença das classes
565 anteriores, os papéis do sequenciador e do remetente são
566 desenvolvidos pelo mesmo processo. O principio é que só o processo
567 que possui o privilegio, e.g.\ token, pode enviar mensagens, mas
568 este privilegio é circulado entre os remetentes.
569 \item \textit{Baseados na historia da comunicação}(e.g.\
570 Atom~\cite{Bar-Joseph:2002:EDA:645959.676132}). São os destinatários
571 os que definem a ordem de entrega das mensagens baseando-se na
572 historia deles, i.e.\ os destinatários são os sequenciadores. Os
573 dois métodos utilizados são:
574 \begin{inparaenum}[\itshape a\upshape)]
575 \item \textit{historia causal}, onde algoritmos de ordem causal
576 parcial~\cite{Lamport:1978_clocks} são aumentados com políticas
577 comuns para a ordenação de mensagens concorrentes, e o ordem
578 total resultante é utilizado para ordenação das mensagens;
579 \item \textit{união determinista}, onde não existe uma ordenação
580 causal das mensagens, senão uma política determinista de união dos
581 fluxos de mensagens de cada remetente.
582 \end{inparaenum}
583 \item \textit{Acordo dos destinatários}(e.g.\ Chandra e
584 Toueg~\cite{Chandra:1996:UFD:226643.226647}). Como o nome o indica,
585 os destinatários acordam a ordem das mensagens a ser entregues. As
586 variantes são:
587 \begin{inparaenum}[\itshape a\upshape)]
588 \item \textit{acordo na sequencia de mensagens}, cada destinatário
589 assina uma \textit{timestamp} local a mensagem, logo a maior
590 destas é escolhida como a \textit{timestamp} global e é utilizada
591 para ordenar a entrega;
592 \item \textit{acordo no conjunto de mensagens}, algoritmos de
593 consenso são utilizados para determinar um subconjunto de
594 mensagens a ser entregues simultaneamente por todos os processos
595 (a ordenação no subconjunto é definida por algum parâmetro
596 predefinido);
597 \item \textit{acordo na aceitação de ordens propostas}, um processo
598 propõe uma ordem das mensagens e os demais destinatários acordam
599 se é aceitado o não, utilizando algum protocolo de \textit{commit}
600 atômico.
601 \end{inparaenum}
602 \end{itemize}
604 Chandra e Toueg~\cite{Chandra:1996:UFD:226643.226647} mostraram
605 que o problema do consenso uniforme e o \textit{broadcast} de ordem
606 total em sistemas assíncronos com falhas de parada são equivalentes,
607 i.e.\ qualquer algoritmo que possa resolver um deles também se pode
608 adaptar para resolver o outro. Portanto, o \textit{broadcast} de ordem
609 total é sujeito ao mesmo resultado de impossibilidade de Fischer,
610 Lynch e Patterson.
612 Existem múltiplos mecanismos pelos quais se pode prover alguma
613 tolerância a falhas ao \textit{broadcast} de ordem total. Na prática, os
614 algoritmos implementam vários mecanismos simultaneamente. Os mecanismos
615 são:
617 \begin{itemize}
618 \item \textit{Detecção de falhas} Baseados nos detetores de falhas não
619 confiáveis propostos inicialmente por Chandra e
620 Toueg~\cite{Chandra:1996:UFD:226643.226647}.
621 \item \textit{Serviço de configuração do grupo}, profundamente
622 relacionado com os grupos dinâmicos. No evento de um processo cai, o
623 serviço gera uma nova vista do grupo e a envia aos processos ativos,
624 portanto, eles podem assumir que na vista atual todos os processos
625 estão ativos. Se um processo foi excluído erroneamente, é forçado a
626 cair para manter a correção. A diferença dos detetores de falhas,
627 provê notificações de falhas consistentes.
629 \item \textit{Padrões de comunicação tolerantes a falhas}, são aqueles padrões
630 que consideram, dentro do número \(n\) total de processos, um número
631 \(f\) máximo de processos que podem falhar, e trabalham sob o
632 pressuposto que sempre vão receber pelo menos \(n-f\) mensagens de
633 resposta.
635 \item \textit{Estabilidade das mensagens}. Além da possibilidade que
636 um processo fique bloqueado esperando a resposta de outro que caiu,
637 tem que se considerar a estabilidade das mensagens. Uma mensagem
638 \(m\) é \(k\)-estável se \(m\) e recebida por \(k\) processos. Se
639 num sistema podem cair ao mais \(f\) processos, é importante detetar
640 que as mensagens são \(f+1\)-estáveis, também chamadas estáveis, já
641 que permite aos algoritmos garantir que, eventualmente, as mensagens
642 são recebidas por todos os processos bons.
643 \item \textit{Consenso} O \textit{broadcast} de ordem total pode
644 reduzir se a uma série de execuções do problema do consenso,
645 portanto é possível delegar toda a responsabilidade da tolerância a
646 falhas ao algoritmo de consenso.
647 \end{itemize}
649 \section{Treplica}
650 \label{sec:treplica}
652 Esta seção sumariza a plataforma Treplica, sobre a qual este projeto
653 será desenvolvido. Treplica é uma biblioteca desenvolvida para apoiar
654 a construção de aplicações replicadas altamente disponíveis no modelo
655 de falha e
656 recuperação~\cite{vieira08:_trepl,vieira10:implementing-tr}. O
657 objetivo da ferramenta é garantir consistência e persistência de dados
658 através de abstrações de programação simples e descomplicadas.
660 A abstração de programação fundamental oferecida pela biblioteca é a
661 de filas assíncronas persistentes, que são utilizadas como canais de
662 comunicação em grupo com as seguintes propriedades:
664 \begin{inparaenum}[\itshape a\upshape)]
665 \item as mensagens são entregues no mesmo ordem;
666 \item todos os processos, ainda aqueles que caem e voltam ao sistema,
667 recebem todas as mensagens; e
668 \item a persistência das mensagens é garantida.
669 \end{inparaenum}
670 A similaridade com o \textit{broadcast} de ordem total com sincronia
671 de vista (seção~\ref{sec:broadcast}) e
672 clara~\cite{Birman:1987:EVS:41457.37515}, mas a entrega das mensagens
673 é restrito ao estado da aplicação, não à vista atual. Porém, pode-se
674 implementar as filas persistentes utilizando \textit{broadcast} de
675 ordem total uniforme. Em Treplica, cada fila tem um identificador
676 único chamado \textit{queue id}. Os processos que participam da
677 comunicação criam pontos de conexão exclusivos chamados \textit{queue
678 endpoints}, um para cada fila que utilizam. As primitivas oferecidas
679 pela fila são simples:
681 \begin{itemize}
682 \item \texttt{create(queueId)}, gera um ponto de conexão associado à
683 fila.
684 \item \texttt{getProcessId()}, retorna o identificador do processo
685 associado ao ponto de conexão.
686 \item \texttt{put(message)}, envia uma mensagem aos participantes da fila.
687 \item \texttt{get()}, recebe a próxima mensagem armazenada na fila.
688 \end{itemize}
690 A \emph{persistência} das mensagens é garantida pela fila e o ponto de
691 conexão que registra as mensagens já entregues. Portanto, no evento de
692 geração de um novo ponto de conexão, o processo vai receber todas as
693 mensagens enviadas pela fila. Esta propriedade, atrativa para o
694 desenvolvedor de aplicações, não se pode implementar efetivamente na
695 prática. Treplica suporta aplicações de grupos estáticos, nos quais os
696 participantes, i.e.\ pontos de conexão, são conhecidos desde o inicio
697 da aplicação e não mudam, mas podem cair e voltar ao sistema,
698 obrigarando o armazenamento permanente de toda a historia das
699 mensagens. A solução é o uso de persistência baseada na
700 fila~\cite{vieira10:implementing-tr} que armazena periodicamente de
701 maneira persistente uma copia do estado atual da aplicação e da fila,
702 i.e.\ \textit{snapshot} e o historial das mensagens já entregues
703 limpado. Este procedimento precisa suporte de parte da aplicação, a
704 qual deve delegar o controle de seu estado à fila através das
705 seguintes duas primitivas adicionais:
707 \begin{itemize}
708 \item \texttt{bind(stateHolder)}, cria uma relação entre o ponto de
709 conexão e o processos, através do \textit{stateHolder}, um
710 componente da aplicação que implementa os métodos
711 \texttt{getState()} e \texttt{setState(state)}.
712 \item \texttt{checkpoint()}, solicita a geração do \textit{snapshot}
713 do estado da aplicação e da fila.
714 \end{itemize}
716 É garantido que os \textit{snapshot} com a seguinte mensagem a ser
717 entregue. No caso que o processo falhe e quede atrasado no progresso
718 do sistema, a copia do estado de outra réplica pode-se utilizar para
719 sua atualização. Ainda em casos que o processo não falha mas fica
720 retrasado, é possível que seu estado seja trocado pelo estado de um
721 processo atualizado. Isto permite, e exige, que a aplicação seja
722 \textit{stateless}.
724 A implementação das filas assíncronas persistentes de Treplica utiliza
725 um algoritmo de \textit{broadcast} de ordem total uniforme baseado em
726 consenso, especificamente Paxos (ver seção~\ref{sec:consenso}) e Fast
727 Paxos~\cite{lamport06a}, uma variante que reduz uma das rondas de
728 comunicação, já que assume que as mensagens são ordenadas naturalmente
729 pelo canal de comunicação. A transição entre ambos algoritmos é
730 transparente ao usuário: em uma configuração de \(N\) réplicas, se
731 pelo menos \(\lceil 3N/4 \rceil\) estão disponíveis, Fast Paxos é
732 utilizado, no caso que pelo menos \(\lfloor 2N/1 \rfloor + 1\) estão
733 disponíveis, o algoritmo escolhido é Paxos; se nenhuma das dois
734 condições é cumprida o sistema é bloqueado até que suficientes
735 processos se recuperem.
737 \section{Proposta de pesquisa}
738 \label{sec:proposta}
739 Pesquisas anteriores~\cite{gray07:empirical,
740 Pinheiro:2007:FTL:1267903.1267905,
741 Schroeder:2007:DFR:1267903.1267904, 10.1109/SRDS.2008.9} mostraram
742 que, na prática, as falhas dos componentes de hardware dos sistemas
743 distribuídos de produção são maiores que as publicadas pelos
744 fabricantes; além disso, erros no software também causam quedas nos
745 processos, portanto, a tolerância a falhas é vital.
747 Esta proposta de pesquisa tem o foco em sistemas distribuídos de
748 replicação ativa no modelo de máquina de
749 estados~\cite{Schneider:1990:IFS:98163.98167}, com \textit{broadcast}
750 de ordem total uniforme. Os processos têm as seguintes caraterísticas:
751 \begin{inparaenum}[\itshape a\upshape)]
752 \item acesso a memória estável e a memória volátil;
753 \item participação no \textit{broadcast} como remetentes e
754 destinatários, i.e.\ \(\forall p,j \in \Pi~\exists m \in \mathcal{M}
755 (sender(m) = p \wedge j \in Dest(m))\);
756 \item suscetibilidade às falhas de software ou hardware, as quais
757 causam que os processos percam o conteúdo de sua memória volátil e
758 não participem do sistema por um tempo limitado mas desconhecido,
759 depois \textit{recuperam}-se e voltam à atividade.
760 \end{inparaenum}
761 As propriedades da comunicação pelo \textit{broadcast} uniforme,
762 definidas na seção~\ref{sec:broadcast}, que caracterizam o modelo são:
763 \begin{inparaenum}[\itshape a\upshape)]
764 \item o grupo de processos é fechado e estático;
765 \item a sequencia das mensagens é decidida por acordo dos
766 destinatários, utilizando o algoritmo de consenso Paxos.
767 \end{inparaenum}
769 O mecanismo de tolerância a falhas do sistema é fornecido pelo
770 \textit{broadcast} de ordem total uniforme que garanta a entrega
771 ordenada das mensagens, ainda aos processos com falhas. É possível,
772 porém não prático, que sejam armazenadas todas as mensagens enviadas
773 pelo \textit{broadcast} e, no caso de falhas, estas sejam entregues
774 novamente ao processo recuperado. Ao invés, cada nó vai armazenar
775 \textit{checkpoints} em períodos regulais. Não precisasse utilizar
776 protocolos de \textit{checkpoint} distribuídos tais como os
777 apresentados em~\cite{Chandy:1985:DSD:214451.214456,
778 Koo:1986:CRD:324493.325074} já que, a principal motivação do uso
779 deles, é garantir a consistência dos estados armazenados através do
780 sistema, mas neste caso não precisa; o \textit{broadcast} garanta a
781 consistência das mensagens entregues às replicas, e o algoritmo de
782 consenso fornece o mecanismo de coordenação e sincronização dos
783 estados.
785 % \begin{table}[h]
786 % \small
787 % \centering
788 % \begin{tabular}{|l|p{5cm}|l|p{5cm}|}
789 % \hline
790 % \(\Pi\) & Conjunto de processos do sistema. &
791 % \(\Pi_{local}\) & Conjunto de processos que armazenam localmente seus \textit{checkpoints}. \\
792 % \(\Pi_{remote}\) & Conjunto de processos que armazenam remotamente seus \textit{checkpoints}. &
793 % \(\Pi_{storage}\) & Conjunto de processos que armazenam localmente \textit{checkpoints} remotos, além dos próprios. \\
794 % \(\Pi'_{storage}\) & Conjunto de processos externos que armazenam localmente \textit{checkpoints} remotos. &
795 % \(P_{storage}\) & \(\Pi_{storage} \cup \Pi'_{storage}\). \\
796 % \(States_i\) & Conjunto de estados do processo \(p_i\). &
797 % \(S_i(t)\) & Estado do processo \(p_i\) no tempo \(t\). \\
798 % \(\mathcal{M}_b\) & Conjunto das mensagens dos algoritmos (\textit{broadcast} e consenso). &
799 % \(\mathcal{M}_s\) & Conjunto das mensagens de armazenamento dos \textit{checkpoints}. \\
800 % \hline
801 % \end{tabular}
802 % \caption{Notação adicional.}
803 % \label{tab:notacion_proposta}
804 % \end{table}
806 % Vamos definir mais formalmente o sistema; a
807 % tabela~\ref{tab:notacion_proposta} contém o resumo da notação
808 % utilizada adicional à já definida na tabela~\ref{tab:notacao}. Seja
809 % \(\Pi = \{p_1, \ldots, p_n\}\) um conjunto de \(n\) processos que
810 % conformam o sistema, i.e.\ participam do \textit{broadcast} de ordem
811 % total. Cada processo do sistema é modelado como uma máquina de
812 % estados, onde \(States_i\) é o conjunto (não necessariamente finito)
813 % de estados do processo \(p_i\). Seja \(S_i\) uma função de
814 % \(\mathcal{T}\) a \(States_i\), tal que \(S_i(t)\) representa o estado
815 % do processo \(i\) ao tempo \(t\); o estado especial \(\bot\)
816 % representa inatividade, e.g.\ \(S_i(t) = \bot \iff p_i \in F(t)\). Os
817 % processos só mudam de estado pelo intercambio de mensagens \(m \in
818 % \mathcal{M}\), ou pelos eventos de falha e recuperação.
820 O modelo computacional adotado para a discussão das configurações
821 possíveis de armazenamento de estados é o mesmo descrito na
822 seção~\ref{sec:notacao}.
824 Cada processo do sistema é modelado como uma máquina de
825 estados, onde \(States_i\) é o conjunto (não necessariamente finito)
826 de estados do processo \(p_i\). Seja \(S_i\) uma função de
827 \(\mathcal{T}\) a \(States_i\), tal que \(S_i(t)\) representa o estado
828 do processo \(i\) ao tempo \(t\); o estado especial \(\bot\)
829 representa inatividade, e.g.\ \(S_i(t) = \bot \iff p_i \in F(t)\). Os
830 processos só mudam de estado pela troca de mensagens \(m \in
831 \mathcal{M}\), ou pelos eventos de falha e recuperação.
833 O \textit{checkpoint} do processo \(p_i\) no tempo \(t\) é definido
834 como a copia não modificável do estado \(S_i(t)\). A operação que os
835 gera é atômica~\cite{Randell:1978:RIC:356725.356729} e só pode-se
836 executar no tempo \(t\) se \(S_i(t) \neq \bot\). Formalmente, a
837 recuperação, ou reconstrução~\cite{Okun:2002:NSR:829526.831119}, no
838 tempo \(t'\) do processo \(p_i\) é uma operação especial, executável
839 se \(p_i \in F(t')\), que transforma do estado inicial \(S_i(0)\) ao
840 estado \(S_i(t)\) armazenado pelo \textit{checkpoint} gerado no tempo
841 \(t\), tal que \(t'> t\). O procedimento descrito só volta o processo
842 a seu último estado armazenado; a responsabilidade da atualização
843 deste até o estado atual das demais réplicas é delegada ao algoritmo
844 de consenso. Os \textit{checkpoints} são gerados em intervalos
845 regulais.
847 Sejam \(\Pi_{local}\), \(\Pi_{remote}\) e \(\Pi_{storage}\), três
848 subconjuntos disjuntos do \(\Pi\) tais que sua união é igual a
849 este. Se \(p \in \Pi_{local}\), o processo \(p\) armazena seus
850 \textit{checkpoints} em sua memoria estável local. Se \(p \in
851 \Pi_{remote}\), o processo \(p\) delega a responsabilidade do
852 armazenamento a outros processos, enviando-lhes os
853 \textit{checkpoints}. Se \(p \in \Pi_{storage}\), o processo \(p\)
854 armazena seus \textit{checkpoints} em sua memoria estável local, além
855 de armazenar \textit{checkpoints} de processos remotos em suas duas
856 memórias: a estável e a volátil. Além dos processos já definidos,
857 existem um conjunto de processos \(\Pi'_{storage}\) que não participam
858 do \textit{broadcast} de ordem total, e portanto não são replicas do
859 sistema, i.e.\ \(\Pi_{storage} \cap \Pi = \emptyset\): se \(p \in
860 \Pi'_{storage}\), o processo \(p\) é um repositório, e tem a única
861 função de armazenar \textit{checkpoints} de processos remotos em suas
862 duas memorias: a estável é a volátil. Existe uma relação entre os
863 processos que delegam o armazenamento de seus \textit{checkpoints},
864 \(\Pi_{remote}\), e aqueles que assumem a responsabilidade,
865 representados pelo conjunto de processos \(P_{storage} = \Pi_{storage}
866 \cup \Pi'_{storage}\)~: seja \(Store\) uma relação de \(\Pi_{remote}\)
867 a \(2^{P_{storage}}\), tal que \(Store(p)\) representa o conjunto de
868 processos em \(P_{storage}\) que armazenam os \textit{checkpoints} de
869 \(p\); diz-se que \(j\) é um \textit{store} de \(p\) se somente se \(j
870 \in Store(p)\). Todos os processos de armazenamento devem ser
871 \textit{store} de pelo menos um processo remoto, i.e.\ \(\forall j \in
872 P_{storage} \exists p \in \Pi_{remote} (j \in Store(p))\), e todo
873 processo remoto tem que armazenar seus \textit{checkpoints} em pelo
874 menos um \textit{store}, i.e.\ \(\forall p \in \Pi_{remote} (Store(p)
875 \neq \emptyset)\).
877 %% As mensagens válidas são de duas classes: sejam \(\mathcal{M}_b\) e
878 %% \(\mathcal{M}_s\) dois subconjuntos disjuntos de \(\mathcal{M}\), tais
879 %% que \(\mathcal{M}_b \cap \mathcal{M}_s = \emptyset \wedge
880 %% \mathcal{M}_b \cup \mathcal{M}_s = \mathcal{M}\). \(\mathcal{M}_b\) é
881 %% o conjunto de todas as mensagens válidas do sistema que estão
882 %% relacionadas com o progresso dos algoritmos de consenso e de
883 %% \textit{broadcast} de ordem total uniforme; os remetentes e
884 %% destinatários destas mensagens são processos que participam do
885 %% consenso, i.e.\ \(\forall m \in \mathcal{M}_b (sender(m) \in \Pi \wedge
886 %% Dest(m) \subseteq \Pi)\). \(\mathcal{M}_s\) é o conjunto de todas as
887 %% mensagens válidas do sistema que transmitem valores de
888 %% \textit{checkpoint} entre os processos que participam do armazenamento
889 %% remoto de dados, i.e.\ \(\forall m \in \mathcal{M}_s(sender(m) \in
890 %% (\Pi_{remote} \cup P_{storage}) \wedge Dest(m) \in (\Pi_{remote} \cup
891 %% P_{storage}))\).
893 \begin{figure}[h]
894 \centering
895 \includegraphics[width=120mm]{images/system_arch}
896 \caption{Arquitetura do sistema}
897 \label{fig:arquitetura}
898 \end{figure}
900 O objetivo desta pesquisa é encontrar a melhor configuração em termos
901 de desempenho num sistema com as caraterísticas descritas na
902 figura~\ref{fig:arquitetura}. As medidas de desempenho utilizadas são:
903 \begin{inparaenum}[\itshape a\upshape)]
904 \item \textit{disponibilidade}, razão entre o tempo que a aplicação
905 está operacional e o tempo total de execução;
906 \item \textit{desempenho}, é a razão entre o desempenho médio da
907 aplicação em requisições atendidas por segundo durante o período sem
908 falhas e o desempenho promédio durante o período de recuperação;
909 está medida quantifica o impacto das falhas no desempenho da
910 aplicação;
911 \end{inparaenum}
913 As possíveis configurações do sistema são:
915 \begin{itemize}
916 \item \(\Pi_{local} = \Pi\), está é a configuração atual de
917 Treplica. Todos os processo armazenam seus \textit{checkpoints},
918 portanto o custo de recuperação do estado é dominado pela latência
919 da memoria estável, e o procedimento não gera tráfego de rede ou
920 carga adicional aos nós vizinhos\footnote{É claro que a falha de um
921 processo vai gerar uma carga de trabalho adicional aos demais
922 membro do sistema, devido à redistribuição de tarefas, mas é
923 considerado um custo inerente ao modelo e portanto não considerado
924 nos cálculos.}
925 \item \(\Pi_{local} \neq \emptyset \wedge \Pi_{remoto} \neq \emptyset
926 \wedge \Pi_{storage} \neq \emptyset \wedge \Pi'_{storage} =
927 \emptyset \), alguns processos armazenam seus estados em processos
928 remotos que participam do \textit{broadcast}, portanto o custo de recuperação
929 desses processos é dominado pela latência de rede, e o procedimento
930 gera tráfego de rede e carga adicional aos vizinhos, mas é uma
931 quantidade limitada aos processos que utilizam armazenamento remoto.
932 \item \(\Pi_{local} \neq \emptyset \wedge \Pi_{remoto} \neq \emptyset
933 \wedge \Pi_{storage} \neq \emptyset \wedge \Pi'_{storage} \neq
934 \emptyset \), alguns processos armazenam seus estados em processos
935 remotos que participam ou não do \textit{broadcast}, portanto o custo de
936 recuperação desses processos é dominado pela latência de rede, e o
937 procedimento gera tráfego de rede e carga adicional aos vizinhos,
938 mas é uma quantidade menor à opção anterior, já que o tráfego e a
939 carga gerados aos nós repositório não tem impacto sobre o desempenho do
940 sistema.
941 \item \(\Pi_{local} \neq \emptyset \wedge \Pi_{remoto} \neq \emptyset
942 \wedge \Pi_{storage} = \emptyset \wedge \Pi'_{storage} \neq
943 \emptyset \), alguns processos armazenam seus estados em processos remotos
944 que não participam do \textit{broadcast}, portanto o custo de recuperação
945 desses processos é dominado pela latência de rede, e o procedimento
946 não gera tráfego de rede ou carga adicional aos vizinhos.
947 \item \(\Pi_{local} = \emptyset \wedge \Pi_{remoto} \neq \emptyset
948 \wedge \Pi_{storage} \neq \emptyset \wedge \Pi'_{storage} =
949 \emptyset \), todos os processos armazenam seus estados em processos
950 remotos que participam do \textit{broadcast}, portanto o custo de recuperação
951 está dominado pela latência de rede, e o procedimento gera tráfego
952 de rede e carga adicional aos vizinhos.
953 \item \(\Pi_{local} = \emptyset \wedge \Pi_{remoto} \neq \emptyset
954 \wedge \Pi_{storage} \neq \emptyset \wedge \Pi'_{storage} \neq
955 \emptyset \), todos os processos armazenam seus estados em processos
956 remotos que participam ou não do \textit{broadcast}, portanto o
957 custo de recuperação está dominado pela latência de rede, e o
958 procedimento gera tráfego de rede e carga adicional aos vizinhos,
959 mas é uma quantidade menor à proposta anterior.
960 \item \(\Pi_{local} = \emptyset \wedge \Pi_{remoto} \neq \emptyset
961 \wedge \Pi_{storage} = \emptyset \wedge \Pi'_{storage} \neq
962 \emptyset \), todos os processos armazenam seus estados em processos
963 remotos que não participam do \textit{broadcast}, portanto o custo
964 de recuperação está dominado pela latência de rede, e o procedimento
965 não gera tráfego de rede ou carga adicional aos vizinhos.
966 \end{itemize}
968 A avaliação das opções tem que considerar não só a melhor opção, senão
969 qual é a proporção de cada conjunto de processo que gera o resulta
970 mais ótimo. Um aspecto importante a considerar se é o desempenho das
971 soluções sobre as distintas classes de processos em relação as falhas:
972 ativo, eventualmente ativo, eventualmente inativo e instável (ver
973 seção~\ref{sec:notacao}).
975 % LAS TECNICAS PROPUESTAS TAMBIEN HAN SIDO HECHAS PARA EL AMBIENTE
976 % HPC. [ver paper de Bautista Gomez] REVISAR ARTICULO DE ISLENE
978 % As alternativas a avaliar são as seguintes:
980 % % hay que tener en consideracion que en este caso no se asume las
981 % % fallas de disco dentro de la evaluacion. El metodo necesario para
982 % % soportar esa situacion seria, por ejemplo, el uso de un sistema de
983 % % archivos distribuido con replicacion, como hdfs. Aunque el impacto
984 % % sobre el desempenho del sistema no es, necesariamente, despreciable,
985 % % puede asumirse que afecta de manera uniforme a todos los nodos del
986 % % sistema que utilizan la memoria estable.
989 \section{Metodologia Científica}
990 \label{sec:metodologia}
992 O trabalho divide-se em duas fases. Na primeira, faremos o projeto do
993 sub-sistema de persistência e recuperação de estados para o Treplica,
994 levando em conta as possibilidades de armazenamento listadas na
995 seção~\ref{sec:proposta}.
997 Na segunda fase, codificaremos o sub-sistema de armazenamento remoto e
998 compararemos experimentalmente o seu desempenho em distintas
999 configurações. Durante essa fase os experimentos serão realizados com
1000 o mesmo método experimental e com as duas aplicações já implementadas
1001 para testar Treplica: um benchmark TPC-W e um hash
1002 replicado~\cite{buzato09}. As medidas de interesse são
1003 disponibilidade, desempenho e tempo de recuperação~\cite{buzato09}.
1005 Durante todo o mestrado haverá a preocupação com a escrita e
1006 publicação dos resultados na forma de relatórios técnicos e artigos em
1007 veículos científicos arbitrados.
1010 \subsection{Tarefas e cronograma}
1011 \label{sec:planodetrabalho}
1013 Esta seção detalha as tarefas planejadas para o desenvolvimento do
1014 Mestrado e o cronograma proposto (Tabela~\ref{projtimetable}):
1016 \begin{enumerate}
1017 \addtolength{\itemsep}{-0.35\baselineskip}
1019 % Ago-Julho 2010
1020 \item \label{t1} Créditos em disciplinas
1022 % Abril-Julho 2010
1023 \item \label{t2} Revisão bibliográfica
1025 % Maio-Ago 2010
1026 \item \label{t3} Estudo dirigido
1028 % Jul-Ago 2010
1029 \item \label{t4} Elaboração do projeto de mestrado
1031 % Ago 2010 - Jul 2011
1032 \item \label{t5} Estudo comparativo de algoritmos
1034 % Jan 2011 - Dez 2011
1035 \item \label{t6} Proposta, análise e prova de algoritmos.
1037 % Dez 2011 - Dez 2011
1038 \item \label{t7} Implementação da solução sobre a plataforma
1039 Tréplica~\cite{vieira08:_trepl}. Testes de desempenho da solução com
1040 diversas cargas de trabalho, tanto na presença como na ausência de
1041 falhas de processos.
1043 % Mai 2011 - Jan 2012
1044 \item \label{t8} Escrita da Dissertação de Mestrado
1046 % Fev 2012 - Mar 2012
1047 \item \label{t9} Defesa da Dissertação de Mestrado
1049 % Dez 2010 - Mar 2012
1050 \item \label{t10} Escrita e submissão de artigos para publicação
1052 \end{enumerate}
1054 \begin{table}[h]
1055 \begin{center}
1056 \setlength{\tabcolsep}{1.5pt}
1057 \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline
1058 & \multicolumn{5}{c|}{\scriptsize 2010} & \multicolumn{12}{c|}{\scriptsize 2011} & \multicolumn{7}{c|}{\scriptsize 2012} \\ \cline{2-25}
1059 {\small Tarefas } &
1060 \rotatebox{90}{\scriptsize ago } &
1061 \rotatebox{90}{\scriptsize set } &
1062 \rotatebox{90}{\scriptsize out } &
1063 \rotatebox{90}{\scriptsize nov } &
1064 \rotatebox{90}{\scriptsize dez } &
1065 \rotatebox{90}{\scriptsize jan } &
1066 \rotatebox{90}{\scriptsize fev } &
1067 \rotatebox{90}{\scriptsize mar } &
1068 \rotatebox{90}{\scriptsize abr } &
1069 \rotatebox{90}{\scriptsize mai } &
1070 \rotatebox{90}{\scriptsize jun } &
1071 \rotatebox{90}{\scriptsize jul } &
1072 \rotatebox{90}{\scriptsize ago } &
1073 \rotatebox{90}{\scriptsize set } &
1074 \rotatebox{90}{\scriptsize out } &
1075 \rotatebox{90}{\scriptsize nov } &
1076 \rotatebox{90}{\scriptsize dez } &
1077 \rotatebox{90}{\scriptsize jan } &
1078 \rotatebox{90}{\scriptsize fev } &
1079 \rotatebox{90}{\scriptsize mar } &
1080 \rotatebox{90}{\scriptsize abr } &
1081 \rotatebox{90}{\scriptsize mai } &
1082 \rotatebox{90}{\scriptsize jun } &
1083 \rotatebox{90}{\scriptsize jul } \\ \hline
1085 \quad\ref{t1} & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & & & & & & & & & & & & & \\ \hline
1086 \quad\ref{t2} & & \f & \f & \f & \f & \f & \f & & & & & & & & & & & & & & & & & \\ \hline
1087 \quad\ref{t3} & & & & \f & \f & \f & \f & & & & & & & & & & & & & & & & & \\ \hline
1088 \quad\ref{t4} & & & & \f & \f & \f & \f & & & & & & & & & & & & & & & & & \\ \hline
1089 \quad\ref{t5} & & & & & & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & & & & & & & \\ \hline
1090 \quad\ref{t6} & & & & & & & & & & & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & & \\ \hline
1091 \quad\ref{t7} & & & & & & & & & & & & & & & & & \f & \f & \f & \f & \f & \f & & \\ \hline
1092 \quad\ref{t8} & & & & & & & & & & & & & & & \f & \f & \f & \f & \f & \f & \f & \f & \f & \\ \hline
1093 \quad\ref{t9} & & & & & & & & & & & & & & & & & & & & & & & \f & \f \\ \hline
1094 \quad\ref{t10} & & & & & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f & \f \\ \hline
1095 \end{tabular}
1096 \caption{Cronograma do projeto}
1097 \label{projtimetable}
1098 \end{center}
1099 \end{table}
1102 \begin{small}
1103 \phantomsection
1104 \addcontentsline{toc}{section}{\bibname}
1105 \bibliographystyle{plain}
1106 \bibliography{bibliography}
1107 \end{small}
1109 \end{document}