From 264e7bd16d2e4b2ce71cae15c0e23edc948d5737 Mon Sep 17 00:00:00 2001 From: Justin Chan Date: Mon, 14 Jan 2019 12:50:40 -0500 Subject: [PATCH 1/2] Add design for M3DB coldwrites --- design/005-m3db-coldwrites.md | 178 +++++++++++++++++++++++++++++++++ design/images/coldwrites_0.png | Bin 0 -> 29244 bytes design/images/coldwrites_1.png | Bin 0 -> 25480 bytes 3 files changed, 178 insertions(+) create mode 100644 design/005-m3db-coldwrites.md create mode 100644 design/images/coldwrites_0.png create mode 100644 design/images/coldwrites_1.png diff --git a/design/005-m3db-coldwrites.md b/design/005-m3db-coldwrites.md new file mode 100644 index 0000000..f5b4ad5 --- /dev/null +++ b/design/005-m3db-coldwrites.md @@ -0,0 +1,178 @@ +# Proposal: M3DB Writing To Any Time + +Author(s): Justin Chan + +Last updated: Thursday, December 6, 2018 +Discussion at [github.com/m3db/proposal/issues/5](https://github.com/m3db/proposal/issues/5). + +## Abstract + +M3DB currently only accepts writes with timestamps that fall within a configurable duration before and after the current time. This prevents certain use cases, for example backfilling data and forecasting data. This document outlines a change that enables users to write data into M3DB with any timestamp within the retention period. + +## Background + +M3DB houses its metrics in the following hierarchy: + +Database → namespaces → shards → series → blocks + buffer + +Writes come into the buffer, which holds the mutable data within the series. Each write is persisted into a commit log for disaster recovery. In addition, [snapshots](https://docs.google.com/document/d/1wqke7CmGIznfBXf-dEWyqnJZROWQ1lQ83ChO3TXR0fU/edit) are taken of the entire mutable block and persisted as a snapshot file (structurally identical to data files) in the snapshot directory. + +The series also has a blocks area, which contain the immutable data. After a block can no longer be written to, the contents of that block within the buffer are drained to blocks, where the flush cycle will eventually persist them on to disk as (compressed) data files. + +Other ways in which data arrive at the series are via bootstrap or by getting cached after a read. The block to be bootstrapped will go to the buffer if there is a writable bucket within the buffer for it; otherwise it will be bootstrapped within the blocks. Finally, when we want to cache a block after reading data from disk, it will get cached within the blocks. + +A summary of the data flow can be summarized by the below diagram: + +![Old data flow](images/coldwrites_0.png) + +In this document, I define *warm* writes as writes that fall within the configured window around the current time (writes that M3DB accept today). I define *cold* writes as any writes outside of that window. + +## Proposal + +The structure of the buffer will have to be modified in order to accommodate writes coming in with an arbitrary time. The buffer will be in charge of handling all the data requiring persistence, i.e. data that need to eventually be stored as data files. The blocks section will only be used as the area for caching. The new data flow will be: + +1. Writes go into the buffer +2. For warm writes: + 1. Periodic snapshots capture warm writes in the series as it does today + 2. A compactor process will move the now complete snapshot to the data directory. For the majority of the time, since snapshots are essentially the same as data files, this will be a simple move operation. However, there could be an existing data file for this block already from a future write, in which case the compactor will merge it with the snapshot data before persisting +3. For cold writes: + 1. Every tick, the compactor will merge all cold writes with (potentially) existing data for the block and write it out as the new data file +4. After the persistence to disk is fully complete (snapshot for warm writes; merging to a data file for cold writes), the buffer will evict that data from memory and the cache for that block will be invalidated if present, since the disk now has more up to date data + +A summary of the new data flow can be summarized by the below diagram: + +![New data flow](images/coldwrites_1.png) + +## Rationale + +While we expect M3DB’s most prevalent use case to remain as collecting current metrics, enabling writes for an arbitrary timestamp enables other use cases for M3DB. After talking to other users who were interested in this new proposal[[A]](#heading=h.4nmwr5b8r3vx), none of their use cases for cold writes had a usage pattern of sustained, high throughput writes. Thus, this informs us to design around maintaining high performance for our current workloads while making cold writes possible. + +The current design revolves around the fact that after a certain time, blocks are sealed and any metric for that block (or before) can no longer be written to. Given that this will no longer be the case, we need to change the structure of data within the buffer and the data flow to disk. + +Draining to the series blocks was done when that block is sealed, but since blocks can always be written to, draining no longer makes sense. Instead, we aim to have a better separation of concerns: + +* The series blocks will be used just as the area to hold on to blocks for caching when reading from disk. This also simplifies the logic as to whether a block can be evicted. Furthermore, this avoids having to rewrite caching code, which works off of blocks and not buffer buckets. +* The series buffer will handle all data that require persistence to disk. New writes and bootstrapped blocks will go to the buffer, and snapshots/merges will happen directly in the buffer as well. + +The compactor process in charge of merging new data with existing data from the data file will be necessary to support cold writes. Fileset files are immutable in that once a metric is written to disk, we no longer modify that file. If we want to persist new metrics at a time for which we already have a data file, we would need to either: + +1. Write another file to contain them, compacting files later, or +2. Merge them with the data in the existing file and write the new complete file + +After discussing solution (1), we settled on targeting (2) instead, which is simpler to implement and leaves the possibility of moving towards (1) at a later point to improve write performance of cold writes. + +Warm writes should still account for the vast majority of use cases for M3DB, and as such, we should aim to optimize for the warm writes case. This solution should only have a nominal impact on performance for warm writes. The reason why cold writes are treated differently from warm writes is that there isn’t a logical time when we would want to persist them. + +In the new flow, since there will still be at most be one active snapshot and one active data file, the read path does not need to change significantly. + +## Implementation + +**Series buffer/blocks** + +We will need a map of buffer buckets to facilitate the ability to write to any time. We will add: + +
+type dbBuffer struct {
+    opts           Options
+    nowFn          clock.NowFn
+    blockRetriever QueryableBlockRetriever
+
+    bucketsMap          map[xtime.UnixNano]*dbBufferBuckets
+    bucketsCache        [bucketsCacheSize]*dbBufferBuckets
+    bucketVersionsPool  *dbBufferBucketsPool
+    bucketPool          *dbBufferBucketPool
+
+    blockSize             time.Duration
+    bufferPast            time.Duration
+    bufferFuture          time.Duration
+    coldWritesEnabled     bool
+    futureRetentionPeriod time.Duration
+}
+
+ +bucketsMap maps a block start time to their corresponding buckets + +bucketsCache is an LRU write cache to buckets so that map lookups are minimized for writes + +The existing dbBufferBucket struct will have to be refactored. Metrics aren’t fully persisted to disk until persist operations for all series are complete at the shard level. This means that there will be a period between when e.g. a merge is complete for the series and when those new datapoints are actually retrievable from disk. The buffer must keep merged metrics in memory until they are retrievable, otherwise reads during that period would fail. It is important to separate (1) new writes during this period from (2) what has been (attempted to be) merged, otherwise we can’t safely evict (2) from memory without knowing that we’re not dropping metrics from (1). Hence, we introduce the concept of versions in buckets, increasing the bucket version when a merge is attempted, creating a new version 0 bucket to write to going forward. Encapsulating these versioned buckets for each dbBufferBucket is dbBufferBucketVersions. + +
+type dbBufferBucketVersions struct {
+    buckets           []*dbBufferBucket
+    start             time.Time
+    opts              Options
+    lastReadUnixNanos int64
+    bucketPool        *dbBufferBucketPool
+}
+
+ +
+type dbBufferBucket struct {
+    opts     Options
+    start    time.Time
+    encoders []inOrderEncoder
+    blocks   []block.DatabaseBlock
+    version  int
+    wType    WriteType
+}
+
+ +As an intermediate milestone, we should implement the above and verify the correctness and performance of warm writes before proceeding with the compactor and other changes. In order to facilitate this, we’d have to introduce a flush method for the buffer so that data can be flushed from the buffer directly. + +**Compactor** + +The Compactor will be an asynchronous process controlled via the mediator similar to flushing. + +
+Compact(
+    ctx context.Context,
+    blockStart time.Time,
+    persistFn persist.DataFn,
+) error
+
+ +This will merge snapshot files for a block start time with any existing data file for blockStart and persist it as the new data file. As part of persisting a data file, an info metadata file is also written, which contains the ID of the latest snapshot that we compacted. As part of manipulating files, we will also need to update and invalidate their file seekers appropriately such that new read attempts will only access the newly created data file. File seekers referencing outdated files will only be removed once all in-flight reads are satisfied. + +**Clean up** + +After a snapshot is compacted into a data file, it can be safely removed. To do this, we inspect the info metadata file to find the latest snapshot ID that has been compacted. That latest snapshot file and any previous snapshots for that block can safely be cleaned up. If there is no such metadata file, no snapshots for that block can be cleaned up. + +## Open issues + +* Due to the assumptions made in the index, there would have to be optimizations done in that area to make sure we take into account the possibility of cold writes. +* Naming of "metric type". Suggestions: + * ~~Realtime / NonRealtime~~ + * Warm / Cold + * ~~Realtime / OutOfOrder~~ + * ~~Active / Passive~~ + +## Future Work + +**Unifying Metric Persistence** + +In the future, we may also want to consider merging the two persistence strategies for warm and cold writes into the single data flow of: write to buffer → snapshot → compact/merge to data file. This will require coming up with heuristics as to when snapshots should be compacted and merged, as well as additional work to be able to handle multiple active snapshot files, but may be worth it to unify data flows. + +**Client For Batch Emission** + +With the current design, it would be suboptimal from a memory and CPU usage perspective for the client to emit a batch of metrics in random chronological order. This will cause the creation of additional buckets to then be flushed and GC’d. To mitigate this, a client can be built that handles the data to be backfilled, ensuring that they are in chronological order and potentially hinting to M3DB when a good time to snapshot/compact would be. + +## Appendix A + +**Use Case 1:** Backfilling + +There are a few reasons why User wants to be able backfill: +1. To migrate from existing metrics platform to M3 +2. A processing pipeline goes down and metrics get queued up. After the pipeline recovers, there may be metrics from hours/days old to batch process +3. After developing a new feature, there may be metrics for that feature that need to be backfilled + +**Use Case 2:** Forecasting + +Metrics will need to be emitted for a future time to support forecasting. This will not be a high throughput metric emission. + +**Use Case 3:** Batch Processing + +Some metrics will require substantial offline calculation from current data before that metric can be emitted. This will cause metric emissions to have up to an hour in delay. + +**Use Case 4:** Metric Corrections + +Rewriting a metric for the same series for the same timestamp will cause that metric to be overwritten by the new metric. There are times when metrics need to be corrected, following a bug fix or other business requirement change. diff --git a/design/images/coldwrites_0.png b/design/images/coldwrites_0.png new file mode 100644 index 0000000000000000000000000000000000000000..f0ededa20eded1da78d3d67464878d1b985730c1 GIT binary patch literal 29244 zcmeGDRd5_l6E+HpEM{5E%(9qA%*@Qpl7%B?X116{%*@QpXfd-aw$Q8h`!~+sZS2)X zoQTsm6WyJaR5?{oW>!ZkDM%v0lq?-@i{!PY(|dcXxNs&(DvKkN5ZYx3{-9 z|6PBMPtKm6pa1;%bA5gN_Wr)Gv=R^=x4FHW2P*IA>30GKRMj_MU0o?^nOt68UR+!l zTKyaupE^H3KRY{1NXz~S3|LxPiin7imX@}*wyv+QFD@?L-rm;M)-Eb4+Su3-kW}jF z>B-N}*VNQJJw4UZ(#p!pnwpvdNGb;f1qBBOS5;MYbaaf2j2s;ud3t(IOiXNUZtm>t z?Cu>FDS*H8oXKRD_0xhJ}TRNy&*wDhNs{Sy))CtgMWUjfqIgOGwFxOUVjK zDrRSAcXf3Q4-Y3KBv@Knib}}|ODedzxuvD0B_<}$&(F8CwEX`4`{&P}?(XiLot@Ry z)m~m+jg5@}NhLEgGf63FD=Vw%>FLGAMGp@T5D4Vr;^OM+8W|Z`S68Q`qyz*4`}+EX zBozY#0}Bfa7Zw)Q*Vn_t!@Ik?<>lp_ot=lrCfnND8X6jslau4);|B)^+uPd*1_n}7 zQ!_F$a&vPvG&D?2P3Pw3e0+S$%F29weVdz`{rvp={r$gU;QzV)j|cK+CA`7F9G<1c zgw=o>m)!`i1WzkH%bN*F04>``{$1-6aYmGRspZx_tBwE5;$O}{=EI~?WX%50$89B2`VfU#QzO` z+HkXN5k%YYUTN^S&o@Ie_mmdNt%9$QiJPP~FR~k}z9YNwo1~R>X8O!g>DRc-WU_Lr zPL`c2vx;;Z$J9^|HA#DXkx5Ku6RWc&DQ%7etdg%++h-vdU7*Sm=AlO0=PQM>9s*{3 zv8-^Fri*ODc15m*vmSzGd^I+sX5)LVA_h(t;Nv*YymIa}+FAsPLdy#@B;bW@!r0Ho z+Ud7~InUs7?tL%T!RXA*4*Z@eGv}$g^X~;9nK*$1@is*IY!6unmYatU`SM=ECs;s$ zKyI0~aBK_(P=8hb^f6z)!|(*_&`ao`t#9mtd?JuPD8Blvubp}IAX^^34>R7&L2gwx zEJuu|d+DrmXO%#ES*2VD+JZm45ge#jBSIeRR*$ zHdcbyP7Oj^cB8b4KZrb!A=n)@@knT^6&&%8N=6sa4ij?t%$qD5zGyVNz%Kqq2Zt_$ z6iHH=INdbCQjfhP8Tr|xl{}l1a@$e1{AR z1g(t=ukbY*N4LlH=VoC|D~f`_|MUiJDCEQLU*Olm)WfsO1Gac0N4STWvb0!()t!K0iPwh$q-<1ilW5ISXb` zNMXzL2VBiunT< zrDSYMBPpb)TnzE)L~0myN$G#e-vP9-ThzZFp^~Xnu&7-Fg)P#A^mGev6QC%T=&(*; z-RhDl_Ijk{2w4{*-y~Q}AL1#QMb3n9FFWtksdB0Brvh1lYT_B>FmF& zj3y;`b;W1nphzt#3KXcxT2S@pqb;n-vz}X@rJ%AZSz4wp@DS_H*k{kiI^3+z4W2eG zOn0I4RDtt{(Abs)QK*H775Dk!TCZqQe6v2s3UMaK9qOsK|H~C(&dNfbPmi%6tw}Qs zi(ZGQ#57k=0m?1dC0a=N6Nre^u9zmHW>g*J5y6an3@(K8s~k#xD-Ov?=o)^HFr5dI9{1LrYEWJn?tyw z_Q)1De!5e$hNR-;+j*8nRPmtxW+7#c7(VmuIR)e?=CwBHrj~*(S4k_ijCaa@=UVeZ z%aO7_@e#=bPBF!bLXPLFQOqutX?Cn7Mq8YkjHR`%SH&o_Zx|qT;g$&^+(*pEy{~2G{ z5ieu6bW3EjTd>GZz;=qm6=~P26d8Pao1wOtftA1X*QQBTS_&WvX55bIpnT1V@oRo5 zQo0^DrnxR*y)~ndlQf%^p$NK3T?|pTbLp~C$5a(zp@~}6%GFN(61kVJ*vnaBFb%x^ zfFUXk*h>#FZVHqd$W4O!iitkJ{x%U8jRZ{{6XSruZ@JFJ;${F_d(_XdsfER& z;R)*nC`Mw_og9j^;0A&ocQ}>fy2wH>RdDjR2Jjf+kPJEex64)niGVegOLjt9tEs{@ zu1&?PwA7?C|GQGT&+nGY07`kFxX&*O0i4GawE%X_yfrEV_A5Td8FLq>q{=f{X3N94 zBE~`Y7F87iH~!0=ng|eORSAf_R=nc;6C(+2TYQ+nXUZp&(xpoL`e9+=EQ(50B)QeH z@=gJ8kurwn!i@2UQP`%)<>U={!h{K>bkg;zEOYPeP}N0%cDdlcz!y^ZWmrgf=(&(^ zX16qQXGf%UV)?$EtB3Oa!X!@o)lSKUMQWC!7dT3UDjAL#?_O5Q(@>Hy!=QYjg(egP z1&VcJebPo2jmI`y)OqIYjF2r(afD!Bx9X!n9l*HwoQ9zpC6#*&abMtSr`S0) zN-#G@Wd9(Y!!68GlEz_4G(tvTzZA2)p~|PjfTRsyl}QmJ;+SFXQRZN%xXr{M2RArr zneqgogw`D|E}1wxN)rkD(<97Pue=9(8Sx6yV>`5R>g0>cj9}&!E^jqS&~1PuUE{1R zpdeVlNFKis8i?o%qb&u0fi)?>7hEfc`2uVSUSG&f1?4~N_J5HGoeTf}PVzs7|KGX% zq(HQob(<+(m{W$%kGBxtmG}h(UF7ViM0dPd1~!8$o{y+E&RaAt0IAAz)0M`PPM2Z2 zzdBwS$BILE_p^~VOy{U;P;orN#=WQ{^6$F;mI7lw;-<#!W>uWA2G31hrl&_1Y48Ml zAS({|b;0@WJM)5-O3i-NgeNs|;=RPAh`v%*N&u_Vx@wYtQMS=GC6c82wJ66;x9V?L z2=iT$W8rgLxz5wmHlmpmxSf@o110F5`LaYYLUJO9#;6j=)Y5Y!%o^w-qzadC^=rMFaMM3g2iCLPFe!nPg)+0Jg9RkNrBmMs*v#(^ zo@H_e9g&}ea1omqP0Jw5OG!~J)vrOT2M0U~j{)$&oIa{r81r2^zvA=V?`AnAGlXjG z$?ZgQUGoE0yo5_8iZ!MFxDj-J+688DzTAbShVBMcMJs=5cq;!Nn0qHL3BF9&;;V4B z4F7&7TuxQ>6 z(Hb=*7aEG{XuYIH3WtI8&T|_#fkwNiwMEgO*uk5V1KWD+y24Fz3l-XWAwgz@mM93^ zz;?UA+e|3ee};#xNgA37q4gJURXGHnowkSL??n5RZ79Ojh(S6J*4+iKDp%L3P}EGl zbDu_BDFDe2bXa<9jc`4r*C>y{WX#iso__H6a`U<}%b zD9Am7UPf7u0}@KUR9A|7Uq|`^7Y0R;T2H!6oByD~o>u zSZD!?e*=o%_pqR07>e zVFsaXxlkhWEfPpgalJ5JZrk(3Uo7Ux2T|q8DNK%ikym)C6NsnHf3&Ekv7_guNL(5U zPhvdWOzO*(dc+u?4_lHkZz)MQkJE6l_vpPs)f zRBXvbOqfPzM&oJ4Gft%BDf`!{gyRTC1ITg@vG_DeA zL#kg8dvHdndM8KAN&(4ZQ(P!z&kjk8Cosv}n_Em>3@Px$q|~Wy2F|TrLd<3Vyu=#a zYxcr!tq_nZ9Hl^4#b(E3Yd}Z&_=$*IxykoL3C;V`)Qo4GrZeqBN`y+9BW14=kiEWK z9`vgUS(Fm3edPpul;T%bjr<5Hb|E8~^+QNxB*o$4G~0lRP0qp(5P7qX7!(IIY!>Py z7-d*HI_S8h=xmc^0A`#LmD;9R3;s^xG-Y~PQ6kbj%teHPEWk|6OP2MG9wTj7ibBDs zL?S{Tqs)^lGii+#WYWA50xO$r6w@LlN2OAXy4YM>aF~CJn{i9jCRrGip!h>5O0a1Q z%M29`98+31593!J{V=ORtL?!Hq{_uT4D5YEZxqOyaVQFPM%WB9pPl@qP$EtR@z|(x zD6=2lUcl2hOERji9uJKaLHk!JlQcTT04YYXYX*%_6vR+0H@8=M@d-r*4=g8H_YnM> zY?P`fAY=aN@x@wH1s=r4`^NSW;qxQSVr5!dsaWPX#9mM(K9r{MUjow!FS9(~fccu) zjXgw6y$8SGhRMl`Y;l?pxC%6i{TvJ?!m*13^$2GSMoBt}O!psqlai&zSyI8Zi1G#g zg4B9eJ0%`V%g7HnTq95X4I&0yOJ(1bATZl0X11_E71d&YT&AmIKk{^QwhXcC%@`5{ z^grw~On3rG5WA%^OkUC!2C!{V!uiHxRQw)RWBItH2oUK(UZV85&t6j}f-86L1roiv z7GkMk;G)(?x&17o^2gvAz`y+|5tl~vEg3}TvBO*%8Zu&{M(%NM(>3(um*}MW>{266 zqpFn2{_OXgGids38#PKtTnJn>C(@MO{TJFCbi2Qx?j`ddohPF=)OyqF@89{hs?iD9 zwr9S@g1=vJ^5wGOOIu`z#4Z#dJ$T!Rs@ZVU56{GQ^c0aT+flk}O$GpsOoSYtv3-nM zswzBEFLT%%-iIgfZI7#YPX7z{xOsQ_ykrNDS*3>4XP0v z>3#fM?0PLkyLZMo&z(0>5mTqpOd&UP1|e?zx<@;U=tcFCdY4BYt@dMF5`YsZ%7sDb z?K77%io0FxJ`TwxDH0v4#3P}9V=|!zvWjzz+pYu|HCTrYdsp5gnTl)0jW9&X40=RH z*|Cb{Tc_Oh6V0OeY+I-!%@tP0s!31I0SnE*DQ;-iWtU8wuCk8hM|ne=_bi_1IDCq< z2C4)r_x4X>V6rWaiCDes+GLom+r)|)6UwqfK*oEvwDi=tq&oAz#FaTpTOvkREXtY{ zIL649|8XqDR`81dD9O^cb}2yKOPN1h>IRwJC@I=8fmuf?`QdRV&XAwFEX3`vU{~56i$`X9hv&MUpSqLcEcU^8eh-Sj)HN>erPGj@)bQ}iL(CiJmU@d!dg6JqG}_+kE1 zvmXym({=dM_P@%T8OMs_M2(9U*{?Slq?{TCY_%f<39#O_AK$|u1;{6v+3JU7t56gb zPRzKG1Lb7nw{>`v6{R0jQs8Y-ACLxNsh@}YJb4#M=WqzMidR~vkA$?$CnicPMk~Ha zJ#uE}ax)*8`nd>bJ%uzujdJk%oBVdFgD*b-AIDiQ0fAh{Y-OGx9)ATo%dnILYN(>y zzb6xRPHQHaqF)q$4-4~j&+Xk{MQS1X0hV)=T*0DPCSjM*CQ$x*hm1rI;)yweV%95G z!^{|POXXFt`CF;CIVI)yt#?IO7^yy8rY2b^f?IwOLsb6= z2`LKg`r}d&{{4yCw~CT<)jLWmAzj@#O08azfl~`kLlXRG=+pom(;|bmkW>Wj_Jfyc z%L!puz1lbR#j42IFzSid;FVIQVjnvFRn3Uk)sJPEF|?K7B8yV4wHz%&wK55!Gia0) z2$nqeDiscBBMwA0#WKd)D}S^g={}i*TC&G7wR=X&UOziTQ< zQ%I?_LH9+c3nDr3LldyDLkW98<}s0aZeYs+x+NPq>NezF*7%(JSTEGL`F{X-54C}< zVTg(@%D|lH>wX|w3v>U%M?uXd*B9b{_X*SDfdB-#uc7~c0nBUgnm1DY+G=sv#@~LD z{{V+lnI*9yuoSO8=+b_xN(%I#3=lfU6)HYpu({>YIB~r@udcAnLF}UYqKv;!jbpRT z!8{Z_CwQy%E4NHj@K0`Sf1sZGW{Z_0UxRxJQ>g#MO#y0g~{e> zGD%15BL7bsm<{2YIAAw1(=rQ@|9?+}Y;tFBT932=Y8RJ@fhe9ZdsuCZtAm-|dGq_L z3=CXS^h8%Dw?YkrM7Tg{2v|@q_!1xF(|4q8oK2Je!vk6`j_dE?s3Z2{-|2c*2M;g1 zScxc18q0`=ZIC)3H7CMCumC5>;21_WEJDx>ArOT-|IrhHYcfqk>AU3gSJl#K#F~L+%*Pp zsDVLn?DC(1b&N$BkQ^!73O<0W=9wL<Vm9ev3Cz^w=mO1at7X$U=4`*IK@>*<%+A!gNhT{L=;s2|_( z3HnQ0-1hH4n@bXJfTt~MZlt~F&uxvFrGhGl4na00@U`#1gIXabMlX`Q`b&O~l)vPC|Gp>w-I z9Yr4~MWO&lzSr^t!X2cncNKPR^DLr}x)c~;oY^Km0AhM2U@H>hk63<}O*d4F(Yx4v ze57;HUFaC)D40XcMgnn86RAy~o)`rz?4YtojNjY^4{u9sx>a#%F~zUWR(Q4*18HR+ zMJK)ej#v~`Yi>t3nS_w=T;{1bl%#{T$3&$vg*D0Y*ZGDl``qM4y9BQea2Lc8oifQO z;p`Ic!#$vYh$NnQVRftgOvCboLrOURHkkuToU;utz>m5}5tLg*4tCJA8fAMzX45{N z)EtBeHBl=MLxlK8J5~&9O4!-Wr=p8H1QF!IzJFIqK;@k|HRvAY8WklO?zJ6o4`DrO zTL5Y4xnRZBzHvJ=jB2J*I)TAxO-Pe#uux>$!7#>StXN;0WBaB$*BabWGs(8T5&Ml;66P0+JtRY#E9MaY0}QoZsI4uz>B-E(+sz(dExx4-8M{&#Cd z)-|v^+*~Ghjj&`x56$I|Z#LSsv|faeOuB!L^}q6d6a$W+68xj)8R|4eMp>|8vkQVq zBy?MKl20cIrrCxnXIXrmo)w~Lr|elp?&1ejcgANw_tC_CpH2Ehc5f&rUp;GqwN$Ad zYfBH~LksXcK`s?obMKU8XSRCmoX-8L+H=uo9|8$?!FK)3?pxxD`J8f=N z!hYJv#71@T<+0woLudJe*UifnM5HNVA&iMX-DT2~%BGiZ!Un}=sOhy&Xj!los99rY zz`iE=oU@8|=t3CxLkVX584`tx=*M+tjKs^y;6&D^?e+-~2^#k3H#*~g_ksJW!wp1@Z`3p1D=l2~7dU<2*V@1=YSUMlX zcP`h~ah;u~=B43ryA<{IshSYRh6Y5_!=`TXwVIeC{F%tyHI_q7dBj#=E*NC@VHe4v zjgy4V;|$hrzx}lsC!a%ig`f2AHE3UoVutg=)Tcz&&_Lz|HzN3ymy(?*kDKc)A{1xf53U!+GboRaau@ zXxE6q$Top19kyq)`KYcUx8KlXL01tUUkg|{Onva3i(-R8oZ}$M=Zx}9ub;1;=WKZ_ zKI7$}r%gLsuxreUpPGl{()2%MHWU?vbKjKdGmI6_&%LHx7?#?|E#E! z-u7Uf(BBV4G{mIm{V4iybbc<`5w%>?^GBzf=S`(n!2Jo4DJ1x-YUUbv@$ad24*Mw9 z!|fSxHRJN7;Y)5ia2Qfi_GGHQIZ}dsbrI-3nzs|%PSm+F=?1*g#-7+ML;rh)0KV}v zwHMg<+v#eC@ZawrzZ&VW@_qa+IXpZ(e;!jkZ_<=zv|EhWhLn#UKROfYd#|Ljau-55 ze2m?mjLTl#{JW@;{HyZh*_&$*ZP4-A;T?Wnzv4FpIY@OxH*+m}(Gd`B(V0@gI8uQ~ zl77sDOP~+&!}qLqA-%S@HQlRR-*=CZcoiKeuBUq;!8Lb|9dXAHCJY*Whh06OGeL=qGO}e4W2}@`(BN@$_~X;5wP6?XJAqgY~>u2w6`>Aq@Xz z)UsTA*00Vfc0wl7Yaaw5{8?-7y1bnFpdRv^ov0g;sOjLJ?n+`&vVK z8|J8==TgTuGdD;C{Xn^dfq&1S1RTt`2J2nBHv_-8!s9;B2JUP6*ZE(cAxSgU*?F_w z97JYgnh^#gNO+Yq4_E2ef!MdYVO`tZF=f z_cS}w`SnwXcok)!f=zP)DEZrhYi6(E%bxyfzy%iW1AQQ$CC#%{y5mDy11VOEwn?wr zQJE5bdd%~9Er%)os`gqCiD50CaVRQPq6PVY6^|k8+j)fyM1(d{lQxH~belL4J?bCA z{XpJS_{>QOUU3cZU)(0(jW3)Y3GuG&2$Z#d`}z|meZkX*FOHBMuC!an@*UxDHdO(O zqN70e3HLHV?V0{1m3?3VL_!VvC+Z;j3+4ich=AuWRm!{3+i7vANw&|OiYe`#~>!I4LSkKk$HJe&j5uC?%>?1OR{tpi& z+u06D=nt9Q8S!(Em;J3;z%MQI<|`o*445*oA8-UW$w?s^Kxws<`hf4|mW-l$S!3TV zG>!PPHdG+8hsr3$W}ZV?e~JJE1~{{S{1C3f!KEK+ZK;N9gS~(n_zdR(SRe77uwL%#fZ{F{n zbROqYu2FE%Q7PSkgHGv?YF*Da>z*z9PxWO4yPDs7U=! zYZNcKyA&FIwCD4YnKW+9p^vDfau~4Ows1eI07)Ia~X?5HUTPb}on&a4WQ~sVC>R8c!9KLcpn$cH=_Ojh`X33CRD4eH6+FB} zi#e6wGcS%-F5J2uaYBLS-H3c+x=H-SCG4qsfK0FqP#NWfW7nxf!^Q z9as_-q9l1TqY8OZ8C~ME(HfQ}#f4{OV>5K5nWT2G^8{0hOC_eX<70oBFc;>}+SwWA zJ7v(5GOC7;g;^cFwb9Ay*@Yr~cyj`W%I&)PmZN!<%7+KpK$s zVEba#SZKzXX}LB-%9G_oW@Jb&riV7l&em9o=nIicRNuxD-*hOyQP|j>T1zR+a=k6b zpO6yfWXq24;Z$Fr!P5IMa5_PHT*Q6vI77ck!#oCP(FFHI&lwa9dSi879Z%$LSm2sr z#i)6pQ!dIL@q_RL)Vi%Bi&OG){dpC;W2Vy(tNK;cOVy3cbjUEZ$a`==P|H%&LpK

