From 6f49d9cabd629a371ee917258ad2155567238236 Mon Sep 17 00:00:00 2001 From: Sears Russell Date: Fri, 13 Jun 2008 11:43:31 +0000 Subject: [PATCH] More fixes; graphs print in black and white, cleaned up text. --- doc/rosePaper/4R-throughput.pdf | Bin 40292 -> 40293 bytes doc/rosePaper/average-ms-tup.pdf | Bin 25125 -> 25901 bytes doc/rosePaper/average-throughput.pdf | Bin 18397 -> 19127 bytes doc/rosePaper/query-graph.pdf | Bin 14374 -> 14667 bytes doc/rosePaper/rose.tex | 646 ++++++++++++++------------- 5 files changed, 326 insertions(+), 320 deletions(-) diff --git a/doc/rosePaper/4R-throughput.pdf b/doc/rosePaper/4R-throughput.pdf index acc1f585d2258b7e112a3bf3c18996e4d07c9251..22d598cab593534bd194325886fd815baf5e7356 100644 GIT binary patch delta 32232 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 z%0A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

J$YJV9M^W6HJk*EarT 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 delta 32261 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 A6#xJL diff --git a/doc/rosePaper/average-ms-tup.pdf b/doc/rosePaper/average-ms-tup.pdf index 9164b993bf29b804072eaca4ce78537c6a9f1d3a..1903a2a34dfbaf8f2613975cf1a3b2a1708a226c 100644 GIT binary patch delta 17541 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 xMkc0)AoF~YT?G_0L3gQn7XV`*SV;f? delta 16729 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 diff --git a/doc/rosePaper/average-throughput.pdf b/doc/rosePaper/average-throughput.pdf index af12fa9da7c27323094228c5d8f1bc23f5e730fc..64e87325f254dac88a2ca656815f2c1c012855bd 100644 GIT binary patch delta 11789 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 b;r|IDDlD21s-%u9BFKx&%&efHi2Hv4492K# delta 11051 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 PC?tr_&aV3M8UFtO0|{Ct diff --git a/doc/rosePaper/query-graph.pdf b/doc/rosePaper/query-graph.pdf index ab0c6f74048a733d7c16f2fb5bc2584b1ef0f3a3..115b6f31b092dcda3b327bc12e03ef37cf9d253f 100644 GIT binary patch delta 12985 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 GkpB-gVrQBF diff --git a/doc/rosePaper/rose.tex b/doc/rosePaper/rose.tex index 5d89b8a..766e8ab 100644 --- a/doc/rosePaper/rose.tex +++ b/doc/rosePaper/rose.tex @@ -52,7 +52,7 @@ \newcommand{\rowss}{Rose's\xspace} \newcommand{\xxx}[1]{\textcolor{red}{\bf XXX: #1}} -%\renewcommand{\xxx}[1]{\xspace} +\renewcommand{\xxx}[1]{\xspace} \begin{document} \title{{\ttlit \rows}: Compressed, log-structured replication [DRAFT]} @@ -88,23 +88,23 @@ orders of magnitude more write throughput than B-tree based replicas. \rowss write performance relies on the fact that replicas do not read old values before performing updates. Random LSM-tree lookups are roughly twice as expensive as B-tree lookups. Therefore, if \rows -read each tuple before updating it then its write throughput would be -lower than that of a B-tree. Although we target replication, \rows provides +read a tuple before each update then its write throughput would be +bound by random I/O performance. Although we target replication, \rows provides high write throughput to any application that updates tuples without reading existing data, such as append-only, streaming and versioning databases. -LSM-tree data is written to disk sequentially in index order, allowing compression to -increase replication throughput. Also, LSM-trees are laid out sequentially, -allowing \rows to provide predictable high-performance -index scans. In order to support efficient tree lookups, we introduce -a column compression format that doubles as an index of -the values stored on the page. +LSM-trees are laid out sequentially, allowing \rows to provide +predictable high-performance index scans. We introduce a page +compression format that takes advantage of LSM-tree's sequential, +sorted data layout. It increases replication throughput by reducing +sequential I/O and supports efficient tree lookups by doubling as an +index of the values it stores. -Replication is essentially a single writer, multiple readers -environment. This allows \rows to provide transactional atomicity, -consistency and isolation without resorting to rollback, or blocking -index requests or maintenance tasks. +Replication environments have multiple readers, but only one writer. +This allows \rows to provide transactional atomicity, consistency and +isolation without resorting to rollback, blocking index requests or +interfering with maintenance tasks. \rows avoids random I/O during replication and scans, providing more I/O capacity for queries than existing systems. This increases @@ -161,13 +161,15 @@ transaction processing applications. Traditional database replication technologies provide acceptable performance if the application write set fits in RAM or if the storage system is able to update data in place quickly enough to keep -up with the replication workload. Transaction processing (OLTP) +up with the replication workload. + +Transaction processing (OLTP) systems optimize for small, low-latency reads and writes by fragmenting tables. They scale by increasing memory size and adding additional drives, increasing the number of available I/O operations per second. Data warehousing technologies introduce -latency, giving them time to reorganize data for bulk insertion. -Column stores optimize for scan performance at the expense of random +latency, giving them time to reorganize data for bulk insertion, and +column stores optimize for scan performance at the expense of random access to individual tuples. \rows combines the best properties of these approaches: @@ -175,9 +177,8 @@ access to individual tuples. \begin{itemize} \item High throughput writes, regardless of update patterns \item Scan performance comparable to bulk-loaded structures -\item Low latency updates +\item Low latency lookups and updates \end{itemize} - We implemented \rows because existing replication technologies only met two of these three requirements. \rows achieves all three goals, providing orders of magnitude better write throughput than @@ -189,26 +190,30 @@ allows them to provide better write and scan throughput than B-trees. Unlike existing LSM-tree implementations, \rows makes use of compression, further increasing replication and scan performance. -However, like LSM-Trees, \rowss random reads are up to twice as -expensive as B-Tree lookups. If the application read an old value -each time it performed a write, \rowss replication performance would -degrade to that of other systems that rely upon random I/O. -Therefore, we target systems that write data without performing reads. -We focus on replication, but append-only, streaming and versioning -databases would also achieve high write throughput with \rows. - -We focus on replication because it is a common, well-understood -workload, requires complete transactional semantics and avoids -reading data during updates regardless of application behavior. -Finally, we know of no other scalable replication approach that -provides real-time analytical queries over transaction +\rows provides extremely high write throughput to applications that +write data without performing reads, such as replication, append-only, streaming +and versioning databases. +%However, like LSM-trees, \rowss random reads are up to twice as +%expensive as B-tree lookups. If the application read an old value +%each time it performed a write, \rowss replication performance would +%degrade to that of other systems that rely upon random I/O. +%Therefore, we target systems that write data without performing reads. +%We focus on replication, but append-only, streaming and versioning +%databases would also achieve high write throughput with \rows. +%It requires complete transactional semantics and avoids +%reading data during updates regardless of application behavior. +Replication is a particularly attractive application of LSM-trees because +it is common, well-understood and requires complete transactional +semantics. Also, we know of no other scalable replication approach +that provides real-time analytical queries over seek-bound transaction processing workloads. -\rows provides much greater write throughput than the database master -would on comparable hardware, increasing the amount of I/O available to -read-only queries. Alternatively, a single \rows instance -could replicate the workload of multiple database masters, -simplifying read-only queries that span databases. +%\rows provides much greater write throughput than the database master +%would on comparable hardware, increasing the amount of I/O available to +%read-only queries. +% Alternatively, a single \rows instance +%could replicate the workload of multiple database masters, +%simplifying read-only queries that span databases. %is designed to service analytical processing queries over @@ -272,11 +277,11 @@ simplifying read-only queries that span databases. %Furthermore, \rows index scans never resort to random I/O, making them -%considerably less expensive than B-Tree index scans. +%considerably less expensive than B-tree index scans. %However, \rows does not provide highly-optimized single tuple lookups %required by an OLTP master database. \rowss on-disk tuple lookups are -%approximately two times slower than in a conventional B-Tree, and therefore +%approximately two times slower than in a conventional B-tree, and therefore %up to two to three orders of magnitude slower than \rows updates. %During replication, writes can be performed without reading modified data. Therefore, the overhead of random index probes can easily be offset by @@ -334,21 +339,21 @@ simplifying read-only queries that span databases. \subsection{Paper structure} We begin by providing an overview of \rowss system design and then -present a simplified analytical model of LSM-Tree I/O behavior. We +present a simplified analytical model of LSM-tree I/O behavior. We apply this model to our test hardware and predict that \rows will -greatly outperform database replicas that store data in B-Trees. We +greatly outperform database replicas that store data in B-trees. We proceed to present a row-oriented page layout that allows many database compression schemes to be used in \rows. Any scheme that can compress data in a single pass and provide random access to compressed values can be used by \rows. -Next, we -measure \rowss replication performance on real world data and -demonstrate orders of magnitude greater throughput and scalability than -a MySQL InnoDB B-Tree index. We then introduce a hybrid of the -TPC-C and TPC-H benchmarks that is appropriate for the environments -targeted by \rows. We use this benchmark to evaluate \rowss index scan and lookup performance. Our evaluation concludes -with an analysis of our prototype's performance and shortcomings. We +Next, we measure \rowss replication performance on real world data and +demonstrate orders of magnitude greater throughput and scalability +than a MySQL InnoDB B-tree index. We compare \rowss replication +throughput to that of an ideal LSM-tree implementation. We then +introduce a hybrid of the TPC-C and TPC-H benchmarks that is +appropriate for the environments targeted by \rows. We use this +benchmark to evaluate \rowss index scan and lookup performance. We defer related work to the end of the paper, as recent research suggests a number of ways in which \rows could be improved. @@ -362,20 +367,20 @@ tree\cite{lsm}. \caption{The structure of a \rows LSM-tree} \label{fig:lsm-tree} \end{figure} -An LSM-Tree is an index that consists of multiple sub-trees called +An LSM-tree is an index that consists of multiple sub-trees called {\em components} (Figure~\ref{fig:lsm-tree}). The smallest component, $C0$, is a memory resident -binary search tree that is updated in place. The next-smallest component, $C1$, is a bulk-loaded B-Tree. As $C0$ grows, +binary search tree that is updated in place. The next-smallest component, $C1$, is a bulk-loaded B-tree. As $C0$ grows, it is merged with $C1$. The merge process consists of index scans and produces a new bulk-loaded version of $C1$ that contains the -updates from $C0$. LSM-Trees can have arbitrarily many components, +updates from $C0$. LSM-trees can have arbitrarily many components, though three (two on-disk tress) is generally adequate. All other components are produced by repeated merges with the next smaller -component. Therefore, LSM-Trees are updated without resorting to +component. Therefore, LSM-trees are updated without resorting to random disk I/O. Lookups are performed by examining tree components, starting with the -in-memory (and most up-to-date) component, and then moving on +in-memory (and most up-to-date) component, then moving on to progressively larger and out-of-date trees until a match is found. This involves a maximum of two on-disk tree lookups unless a merge is process, in which case three lookups may be required. @@ -399,33 +404,32 @@ these entries must match the order in which they are applied at the database master. Workloads that do not contain transactions or do not update existing data may omit some of the mechanisms described here. -\rows focuses on providing inexpensive read-only queries to clients. -Instead of making each replicated transaction durable, \rows assumes -the replication log is made durable by some other mechanism. \rowss -recovery routines ensure that some prefix of the replication log is -applied after a crash. Replaying the remaining portion of the -replication log brings \rows up to date. +\rows focuses on providing inexpensive read-only queries to clients +and assumes the replication log is made durable by some other +mechanism. \rowss recovery routines ensure that some prefix of the +replication log is applied after a crash. Replaying the remaining +portion of the replication log brings \rows up to date. -\rows determines where to begin replaying the log by consulting its -metadata. Each time a new version of $C1$ is -completed, \rowss metadata is updated with the timestamp of the last -update to be applied to that version of $C1$. This timestamp is that -of the last tuple written to $C0$ before the merge began. +\rows determines where to begin replaying the log by consulting its +metadata. \rowss metadata is updated each time a tree merge +completes. This metadata contains the timestamp of the last update +that is reflected in $C1$, which is simply the timestamp of the +last tuple written to $C0$ before the merge began. - -Upon receiving a -log entry, \rows applies it to $C0$, and the update is immediately +\rows immediately applies updates to $C0$ and makes them available to queries that do not require a consistent view of the -data. \rows provides snapshot consistency for readers that require -transactional isolation, making transactionally consistent data -available after a delay on the order of the duration of a few update -transactions. All \rows transactions are read only and can -never block or abort due to reads or updates performed by other transactions. -Instead, long running read-only transactions delay the -deallocation of stale data, and long running updates introduce -replication delay. Neither block \rowss maintenance tasks or index -operations. The details of \rowss concurrency control mechanisms are -provided in Section~\ref{sec:isolation}. +data. \rows supports transactional isolation by delaying the +availability of new data for the duration of a few update +transactions. It then produces a new, consistent snapshot that +reflects the new data. Multiple snapshots can coexist, allowing read +only transactions to run without creating lock contention or being +aborted due to concurrent updates. + +Long running transactions do not block \rowss maintenance tasks or +index operations. However, long-running read-only transactions delay +the deallocation of stale data, and long-running updates introduce +replication delay. The details of \rowss concurrency control +mechanisms are provided in Section~\ref{sec:isolation}. %To prevent the in-memory tree from growing without bound, a merge %process iterates over the (sorted) tree entries, and merges them with @@ -454,11 +458,11 @@ allocation and merge. These transactions generate minimal log information. Redo and undo information for tree component metadata and headers are -written to the Stasis log, and tree component contents are force -written to the page file during Stasis commit. During recovery, -partially written tree components are deallocated, and tree headers -are brought to a consistent state. Tree component contents are never -written to log and are not manipulated during recovery. +written to the Stasis log. Data contained in tree components are +never written to the log and tree component contents are sequentially +forced to the page file at Stasis commit. During recovery, +partially written tree components are deallocated and tree headers are +brought to a consistent state. After Stasis recovery completes, \rows is in a consistent state that existed at some point in the past. The replication log must be @@ -485,48 +489,45 @@ played forward from that point in time in order to complete recovery. %crash. \subsection{Tree merging} +\xxx{This information doesn't belong here... place it throughout this section} -The remainder of this section provides an overview of LSM-Trees and quantifies the +The remainder of this section provides an overview of LSM-trees and quantifies the cost of tuple insertions. It then steps through a rough analysis of -LSM-Tree performance on current hardware. Thorough analytical discussions of LSM +LSM-tree performance on current hardware. Thorough analytical discussions of LSM performance~\cite{lsm}, and comparisons between LSM-trees and a wide variety of other indexing techniques~\cite{partexp} are available elsewhere. Next, we explain how our implementation provides transactional isolation and -exploits hardware parallelism. The adaptation of LSM-Trees to +exploits hardware parallelism. The adaptation of LSM-trees to database replication is an important contribution of this work and is the focus of the rest of this section. We defer discussion of compression to the next section. % XXX figures? -%An LSM-Tree consists of a number of underlying trees. +%An LSM-tree consists of a number of underlying trees. \rowss LSM-trees consist of three components. Component zero ($C0$) -is an uncompressed in-memory binary search tree. Components one and two ($C1$, -$C2$) are bulk-loaded compressed B-Trees. -%Only $C0$ is updated in place. -Each update is handled in three stages. In the first stage, -it is applied to the in-memory tree. Once enough updates -have been applied, a tree merge is initiated, and the tuple is -eventually merged with existing tuples in $C1$. The merge process -performs a sequential scan over the in-memory tree and $C1$, producing -a new version of $C1$. +is an uncompressed in-memory binary search tree. Components one and +two ($C1$, $C2$) are bulk-loaded compressed B-trees. \rows applies +updates by inserting them into the in-memory tree. -When the merge is complete, $C1$ is atomically replaced -with the new tree, and $C0$ is atomically replaced with an empty tree. -The process is eventually repeated when $C1$ and $C2$ are merged. +\rows uses tree merges to limit the size of $C0$. Tree merges +produce a new version of $C1$ by combining tuples in $C0$ with tuples +in the existing version of $C1$. When the merge completes, $C1$ is +atomically replaced with the new tree and $C0$ is atomically replaced +with an empty tree. The process is eventually repeated when C1 and C2 +are merged. -Replacing entire trees at once -introduces a number of performance problems. In particular, it +Replacing entire trees at once introduces a number of problems. It doubles the number of bytes used to store each component, which is important for $C0$, as it doubles memory requirements, and is important for $C2$, as it doubles the amount of disk space used by -\rows. Also, it forces index probes to access both versions of $C1$, +\rows. It also forces index probes to access both versions of $C1$, increasing random lookup times. -The original LSM work proposes a more sophisticated scheme that +The original LSM-tree work proposes a more sophisticated scheme that addresses these issues by replacing one sub-tree at a time. This reduces peak storage and memory requirements but adds some complexity by requiring in-place updates of tree components. -%Truly atomic replacement of portions of an LSM-Tree would cause ongoing +%Truly atomic replacement of portions of an LSM-tree would cause ongoing %merges to block insertions and force the mergers to run in lock step. %We address this issue by allowing data to be inserted into %the new version of the smaller component before the merge completes. @@ -535,9 +536,8 @@ by requiring in-place updates of tree components. %without resorting to fine-grained latches. A third approach would partition \rows into multiple LSM-trees and -merge a single partition at a time. This would reduce the frequency -of extra lookups caused by ongoing tree merges. A similar approach is -evaluated in \cite{partexp}. +merge a single partition at a time~\cite{partexp}. This would reduce +the frequency of extra lookups caused by ongoing tree merges. Partitioning also improves write throughput when updates are skewed, as unchanged portions of the tree do not participate in merges and @@ -546,25 +546,20 @@ consider these optimizations in the discussion below; including them would complicate the analysis without providing any new insight. \subsection{Amortized insertion cost} - -In order to compute the amortized cost of insertion into an LSM-Tree, +In order to compute the amortized cost of insertion into an LSM-tree, we need only consider the cost of comparing the inserted tuple with older tuples. Otherwise, we would count the cost of each comparison -twice. Therefore, we say that each tuple insertion ultimately causes -two rounds of I/O operations; one for the merge into $C1$, and another -to merge into $C2$. Once a tuple reaches $C2$ it does not contribute -to the initiation of more I/O. For simplicity, we assume the LSM-Tree -has reached a steady state. +twice. Each tuple insertion ultimately causes two rounds of I/O +operations. One merges the tuple into $C1$; the other merges it into +$C2$. Tuples do not initiate more I/O once they reach $C2$. -%In a populated LSM-Tree $C2$ is the largest component, and $C0$ is the -%smallest component. -The original LSM-Tree work proves that throughput -is maximized when the ratio of the sizes of $C1$ to $C0$ is equal to -the ratio between $C2$ and $C1$. They call this ratio $R$. Note that -for every $C0$ tuple consumed by a -merge, an average of $R$ tuples from $C1$ must be examined. Similarly, each time a -tuple in $C1$ is consumed, $R$ tuples from $C2$ are examined. -Therefore, in a steady state: +Write throughput is maximized when the ratio of the +sizes of $C1$ to $C0$ is equal to the ratio between $C2$ and +$C1~\cite{lsm}$. This ratio is called $R$. + +Tree merges examine an average of $R$ tuples from $C1$ for each tuple +of $C0$ they consume. Similarly, $R$ tuples from $C2$ are examined +each time a tuple in $C1$ is consumed. Therefore, in a steady state: \[size~of~tree\approx~R^2*|C0|\] and: \[insertion~rate*R(t_{C2}+t_{C1})\approx~sequential~i/o~cost\] @@ -579,35 +574,36 @@ from and write to C1 and C2. %in $C0$ and $C1$)\footnote{The proof that keeping R constant across % our three tree components follows from the fact that the mergers % compete for I/O bandwidth and $x(1-x)$ is maximized when $x=0.5$. -% The LSM-Tree paper proves the general case.}. +% The LSM-tree paper proves the general case.}. \subsection{Replication Throughput} -LSM-Trees have different asymptotic performance characteristics than +LSM-trees have different asymptotic performance characteristics than conventional index structures. In particular, the amortized cost of insertion is $O(\sqrt{n})$ in the size of the data and is proportional - to the cost of sequential I/O. In a B-Tree, this cost is + to the cost of sequential I/O. In a B-tree, this cost is $O(log~n)$ but is proportional to the cost of random I/O. %The relative costs of sequential and random -%I/O determine whether or not \rows is able to outperform B-Trees in +%I/O determine whether or not \rows is able to outperform B-trees in %practice. -This section describes the impact of compression on B-Tree -and LSM-Tree performance using simplified models of -their performance characteristics. +This section describes the impact of compression on B-tree +and LSM-tree performance. -In particular, we assume that the leaf nodes do not fit in memory, and -that tuples are accessed randomly with equal probability. To simplify -our calculations, we assume that internal tree nodes fit in RAM. -Without a skewed update distribution, reordering and batching I/O into +We use simplified models of each structure's performance +characteristics. In particular, we assume that the leaf nodes do not +fit in memory, that tuples are accessed randomly with equal +probability, and that internal tree nodes fit in RAM. Without a +skewed update distribution, reordering and batching I/O into sequential writes only helps if a significant fraction of the tree's -data fits in RAM. Therefore, we do not consider B-Tree I/O batching here. +data fits in RAM. Therefore, we do not consider B-tree I/O batching +here. %If we assume uniform access patterns, 4 KB pages and 100 byte tuples, -%this means that an uncompressed B-Tree would keep $\sim2.5\%$ of the +%this means that an uncompressed B-tree would keep $\sim2.5\%$ of the %tuples in memory. Prefix compression and a skewed update distribution %would improve the situation significantly, but are not considered %here. -Starting with the more familiar B-Tree case, in the steady state we +Starting with the more familiar B-tree case, in the steady state we can expect each index update to perform two random disk accesses: one evicts a page; the other reads a page. Tuple compression does not reduce the number of disk seeks: @@ -620,19 +616,18 @@ In \rows, we have: \] We multiply by $2R$ because each new tuple is eventually merged into both on-disk components, and -each merge involves $R$ comparisons with existing tuples on average. - +each merge involves an average of $R$ comparisons with existing tuples. The second factor of two reflects the fact that the merger must read existing tuples into memory before writing them back to disk. + An update of a tuple is handled as an insertion of the new tuple and a deletion of the old tuple. Deletion is simply an insertion of a tombstone tuple, leading to the third factor of two. - Updates that do not modify primary key fields avoid this final factor -of two. If update is an atomic operation then the delete and insert +of two. If updates are atomic then the delete and insert will always occur during the same snapshot. Since the delete and insert share the same primary key and the same snapshot number, the -insertion will always supercede the deletion. Therefore, there is no +insertion will always supersede the deletion. Therefore, there is no need to insert a tombstone. % @@ -646,9 +641,9 @@ need to insert a tombstone. The $compression~ratio$ is $\frac{uncompressed~size}{compressed~size}$, so improved compression -leads to less expensive LSM-Tree updates. For simplicity, we assume +leads to less expensive LSM-tree updates. For simplicity, we assume that the compression ratio is the same throughout each component of -the LSM-Tree; \rows addresses this at run-time by reasoning in terms +the LSM-tree; \rows addresses this at runtime by reasoning in terms of the number of pages used by each component. Our test hardware's hard drive is a 7200RPM, 750 GB Seagate Barracuda @@ -662,14 +657,14 @@ report random access times of 12.3/13.5~msec (read/write) and 44.3-78.5~megabyte sustained throughput. Timing {\tt dd if=/dev/zero of=file; sync} on an empty ext3 file system suggests our test hardware provides 57.5~megabytes/sec of storage bandwidth, but running a similar test via Stasis' buffer manager produces -inconsistent results ranging from 22 to 47~megabytes/sec. +a multimodal distribution ranging from 22 to 47~megabytes/sec. %We used two hard drives for our tests, a smaller, high performance drive with an average seek time of $9.3~ms$, a %rotational latency of $4.2~ms$, and a manufacturer reported raw %throughput of $150~mb/s$. Our buffer manager achieves $\sim 27~mb/s$ %throughput; {\tt dd if=/dev/zero of=file} writes at $\sim 30.5~mb/s$. -Assuming a fixed hardware configuration, and measuring cost in disk +Assuming a fixed hardware configuration and measuring cost in disk time, we have: %\[ % cost_{sequential~io}=\frac{|tuple|}{30.5*1024^2}=0.000031268~msec @@ -698,7 +693,7 @@ Pessimistically setting \] If tuples are 100 bytes and we assume a compression ratio of 4, which is lower than we expect to see in practice, but numerically convenient, then the -LSM-Tree outperforms the B-Tree when: +LSM-tree outperforms the B-tree when: \[ R < \frac{250,000*compression~ratio}{|tuple|} \] @@ -707,67 +702,65 @@ LSM-Tree outperforms the B-Tree when: \] %750 gb throughput = 1 / (((8 * 27 * 22.6 * 100) / 4) * (ns)) = 8.00198705 khz % 1 / (((8 * 2.73 * 100 * 22.6) / 4) * (ns)) -on a machine that can store 1 GB in an in-memory tree. +%on a machine that can store 1 GB in an in-memory tree. %, this yields a %maximum ``interesting'' tree size of $R^2*1GB = $ 100 petabytes, well %above the actual drive capacity of $750~GB$. - A 750~GB tree would -have a $C2$ component 750 times larger than the 1GB $C0$ component. -Therefore, it would have an $R$ of $\sqrt{750}\approx27$; we would -expect such a tree to have a sustained insertion throughput of -approximately 8000~tuples/sec, or 800~kilobytes/sec +A 750~GB tree with a 1GB $C0$ would have an $R$ of $\sqrt{750}\approx27$. +If tuples are 100 bytes such a tree's sustained insertion throughput will be +approximately 8000~tuples/sec or 800~kilobytes/sec. %\footnote{It would % take 11 days to overwrite every tuple on the drive in random order.} -given our 100 byte tuples. +%given our 100 byte tuples. Our hard drive's average access time allows the drive to deliver 83 I/O operations/sec. -Therefore, we can expect an insertion throughput of 41.5~tuples/sec from a B-Tree with -a 18.5~GB buffer pool. With just 1~GB of RAM, \rows should outperform the -B-Tree by more than two orders of magnitude. Increasing \rowss system +Therefore, we can expect an insertion throughput of 41.5~tuples/sec from a B-tree +that does not cache leaf pages. With 1~GB of RAM, \rows should outperform the +B-tree by more than two orders of magnitude. Increasing \rowss system memory to cache 10~GB of tuples would increase write performance by a factor of $\sqrt{10}$. % 41.5/(1-80/750) = 46.4552239 -Increasing memory another ten fold to 100~GB would yield an LSM-Tree +Increasing memory another ten fold to 100~GB would yield an LSM-tree with an R of $\sqrt{750/100} = 2.73$ and a throughput of 81,000~tuples/sec. -In contrast, the B-Tree would cache less than 100~GB of leaf pages +In contrast, the B-tree would cache less than 100~GB of leaf pages in memory and would write fewer than $\frac{41.5}{1-(100/750)} = 47.9$ tuples/sec. Increasing memory further yields a system that is no longer disk bound. -Assuming CPUs are fast enough to allow \rowss -compression and merge routines to make use of the bandwidth supplied +Assuming CPUs are fast enough to allow \rowss to make use of the bandwidth supplied by the disks, we conclude that \rows will provide significantly higher -throughput than a seek-bound B-Tree. +throughput than a seek-bound B-tree. \subsection{Indexing} -Our analysis ignores the cost of allocating and initializing -LSM-Trees' internal nodes. The merge process uses compressed pages as -tree leaf pages. Each time the compression process fills a page it -inserts an entry into the leftmost entry in the tree, allocating +Our analysis ignores the cost of bulk-loading and storing +LSM-trees' internal nodes. Each time the merge process fills a page it +inserts an entry into the rightmost position in the tree, allocating additional internal nodes if necessary. Our prototype does not compress internal tree nodes. The space overhead of building these tree nodes depends on the number -of tuples that fit in each page. If tuples are small, \rows gets good -fan-out on internal nodes, reducing the fraction of storage reserved -for tree pages. \rows inherits a default page size of 4KB from -Stasis. Although this is fairly small by modern standards, even with -4KB pages, \rowss per-page overheads are acceptable. For the tuple -sizes used in our experiments tree node overhead amounts to a few -percent. For larger, or very compressible tuples, tree overhead can -be more significant. +of tuples that fit in each page. If tuples take up a small fraction +of each page then \rows gets good fan-out on internal nodes, reducing +the fraction of storage used by internal nodes. Therefore, as page +size increases, tree overhead decreases. Similarly, as tuple sizes +increase, the fraction of storage dedicated to internal tree nodes +increases. -Consider a tree that can store 10 compressed tuples in each 4K page. -If an uncompressed tuple is 400 bytes long, then roughly a tenth of -the pages are dedicated to the lowest level of tree nodes, with a -tenth that number devoted to the next highest level, and so on. With -a 2x compression ratio, uncompressed tuples occupy 800 bytes and each -higher level in the tree is only a fifth the size of the level below -it. Larger page sizes and compression of internal nodes would reduce -the overhead of tree creation. +\rows inherits a default page size of 4KB from Stasis. Workloads with +larger tuples would benefit from larger pages and compression of +internal nodes. + +%Consider a tree that can store 10 compressed tuples in each 4K page. +%If an uncompressed tuple is 400 bytes long then roughly a tenth of +%the pages are dedicated to the lowest level of tree nodes, with a +%tenth that number devoted to the next highest level, and so on. With +%a 2x compression ratio, uncompressed tuples occupy 800 bytes and each +%higher level in the tree is only a fifth the size of the level below +%it. Larger page sizes and compression of internal nodes would reduce +%the amount of space dedicated to internal tree nodes. %Table~\ref{table:treeCreationTwo} provides a comparison of compression %performance with and without tree creation enabled\footnote{Our @@ -791,59 +784,59 @@ the overhead of tree creation. \label{sec:isolation} \rows must deal with two types of transactions: updates from the -master and the read-only queries it provides to its clients. \rows -has no control over the order or isolation of updates from the master -database, so it must apply these updates in an order consistent with -the master database order. LSM-tree updates do not immediately remove -pre-existing data from the tree. Instead, they provide a simple form -of versioning, where data from the newest component ($C0$) is always -the most up to date. We extend this idea to provide snapshots. Each -transaction is assigned to a snapshot, and no more than one version of -each tuple exists within a snapshot. +master and read-only queries. \rows has no control over the order or +isolation of updates from the master database. Therefore, it must +apply these updates in an order consistent with the master database +in a way that isolates queries from concurrent transactions. + +LSM-tree updates do not immediately remove pre-existing data +from the tree. Instead, they provide a simple form of versioning +where data from the newest component ($C0$) is always the most up to +date. We extend this idea to provide snapshots. Each transaction is +assigned to a snapshot, and no more than one version of each tuple +exists within a snapshot. To lookup a tuple as it existed at some point in time, we examine all snapshots that were taken before that point and return the most recent -version of the tuple that we find. All versions of the same tuple are -stored in adjacent positions in the LSM-tree, so this is an -inexpensive operation. Furthermore, \rowss versioning is meant to be -used for transactional consistency, and not time-travel. This should +version of the tuple that we find. This is inexpensive because all versions of the same tuple are +stored in adjacent positions in the LSM-tree. Furthermore, \rowss versioning is meant to be +used for transactional consistency and not time-travel. This should restrict the number of snapshots to a manageable level. In order to insert a tuple \rows first determines which snapshot the tuple should belong to. At any given point in time up to two snapshots may accept new updates. The newer of these snapshots accepts new transactions. If the replication log contains interleaved transactions, -the older snapshots waits for any pending transactions that +the older snapshot waits for any pending transactions that it contains to complete. Once all of those transactions are complete, the older snapshot will stop accepting updates, the newer snapshot will stop accepting new transactions, and a snapshot for new transactions will be created. -\rows examines the time stamp and transaction id associated with the tuple insertion, +\rows examines the timestamp and transaction id associated with the tuple insertion and marks the tuple with the appropriate snapshot number. It then inserts the tuple into $C0$, overwriting any tuple that matches on primary key and has the same snapshot id. -When it is time to merge the inserted tuple with $C1$, the merge -thread consults a list of currently accessible snapshots. It uses this +The merge thread uses a list of currently accessible snapshots to decide which versions of the tuple in $C0$ and $C1$ are accessible -to transactions. Such versions are the most recent versions that +to transactions. Such versions are the most recent copy of the tuple that existed before the end of an accessible snapshot. After finding all such versions of a tuple (one may exist for each accessible snapshot), the merge process writes them to the new version of $C1$. Any other versions of the tuple are discarded. If two matching tuples from the -same snapshot are encountered, one must be from $C0$ and the other -from $C1$. The merger discards the version from $C1$, since $C0$ is -more recent. An identical procedure is followed when insertions from -$C1$ and $C2$ are merged. +same snapshot are encountered then one must be from $C0$ and the other +from $C1$. The version from $C0$ is more recent, so the merger +discards the version from $C1$. Merges between $C1$ and $C2$ work the +same way as merges between $C0$ and $C1$. \rows handles tuple deletion by inserting a tombstone. Tombstones record the deletion event and are handled similarly to insertions. A -tombstone will be kept if is the newest version of a tuple in at least one -accessible snapshot. Otherwise, the tuple can be deleted because it - was reinserted after the deletion but before the next accessible -snapshot was taken. Unlike insertions, tombstones in -$C2$ can be deleted if they are the oldest remaining reference to a tuple. +tombstone will be kept if it is the newest version of a tuple in at +least one accessible snapshot. Otherwise, the tuple was reinserted +before next accessible snapshot was taken and the tombstone can be +deleted. Unlike insertions, tombstones in $C2$ can be deleted if they +are the oldest remaining reference to a tuple. %% The correctness of \rows snapshots relies on the isolation mechanisms %% provided by the master database. Within each snapshot, \rows applies @@ -864,20 +857,18 @@ $C2$ can be deleted if they are the oldest remaining reference to a tuple. %% (the point in time when the locks are released) of each transaction. %% Until the commit time is known, \rows would store the transaction id -%% in the LSM-Tree. As transactions are committed it would record the +%% in the LSM-tree. As transactions are committed it would record the %% mapping from transaction id to snapshot. Eventually, the merger would %% translate transaction ids to snapshots, preventing the mapping from %% growing without bound. \rowss snapshots have minimal performance impact and provide -transactional concurrency control without blocking or rolling back -transactions. Also, they do not block \rowss merge and replication -processes. However, long running updates prevent queries from -accessing the results of recently completed transactions, causing the -results that \rows returns to become increasingly stale. Long running -queries increase the number of accessible snapshots, increasing \rowss -disk footprint. Both issues can be partially addressed by limiting -the length of transactions. +transactional concurrency control without rolling back transactions, +or blocking the merge and replication processes. However, +long-running updates prevent queries from accessing the results of +recent transactions, leading to stale results. Long-running queries +increase \rowss disk footprint by increasing the number of accessible +snapshots. %\label{sec:isolation} %\rows combines replicated transactions into snapshots. Each transaction @@ -950,7 +941,7 @@ the length of transactions. %%consistent version of the database. %They force \rows to keep old versions of overwritten tuples around %until the query completes. These tuples increase the size of \rowss -%LSM-Trees, increasing merge overhead. If the space consumed by old +%LSM-trees, increasing merge overhead. If the space consumed by old %versions of the data is a serious issue, extremely long running %queries should be disallowed. Alternatively, historical or %long-running queries could be run against certain snapshots (every @@ -1040,7 +1031,7 @@ with memory size, compression ratios and I/O bandwidth for the foreseeable futur %% up by partially written trees was allocated by an aborted %% transaction, and has been reclaimed by the transaction system's %% recovery mechanism. After the underlying recovery mechanisms -%% complete, \rows reads the last committed timestamp from the LSM-Tree +%% complete, \rows reads the last committed timestamp from the LSM-tree %% header, and begins playback of the replication log at the appropriate %% position. Upon committing new components to disk, \rows allows the %% appropriate portion of the replication log to be truncated. @@ -1074,7 +1065,7 @@ RLE + tree & 1.50x & 6525 \\ %& 148.4 MB/s \\ \end{table} -\rows stores tuples in a sorted, append-only format. This greatly +\rows stores tuples in a sorted, append-only format. This simplifies compression and provides a number of new opportunities for optimization. Compression reduces sequential I/O, which is \rowss primary bottleneck. It also @@ -1086,10 +1077,10 @@ in-place updates and provide efficient random access to compressed tuples. In contrast, compressed column-oriented database layouts focus on high-throughput sequential access and do not provide in-place updates or efficient random access. \rows never updates data in -place, allowing us to make use of append-only compression techniques -from the column literature. Also, \rowss tuples never span pages, and +place, allowing it to make use of append-only compression techniques +from the column literature. Also, \rowss tuples never span pages and are stored in sorted order. We adapt column compression techniques to provide an -index over the page contents, providing efficient random access within +index over each page's contents and efficient random access within pages. \rowss compression format is straightforward. Each page is divided into @@ -1104,15 +1095,15 @@ implemented it to support efficient compression, decompression and random lookups by slot id and by value. \subsection{Compression algorithms} -Our prototype provides three compressors. The first, {\em NOP}, +The \rows prototype provides three compressors. The first, {\em NOP}, simply stores uncompressed integers. The second, {\em RLE}, implements run length encoding, which stores values as a list of distinct values and repetition counts. The third, {\em PFOR}, or patched frame of reference, stores values as a single per-page base offset and an array of deltas~\cite{pfor}. The values are reconstructed by adding the offset and the delta or by traversing a pointer into the -exception section of the page. Currently \rows only supports integer -data, but could be easily extended with support for strings and +exception section of the page. Currently, \rows only supports integer +data although its page formats could be easily extended with support for strings and other types. Also, the compression algorithms that we implemented would benefit from a technique known as {\em bit-packing}, which represents integers with lengths other than 8, 16, 32 and 64 @@ -1145,10 +1136,10 @@ examine every column within a page. In particular, many queries filter based on the value of a few attributes. If data is clustered into rows, then each column from the page will be brought into cache, even if no tuples match. By clustering data into columns, PAX ensures -that only the necessary columns are brought into cache\cite{PAX}. +that only the necessary columns are brought into cache~\cite{PAX}. \rowss use of lightweight compression algorithms is similar to -approaches used in column databases\cite{pfor}. \rows differs from +approaches used in column databases~\cite{pfor}. \rows differs from that work in its focus on efficient random reads on commodity hardware. Existing work targeted RAID and used page sizes ranging from 8-32MB. Rather than use large pages to get good sequential I/O performance, \rows @@ -1163,7 +1154,7 @@ Because we expect index lookups to be a frequent operation, our page format supports efficient lookup by tuple value. The original ``patched'' compression algorithms store exceptions in a linked list and perform scans of up to 128 tuples in order to materialize compressed -tuples. This was done in order to reduce the number of branches +tuples~\cite{pfor}. This was done in order to reduce the number of branches required during compression and sequential decompression. We investigated a number of implementations of tuple lookup by value including per-column range scans and binary search. \xxx{need data here} @@ -1241,7 +1232,7 @@ search, reducing the amount of data brought into processor cache. %Because \rows never updates data in place, it %is able to make use of read-only compression formats that cannot be -%efficiently applied to B-Trees. +%efficiently applied to B-trees. %% Disk heads are the primary %% storage bottleneck for most OLTP environments, and disk capacity is of @@ -1261,7 +1252,7 @@ search, reducing the amount of data brought into processor cache. %remaining region contains ``exceptional'' column data (Figure~\ref{fig:mc-fmt}). \begin{figure} -\centering \epsfig{file=multicolumn-page-format.pdf, width=3in} +\centering \epsfig{file=multicolumn-page-format-2.pdf, width=3.3in} \caption{Multicolumn page format. Many compression algorithms can coexist on a single page. Tuples never span multiple pages.} \label{fig:mc-fmt} @@ -1363,11 +1354,11 @@ void append(COL_TYPE value, int* exception_offset, %\end{quote} where {\tt value} is the value to be appended to the column, {\tt exception\_offset} is a pointer to the offset of the first free byte in the -exceptions region, and {\tt exceptions\_base} and {\tt column\_base} point +exceptions region, and {\tt exceptions\_base} and {\tt column\_base} points to page-sized buffers used to store exceptions and column data as the page is being written. One copy of these buffers exists for each page that \rows is actively writing to (one per disk-resident -LSM-Tree component); they do not significantly increase \rowss memory +LSM-tree component); they do not significantly increase \rowss memory requirements. {\tt freespace} is a pointer to the number of free bytes @@ -1376,9 +1367,9 @@ values when the page is allocated. As {\tt append()} implementations are called they update this data accordingly. Each time a column value is written to a page the column compressor must allocate some space to store the new value. A naive allocation approach would have -the compressor check {\tt freespace} to decide if the page is full, +the compressor check {\tt freespace} to decide if the page is full and return an error code otherwise. Then its caller would check the -return value, and behave appropriately. This would lead to two branches +return value and behave appropriately. This would lead to two branches per column value, greatly decreasing compression throughput. We avoid these branches by reserving a portion of the page (typically the @@ -1487,7 +1478,7 @@ We need to register implementations for these functions because Stasis maintains background threads that control eviction of \rowss pages from memory. As we mentioned above, multicolumn pages are split into a number of temporary buffers while they are being -created, and are then packed into a contiguous buffer before being +created and are then packed into a contiguous buffer before being flushed. Multicolumn's {\tt pageFlushed()} callback guarantees that this happens before the page is written to disk. {\tt pageLoaded()} parses the page headers and associates statically generated @@ -1670,21 +1661,21 @@ MySQL to periodically reflect inserted values in its index. % {\em existing} data during a bulk load; new data is still exposed % atomically.}. -We set InnoDB's buffer pool size to 2GB, and the log file size to 1GB. +We set InnoDB's buffer pool size to 2GB and the log file size to 1GB. We enabled InnoDB's double buffer, which writes a copy of each updated -page to a sequential log. The double buffer increases the amount of -I/O performed by InnoDB, but allows it to decrease the frequency with -which it calls fsync() while writing buffer pool to disk. This +page to a sequential log. The double buffer increases the total amount of +I/O performed, but decreases the frequency with +which InnoDB calls fsync() while writing dirty pages to disk. This increases replication throughput for this workload. We compiled \rowss C components with ``-O2'', and the C++ components with ``-O3''. The later compiler flag is crucial, as compiler inlining and other optimizations improve \rowss compression throughput significantly. \rows was set to allocate $1GB$ to $C0$ and another -$1GB$ to its buffer pool. In this experiment \rowss buffer pool is -essentially wasted once it's page file size exceeds 1GB. \rows +$1GB$ to its buffer pool. In this experiment, \rowss buffer pool is +essentially wasted once its page file size exceeds 1GB; \rows accesses the page file sequentially, and evicts pages using LRU, -leading to a cache hit ratio near zero. +leading to a cache hit rate near zero. Our test hardware has two dual core 64-bit 3GHz Xeon processors with 2MB of cache (Linux reports 4 CPUs) and 8GB of RAM. We disabled the @@ -1697,10 +1688,12 @@ from unexpectedly evicting portions of the \rows binary. We monitored \rows throughout the experiment, confirming that its resident memory size was approximately 2GB. -All software used during our tests -was compiled for 64 bit architectures. We used a 64-bit Ubuntu Gutsy -(Linux 2.6.22-14-generic) installation and -its prebuilt MySQL package (5.0.45-Debian\_1ubuntu3). +All software used during our tests was compiled for 64 bit +architectures. We used a 64-bit Ubuntu Gutsy (Linux +2.6.22-14-generic) installation and its prebuilt MySQL package +(5.0.45-Debian\_1ubuntu3). \rowss and InnoDB's page files and logs +were stored on a dedicated drive. The operating system, executables +and input files for our tests were stored on another hard drive. \subsection{Comparison with conventional techniques} @@ -1712,22 +1705,30 @@ its prebuilt MySQL package (5.0.45-Debian\_1ubuntu3). \begin{figure} \centering \epsfig{file=average-ms-tup.pdf, width=3.33in} -\caption{Tuple insertion time (``instantaneous'' is mean over 100,000 +\caption{Tuple insertion time (``instantaneous'' is the mean over 100,000 tuple windows).} \label{fig:avg-tup} \end{figure} -\rows provides roughly 4.7 times more throughput than InnoDB on an -empty tree (Figure~\ref{fig:avg-thru}). InnoDB's performance remains -constant while its tree fits in memory. It then falls back on random -I/O, causing a sharp drop in throughput. \rowss performance begins to -fall off earlier due to merging, and because it has half as much page +At the beginning of the experiment, \rows provides roughly 4.7 times more +throughput than InnoDB~(Figure~\ref{fig:avg-thru}). While its tree fits +in memory, InnoDB's throughput remains constant. Once it starts to fall back on random +I/O, throughput drops sharply. + +\rowss performance begins to +fall off earlier due to merging and because it has half as much page cache as InnoDB. However, \rows does not fall back on random I/O, and maintains significantly higher throughput than InnoDB throughout the run. InnoDB's peak write throughput was 1.8 mb/s and dropped by orders of magnitude\xxx{final number} before we terminated the -experiment. \rows was providing 1.13 mb/sec write throughput when it -exhausted the dataset. +experiment. \rows provided an average of 1.13 mb/sec write throughput during this experiment. + +\rows merged $C0$ and $C1$ 59 times and merged $C1$ and $C2$ 15 times. +At the end of the run (132 million tuple insertions) $C2$ took up +2.8GB, and $C1$ was 250MB; both of these trees are stored twice, so +the minimum possible size for the page file was 6GB. The actual page +file was 8.7GB.\xxx{rerun to confirm pagefile size!} InnoDB used +4.7GB after 46 million tuple insertions. %\begin{figure} @@ -1745,17 +1746,22 @@ exhausted the dataset. \subsection{Comparison with analytical model} -\rows outperforms B-Tree based solutions, as expected. However, the -prior section says little about the overall quality of our prototype +The prior section says little about the overall quality of our prototype implementation. In this section we measure update latency and compare measured write throughput with the analytical model's predicted throughput. -Figure~\ref{fig:inst-thru} reports \rowss replication throughput -averaged over windows of 100,000 tuple insertions. The large downward -spikes occur periodically throughout the run, though the -figure is truncated to only show the first 10 million inserts. They -occur because \rows does not perform admission control. +Figure~\ref{fig:avg-tup} tuple insertion times for \rows and InnoDB. +The ``instantaneous'' line in the figure reports insertion times +averaged over 100,000 insertions, while the other lines are averaged +over the entire run. The large spikes in instantaneous tuple +insertion times occur periodically throughput the run, though the +figure is truncated to show the first 75 million insertions.\xxx{show + the whole run???} The spikes occur when an insertion blocks waiting +for a tree merge to complete. This happens when one copy of $C0$ is +full and the other one is being merged with $C1$. Admission control +would eliminate this problem. + % First, $C0$ accepts insertions at a much %greater rate than $C1$ or $C2$ can accept them. Over 100,000 tuples %fit in memory, so multiple samples are taken before each new $C0$ @@ -1789,11 +1795,11 @@ Eventually each run converges to a constant effective disk utilization roughly proportional to its compression ratio. This shows that \rows continues to be I/O bound with higher compression ratios. -The analytical model predicts that, given the hard drive's 57.5~mb/s write -bandwidth, an ideal \rows implementation would perform about twice as -fast as our prototype. We believe the difference is largely due to -Stasis' buffer manager; on our test hardware it delivers unpredictable -bandwidth between approximately 22 and 47 mb/s. The remaining +The analytical model predicts that, given the hard drive's 57.5~mb/s +write bandwidth, an ideal \rows implementation would perform about +twice as fast as our prototype. We believe the difference is largely +due to Stasis' buffer manager, which delivers between 22 and 47 mb/s +of sequential bandwidth on our test hardware. The remaining difference in throughput is probably due to \rowss imperfect overlapping of computation with I/O and coarse-grained control over component sizes and R. @@ -1831,8 +1837,8 @@ bandwidth for the foreseeable future. \centering \epsfig{file=4R-throughput.pdf, width=3.33in} \caption{The hard disk bandwidth an uncompressed LSM-tree would - require to match \rowss throughput. Our buffer manager delivered - 22-45 mb/s during the tests.} + require to match \rowss throughput. As indicated by the error bar, the + buffer manager delivered 22-45 mb/s during the tests.} \label{fig:4R} \end{figure} @@ -1840,7 +1846,7 @@ bandwidth for the foreseeable future. TPC-H is an analytical processing benchmark that targets periodically bulk-loaded data warehousing systems. In particular, compared to -TPC-C, it de-emphasizes transaction processing and rollback. Also, it +TPC-C, it de-emphasizes transaction processing and rollback, and allows database vendors to permute the dataset off-line. In real-time database replication environments faithful reproduction of transaction processing schedules is important and there is no @@ -1852,7 +1858,7 @@ implementation. Rather than implement relational algebra operations and attempt to process and appropriately optimize SQL queries on top of \rows, we chose a small subset of the TPC-H and C benchmark queries, and wrote custom code to invoke appropriate \rows tuple -modifications, table scans and index lookup requests. For simplicity +modifications, table scans and index lookup requests. For simplicity, updates and queries are performed by a single thread. When modifying TPC-H and C for our experiments, we follow an existing @@ -1891,15 +1897,14 @@ access methods: timed uniformly at random within the 13 days after the order is placed. \end{itemize} - The script that we used to generate our dataset is publicly available, along with Stasis' and the rest of \rowss source code. This dataset is not easily compressible using the algorithms provided by \rows. Many columns fit in a single byte, rendering \rowss version -of FOR useless. These fields change frequently enough to limit the +of PFOR useless. These fields change frequently enough to limit the effectiveness of run length encoding. Both of these issues would be -reduced by bit packing. Also, occasionally revaluating and modifing +addressed by bit packing. Also, occasionally re-evaluating and modifying compression strategies is known to improve compression of TPC-H data. TPC-H orders are clustered in the last few weeks of years during the 20th century.\xxx{check} @@ -1941,7 +1946,7 @@ Order status queries have excellent temporal locality and generally succeed after accessing $C0$. These queries simply increase the amount of CPU time between tuple insertions and have minimal impact on replication throughput. \rows overlaps their processing with the -asynchronous I/O peformed by merges. +asynchronous I/O performed by merges. We force \rows to become seek bound by running a second set of experiments a different version of the order status query. In one set @@ -1960,7 +1965,7 @@ status queries can be serviced from $C0$. %% replication throughput. Figure~\ref{fig:tpch} plots the number of orders processed by \rows -per second agasint the total number of orders stored in the \rows +per second against the total number of orders stored in the \rows replica. For this experiment we configure \rows to reserve 1GB for the page cache and 2GB for $C0$. We {\tt mlock()} 4.5GB of RAM, leaving 500MB for the kernel, system services, and Linux's page cache. @@ -1977,12 +1982,9 @@ the page cache and 2GB for $C0$. We {\tt mlock()} 4.5GB of RAM, leaving As expected, the cost of searching $C0$ is negligible, while randomly accessing the larger components is quite expensive. The overhead of index scans increases as the table increases in size, leading to a -continuous downward slope throughout runs that perform scans. Index -probes are out of $C0$ until $C1$ and $C2$ are materialized. Soon -after that, the system becomes seek bound as each index lookup -accesses disk. +continuous downward slope throughout runs that perform scans. -Suprisingly, performing periodic table scans improves lookup +Surprisingly, periodic table scans improve lookup performance for $C1$ and $C2$. The effect is most pronounced after approximately 3 million orders are processed. That is approximately when Stasis' page file exceeds the size of the buffer pool, which is @@ -2008,25 +2010,25 @@ obsolete pages before accessible pages. %% improve \rowss throughput by four to sixteen times. XXX check cited ratios %% Our performance figures show that \rows significantly outperforms a -%% popular, production quality B-Tree implementation. Our experiments +%% popular, production quality B-tree implementation. Our experiments %% reveal a number of deficiencies in our prototype implementation, %% suggesting that further implementation efforts would improve its %% performance significantly. Finally, though our prototype could be %% improved, it already performs at roughly $\frac{1}{4}$th of its ideal %% throughput. Our analytical models suggest that it will significantly -%% outperform any B-Tree implementation when applied to appropriate +%% outperform any B-tree implementation when applied to appropriate %% update workloads. \section{Related Work} -\subsection{LSM-Trees} +\subsection{LSM-trees} -The original LSM-Tree work\cite{lsm} provides a more detailed +The original LSM-tree work\cite{lsm} provides a more detailed analytical model than the one presented above. It focuses on update -intensive OLTP (TPC-A) workloads, and hardware provisioning for steady +intensive OLTP (TPC-A) workloads and hardware provisioning for steady state workloads. -LHAM is an adaptation of LSM-Trees for hierarchical storage +LHAM is an adaptation of LSM-trees for hierarchical storage systems~\cite{lham}. It was optimized to store higher numbered components on archival media such as CD-R or tape drives. It focused on scaling LSM-trees beyond the capacity of high-performance storage @@ -2065,9 +2067,9 @@ matter in \rows, but could be a significant overhead for a system with many small partitions. Some LSM-tree implementations do not support concurrent insertions, -merges, and queries. This causes such implementations to block during +merges and queries. This causes such implementations to block during merges, which take up to $O(n)$ time, where n is the tree size. -\rows never blocks queries, and overlaps insertions and tree merges. +\rows never blocks queries and overlaps insertions and tree merges. Admission control would provide predictable, optimal insertion latencies. @@ -2075,41 +2077,41 @@ Also, some LSM-tree implementations produce many levels of tree components. We have argued that two on disk components is adequate for \rowss target applications. -Later work proposes the reuse of existing B-Tree implementations as -the underlying storage mechanism for LSM-Trees\cite{cidrPartitionedBTree}. Many -standard B-Tree optimizations (such as prefix compression and bulk insertion) -would benefit LSM-Tree implementations. \rows uses a custom tree +Later work proposes the reuse of existing B-tree implementations as +the underlying storage mechanism for LSM-trees\cite{cidrPartitionedBTree}. Many +standard B-tree optimizations (such as prefix compression and bulk insertion) +would benefit LSM-tree implementations. \rows uses a custom tree implementation so that it can take advantage of compression. -Compression algorithms used in B-Tree implementations must provide for +Compression algorithms used in B-tree implementations must provide for efficient, in-place updates of tree nodes. The bulk-load application of \rows updates imposes fewer constraints upon our compression algorithms. -Recent work optimizes B-Trees for write intensive workloads by dynamically -relocating regions of B-Trees during +Recent work optimizes B-trees for write intensive workloads by dynamically +relocating regions of B-trees during writes~\cite{bTreeHighUpdateRates}. This reduces index fragmentation but still relies upon random I/O in the worst case. In contrast, -LSM-Trees never use disk-seeks to service write requests and produce -perfectly laid out B-Trees. +LSM-trees never use disk-seeks to service write requests and produce +perfectly laid out B-trees. -The problem of {\em Online B-Tree merging} is closely related to -LSM-Trees' merge process. B-Tree merging addresses situations where +The problem of {\em Online B-tree merging} is closely related to +LSM-trees' merge process. B-tree merging addresses situations where the contents of a single table index have been split across two -physical B-Trees that now need to be reconciled. This situation +physical B-trees that now need to be reconciled. This situation arises, for example, during rebalancing of partitions within a cluster of database machines. One particularly interesting approach lazily piggybacks merge operations on top of tree access requests. To service an index -probe or range scan, the system must read leaf nodes from both B-Trees. +probe or range scan, the system must read leaf nodes from both B-trees. Rather than simply evicting the pages from cache, their approach merges the portion of the tree that has already been brought into memory~\cite{onlineMerging}. -The original LSM-Tree paper proposes a mechanism that provides delayed -LSM-Tree index scans with no additional I/O. When a query requests a table scan, it would wait for +The original LSM-tree paper proposes a mechanism that provides delayed +LSM-tree index scans with no additional I/O. When a query requests a table scan, it would wait for the merge processes to make a pass over the index. -By combining this idea with lazy merging, an LSM-Tree could service +By combining this idea with lazy merging, an LSM-tree could service range scans immediately without significantly increasing the amount of I/O performed by the system. @@ -2121,7 +2123,7 @@ tuples. One such approach compresses low cardinality data by building a table-wide mapping between short identifier codes and longer string values. The mapping table is stored in memory for convenient compression and decompression. Other approaches include NULL -suppression, which stores runs of NULL values as a single count, and +suppression, which stores runs of NULL values as a single count and leading zero suppression which stores integers in a variable length format that does not store leading zeros. Row-based schemes typically allow for easy decompression of individual tuples. Therefore, they @@ -2170,8 +2172,8 @@ information from the same tuple in the same portion of the page~\cite{bitsForChronos}. \rows, which does not split tuples across pages, takes a different -approach, and stores each column separately within a page. Our -column-oriented page layouts incur different types of per-page overhead, and +approach and stores each column separately within a page. Our +column-oriented page layouts incur different types of per-page overhead and have fundamentally different processor cache behaviors and instruction-level parallelism properties than the schemes they consider. @@ -2180,7 +2182,7 @@ In addition to supporting compression, column databases typically optimize for queries that project away columns during processing. They do this by precomputing the projection and potentially resorting and recompressing the data. This reduces the size of the uncompressed -data, and can improve compression ratios, reducing the amount of I/O +data and can improve compression ratios, reducing the amount of I/O performed by the query. \rows can support these optimizations by computing the projection of the data during replication. This provides a \rows replica optimized for a particular set of queries, @@ -2188,7 +2190,7 @@ and is particularly attractive if multiple \rows replicas are available. Unlike read-optimized column-oriented databases, \rows is optimized -for write throughput, provides low-latency, in-place updates, and tuple lookups comparable to row-oriented storage. +for write throughput, provides low-latency, in-place updates and tuple lookups comparable to row-oriented storage. However, many column storage techniques are applicable to \rows. Any column index that supports efficient bulk-loading, provides scans over data in an order appropriate for bulk-loading, and can be emulated by an updatable data structure can be implemented within @@ -2198,7 +2200,7 @@ to real-time replication scenarios. %This property does not come without cost; compared to a column %store, \rows must merge replicated data more often, achieves lower %compression ratios, and performs index lookups that are roughly twice -%as expensive as a B-Tree lookup. +%as expensive as a B-tree lookup. \subsection{Snapshot consistency} @@ -2227,27 +2229,27 @@ livelock~\cite{concurrencyControl}. \section{Conclusion} -Compressed LSM-Trees are practical on modern hardware. Hardware trends such as increased memory size and sequential disk bandwidth will further improve \rowss performance. In addition -to developing new compression formats optimized for LSM-Trees, we presented a new approach to -database replication that leverages the strengths of LSM-Trees by +Compressed LSM-trees are practical on modern hardware. Hardware trends such as increased memory size and sequential disk bandwidth will further improve \rowss performance. In addition +to developing new compression formats optimized for LSM-trees, we presented a new approach to +database replication that leverages the strengths of LSM-trees by avoiding index probing during updates. We also introduced the idea of using snapshot consistency to provide concurrency control for -LSM-Trees. +LSM-trees. -%% Our prototype's LSM-Tree recovery mechanism is extremely +%% Our prototype's LSM-tree recovery mechanism is extremely %% straightforward, and makes use of a simple latching mechanism to -%% maintain our LSM-Trees' consistency. It can easily be extended to -%% more sophisticated LSM-Tree implementations that perform incremental +%% maintain our LSM-trees' consistency. It can easily be extended to +%% more sophisticated LSM-tree implementations that perform incremental %% tree merging. Our implementation is a first cut at a working version of \rows. We have characterized the performance of our prototype, and bounded the replication throughput gain we can expect to achieve via further optimizations. By avoiding disk seeks for all operations except -random index probes, uncompressed LSM-Trees can outperform -B-Tree based indices by at least 2 orders of magnitude. With real-world +random index probes, uncompressed LSM-trees can outperform +B-tree based indices by at least 2 orders of magnitude. With real-world database compression ratios ranging from 5-20x, we expect \rows -database replicas to outperform B-Tree based database replicas by an +database replicas to outperform B-tree based database replicas by an additional factor of ten. \xxx{new conclusion?} @@ -2257,6 +2259,10 @@ additional factor of ten. %support queries over large, frequently updated data sets. %Such applications are becoming increasingly common. +\section{Acknowledgements} + +TODO + \bibliographystyle{abbrv} \bibliography{rose} % sigproc.bib is the name of the Bibliography in this case % You must have a proper ".bib" file