From 83331c6cf318c10bfa8c2e650622d61d05e5b61a Mon Sep 17 00:00:00 2001 From: Roy Chiang Date: Thu, 25 Aug 2022 13:41:58 -0700 Subject: [PATCH 1/2] add proposal for timeseries partitioning in compactor Signed-off-by: Roy Chiang --- .../timeseries-partitioning-in-compactor.md | 267 ++++++++++++++++++ ...ries-partitioning-in-compactor-compact.png | Bin 0 -> 22809 bytes ...ies-partitioning-in-compactor-grouping.png | Bin 0 -> 23794 bytes ...itioning-in-compactor-modulo-partition.png | Bin 0 -> 25006 bytes ...s-partitioning-in-compactor-partitions.png | Bin 0 -> 26358 bytes 5 files changed, 267 insertions(+) create mode 100644 docs/proposals/timeseries-partitioning-in-compactor.md create mode 100644 website/static/images/proposals/timeseries-partitioning-in-compactor-compact.png create mode 100644 website/static/images/proposals/timeseries-partitioning-in-compactor-grouping.png create mode 100644 website/static/images/proposals/timeseries-partitioning-in-compactor-modulo-partition.png create mode 100644 website/static/images/proposals/timeseries-partitioning-in-compactor-partitions.png diff --git a/docs/proposals/timeseries-partitioning-in-compactor.md b/docs/proposals/timeseries-partitioning-in-compactor.md new file mode 100644 index 00000000000..eba46f78786 --- /dev/null +++ b/docs/proposals/timeseries-partitioning-in-compactor.md @@ -0,0 +1,267 @@ +--- +title: "Timeseries Partitioning in Compactor" +linkTitle: "Timeseries Partitioning in Compactor" +weight: 1 +slug: timeseries-partitioning-in-compactor +--- + +- Author: @roystchiang +- Reviewers: +- Date: August 2022 +- Status: Proposed + + +## Timeseries Partitioning in Compactor + +## Introduction + +The compactor is a crucial component in Cortex responsible for deduplication of replicated data, and merging blocks across multiple time intervals together. This proposal will not go into great depth with why the compactor is necessary, but aims to focus on how to scale the compactor as a tenant grows within a Cortex cluster. + + +## Problem and Requirements + +Cortex introduced horizontally scaling compactor which allows multiple compactors to compact blocks for a single tenant, sharded by time interval. The compactor is capable of compacting multiple smaller blocks into a larger block, to reduce the the duplicated information in index. The following is an illustration of how the shuffle sharding compactor works, where each arrow represents a single compaction that can be carried out independently. +![Current Implementation](/images/proposals/parallel-compaction-grouping.png) + +However, if the tenant is sending unique timeseries, the compaction process does not help with reducing the index size. Furthermore, this scaling of parallelism by time interval is not sufficient for a tenant with hundreds of millions of timeseries, as more timeseries means longer compaction time. + +Currently, the compactor is bounded by the 64GB index size, and having a compaction that takes days to complete simply is not sustainable. This time includes the time to download the blocks, merging of the timeseries, writing to disk, and finally uploading to object storage. + +The compactor is able to compact up to 400M timeseries within 12 hours, and will fail with the error of index exceeding 64GB. Depending on the number of labels and the size of labels, one might reach the 64GB limit sooner. We need a solution that is capable of: + +* handling the 64GB index limit +* reducing the overall compaction time + * reducing the amount of data downloaded + * reducing the time required to compact + +## Design + +A reminder of what a Prometheus TSDB is composed of: an index and chunks. An index is a mapping of timeseries to the chunks, so we can do a direct lookup in the chunks. Each timeseries is effectively a set of labels, mapped to a list of pair. This proposal focuses on partitioning of the timeseries. + +### Partitioning strategy + +The compactor will compact a overlapping time-range into multiple sub-blocks, instead of a single block. Cortex can determine which partition a single timeseries should go into by applying a hash to the timeseries label, and taking the modulo of the hash by the number of partition. This guarantees that with same number of partition, the same timeseries will go into the same partition. + +`partitionId = Hash(timeseries label) % number of partition` + +The number of partition will be determined automatically, via a configured `multiplier`. This `multiplier` factor allows us to group just a subset of the blocks together to achieve the same deduplication factor as having all the blocks. Using a `multiplier` of 2 as an example, we can do grouping for partition of 2, 4 and 8. We’ll build on the actual number of partition determination in a later section. + +### Determining overlapping blocks + +In order to reduce the amount of time spent downloading blocks, and iterating through the index to filter out unrelated timeseries, we can do smart grouping of the blocks. + +![Modulo Partitioning](/images/proposals/timeseries-partitioning-in-compactor-modulo-partition.png) + +Given that we are always multiplying the number of partition by the `multiplier` factor, we can deduce from the modulo which partition could contain overlapping result + +``` +Given a hash N, if N % 8 == 7, then N % 4 must be 3 +Given a hash N, if N % 8 == 3, then N % 4 must be 3 +Given a hash N, if N % 8 == 4, then N % 4 must be 0 +Given a hash N, if N % 8 == 0, then N % 4 must be 0 +``` + +Hence it is safe to group blocks with `N % 8 == 7` with `N % 8 == 3 `together with `N % 4 == 3` together, and we are sure that other blocks won’t contain the same timeseries. We also know that if `N % 8 == 0`, then we don’t need to download blocks where `N % 4 == 1` or `N % 4 == 2 +` +Given partition count and partition id, we can immediately find out which blocks are required. Using the above modulo example, we get the following partitiong mapping. + +![Partition](/images/proposals/timeseries-partitioning-in-compactor-partitions.png) +### Planning the compaction + +The shuffle sharding compactor introduced additional logic to group blocks by distinct time intervals. It can also sum up the sizes of all indices to determine how many shards are required in total. Using the above example again, and assuming that each block has an index of 30GB, the sum is 30GB * 14 = 420GB, which needs to be at least 7, since maximum index size is 64GB. Using the `multiplier` factor, it will be rounded up to 8. + +Now the planner knows the resulting compaction will have 8 partitions, it can start planning out which groups of blocks can go into a single compaction group. Given that we need 8 partitions in total, the planner will go through the process above to find out what blocks are necessary. Using the above example again, but we have distinct time intervals, T1, T2, and T3. T1 has 2 partitions, T2 has 4 partitions, and T3 has 8 partitions, and we want to produce T1-T3 blocks +![Grouping](/images/proposals/timeseries-partitioning-in-compactor-grouping.png) +``` +Compaction Group 1-8 +T1 - Partition 1-2 +T2 - Partition 1-4 +T3 - Partition 1-8 + +Compaction Group 2-8 +T1 - Partition 2-2 +T2 - Partition 2-4 +T3 - Partition 2-8 + +Compaction Group 3-8 +T1 - Partition 1-2 +T2 - Parittion 3-4 +T3 - Partition 3-8 + +Compaction Group 4-8 +T1 - Partition 2-2 +T2 - Partition 4-4 +T3 - Partition 4-8 + +Compaction Group 5-8 +T1 - Partition 1-2 +T2 - Partition 1-4 +T3 - Partition 5-8 + +Compaction Group 6-8 +T1 - Partition 2-2 +T2 - Partition 2-4 +T3 - Partition 6-8 + +Compaction Group 7-8 +T1 - Partition 1-2 +T2 - Partition 3-4 +T3 - Partition 7-8 + +Compaction Group 8-8 +T1 - Partition 2-2 +T2 - Partition 4-4 +T3 - Partition 8-8 +``` + +`T1 - Partition 1-2` is used in multiple compaction groups, and the following section will describe how the compaction avoids duplicate timeseries in the resulting blocks + +### Compaction + +Now that the planner has produced a compaction plan for the T1-T3 compaction groups, the compactor can start downloading the necessary blocks. Using compaction group 1-8 from above as example. +![Grouping](/images/proposals/timeseries-partitioning-in-compactor-compact.png) +T1 - Partition 1-2 was created with hash % 2 == 0, and in order to avoid having duplication information in blocks produced by compaction group 3-8, compaction group 5-8, and compaction group 7-8, we need apply the filter the `%8 == 0` hash, as that’s the hash of the highest partition count. + +## Performance + +Currently a 400M timeseries takes 12 hours to compact, without taking block download into consideration. If we have a partition count of 2, we can reduce this down to 6 hours, and a partition count of 10 is 3 hours. The scaling is not linear, and I’m still attempting to find out why. The initial result is promising enough to continue though. + +## Alternatives Considered + +### Dynamic Number of Partition + +We can also increase/decrease the number of partition without needing the `multiplier` factor. However, if a tenant is sending highly varying number of timeseries or label size, the index size can be very different, resulting in highly dynamic number of partitions. To perform deduplication, we’ll end up having to download all the sub-blocks, and it can be inefficient as less parallelization can be done, and we will spend more time downloading all the unnecessary blocks. + +### Consistent Hashing + +Jump consistent hash, rendezvous hashing, and other consistent hashing are great algorithms to avoid +reshuffling of data when introducing/removing partitions on the fly. However, it does not bring much of a benefit when determining which partition contains the same timeseries, which we need to deduplication of index. + +### Partition by metric name + +It is likely that when a query comes, a tenant is interested in an aggregation of a single metric, across all label names. The compactor can partition by metric name, so that all timeseries with the same name will go into the same block. However, this can result in very uneven partitioning. + +## Architecture + +### Planning + +The shuffle partitioning compactor introduced a planner logic, which we can extend on. This planner is responsible for grouping the blocks together by time interval, in order to compact blocks in parallel. The grouper can also determine the number of partition by looking at the sum of index file sizes. In addition, it can also do the grouping of the sub-blocks together, so we can achieve even higher parallelism. + +### Clean up + +Cortex compactor cleans up obsolete source blocks by looking at a deletion marker. The current architecture does not have the problem of having a single source block involved in multiple compaction. However, this proposal is able to achieve higher parallelism than before, hence it is possible that a source block is involved multiple times. Changes needs to be made on the compactor regarding how many plans a particular blocked is involved in, and determining when a block is safe to be deleted. + + +## Changes Required in Dependencies + +### Partitioning during compaction time + +Prometheus exposes the possibility to pass in a custom [mergeFunc](https://github.com/prometheus/prometheus/blob/a1fcfe62dbe82c6292214f50ee91337566b0d61b/tsdb/compact.go#L148). This allows us to plug in the custom partitioning strategy. However, the mergeFunc is only called when the timeseries is successfully replicated to at least 3 replicas, meaning that we’ll produce duplicate timeseries across blocks if the data is only replicated once. To work around the issue, we can propose Prometheus to allow the configuration of the [MergeChunkSeriesSet](https://github.com/prometheus/prometheus/blob/a1fcfe62dbe82c6292214f50ee91337566b0d61b/tsdb/compact.go#L757). + +### Source block checking + +Cortex uses Thanos’s compactor logic, and it has a check to make sure the source blocks of the input blocks do not overlap. Meaning that if BlockA is produced from BlockY, and BlockB is also produced from BlockY, it will halt. This is not desirable for us, since partitioning by timeseries means the same source blocks will produce multiple blocks. Reason for having this check in Thanos is supposed to prevent having duplicate chunks, but the change was introduced without knowing whether it will actually help. We’ll need to introduce a change in Thanos to disable this check, or start using Thanos compactor as a library instead of a closed box. + +## Work Plan + +* Performance test the impact on query of having multiple blocks +* Get real data on the efficiency of modulo operator for partitioning +* Get the necessary changes in Prometheus approved and merged +* Get the necessary changes in Thanos approved and merged +* Implement the number of partition determination in group +* Implement the grouper logic in Cortex +* Implement the clean up logic in Cortex +* Implement the partitioning strategy in Cortex, passed to Prometheus +* Produce the partitioned blocks + +## Appendix + +### Risks + +* Is taking the modulo of the hash sufficient to produce a good distribution of partitions? +* What’s the effect of having too many blocks for the same time range? + +### Frequently Asked Questions + +* Are we able to decrease the number of partition? + * Using partitions of 2, and 4, and 8 as example + +``` +T1 partition 1 - Hash(timeseries label) % 2 == 0 +T1 partition 2 - Hash(timeseries label) % 2 == 1 + +T2 partition 1 - Hash(timeseries label) % 4 == 0 +T2 partition 2 - Hash(timeseries label) % 4 == 1 +T2 partition 3 - Hash(timeseries label) % 4 == 2 +T2 partition 4 - Hash(timeseries label) % 4 == 3 + +T3 partition 1 - Hash(timeseries label) % 8 == 0 +T3 partition 2 - Hash(timeseries label) % 8 == 1 +T3 partition 3 - Hash(timeseries label) % 8 == 2 +T3 partition 4 - Hash(timeseries label) % 8 == 3 +T3 partition 5 - Hash(timeseries label) % 8 == 4 +T3 partition 6 - Hash(timeseries label) % 8 == 5 +T3 partition 7 - Hash(timeseries label) % 8 == 6 +T3 partition 8 - Hash(timeseries label) % 8 == 7 + +We are free to produce a resulting timerange T1-T3, without +having to download all 14 blocks in a single compactor + +If T1-T3 can fit inside 4 partitions, we can do the following grouping + +T1 partition 1 - Hash(timeseries label) % 2 == 0 && % 4 == 0 +T2 partition 1 - Hash(timeseries label) % 4 == 0 && +T3 partition 1 - Hash(timeseries label) % 8 == 0 +T3 partition 5 - Hash(timeseries label) % 8 == 4 + +T1 partition 2 - Hash(timeseries label) % 2 == 1 && % 4 == 01 +T2 partition 2 - Hash(timeseries label) % 4 == 1 +T3 partition 2 - Hash(timeseries label) % 8 == 1 +T3 partition 7 - Hash(timeseries label) % 8 == 5 + +T1 partition 1 - Hash(timeseries label) % 2 == 0 && % 4 == 2 +T2 partition 3 - Hash(timeseries label) % 4 == 2 +T3 partition 3 - Hash(timeseries label) % 8 == 2 +T3 partition 7 - Hash(timeseries label) % 8 == 6 + +T1 partition 2 - Hash(timeseries label) % 2 == 1 && % 4 == 3 +T2 partition 4 - Hash(timeseries label) % 4 == 3 +T3 partition 4 - Hash(timeseries label) % 8 == 3 +T3 partition 8 - Hash(timeseries label) % 8 == 7 + +If T1-T3 can fit inside 16 partitions, we can do the same grouping, and hash on top + +T1 partition 1 - Hash(timeseries label) % 2 == 0 && % 8 == 0 +T2 partition 1 - Hash(timeseries label) % 4 == 0 && % 8 == 0 +T3 partition 1 - Hash(timeseries label) % 8 == 0 + +T1 partition 2 - Hash(timeseries label) % 2 == 1 && % 8 == 1 +T2 partition 2 - Hash(timeseries label) % 4 == 1 && % 8 == 1 +T3 partition 2 - Hash(timeseries label) % 8 == 1 + +T1 partition 1 - Hash(timeseries label) % 2 == 0 && % 8 == 2 +T2 partition 3 - Hash(timeseries label) % 4 == 2 && % 8 == 2 +T3 partition 3 - Hash(timeseries label) % 8 == 2 + +T1 partition 2 - Hash(timeseries label) % 2 == 1 && % 8 == 3 +T2 partition 4 - Hash(timeseries label) % 4 == 3 && % 8 == 3 +T3 partition 4 - Hash(timeseries label) % 8 == 3 + +T1 partition 1 - Hash(timeseries label) % 2 == 0 && % 8 == 4 +T2 partition 1 - Hash(timeseries label) % 4 == 0 && % 8 == 4 +T3 partition 5 - Hash(timeseries label) % 8 == 4 + +T1 partition 2 - Hash(timeseries label) % 2 == 1 && % 8 == 5 +T2 partition 2 - Hash(timeseries label) % 4 == 1 && % 8 == 5 +T3 partition 6 - Hash(timeseries label) % 8 == 5 + +T1 partition 1 - Hash(timeseries label) % 2 == 0 && % 8 == 6 +T2 partition 3 - Hash(timeseries label) % 4 == 2 && % 8 == 6 +T3 partition 7 - Hash(timeseries label) % 8 == 6 + +T1 partition 2 - Hash(timeseries label) % 2 == 1 && % 8 == 7 +T2 partition 4 - Hash(timeseries label) % 4 == 3 && % 8 == 7 +T3 partition 8 - Hash(timeseries label) % 8 == 7 +``` + + diff --git a/website/static/images/proposals/timeseries-partitioning-in-compactor-compact.png b/website/static/images/proposals/timeseries-partitioning-in-compactor-compact.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4326d588029097e70e39301bfa1ff4c20965e1 GIT binary patch literal 22809 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 N@O1TaS?83{1OOhtWd8sF literal 0 HcmV?d00001 diff --git a/website/static/images/proposals/timeseries-partitioning-in-compactor-grouping.png b/website/static/images/proposals/timeseries-partitioning-in-compactor-grouping.png new file mode 100644 index 0000000000000000000000000000000000000000..f68eda1f6a8b400ba7ef8659fb41dd2d437d38f7 GIT binary patch literal 23794 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 VTQV)ckC>m5msW=6OFnq=e*s1?Y61WN literal 0 HcmV?d00001 diff --git a/website/static/images/proposals/timeseries-partitioning-in-compactor-modulo-partition.png b/website/static/images/proposals/timeseries-partitioning-in-compactor-modulo-partition.png new file mode 100644 index 0000000000000000000000000000000000000000..80878d23e358d735b833d733a3c2b4685e11deac GIT binary patch literal 25006 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