p%+TSde(=H>;` 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 literal 0 HcmV?d00001 diff --git a/design/images/coldwrites_1.png b/design/images/coldwrites_1.png new file mode 100644 index 0000000000000000000000000000000000000000..48516616e4aba5d8f3aa7a2dd8f29ca88843a1bb GIT binary patch literal 25480 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 literal 0 HcmV?d00001 From 64f4ecc4104d752045e669c7cfe2e6de2bc81a23 Mon Sep 17 00:00:00 2001 From: Justin Chan Date: Mon, 14 Jan 2019 13:00:57 -0500 Subject: [PATCH 2/2] Fix formatting --- design/005-m3db-coldwrites.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/design/005-m3db-coldwrites.md b/design/005-m3db-coldwrites.md index f5b4ad5..7ccd890 100644 --- a/design/005-m3db-coldwrites.md +++ b/design/005-m3db-coldwrites.md @@ -3,6 +3,7 @@ Author(s): Justin Chan Last updated: Thursday, December 6, 2018 + Discussion at [github.com/m3db/proposal/issues/5](https://github.com/m3db/proposal/issues/5). ## Abstract @@ -160,7 +161,7 @@ With the current design, it would be suboptimal from a memory and CPU usage pers **Use Case 1:** Backfilling -There are a few reasons why User wants to be able backfill: +There are a few reasons why a user would want to backfill metrics: 1. To migrate from existing metrics platform to M3 2. A processing pipeline goes down and metrics get queued up. After the pipeline recovers, there may be metrics from hours/days old to batch process 3. After developing a new feature, there may be metrics for that feature that need to be backfilled