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