;2^o zWq9xW1rSFFBP0KlI<`eCa*YN2sGD5Q@p&t3QwGblYZ=uk=hRLc2A%>1W0%MP9#9SR ztn8Ag)9|O}VC3t2S4wYQ_ngD={XTWyxY|kwTVn!VT8`=pw){m(FIe*GXJh=&reAOn z2Uu_fc0f|cC1Ho2NjD%IhuStW$VQf`sIM%4aRDyN2HbOO|1;4Z15wmm%LN zJZ`JngYq$kmR>A->y!BBH(9H0Z}8ovA(L77e(!u=c>;W zr2eCsSX^}Q0EqB_H<83SFAxR};m3SmYAhgmiHiiW7 zZI|^5VQ)2vlw;-H-amKj`Iv6$cS+oJoTx1M+6c{VtXP*XP$VXgazw4kkJMeTIK z((P}PW99i_TJ#p4k(v7Uf(v#&PIs zIX|@FH8B7v6s^%En-2?@O|1G-eeDa;zY$lJwp7Kh!o8R6&vRI@O@b6Rp$rieS*(7y z46NiA@nfAS#N6Hu4Difd(yQzR!IU;Aiis|T9B)s8<%FfC>*q(GA0KdjMSSsCn}Zc3yC^W9g`Scrq}y3B`Jl zn*Kc6Lu`u-3-l{kK`a;?Hp8@Ksbh7xC2or}Hw*HlIjdt~X4;9C(BLd-AFev&SPYn6 z$MdDhx^ge?kqY&arq!&stpOVs>HoAx7Pyq_Z#5s-Bt#Ql$|9@%5STmXNrI%r5C-6- zkK7jQaPb;grkYt~55Lzq#eDG@y6!yg&;m3BDx}1-(n47Z!f+6e1fw$GFKhZ&wayDZ z@Axv)H#~W*ugL{^kV-G|<)g-Owy2B+5uO>PC-Pn&+0t1VO(c6Q&FSw|w1eF>-9Kft z?0S_A{x@##9%tUi&o(=fsD$-@`}#Il``6b&em|ycb5M%q*>DC$#^{w4qw3DSDyp{Q zIqNr54J_+nzDF@S61f4HKYtC$>w;PhXXy5Xi6N-CPrbs0l~3Kjtwl7(OH+2F+cC!$ z9wVq8(IWV05&Z#Z>VzPyzYu*hrHfHcY=j{cw)7&-n-t+>G9#WFPRi zQZku7e{&S1;Yhl~;d->SXz}XF;aWW?0my2GDoavv%P1>6Z$*7-dXL&1s<{~DSk3U0 zu&F71w_-7Bjj(<;?3!ix@itplCx)us%E=%D?#TAs2akZ>PpXmO+(F~RgxMcTt(!Mm zpPQ41_Oso}kBR^V@~8m|{<+CSpI4ktB%i09D!+w{o5ay>p41*;OHy6gJBQwTp7J*A z?m($}43lMTWHd*Gq$R=HiMh{U0ZBUei-|A+&y|^Y{A)<;NiYbMw|W@Sdb>YoDnV7~ zE5j$22tD6($>tx?pvvLoji0@J7`{ok26zt_0$d!9G6#)C(2Jubqqbu?gh z4msP)GLYiYffy2rThw`_pt^HGYD#R2 zo>2AK6h{V}&er@qDDAQhj4El83EpgHXB3z1M@~Jpb>cPu8_{9ok$-O@qxv7FLq_|h z)))1)QO>H*%({gGuA{mB-Lf&yDa-iCf9;dgjHf3UDpOQ%#(~IampaaFV!r8z26PBW z&724TjFE@5^O$-Xx!2Mm$^}**#{3H2%#tlyUOG)hg?m8AH`nbo$U^NS9`l?#h-VWP zO#$nmPAE2liyxn3+ZG_^H+~GQ{xs9*%P(Nj0A1Xa`DBO&Gzcg8GO)^jJm2#VD+l$E zVB_3P(h2~#slMJ|))p|YEugmwh|H33*8*5ah}z#*j^ek~Q=k7@IHD(I_dh51P%JhV zgL>JZh0mb4qu^=0mIrTW@k2td8CKSbYLH+V(0(z?4hdf@Z42M;x9;jn8#Q@s!$E+1 z1q9Y4k#~6owi1bJABZgrY2CV7c>Zs3KhTtw>aPy?vFWb?<}FaXl9FVUQsxB%dvU9a;kLDSJ7A7kg8*-ZO}s&aMfRT;7=@1Dg7ts9z;K4SS$M8{ z%Z4ReK%X8i7vIIAcVGWnU}QTZT1UzAIE`Avj;X?X7_$ip8La?3_5vv{)DH^GEJl?E z-QPL8v-7n7)jAo5JQmU~$nJjhDMCLX4Z4@ovaxOBfQKuI&6Q#<=-1&LsHqw|TWrzi zHWC>9OYgm3$_69HEA*X^n#i&-z=Ij|mi9mrlso|@*PK&ZqN!NEw?XCVA6DzAG5V_{T$Wlzpi0Hc%++)?` ztZuhRK)YzcCQ+)cp7;AO3z>>dm!EjdG=gZZ$$w0s{-cu5*8$;MSVWy&Ede?kNNl+} zP>i`%nhAg5*?O@0sOM;*7_9P6EPR!clU|G^TXo&kULQGrYw8qg!LfCvm*sR%y%8Xn zsxlENEo|LvyhKD)ZLA22u=ACL==1kzOBKTPIh|(Lu?)fZu*JHtY8k8)% zRCo@>fR|+r<7a8*)%CWf12Bx+ZT=3*wovxV+}1;zI@Z?G#WSoR3;QXD15z@#S2A1l zA5>=I2*>&auHSsu2C`B5|A}nW;?n<0iv9m%n)qLt{QvWr{Qt@n%_%y)^#1Y@Nnvi6 zi!-ZBN<#9uS5+YtWRJt;$g((7=gU7S0H-IJ?mwo751@MiJMW#5tK*fmj{S5DVlEVx zAsgLW3-Ll(r;`=>?AVyZ((k?F&pT9#+Ix9%_>ebj_ii2HicUSVCnRH(NbvjlQIlMD z9VZm=pW8U?sv_~ zAAT3LmpjL02Qp zbd$E#IZ_29UB&zN^UXvw#Y*8vY+3d4>6W00cf$q9$170Rah@#Mz~`AWDacrNIRVRO zcB+NM+aM;UeH&p%{ZKWYZvR$K9Wh`(@^U>B{`Z(9#p~M&RoctmgR!OlFCTRJva+h% z0NlgLk9uvSrzRVev*?lberumB9fT^hQu%1j;!FU2N8=ZJLn|n7b(b*xd+?1A?xmO?sPa8MIM)-2Y>@Xu|oLuZNvK# zS1Pg8`tB0a|J1TAu}bqTLDaR;q0Z4)7Jc(F6nB!^0Bh#^czB6^TXx`BMtbLyU)V?F-onT^1vmd-GOQu2T{L&VLcz(p| zFb#!MNx$0qq8SFk_U&gr&fEp zgz(nAZlUER`O}yCG9b=HVoAiK+Cn2AU;0!6P-gs%pKJMFk@-1)RA(4OS>>s#bcXB-sU2 z9^cK1&~npXZH`Zt@aD|K$reXRZG2~y$N_q;vE~Jw5xuIDB2)O$1`yQdm;PXDb`l=I z-=Pjt$%M#({wewJLbLFEVq0t8gD9?;Y7wAn<(?75_zz(prEnpJR6KnycAb@gj?Ve+ z=)H43t#IKUGvJQ&vvC;${KZH_SsxU`PN>%%fn}78rGI*s*~3CL2lmvw&Tj(^x@>;# z>p`u~wuYbJG9|VpUphIMY|YZ?+n2uU?0vjy(kfytdms1qDbR=g>cR<8 z3K_8+&nGY6;cKte^2IlD5Ir`l=^60A(%FP_fFW^@oWGwl8}du%zT^U^3>i|B)Xbop+MC~e#@G}w){ z^Jxaikz;iG5VkT{0K=P3A5JAMxJCWj7YW8fT8=ig?M05)PEV>cXT|{(%VEb;_Z6S; z0?m8URp9CcEn<4rXx7N0JAZFP>ehP1;Vk?Gf%E6FcW$=!d$EHR0i0fb_`TmS1F-0bx*Hke5MD1nBj@<*k3j`@N zfuGMsEwX_E^>12f*lDiXERKFu z_fPiv%=RX`Ki+^av{1t1qv_|wfYRnIzTJcdk*mNf*lJ4qu>>{HLA==u z23`0PJ5G)dBvT^((9I%1u z03G2zbZojR2B7FX&*^EvVCqFs(WkqhEU*-ba`?W9wd}K zKj;8%${3aGo!7#2QD0URfD6WdCRLWRP1L6hY+V7I8sQpmsAzB1J<}lPbnc>kMH^t6 zVu70uz_EhFDokwpm+|wFW)LojQm+EU|LUe%6DT7FTjd@O-d_1!pr)DAopSd)v|zLF zwwoe$^Hx^JE+ouzzS`z453^Y5P|WC&>(+XSCl}G4CTl1$6Qd4bT5Q)`ylc*MG34lS zLa9G9@$E7?_O>A+P(77vAdu z$dbY(^=Aq+_tv%ml8!n&=p^3ysN=iP!lD(-z|>Yj^S-(j3vmg94#>3%^R5RQfbA`P z6N7D*jsxf{P4U91gayLB@#C{4$Rzu&A7D)!C4(7wIYRq%>n$16aNI}Y_1Por$^r&U z8U@P|>$?cQD|b+_pVY~O=Qdd-V5gMp)pIHOP;sN?a?%lCYrV<0HKu%%)!oIEo$GaZ zA28PnZnles_vT&Q|D_6%CvJ0zQ?Ca+YI?J@dMu$SJ7u!kT0XCbl@yeTDX^`>zu+@}5JIV{rrE9N5>Wly&bL&CUDBI2B})z}L}Ok8c*ugY5}?~0!X0$Bs- zgKxw3PYJRz#I0!?I>ar{n)77%eA+frmbADRbvC_EW>1f;pEVbPJqrdXGplG4+Ru#f zbP*AFculb=WEB3@!e82-QR$xmuYyTC{pf+Ij@x^~1@b&#i|SaK3)s>)hDE{cdlK{! z_76zriPt8Yn`9mFZ)S;7SxCqdS~vN z>**=z%I$N2`qpqLk;@e#6$P84y$uWip{No?k=@s4$5zVeO|W$6|f+C1ppWvN#f05j%=F? zw@~LRUahrcGY8D!{)+7e^t7f5^2BlVIlx^IxQ^w6gFEOB$Iq)J&jy{Ycap2Zc$h6V zX0yhd3j;hY-fhkS{`Byp>K3iBa@}%Ve1bi)b595(uM#%_AP8IO83ryRmTYRSjjHjg zqD)xO>gX%LsmZJ-Df8F~1N@$0eRU>Pz?UnE7iyW>a2=KvfWT!pR2J$#5fGj>dwh5y zfCY>&KVL4n@>2T(J!kyb&bYC64XwaDaMO-BOZ&r z1EMx9uw6%#X%WD+eLS*G!YiktJbe)hW_nHMzwR&PONtT(JQ1oMY&ktS+*VeMhEv*f zA{V-1zba-WZfXm@EO~un>FK2ggtr;;JX$HMMKchvuj2;pEQFUc%Pu?B#1dM{mY$M_ z??t7)U?n1IfJewn$^IG;9h^nB=x)y4br##0)a1@J9LVr&X08>w90>z+`vs42U-pAT zcN{GStcTI0F*ORT>Ud3T3rW|07GN1Ernf**YV>novM|21`imBe9l*B&K^5w1>CbcB zU+q`h?X|<;AZf|pXDmI|s9o8*8-CQ;RJjsGF2{O;KH<2<@=iEjGq_&pRSS$@9MC`P z63W(E4&S0K5G_`slB7DBBilTuu`m~K-vb!)m)@MsAnXeGmUDf;N<~YuaF0y7JsTd# zMWee0fSI*{TC776N0*y^wZ*-~pSC{2o6AI(ZVP>e8P zDFMR^a!ySQG@!Y*Js6^(TZLU1=e0C>@tlXW**1uKlw_gvq z)64kfftL?Y<(syMg-cx6?5vEM1)BF@Mrh%27}(76HIW;HdF}a0wJswa7xMvUs0euF z-uIV3dne$Kzt~?het4-nG}<|My*+#uOo3Dohy!D-7ZdOyVpMatcd*3+XBoM$otk_~ z^yZsj;ROx4$e%N>sE0&|oO0G5OG|Go8eK zXIb4{wJ@&;5_TjU78~dpr7VdHcq0c|M$R?X^Ku-ecCvwHv*YA<7y4Gi=(d7)#ov@i zOB`OGMeo=Bl-i= zPr#0gyvzrKhnDLoys-G0weZv66)y9>AvW!0{?tj5+FI75H@I0f951PG*6$v-=uqW z0%8LI&u-v@_gksOgp1F6vu~bOZJ^{c;N354VsQjjU#^SrTX`%U+P<3okiHg8E?Wtkgga^crUQqx{ey4h{o7_FMp) zG-uaqc%js8GNq&p8G5?cw^IT`uaH*H-($dNewir9Bp27fwo9lZRy*>d<;CKDTgEQ_ z9B1qFU5@J|PLDWY<*3+wpOznC=xcfM9LXaFpq#bIrEIj%=l;#@TApm-=#4fZfyE~w ztCQ7hL5L@{fKf%8@RRU9wtZh~N+yAnQ4_xE3lkr!JFxA))P+h5z^0X5CEj#k-o&I? zFHQg41&>ulgu9h)rM`J&tuM(}ixrrMo)SME2ui6&=}QPK4Fajz9tC8A;?);g!n}I~ zQ|~7Inr^+GQ_T#}5HRD)fLmeaa~P0Vd8H%t8+b(Uu$LyD=fI=CVspd#!v<^m4UosY zELC@Sa@M!sU$J86?KKNI?uUcvBzp354#dhhAB^H_WwZ%i{P?uzT#9l7s2ksg&#p_@svw*OIiA(O|DKAB@`wu=#{v95(+5xYFN-6sEifu0z92sq=fV zW8}1A?Zp9G@?rNXve?C!AG~3tRqqneQqZ!lY#Nql#(S|{$0Wo|@|r3JhuOeZCVGW? z`t7rsHTT}Jo)5c0B|s^@y|QYlojp^}4q@IOw^mXpN=yI8Isv#@s_JzgH9j1F@{{fV z!e)^N!M2pmEoi~~;LLzX%?RM}u>dN_P|z+vQ;F2CxhY53sn&_B8ugvV3Kc2$`cw!n zKm(N9yJiWojWuz&E_e@Ouktk`)p4)Es%n<0TgADuWCB{{an`c|;t|82DVzjM+-v3km>Po3@t3UPeZ{pK#N*;p4b)@80N z0L>MvxL8C`shDo~i9*9O?%bIQ)~G|31aj(AlR7uZ6XrgVLndC#l%!Y1P`F@IJF2dYzdk-B|mXxi0JDduBhH<6U2}uzv8{bGoc) zC#<&-d-hI`6vj=)7gM3=I?S0W38Bidiv)EngFpdR?xNCr?OKo7Kd83Romt{nUI-926{%jzEnQ^X*Cf zD0XKy;l<1gEkB3CPeh+sHD{fjJ8`&E3c@(`qD4SgQ@$&IBGn9th8VEfX3V{QM$LD1 zJeI>Gqu@*f%@2(Vws&X4buDIMTGC<< zpcn^vtt;RhbA)oi&O9r98G)R-TR67jx_@{Cw)|$dx&d&r7@>Pz{3_j}rTHrp*T*#7 zTFEtZ0ouW5QUwE8Qtfnl4YAXi&FKi3ANB*f&azPWzBVNdq726CmGFS91~qi1fnQr& zvHQ-{Swd3)%t(FkMJODZH+l1!=Zj;u*_9%*t_f0)=4;$7<2W*WiJ$1!V?UpKKx&iy@u@i*@N``6S2X(irC&C7 zYh4On?1&~kqhABY_n54@7Sow!zV`&JO{K_&>_Kw_zh*{DRW;`Zd-MIU?eFPM+I#68w_nm)cpIMW6U>{Q5v^ zVsW30nSV(J9Pu!i=`6H?DgpUenv2Y{c>on&`$atV`aXLl;ChP%tlQX4dio z$cGZ_<}T;UR{}JX>X|+2aO$~Zyl{uy@fJb`?2{OrOOz-3dVnQYeppfJPR530WFE{} z2S%)7yI)R^hEBzzn!pATiZVpSEY3A<Mzuf)|bo3G;e=sz* z^USe5g^BIZ=Q;M($Ohni0=$hVI{*oMrJe-)7jLWD|B&sw4Gtt!q0yMejPC5F=U>{F zPLluL1giA5GG?pw3~R{=G5Nc_Nlb1(6Gv~4hZ^vqAFhQBgJ}8Eifn0~?MBb{W97#d{ zf>4WmM{Jwl=`DdGi0l*Ervb>+2(nunndl!0bZ<#dc#x|mvtfr%%)Bp$F!bjqtRE*h zy8>M29bVmc<*63*R1*CQw#4IT`3mGnQS?6JplHIrGV95l`on4sxssS4ga%8R+3>8N z$(0ONpc)C#MD`4Ln#_xyLyqG4rLdD%Z~6Pb@etV3(D2GHM{Mh<2d8%78#BgWdbH`tC_K8Blqwj@bkOC}8}NiO_VT@1x8M zX~;k(UD|vs1y%cIIo)QI;Oqd{*PsP5Ny!VJz%eQ|m*>XWr|@rA11utIpYw~Zv$Wc3 zyQunJa_rV3_DBKp$=|Hg==7&iuVYMCuku;7cn^wCrZgN4WfgHk9{f%3XiuMSS~)o9 zc*SIX=_MBe?8%csUIuIXR;?%Z24OASo7~8iVEr!5>EF6`73kW@Tsb)D!>L+{Sq0F+ z@9x>g?4ElBP&revcW;wJH0q31R3b}sxOKwA!Dgj#O+=a^a#cu{I#>R23xKEw4X{+% zOs_$(QO)DU!JWfa*@;duvnAIwJt-Hq$F2kic+N z7(l`Hdru3yB}14W%L8a=3$U(loT`Qb*3v*{z$%Pef+*m$0&MEiQ*k>B%Eq&Ar-gO* zd?l0oXtU!b0|2lU`IANY0n~K~V!+pm3!}xyO+1c!wh;!G?N3=t4ncoz&gEdX!6SCZ zMrNcRCeFkZa|$Qy?~eMC5fZ*Y?z|w!!D6sjCH^4>&4IqYud6c zbI1OBbLpfT%&|v>wO!ABD-TNyfebVkL+|8&2%sVeznI&|?Y%eKbTo99i@i6j*pQ0 ze%9XJzk&6M9lC2#oOmDm0)gjj;AjYMyie6dCHbW%l(v7Jyr3(y^W%d$I4Ok>y(ZzDuCv7eNa&D^G5zRy6d;Ph zQ3v6!r*+tn)HZxlY$tt=+V}*gTrrA(;9Pjc=BwHN*50{?C4Gf)d^MMB&S^n4vqG1K zg-YdRYNbu>;$@_1_0+s(nmS8ex#2dvClR$wNRp-H1X%X#?n$yCbxds7;LvJq(hpifh*3+3=mH8W1_a>G>>hPkfKD?7 zauT<|etD5Bc#reBcu=_gU=qT;4&oqqB9;M?{&Rb_Xj;jLd6wT2HS$CdBiJ%4<}LAv zV85yXowAmMEfR)iOcg6H2orI0CC^h>lpjJjJ>9HRm6U{YnLT~QbE9)QkCy|uo$L+! z94Cp+Cetamv=;YrsY%yL9`XbYk)2jIR*-D5r*(aIGT&F-WBQS9w`eQVK;f{=!dJSD z7g_uI`6jSGhtt!qUuHh-g1dwNW}<$La6EI0(r03vdSMLE(!!l;sRowA-YM4=2 zu!M(gv{jum0rZ-?uS-t)<)j9AjgGM<3jU+P{zDq`L}6e8dbQ)k!S@2zdsa<;fr>}<_lOcJnng;nACJisiNN`blSA)}*{;EB(3MJa8Eu+g@M2)XshMu~ znee&S;W0zTbT60&SQnC)jd(qwQ8Z@m)9wwOmSfX=m>vk)-U( zPOT6MHh7C3{d58PJ82c?W#eRt$RPb0$W0G*DXdb!BgMCMxpOsZ0LP~e^v^Vn9<7v3 z>b(VjNQP^qy}3)oQ(20o(rp!$5r<_Xlas8=~%ru`Bb!DR2@|t6!Ih zaw@F{CxlK#r3=dJ>XGqt)`e7VhpVj`yi^&A9G!XM#UZuY(#gK7zL1=p+?;nGa)q7m zM}3L#(q87b_U#AYs39@z2EG`elfnN$Ck3`xe*&p4iG2Dd+Vl#W5S-aOINNOt7G*N@ z)-_LR2fW`C#i|=^h@I#^g7ksZdxnNwK7%&@Mvi3$Ef}0J&eHiuk-NRAp1i#hS=TBy zX&718`XqnfjgfBF-f`%robzC97!RiFl1xJRJd}o5ZlDCNhJYfqIneHN1p+7E2rz5{ znw5%f#HLvx(&Sl?`55$|1XU$Xia2!l;-(U;MQ}7`>D6OJXva7v<8uteJFL}HVmKIy z&iO5*27W8F%`>PIy1L@kZOh^_2g<*Ym^z^a=5EOfvNeSZtp4C2W?_~dWCYG9)9Gj| zNlWVm-zew-`f;|7zYB+NfvWi6fB;jXafR^ulEUtTXenZa%RV=M0wMbPGaI2;&x4Ce zK~NmZJ6OegC?7F36WU-QtPsAqQech{-626pj+BW!>_o$Hsn;Ssi9qlOP$z8cfFsg} zLdeVyhokv4@2(@m(FiibnYpb93*=90BHj^V*j&_P_?cydrap3GnAO%*v2uV8`%cNL zjSzLx?YjT04dK{ut~Oo(Lvez^8);KoF6J>uRu&7~-VrGJa#30&gYTeB`kLd=B4Dt_^RX8F= zkj0)+>mGkdwOBNtKWfhJ*}BUyO9h&J1j%1$>jEIJXeXs;4_89b=ypG&>0#RGn4~$NW{Ryu!cVP56xKA^N;{XZ`T+1egJdx%_E$Uxu z5!l_kMzsG3ygO-2D{j?7*jIjwcBo4JZlZF5!~f#?UtIqxt~CeT;%qQZEdLD2PnvG= z%1@peG*urPBJM7dr5)Ggu}-Rcqp6@KR_UV(1jk)x8XlEYpyMv-IU?JOm_#QTBuuie uIhBPUx9%HFb=EANWr%bZ2~vSbn=W82oF^|MWr06nc+Y1m*}KX!BI|E`T`mX! literal 0 HcmV?d00001 diff --git a/website/static/images/proposals/timeseries-partitioning-in-compactor-partitions.png b/website/static/images/proposals/timeseries-partitioning-in-compactor-partitions.png new file mode 100644 index 0000000000000000000000000000000000000000..877dd8b648be31ba1e2b6bd68250b3049a477625 GIT binary patch literal 26358 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 literal 0 HcmV?d00001 From e6bfbe96ee5d01e72356527138a1c147e049e6f5 Mon Sep 17 00:00:00 2001 From: Roy Chiang Date: Tue, 13 Sep 2022 17:13:04 -0700 Subject: [PATCH 2/2] fix linter and address comments Signed-off-by: Roy Chiang --- docs/proposals/timeseries-partitioning-in-compactor.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/proposals/timeseries-partitioning-in-compactor.md b/docs/proposals/timeseries-partitioning-in-compactor.md index eba46f78786..f61e25192c4 100644 --- a/docs/proposals/timeseries-partitioning-in-compactor.md +++ b/docs/proposals/timeseries-partitioning-in-compactor.md @@ -20,7 +20,7 @@ The compactor is a crucial component in Cortex responsible for deduplication of ## Problem and Requirements -Cortex introduced horizontally scaling compactor which allows multiple compactors to compact blocks for a single tenant, sharded by time interval. The compactor is capable of compacting multiple smaller blocks into a larger block, to reduce the the duplicated information in index. The following is an illustration of how the shuffle sharding compactor works, where each arrow represents a single compaction that can be carried out independently. +Cortex introduced horizontally scaling compactor which allows multiple compactors to compact blocks for a single tenant, sharded by time interval. The compactor is capable of compacting multiple smaller blocks into a larger block, to reduce the duplicated information in index. The following is an illustration of how the shuffle sharding compactor works, where each arrow represents a single compaction that can be carried out independently. ![Current Implementation](/images/proposals/parallel-compaction-grouping.png) However, if the tenant is sending unique timeseries, the compaction process does not help with reducing the index size. Furthermore, this scaling of parallelism by time interval is not sufficient for a tenant with hundreds of millions of timeseries, as more timeseries means longer compaction time. @@ -31,7 +31,7 @@ The compactor is able to compact up to 400M timeseries within 12 hours, and will * handling the 64GB index limit * reducing the overall compaction time - * reducing the amount of data downloaded + * downloading the data in smaller batches * reducing the time required to compact ## Design @@ -210,7 +210,7 @@ having to download all 14 blocks in a single compactor If T1-T3 can fit inside 4 partitions, we can do the following grouping T1 partition 1 - Hash(timeseries label) % 2 == 0 && % 4 == 0 -T2 partition 1 - Hash(timeseries label) % 4 == 0 && +T2 partition 1 - Hash(timeseries label) % 4 == 0 && T3 partition 1 - Hash(timeseries label) % 8 == 0 T3 partition 5 - Hash(timeseries label) % 8 == 4