From bb393154f0f0cbdc24d5d37feb33af8359229fbf Mon Sep 17 00:00:00 2001 From: Benjamin Raskin Date: Mon, 2 Mar 2020 15:22:36 -0500 Subject: [PATCH] [WIP][docs] Add hugo theme --- docs-beta/archetypes/default.md | 6 + docs-beta/config.toml | 53 +++ docs-beta/content/basics/_index.md | 7 + docs-beta/content/basics/first-content.md | 6 + .../content/basics/second-content/_index.md | 6 + docs-beta/content/case_studies/index.md | 1 + docs-beta/content/code_assets/README.md | 5 + .../code_assets/commitlog/queue.monopic | Bin 0 -> 1625 bytes .../common/headers_optional_read_write.md | 17 + .../common/headers_placement_namespace.md | 12 + docs-beta/content/community/index.md | 13 + docs-beta/content/coordinator/api/remote.md | 102 ++++++ docs-beta/content/coordinator/index.md | 7 + docs-beta/content/docs/Dockerfile | 17 + docs-beta/content/docs/index.md | 39 ++ docs-beta/content/ecosystem/index.md | 1 + docs-beta/content/faqs/index.md | 76 ++++ docs-beta/content/glossary/index.md | 43 +++ docs-beta/content/how_to/_index.md | 5 + .../content/how_to/cluster_architecture.png | Bin 0 -> 56976 bytes docs-beta/content/how_to/cluster_hard_way.md | 212 +++++++++++ docs-beta/content/how_to/kubernetes.md | 302 ++++++++++++++++ docs-beta/content/how_to/query.md | 92 +++++ docs-beta/content/how_to/redoc_screenshot.png | Bin 0 -> 334063 bytes docs-beta/content/how_to/single_node.md | 140 ++++++++ docs-beta/content/how_to/use_as_tsdb.md | 155 ++++++++ docs-beta/content/integrations/_index.md | 5 + docs-beta/content/integrations/grafana.md | 24 ++ docs-beta/content/integrations/graphite.md | 163 +++++++++ docs-beta/content/integrations/prometheus.md | 128 +++++++ .../content/m3db/architecture/caching.md | 25 ++ .../content/m3db/architecture/commitlogs.md | 58 +++ .../m3db/architecture/consistencylevels.md | 38 ++ docs-beta/content/m3db/architecture/engine.md | 256 +++++++++++++ docs-beta/content/m3db/architecture/index.md | 15 + .../m3db/architecture/peer_streaming.md | 107 ++++++ .../content/m3db/architecture/sharding.md | 76 ++++ .../content/m3db/architecture/storage.md | 56 +++ docs-beta/content/m3db/index.md | 27 ++ .../m3db/monodraw/m3db-file-layout.monopic | Bin 0 -> 2283 bytes .../m3db/monodraw/m3db_structs.monopic | Bin 0 -> 1990 bytes .../m3db/monodraw/peer_bootstrap.monopic | Bin 0 -> 3031 bytes .../placement_monodraw_template.monopic | Bin 0 -> 3118 bytes .../monodraw/placement_state_machine.monopic | Bin 0 -> 1636 bytes docs-beta/content/misc/writing_docs.md | 335 ++++++++++++++++++ .../availability_consistency_durability.md | 127 +++++++ .../bootstrapping_crash_recovery.md | 174 +++++++++ docs-beta/content/operational_guide/etcd.md | 83 +++++ docs-beta/content/operational_guide/index.md | 1 + .../operational_guide/kernel_configuration.md | 87 +++++ .../operational_guide/mapping_rollup.md | 75 ++++ .../content/operational_guide/monitoring.md | 99 ++++++ .../namespace_configuration.md | 186 ++++++++++ .../content/operational_guide/placement.md | 220 ++++++++++++ .../placement_configuration.md | 317 +++++++++++++++++ .../content/operational_guide/repairs.md | 46 +++ .../replication_and_deployment_in_zones.md | 94 +++++ .../replication_between_clusters.md | 73 ++++ .../operational_guide/replication_global.png | Bin 0 -> 36892 bytes .../operational_guide/replication_region.png | Bin 0 -> 23951 bytes .../replication_single_zone.png | Bin 0 -> 16165 bytes .../content/operational_guide/upgrading_m3.md | 101 ++++++ docs-beta/content/overview/components.md | 17 + docs-beta/content/overview/media.md | 33 ++ docs-beta/content/overview/motivation.md | 3 + docs-beta/content/performance/index.md | 3 + docs-beta/content/performance/m3db/index.md | 3 + .../content/performance/m3query/index.md | 3 + docs-beta/content/query_engine/api/index.md | 101 ++++++ .../query_engine/architecture/blocks.md | 61 ++++ .../query_engine/architecture/fanout.md | 9 + .../query_engine/architecture/functions.md | 71 ++++ .../query_engine/architecture/index.md | 7 + .../query_engine/config/annotated_config.md | 3 + .../query_engine/config/annotated_config.yaml | 84 +++++ docs-beta/content/query_engine/index.md | 3 + docs-beta/content/query_engine/roadmap.md | 44 +++ docs-beta/content/theme/__init__.py | 0 .../content/theme/assets/images/M3-logo.png | Bin 0 -> 126282 bytes .../content/theme/assets/images/favicon.ico | Bin 0 -> 1150 bytes .../content/theme/assets/images/favicon.png | Bin 0 -> 1056 bytes .../images/icons/bitbucket-670608a71a.svg | 1 + .../assets/images/icons/github-1da075986e.svg | 1 + .../assets/images/icons/gitlab-5ad3f9f9e5.svg | 1 + .../javascripts/application-8e4952e681.js | 1 + .../theme/assets/javascripts/lunr/lunr.da.js | 1 + .../theme/assets/javascripts/lunr/lunr.de.js | 1 + .../theme/assets/javascripts/lunr/lunr.du.js | 1 + .../theme/assets/javascripts/lunr/lunr.es.js | 1 + .../theme/assets/javascripts/lunr/lunr.fi.js | 1 + .../theme/assets/javascripts/lunr/lunr.fr.js | 1 + .../theme/assets/javascripts/lunr/lunr.hu.js | 1 + .../theme/assets/javascripts/lunr/lunr.it.js | 1 + .../theme/assets/javascripts/lunr/lunr.jp.js | 1 + .../assets/javascripts/lunr/lunr.multi.js | 1 + .../theme/assets/javascripts/lunr/lunr.no.js | 1 + .../theme/assets/javascripts/lunr/lunr.pt.js | 1 + .../theme/assets/javascripts/lunr/lunr.ro.js | 1 + .../theme/assets/javascripts/lunr/lunr.ru.js | 1 + .../javascripts/lunr/lunr.stemmer.support.js | 1 + .../theme/assets/javascripts/lunr/lunr.sv.js | 1 + .../theme/assets/javascripts/lunr/lunr.tr.js | 1 + .../theme/assets/javascripts/lunr/tinyseg.js | 1 + .../javascripts/modernizr-e826f8942a.js | 1 + .../application-23f75ab9c7.palette.css | 1 + .../stylesheets/application-709eec9410.css | 1 + docs-beta/content/theme/mkdocs_theme.yml | 53 +++ docs-beta/content/troubleshooting/index.md | 75 ++++ docs-beta/themes/hugo-theme-learn | 1 + 109 files changed, 4912 insertions(+) create mode 100644 docs-beta/archetypes/default.md create mode 100644 docs-beta/config.toml create mode 100644 docs-beta/content/basics/_index.md create mode 100644 docs-beta/content/basics/first-content.md create mode 100644 docs-beta/content/basics/second-content/_index.md create mode 100644 docs-beta/content/case_studies/index.md create mode 100644 docs-beta/content/code_assets/README.md create mode 100644 docs-beta/content/code_assets/commitlog/queue.monopic create mode 100644 docs-beta/content/common/headers_optional_read_write.md create mode 100644 docs-beta/content/common/headers_placement_namespace.md create mode 100644 docs-beta/content/community/index.md create mode 100644 docs-beta/content/coordinator/api/remote.md create mode 100644 docs-beta/content/coordinator/index.md create mode 100644 docs-beta/content/docs/Dockerfile create mode 100644 docs-beta/content/docs/index.md create mode 100644 docs-beta/content/ecosystem/index.md create mode 100644 docs-beta/content/faqs/index.md create mode 100644 docs-beta/content/glossary/index.md create mode 100644 docs-beta/content/how_to/_index.md create mode 100644 docs-beta/content/how_to/cluster_architecture.png create mode 100644 docs-beta/content/how_to/cluster_hard_way.md create mode 100644 docs-beta/content/how_to/kubernetes.md create mode 100644 docs-beta/content/how_to/query.md create mode 100644 docs-beta/content/how_to/redoc_screenshot.png create mode 100644 docs-beta/content/how_to/single_node.md create mode 100644 docs-beta/content/how_to/use_as_tsdb.md create mode 100644 docs-beta/content/integrations/_index.md create mode 100644 docs-beta/content/integrations/grafana.md create mode 100644 docs-beta/content/integrations/graphite.md create mode 100644 docs-beta/content/integrations/prometheus.md create mode 100644 docs-beta/content/m3db/architecture/caching.md create mode 100644 docs-beta/content/m3db/architecture/commitlogs.md create mode 100644 docs-beta/content/m3db/architecture/consistencylevels.md create mode 100644 docs-beta/content/m3db/architecture/engine.md create mode 100644 docs-beta/content/m3db/architecture/index.md create mode 100644 docs-beta/content/m3db/architecture/peer_streaming.md create mode 100644 docs-beta/content/m3db/architecture/sharding.md create mode 100644 docs-beta/content/m3db/architecture/storage.md create mode 100644 docs-beta/content/m3db/index.md create mode 100644 docs-beta/content/m3db/monodraw/m3db-file-layout.monopic create mode 100644 docs-beta/content/m3db/monodraw/m3db_structs.monopic create mode 100644 docs-beta/content/m3db/monodraw/peer_bootstrap.monopic create mode 100644 docs-beta/content/m3db/monodraw/placement_monodraw_template.monopic create mode 100644 docs-beta/content/m3db/monodraw/placement_state_machine.monopic create mode 100644 docs-beta/content/misc/writing_docs.md create mode 100644 docs-beta/content/operational_guide/availability_consistency_durability.md create mode 100644 docs-beta/content/operational_guide/bootstrapping_crash_recovery.md create mode 100644 docs-beta/content/operational_guide/etcd.md create mode 100644 docs-beta/content/operational_guide/index.md create mode 100644 docs-beta/content/operational_guide/kernel_configuration.md create mode 100644 docs-beta/content/operational_guide/mapping_rollup.md create mode 100644 docs-beta/content/operational_guide/monitoring.md create mode 100644 docs-beta/content/operational_guide/namespace_configuration.md create mode 100644 docs-beta/content/operational_guide/placement.md create mode 100644 docs-beta/content/operational_guide/placement_configuration.md create mode 100644 docs-beta/content/operational_guide/repairs.md create mode 100644 docs-beta/content/operational_guide/replication_and_deployment_in_zones.md create mode 100644 docs-beta/content/operational_guide/replication_between_clusters.md create mode 100644 docs-beta/content/operational_guide/replication_global.png create mode 100644 docs-beta/content/operational_guide/replication_region.png create mode 100644 docs-beta/content/operational_guide/replication_single_zone.png create mode 100644 docs-beta/content/operational_guide/upgrading_m3.md create mode 100644 docs-beta/content/overview/components.md create mode 100644 docs-beta/content/overview/media.md create mode 100644 docs-beta/content/overview/motivation.md create mode 100644 docs-beta/content/performance/index.md create mode 100644 docs-beta/content/performance/m3db/index.md create mode 100644 docs-beta/content/performance/m3query/index.md create mode 100644 docs-beta/content/query_engine/api/index.md create mode 100644 docs-beta/content/query_engine/architecture/blocks.md create mode 100644 docs-beta/content/query_engine/architecture/fanout.md create mode 100644 docs-beta/content/query_engine/architecture/functions.md create mode 100644 docs-beta/content/query_engine/architecture/index.md create mode 100644 docs-beta/content/query_engine/config/annotated_config.md create mode 100644 docs-beta/content/query_engine/config/annotated_config.yaml create mode 100644 docs-beta/content/query_engine/index.md create mode 100644 docs-beta/content/query_engine/roadmap.md create mode 100644 docs-beta/content/theme/__init__.py create mode 100644 docs-beta/content/theme/assets/images/M3-logo.png create mode 100644 docs-beta/content/theme/assets/images/favicon.ico create mode 100644 docs-beta/content/theme/assets/images/favicon.png create mode 100644 docs-beta/content/theme/assets/images/icons/bitbucket-670608a71a.svg create mode 100644 docs-beta/content/theme/assets/images/icons/github-1da075986e.svg create mode 100644 docs-beta/content/theme/assets/images/icons/gitlab-5ad3f9f9e5.svg create mode 100644 docs-beta/content/theme/assets/javascripts/application-8e4952e681.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.da.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.de.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.du.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.es.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.fi.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.fr.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.hu.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.it.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.jp.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.multi.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.no.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.pt.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.ro.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.ru.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.stemmer.support.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.sv.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/lunr.tr.js create mode 100644 docs-beta/content/theme/assets/javascripts/lunr/tinyseg.js create mode 100644 docs-beta/content/theme/assets/javascripts/modernizr-e826f8942a.js create mode 100644 docs-beta/content/theme/assets/stylesheets/application-23f75ab9c7.palette.css create mode 100644 docs-beta/content/theme/assets/stylesheets/application-709eec9410.css create mode 100644 docs-beta/content/theme/mkdocs_theme.yml create mode 100644 docs-beta/content/troubleshooting/index.md create mode 160000 docs-beta/themes/hugo-theme-learn diff --git a/docs-beta/archetypes/default.md b/docs-beta/archetypes/default.md new file mode 100644 index 0000000000..00e77bd79b --- /dev/null +++ b/docs-beta/archetypes/default.md @@ -0,0 +1,6 @@ +--- +title: "{{ replace .Name "-" " " | title }}" +date: {{ .Date }} +draft: true +--- + diff --git a/docs-beta/config.toml b/docs-beta/config.toml new file mode 100644 index 0000000000..b9f8d9c535 --- /dev/null +++ b/docs-beta/config.toml @@ -0,0 +1,53 @@ +# Change the default theme to be use when building the site with Hugo +theme = "hugo-theme-learn" + + +baseURL = "/" +languageCode = "en-US" +defaultContentLanguage = "en" + +title = "M3DB Documentation" +metaDataFormat = "yaml" +defaultContentLanguageInSubdir= true + + +[params] + # Prefix URL to edit current page. Will display an "Edit this page" button on top right hand corner of every page. + # Useful to give opportunity to people to create merge request for your doc. + # See the config.toml file from this documentation site to have an example. + editURL = "" + # Author of the site, will be used in meta information + author = "" + # Description of the site, will be used in meta information + description = "" + # Shows a checkmark for visited pages on the menu + showVisitedLinks = false + # Disable search function. It will hide search bar + disableSearch = false + # Javascript and CSS cache are automatically busted when new version of site is generated. + # Set this to true to disable this behavior (some proxies don't handle well this optimization) + disableAssetsBusting = false + # Set this to true to disable copy-to-clipboard button for inline code. + disableInlineCopyToClipBoard = false + # A title for shortcuts in menu is set by default. Set this to true to disable it. + disableShortcutsTitle = false + # When using mulitlingual website, disable the switch language button. + disableLanguageSwitchingButton = false + # Hide breadcrumbs in the header and only show the current page title + disableBreadcrumb = true + # Hide Next and Previous page buttons normally displayed full height beside content + disableNextPrev = true + # Order sections in menu by "weight" or "title". Default to "weight" + ordersectionsby = "weight" + # Change default color scheme with a variant one. Can be "red", "blue", "green". + themeVariant = "" + twitter = "m3db_io" + +[[Languages.en.menu.shortcuts]] +name = " GitHub" +identifier = "ds" +url = "https://github.com/m3db/m3" +weight = 10 + +[outputs] +home = [ "HTML", "RSS", "JSON"] diff --git a/docs-beta/content/basics/_index.md b/docs-beta/content/basics/_index.md new file mode 100644 index 0000000000..a243656ef5 --- /dev/null +++ b/docs-beta/content/basics/_index.md @@ -0,0 +1,7 @@ +--- +title: "Basics" +date: 2020-03-02T14:11:31-05:00 +# draft: true +--- + +asdfasdf \ No newline at end of file diff --git a/docs-beta/content/basics/first-content.md b/docs-beta/content/basics/first-content.md new file mode 100644 index 0000000000..24485714f1 --- /dev/null +++ b/docs-beta/content/basics/first-content.md @@ -0,0 +1,6 @@ +--- +title: "First Content" +date: 2020-03-02T14:11:46-05:00 +# draft: true +--- + diff --git a/docs-beta/content/basics/second-content/_index.md b/docs-beta/content/basics/second-content/_index.md new file mode 100644 index 0000000000..f63517a850 --- /dev/null +++ b/docs-beta/content/basics/second-content/_index.md @@ -0,0 +1,6 @@ +--- +title: "Second Content" +date: 2020-03-02T14:11:47-05:00 +# draft: true +--- + diff --git a/docs-beta/content/case_studies/index.md b/docs-beta/content/case_studies/index.md new file mode 100644 index 0000000000..3e53c4fd7b --- /dev/null +++ b/docs-beta/content/case_studies/index.md @@ -0,0 +1 @@ +# Case Studies diff --git a/docs-beta/content/code_assets/README.md b/docs-beta/content/code_assets/README.md new file mode 100644 index 0000000000..cf8eb44f2d --- /dev/null +++ b/docs-beta/content/code_assets/README.md @@ -0,0 +1,5 @@ +# Code Assets + +## Overview + +This directory contains assets for READMEs and documentation in the source code. Some assets are kept separate from the source code in order to avoid bloating it with large / binary files. \ No newline at end of file diff --git a/docs-beta/content/code_assets/commitlog/queue.monopic b/docs-beta/content/code_assets/commitlog/queue.monopic new file mode 100644 index 0000000000000000000000000000000000000000..d63fc881b76f8b96ae523033b0cd6b00a4c186be GIT binary patch literal 1625 zcmV-f2B!J{O;1iwP)S1pABzY8000000u$|8&5ol+5PlVlQzEev{R{ZGd&ni1D2E(& zMiz#)O$NgR@a#@jBjsuGV0n^sH#7zeGsbp#HS%6OZKkQNs{ZQhs%n3;vgMy5EDLM? zO$|S|t{Rokk75x=)*N}Z6=mTf7b|P7Cm_qV%J{2D^ed(KS}wvYEk#;d^UwEo_2e;& zQzi5B{mYA8$z^K#V^+jvoTV*!+_#37h~m5uQlw*B8xcecrIA#}ZmH(fqOp>k#HmdO@+DtDtL6m(t5Sj*Cu@F&Q zww~2)SjdTKq@I`gPP7zeTAKV)*@A0bit;&;Uy0NpkJqtW+H!11c{x~X#nf8z;jeP? zjLGM1Cn_IT{-svq==<7dX;ubmqF(FJ#ltCil|+EDF=$|Vn;o$vD>8B0YY(Kzow*S-RFchzORYA%^PNY}e0$QRWFZTl)$ zs0-3?ljSXkVil1cIf~PjoF4QKcfJR9WrO_hFPU^(so^%C{gF$Me+TJwlG0qxaqAjrEx=j_{I(OCUyQ0P#k(-`2yo$xf$U028a(tR~u0p@qe|}v z*D8v+>8EkiPvfSa=9+$*dn5fc_mcfI7pR(Y;c80`S1RxmYbsxsGLA_HU4GK3;L?#( zfqCbi3VJVw;PncW56G|`1$;0!8YZw|R&1Xi-HGiOsabY7z3EYCeWPv8!8+$Mmu7}F z3|G{D4VxG;L556_xo$)Hx~-RH_Ku_e;nQru=owp+@~0qu3W^yT$WZT11#m-|IvvZ@ zx!G54HkMPsl)bmgl$4!w_>`TqDJi>mLjXdfrJf0AYLG+;WX;!IWm3(@u2A#QNtgBL zeP7l)U{`MV$CcY#?l`Wv!0h14?V8mEHm5!|G=WV3V{;T>dK=XR=9j#3BNw=%z|IAP zAO==6U<@W2xnRwDg1|&$3MZPwl&jPMy8Hv`-(wG~sY%CfadZxKUU!ngU6U)xLGmcG z2T>&=6|WZJuSL4sE=8^#jCAV6^#rQLS2=0P6)?p>M?p!bx&Nl3vnQf zF>;cn>|JMzj9oZe{FH6CahYUm)q4FsPS=U}Ak#q^DI%)UrF_<;P`B8aKEgr&{qyh9 zsU&x-PN{g+M3R|46Elq_W;#vGw3?WI8;K-G7fd7>8f%U^=N?MbJB`o@P$t4hEY+3B zS(f_mnwbfOV&>UzJFyervwA1~xz+o*q7V3ADwZ0n%y34HC$Yv^U;OtTX2Y? X`la%>qS9~HlYa6)`^K+sJ3IgYVALR7 literal 0 HcmV?d00001 diff --git a/docs-beta/content/common/headers_optional_read_write.md b/docs-beta/content/common/headers_optional_read_write.md new file mode 100644 index 0000000000..a67b1a125f --- /dev/null +++ b/docs-beta/content/common/headers_optional_read_write.md @@ -0,0 +1,17 @@ +--- +title: "Basics" +date: 2020-03-02T14:11:31-05:00 +draft: true +--- + + +- `M3-Metrics-Type`: + If this header is set, it determines what type of metric to store this metric value as. Otherwise by default, metrics will be stored in all namespaces that are configured. You can also disable this default behavior by setting `downsample` options to `all: false` for a namespace in the coordinator config, for more see [disabling automatic aggregation](/how_to/query.md#disabling-automatic-aggregation).

+ Must be one of: + `unaggregated`: Write metrics directly to configured unaggregated namespace. + `aggregated`: Write metrics directly to a configured aggregated namespace (bypassing any aggregation), this requires the `M3-Storage-Policy` header to be set to resolve which namespace to write metrics to. +
+- `M3-Storage-Policy`: + If this header is set, it determines which aggregated namespace to read/write metrics directly to/from (bypassing any aggregation). + The value of the header must be in the format of `resolution:retention` in duration shorthand. e.g. `1m:48h` specifices 1 minute resolution and 48 hour retention. Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h".

+Here is [an example](https://github.com/m3db/m3/blob/master/scripts/docker-integration-tests/prometheus/test.sh#L126-L146) of querying metrics from a specific namespace. diff --git a/docs-beta/content/common/headers_placement_namespace.md b/docs-beta/content/common/headers_placement_namespace.md new file mode 100644 index 0000000000..0592e40f95 --- /dev/null +++ b/docs-beta/content/common/headers_placement_namespace.md @@ -0,0 +1,12 @@ +--- +title: "Basics" +date: 2020-03-02T14:11:31-05:00 +draft: true +--- + + +- `Cluster-Environment-Name`: + This header is used to specify the cluster environment name. If not set, the default `default_env` is used. +
+- `Cluster-Zone-Name`: + This header is used to specify the cluster zone name. If not set, the default `embedded` is used. diff --git a/docs-beta/content/community/index.md b/docs-beta/content/community/index.md new file mode 100644 index 0000000000..c4e582d84f --- /dev/null +++ b/docs-beta/content/community/index.md @@ -0,0 +1,13 @@ +# Community + +## How to contact the M3 team? + +Feel free to contact us through any of the following channels: + +1. Posting on the [M3 Google group](https://groups.google.com/forum/#!forum/m3db) +2. Opening issues on the [M3 GitHub page](https://github.com/m3db/m3/issues) +3. Chatting us on the official [M3 Gitter channel](https://gitter.im/m3db/Lobby) + +## GitHub/OSS + +Our official GitHub page can be [found here](https://github.com/m3db/m3). diff --git a/docs-beta/content/coordinator/api/remote.md b/docs-beta/content/coordinator/api/remote.md new file mode 100644 index 0000000000..23fa4b37ad --- /dev/null +++ b/docs-beta/content/coordinator/api/remote.md @@ -0,0 +1,102 @@ +# API + +The M3 Coordinator implements the Prometheus Remote Read and Write HTTP endpoints, they also can be used however as general purpose metrics write and read APIs. Any metrics that are written to the remote write API can be queried using PromQL through the query APIs as well as being able to be read back by the Prometheus Remote Read endpoint. + +## Remote Write + +Write a Prometheus Remote write query to M3. + +### URL + +`/api/v1/prom/remote/write` + +### Method + +`POST` + +### URL Params + +None. + +### Header Params + +#### Optional + +--8<-- +docs/common/headers_optional_read_write.md +--8<-- + +### Data Params + +Binary [snappy compressed](http://google.github.io/snappy/) Prometheus [WriteRequest protobuf message](https://github.com/prometheus/prometheus/blob/10444e8b1dc69ffcddab93f09ba8dfa6a4a2fddb/prompb/remote.proto#L22-L24). + +### Available Tuning Params + +Refer [here](https://prometheus.io/docs/practices/remote_write/) for an up to date list of remote tuning parameters. + +### Sample Call + +There isn't a straightforward way to Snappy compress and marshal a Prometheus WriteRequest protobuf message using just shell, so this example uses a specific command line utility instead. + +This sample call is made using `promremotecli` which is a command line tool that uses a [Go client](https://github.com/m3db/prometheus_remote_client_golang) to Prometheus Remote endpoints. For more information visit the [GitHub repository](https://github.com/m3db/prometheus_remote_client_golang). + +There is also a [Java client](https://github.com/m3dbx/prometheus_remote_client_java) that can be used to make requests to the endpoint. + +Each `-t` parameter specifies a label (dimension) to add to the metric. + +The `-h` parameter can be used as many times as necessary to add headers to the outgoing request in the form of "Header-Name: HeaderValue". + +Here is an example of writing the datapoint at the current unix timestamp with value 123.456: + + +```bash +docker run -it --rm \ + quay.io/m3db/prometheus_remote_client_golang:latest \ + -u http://host.docker.internal:7201/api/v1/prom/remote/write \ + -t __name__:http_requests_total \ + -t code:200 \ + -t handler:graph \ + -t method:get \ + -d $(date +"%s"),123.456 +promremotecli_log 2019/06/25 04:13:56 writing datapoint [2019-06-25 04:13:55 +0000 UTC 123.456] +promremotecli_log 2019/06/25 04:13:56 labelled [[__name__ http_requests_total] [code 200] [handler graph] [method get]] +promremotecli_log 2019/06/25 04:13:56 writing to http://host.docker.internal:7201/api/v1/prom/remote/write +{"success":true,"statusCode":200} +promremotecli_log 2019/06/25 04:13:56 write success + +# If you are paranoid about image tags being hijacked/replaced with nefarious code, you can use this SHA256 tag: +# quay.io/m3db/prometheus_remote_client_golang@sha256:fc56df819bff9a5a087484804acf3a584dd4a78c68900c31a28896ed66ca7e7b +``` + +For more details on querying data in PromQL that was written using this endpoint, see the [query API documentation](../../query_engine/api/). + +## Remote Read + +Read Prometheus metrics from M3. + +### URL + +`/api/v1/prom/remote/read` + +### Method + +`POST` + +### URL Params + +None. + +### Header Params + +#### Optional + +--8<-- +docs/common/headers_optional_read_write.md +--8<-- + +### Data Params + +Binary [snappy compressed](http://google.github.io/snappy/) Prometheus [WriteRequest protobuf message](https://github.com/prometheus/prometheus/blob/10444e8b1dc69ffcddab93f09ba8dfa6a4a2fddb/prompb/remote.proto#L26-L28). diff --git a/docs-beta/content/coordinator/index.md b/docs-beta/content/coordinator/index.md new file mode 100644 index 0000000000..82b592ef2a --- /dev/null +++ b/docs-beta/content/coordinator/index.md @@ -0,0 +1,7 @@ +# M3 Coordinator, API for reading/writing metrics and M3 management + +M3 Coordinator is a service that coordinates reads and writes between upstream systems, such as Prometheus, and downstream systems, such as M3DB. + +It also provides management APIs to setup and configure different parts of M3. + +The coordinator is generally a bridge for read and writing different types of metrics formats and a management layer for M3. diff --git a/docs-beta/content/docs/Dockerfile b/docs-beta/content/docs/Dockerfile new file mode 100644 index 0000000000..95bd225b00 --- /dev/null +++ b/docs-beta/content/docs/Dockerfile @@ -0,0 +1,17 @@ +# Dockerfile for building docs is stored in a separate dir from the docs, +# otherwise the generated site will unnecessarily contain the Dockerfile + +FROM python:3.5-alpine +LABEL maintainer="The M3DB Authors " + +WORKDIR /m3db +EXPOSE 8000 + +# mkdocs needs git-fast-import which was stripped from the default git package +# by default to reduce size +RUN pip install \ + mkdocs==0.17.3 \ + pymdown-extensions==6.0 \ + mkdocs-material==2.7.3 +RUN apk add --no-cache git-fast-import openssh-client +ENTRYPOINT [ "/bin/ash", "-c" ] diff --git a/docs-beta/content/docs/index.md b/docs-beta/content/docs/index.md new file mode 100644 index 0000000000..4343c67b59 --- /dev/null +++ b/docs-beta/content/docs/index.md @@ -0,0 +1,39 @@ +# M3 + +## About + +After using open-source metrics solutions and finding issues with them at scale – such as reliability, cost, and +operational complexity – [M3](https://github.com/m3db/m3) was created from the ground up to provide Uber with a +native, distributed time series database, a highly-dynamic and performant aggregation service, a query engine, and +other supporting infrastructure. + +## Key Features + +M3 has several features, provided as discrete components, which make it an ideal platform for time series data at scale: + +* A distributed time series database, [M3DB](m3db/index.md), that provides scalable storage for time series data and a reverse index. +* A sidecar process, [M3Coordinator](integrations/prometheus.md), that allows M3DB to act as the long-term storage for Prometheus. +* A distributed query engine, [M3Query](query_engine/index.md), with native support for PromQL and Graphite (M3QL coming soon). + +* An aggregation tier, M3Aggregator, that runs as a dedicated metrics aggregator/downsampler allowing metrics to be stored at various retentions at different resolutions. + +## Getting Started + +**Note:** Make sure to read our [Operational Guides](operational_guide/index.md) before running in production! + +Getting started with M3 is as easy as following one of the How-To guides. + +* [Single M3DB node deployment](how_to/single_node.md) +* [Clustered M3DB deployment](how_to/cluster_hard_way.md) +* [M3DB on Kubernetes](how_to/kubernetes.md) +* [Isolated M3Query on deployment](how_to/query.md) + +## Support + +For support with any issues, questions about M3 or its operation, or to leave any comments, the team can be +reached in a variety of ways: + +* [Slack (main chat channel)](http://bit.ly/m3slack) +* [Gitter (old chat channel)](https://gitter.im/m3db/Lobby) +* [Email](https://groups.google.com/forum/#!forum/m3db) +* [Github issues](https://github.com/m3db/m3/issues) diff --git a/docs-beta/content/ecosystem/index.md b/docs-beta/content/ecosystem/index.md new file mode 100644 index 0000000000..e46e912ed8 --- /dev/null +++ b/docs-beta/content/ecosystem/index.md @@ -0,0 +1 @@ +# Ecosystem diff --git a/docs-beta/content/faqs/index.md b/docs-beta/content/faqs/index.md new file mode 100644 index 0000000000..d617421391 --- /dev/null +++ b/docs-beta/content/faqs/index.md @@ -0,0 +1,76 @@ +# FAQs + +- **Is there a way to disable M3DB embedded `etcd` and just use an external `etcd` cluster?** +Yes, you can definitely do that. It's all just about setting the etcd endpoints in config as etcd hosts instead of M3DB hosts. See [these docs](https://m3db.github.io/m3/operational_guide/etcd/#configuring-an-external-etcd-cluster) for more information. + +- **Is there a client that lets me send metrics to m3coordinator without going through Prometheus?** +Yes, you can use the [Prometheus remote write client](https://github.com/m3db/prometheus_remote_client_golang/). + +- **Why does my dbnode keep OOM’ing?** +Refer to the [troubleshooting guide](../troubleshooting/index.md). + +- **Do you support PromQL?** +Yes, M3Query and M3Coordinator both support PromQL. + +- **Do you support Graphite?** +Yes, M3Query and M3Coordinator both support Graphite. + +- **Does M3DB store both data and (tag) metadata on the same node?** +Yes it stores the data (i.e. the timeseries datapoints) as well as the tags since it has an embedded index. Make sure you have `IndexEnabled` set to `true` in your namespace configuration + +- **How are writes handled and how is the data kept consistent within M3DB?** +M3 uses quorum/majority consistency to ensure data is written to replicas in a way that can be read back consistently. +For example, if you have a replication factor of 3 and your set your write and read consistencies to quorum, then all writes will only succeed if they make it to at least 2 of the 3 replicas, and reads will only succeed if they get results back from at least 2 of the 3 replicas + +- **Do I need to restart M3DB if I add a namespace?** +If you’re adding namespaces, the m3dbnode process will pickup the new namespace without a restart. + +- **Do I need to restart M3DB if I change or delete a namespace?** +If you’re removing or modifying an existing namespace, you’ll need to restart the m3dbnode process in order to complete the namespace deletion/modification process. It is recommended to restart one node at a time and wait for a node to be completely bootstrapped before restarting another node. + +- **How do I set up aggregation in the coordinator?** +Refer to the [Aggregation section](../how_to/query.md) of the M3Query how-to guide. + +- **How do I set up aggregation using a separate aggregation tier?** +See this [WIP documentation](https://github.com/m3db/m3/pull/1741/files#diff-0a1009f86783ca8fd4499418e556c6f5). + +- **Can you delete metrics from M3DB?** +Not yet, but that functionality is currently being worked on. + +- **How can you tell if a node is snapshotting?** +You can check if your nodes are snapshotting by looking at the `Background tasks` tab in the [M3DB Grafana dashboard](https://grafana.com/dashboards/8126). + +- **How do you list all available API endpoints?** +See [M3DB openhttps://m3db.io/openapi + +- **What is the recommended way to upgrade my M3 stack?** +TBA + +- **When graphing my Prometheus data in Grafana, I see gaps. How do I resolve this?** +This is due to M3 having a concept of `null` datapoints whereas Prometheus does not. To resolve this, change `Stacking & Null value` to `Connected` under the `Visualization` tab of your graph. + +- **I am receiving the error `"could not create etcd watch","error":"etcd watch create timed out after 10s for key: _sd.placement/default_env/m3db"`** +This is due to the fact that M3DB, M3Coordinator, etc. could not connect to the `etcd` server. Make sure that the endpoints listed under in the following config section are correct AND the correct configuration file is being used. +``` +etcdClusters: + - zone: embedded + endpoints: + - HOST1_STATIC_IP_ADDRESS:2379 + - HOST2_STATIC_IP_ADDRESS:2379 + - HOST3_STATIC_IP_ADDRESS:2379 +``` + +- **How can I get a heap dump, cpu profile, etc.** +See our docs on the [/debug/dump api](../troubleshooting/index.md) + +- **How much memory utilization should I run M3DB at?** +We recommend not going above 50%. + +- **What is the recommended hardware to run on?** +TBA + +- **What is the recommended way to create a new namespace?** +Refer to the [Namespace configuration guide](../operational_guide/namespace_configuration.md). + +- **How can I see the cardinality of my metrics?** +Currently, the best way is to go to the [M3DB Node Details Dashboard](https://grafana.com/grafana/dashboards/8126) and look at the `Ticking` panel. However, this is not entirely accurate because of the way data is stored in M3DB -- time series are stored inside time-based blocks that you configure. In actuality, the `Ticking` graph shows you how many unique series there are for the most recent block that has persisted. In the future, we plan to introduce easier ways to determine the number of unique time series. \ No newline at end of file diff --git a/docs-beta/content/glossary/index.md b/docs-beta/content/glossary/index.md new file mode 100644 index 0000000000..b015e5192a --- /dev/null +++ b/docs-beta/content/glossary/index.md @@ -0,0 +1,43 @@ +# Glossary + +- **Bootstrapping**: Process by which an M3DB node is brought up. Bootstrapping consists of determining +the integrity of data that the node has, replay writes from the commit log, and/or stream missing data +from its peers. + +- **Cardinality**: The number of unique metrics within the M3DB index. Cardinality increases with the +number of unique tag/value combinations that are being emitted. + +- **Datapoint**: A single timestamp/value. Timeseries are composed of multiple datapoints and a series +of tag/value pairs. + +- **Labels**: Pairs of descriptive words that give meaning to a metric. `Tags` and `Labels` are interchangeable terms. + +- **Metric**: A collection of uniquely identifiable tags. + +- **M3**: Highly scalable, distributed metrics platform that is comprised of a native, distributed time +series database, a highly-dynamic and performant aggregation service, a query engine, and other +supporting infrastructure. + +- **M3Coordinator**: A service within M3 that coordinates reads and writes between upstream systems, +such as Prometheus, and downstream systems, such as M3DB. + +- **M3DB**: Distributed time series database influenced by [Gorilla](http://www.vldb.org/pvldb/vol8/p1816-teller.pdf) +and [Cassandra](http://cassandra.apache.org/) released as open source by Uber Technologies. + +- **M3Query**: A distributed query engine for M3DB. Unlike M3Coordinator, M3Query only provides supports for reads. + +- **Namespace**: Similar to a table in other types of databases, namespaces in M3DB have a unique name +and a set of configuration options, such as data retention and block size. + +- **Placement**: Map of the M3DB cluster's shard replicas to nodes. Each M3DB cluster has only one placement. +`Placement` and `Topology` are interchangeable terms. + +- **Shard**: Effectively the same as a "virtual shard" in Cassandra in that it provides an arbitrary +distribution of time series data via a simple hash of the series ID. + +- **Tags**: Pairs of descriptive words that give meaning to a metric. `Tags` and `Labels` are interchangeable terms. + +- **Timeseries**: A series of data points tracking a particular metric over time. + +- **Topology**: Map of the M3DB cluster's shard replicas to nodes. Each M3DB cluster has only one placement. +`Placement` and `Topology` are interchangeable terms. diff --git a/docs-beta/content/how_to/_index.md b/docs-beta/content/how_to/_index.md new file mode 100644 index 0000000000..744973b43e --- /dev/null +++ b/docs-beta/content/how_to/_index.md @@ -0,0 +1,5 @@ +--- +title: "How-To Guides" +date: 2020-03-02T14:11:31-05:00 +# draft: true +--- diff --git a/docs-beta/content/how_to/cluster_architecture.png b/docs-beta/content/how_to/cluster_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..e4af6cedf75a1be352bd5458feb37441881db318 GIT binary patch literal 56976 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%0AykDjn0F3)WVlm!7ekXF*y3# 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 T-0@Fl06y2Rm>S?OJ4gQ)AOMhc literal 0 HcmV?d00001 diff --git a/docs-beta/content/how_to/cluster_hard_way.md b/docs-beta/content/how_to/cluster_hard_way.md new file mode 100644 index 0000000000..b2c89fea73 --- /dev/null +++ b/docs-beta/content/how_to/cluster_hard_way.md @@ -0,0 +1,212 @@ +# M3DB Cluster Deployment, Manually (The Hard Way) + +## Introduction + +This document lists the manual steps involved in deploying a M3DB cluster. In practice, you'd be automating this using Terraform or using Kubernetes rather than doing this by hand; guides for doing so are available under the How-To section. + +## Primer Architecture +A quick primer on M3DB architecture. Here’s what a typical deployment looks like: + +![Typical Deployment](cluster_architecture.png) + +A few different things to highlight about the diagram: + +### Role Type + +There are three ‘role types’ for a m3db deployment - + +- Coordinator: `m3coordinator` serves to coordinate reads and writes across all hosts in the cluster. It’s a lightweight process, and does not store any data. This role would typically be run alongside a Prometheus instance, or be baked into a collector agent. + +- Storage Node: `m3dbnode` processes running on these hosts are the workhorses of the database, they store data; and serve reads and writes. + +- Seed Node: First and foremost, these hosts are storage nodes themselves. In addition to that responsibility, they run an embedded ETCD server. This is to allow the various M3DB processes running across the cluster to reason about the topology/configuration of the cluster in a consistent manner. + +Note: In very large deployments, you’d use a dedicated ETCD cluster, and only use M3DB Storage and Coordinator Nodes + +## Provisioning +Enough background, lets get you going with a real cluster! Provision your host (be it VMs from AWS/GCP/etc) or bare-metal servers in your DC with the latest and greatest flavour of Linux you favor. M3DB works on all popular distributions - Ubuntu/RHEL/CentOS, let us know if you run into issues on another platform and we’ll be happy to assist. + +### Network +If you’re using AWS or GCP it is highly advised to use static IPs so that if you need to replace a host, you don’t have to update your configuration files on all the hosts, you simply decomission the old seed node and provision a new seed node with the same host ID and static IP that the old seed node had. For AWS you can use a [Elastic Network Interface](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html) on a VPC and for GCP you can simply use an [internal static IP address](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address). + +In this example you will be creating three static IP addresses for the three seed nodes. + +Further, we assume you have hostnames configured correctly too. i.e. running `hostname` on a host in the cluster returns the host ID you'll be using when specifying instance host IDs when creating the M3DB cluster placement. E.g. running `hostname` on a node `m3db001` should return it's host ID `m3db001`. + +In GCP the name of your instance when you create it will automatically be it's hostname. When you create an instance click "Management, disks, networking, SSH keys" and under "Networking" click the default interface and click the "Primary internal IP" drop down and select "Reserve a static internal IP address" and give it a name, i.e. `m3db001`, a description that describes it's a seed node IP address and use "Assign automatically". + +In AWS it might be simpler to just use whatever the hostname you get for the provisioned VM as your host ID when specifying M3DB placement. Either that or use the `environment` host ID resolver and pass your host ID when launching the database process with an environment variable. You can set to the host ID and specify the environment variable name in config as `envVarName: M3DB_HOST_ID` if you are using an environment variable named `M3DB_HOST_ID`. + +Relevant config snippet: +``` +hostID: + resolver: environment + envVarName: M3DB_HOST_ID +``` + +Then start your process with: +``` +M3DB_HOST_ID=m3db001 m3dbnode -f config.yml +``` + +### Kernel +Ensure you review our [recommended kernel configuration](../operational_guide/kernel_configuration.md) before running M3DB in production as M3DB may exceed the default limits for some default kernel values. + +## Config files +We wouldn’t feel right to call this guide, “The Hard Way” and not require you to change some configs by hand. + +Note: the steps that follow assume you have the following 3 seed nodes - make necessary adjustment if you have more or are using a dedicated ETCD cluster. Example seed nodes: + +- m3db001 (Region=us-east1, Zone=us-east1-a, Static IP=10.142.0.1) +- m3db002 (Region=us-east1, Zone=us-east1-b, Static IP=10.142.0.2) +- m3db003 (Region=us-east1, Zone=us-east1-c, Static IP=10.142.0.3) + +We’re going to start with the M3DB config template and modify it to work for your cluster. Start by downloading the [config](https://github.com/m3db/m3/blob/master/src/dbnode/config/m3dbnode-cluster-template.yml). Update the config ‘service’ and 'seedNodes' sections to read as follows: + +``` +config: + service: + env: default_env + zone: embedded + service: m3db + cacheDir: /var/lib/m3kv + etcdClusters: + - zone: embedded + endpoints: + - 10.142.0.1:2379 + - 10.142.0.2:2379 + - 10.142.0.3:2379 + seedNodes: + initialCluster: + - hostID: m3db001 + endpoint: http://10.142.0.1:2380 + - hostID: m3db002 + endpoint: http://10.142.0.2:2380 + - hostID: m3db003 + endpoint: http://10.142.0.3:2380 +``` + + +## Start the seed nodes +Transfer the config you just crafted to each host in the cluster. And then starting with the seed nodes, start up the m3dbnode process: + +``` +m3dbnode -f +``` + +Note, remember to daemon-ize this using your favourite utility: systemd/init.d/supervisor/etc + +## Create Namespace and Initialize Topology + +The recommended way to create a namespace and initialize a topology is to use the `/api/v1/database/create` api. Below is an example. + +**Note:** In order to create a more custom setup, please refer to the [namespace configuration](../operational_guide/namespace_configuration.md) and +[placement configuration](../operational_guide/placement_configuration.md) guides, though this is discouraged. + +```json +curl -X POST http://localhost:7201/api/v1/database/create -d '{ + "type": "cluster", + "namespaceName": "1week_namespace", + "retentionTime": "168h", + "numShards": "1024", + "replicationFactor": "3", + "hosts": [ + { + "id": "m3db001", + "isolationGroup": "us-east1-a", + "zone": "embedded", + "weight": 100, + "address": "10.142.0.1", + "port": 9000 + }, + { + "id": "m3db002", + "isolationGroup": "us-east1-b", + "zone": "embedded", + "weight": 100, + "address": "10.142.0.2", + "port": 9000 + }, + { + "id": "m3db003", + "isolationGroup": "us-east1-c", + "zone": "embedded", + "weight": 100, + "address": "10.142.0.3", + "port": 9000 + } + ] +}' +``` + +**Note:** Isolation group specifies how the cluster places shards to avoid more than one replica of a shard appearing in the same replica group. As such you must be using at least as many isolation groups as your replication factor. In this example we use the availibity zones `us-east1-a`, `us-east1-b`, `us-east1-c` as our isolation groups which matches our replication factor of 3. + +Shortly after, you should see your node complete bootstrapping: + +``` +20:10:12.911218[I] updating database namespaces [{adds [default]} {updates []} {removals []}] +20:10:13.462798[I] node tchannelthrift: listening on 0.0.0.0:9000 +20:10:13.463107[I] cluster tchannelthrift: listening on 0.0.0.0:9001 +20:10:13.747173[I] node httpjson: listening on 0.0.0.0:9002 +20:10:13.747506[I] cluster httpjson: listening on 0.0.0.0:9003 +20:10:13.747763[I] bootstrapping shards for range starting ... +... +20:10:13.757834[I] bootstrap finished [{namespace metrics} {duration 10.1261ms}] +20:10:13.758001[I] bootstrapped +20:10:14.764771[I] successfully updated topology to 3 hosts +``` + +If you need to setup multiple namespaces, you can run the above `/api/v1/database/create` command multiple times with different namespace configurations. + +### Replication factor (RF) + +Recommended is RF3, where each replica is spread across failure domains such as a rack, data center or availability zone. See [Replication Factor Recommendations](../operational_guide/replication_and_deployment_in_zones.md) for more specifics. + +### Shards + +See [placement configuration](../operational_guide/placement_configuration.md) to determine the appropriate number of shards to specify. + +## Test it out + +Now you can experiment with writing tagged metrics: + +```json +curl -sS -X POST localhost:9003/writetagged -d '{ + "namespace": "metrics", + "id": "foo", + "tags": [ + { + "name": "city", + "value": "new_york" + }, + { + "name": "endpoint", + "value": "/request" + } + ], + "datapoint": { + "timestamp": '"$(date "+%s")"', + "value": 42.123456789 + } +}' +``` + +And reading the metrics you've written: + +```json +curl -sS -X POST http://localhost:9003/query -d '{ + "namespace": "metrics", + "query": { + "regexp": { + "field": "city", + "regexp": ".*" + } + }, + "rangeStart": 0, + "rangeEnd": '"$(date "+%s")"' +}' | jq . +``` + +## Integrations + +[Prometheus as a long term storage remote read/write endpoint](../integrations/prometheus.md). diff --git a/docs-beta/content/how_to/kubernetes.md b/docs-beta/content/how_to/kubernetes.md new file mode 100644 index 0000000000..43396fc82a --- /dev/null +++ b/docs-beta/content/how_to/kubernetes.md @@ -0,0 +1,302 @@ +# M3DB on Kubernetes + +**Please note:** If possible _[PLEASE USE THE OPERATOR](https://operator.m3db.io/)_ to deploy to Kubernetes if you +can. It is a considerly more streamlined setup. + +The [operator](https://operator.m3db.io/) leverages [custom resource definitions](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) +(CRDs) to automatically handle operations such as managing cluster topology. + +The guide below provides static manifests to bootstrap a cluster on Kubernetes and should be considered +as a guide to running M3 on Kubernetes, if and only if you have significant custom requirements not satisified by +the operator. + +## Prerequisites + +M3DB performs better when it has access to fast disks. Every incoming write is written to a commit log, which at high +volumes of writes can be sensitive to spikes in disk latency. Additionally the random seeks into files when loading cold +files benefit from lower random read latency. + +Because of this, the included manifests reference a +[StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/) named `fast`. Manifests are +provided to provide such a StorageClass on AWS / Azure / GCP using the respective cloud provider's premium disk class. + +If you do not already have a StorageClass named `fast`, create one using one of the provided manifests: +``` +# AWS EBS (class io1) +kubectl apply -f https://raw.githubusercontent.com/m3db/m3/master/kube/storage-fast-aws.yaml + +# Azure premium LRS +kubectl apply -f https://raw.githubusercontent.com/m3db/m3/master/kube/storage-fast-azure.yaml + +# GCE Persistent SSD +kubectl apply -f https://raw.githubusercontent.com/m3db/m3/master/kube/storage-fast-gcp.yaml +``` + +If you wish to use your cloud provider's default remote disk, or another disk class entirely, you'll have to modify them +manifests. + +### Kernel Configuration + +We provide a Kubernetes daemonset that can make setting host-level sysctls easier. Please see the [kernel][kernel] docs +for more. + +Note that our default StatefulSet spec will give the M3DB container `CAP_SYS_RESOURCE` so it may raise its file limits. +Uncomment the `securityContext` on the `m3db` container in the StatefulSet if running with a Pod Security Policy or +similar enforcement mechanism that prevents adding capabilities to containers. + +## Deploying + +Apply the following manifest to create your cluster: +``` +kubectl apply -f https://raw.githubusercontent.com/m3db/m3/master/kube/bundle.yaml +``` + +Applying this bundle will create the following resources: + +1. An `m3db` [Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/) for + all M3DB-related resources. +2. A 3-node etcd cluster in the form of a + [StatefulSet](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/) backed by persistent + remote SSDs. This cluster stores the DB topology and other runtime configuration data. +3. A 3-node M3DB cluster in the form of a StatefulSet. +4. [Headless services](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#services) for + the etcd and m3db StatefulSets to provide stable DNS hostnames per-pod. + +Wait until all created pods are listed as ready: +``` +$ kubectl -n m3db get po +NAME READY STATUS RESTARTS AGE +etcd-0 1/1 Running 0 22m +etcd-1 1/1 Running 0 22m +etcd-2 1/1 Running 0 22m +m3dbnode-0 1/1 Running 0 22m +m3dbnode-1 1/1 Running 0 22m +m3dbnode-2 1/1 Running 0 22m +``` + +You can now proceed to initialize a namespace and placement for the cluster the same as you would for our other how-to +guides: +``` +# Open a local connection to the coordinator service: +$ kubectl -n m3db port-forward svc/m3coordinator 7201 +Forwarding from 127.0.0.1:7201 -> 7201 +Forwarding from [::1]:7201 -> 7201 +``` + +```json +# Create an initial cluster topology +curl -sSf -X POST localhost:7201/api/v1/placement/init -d '{ + "num_shards": 1024, + "replication_factor": 3, + "instances": [ + { + "id": "m3dbnode-0", + "isolation_group": "pod0", + "zone": "embedded", + "weight": 100, + "endpoint": "m3dbnode-0.m3dbnode:9000", + "hostname": "m3dbnode-0.m3dbnode", + "port": 9000 + }, + { + "id": "m3dbnode-1", + "isolation_group": "pod1", + "zone": "embedded", + "weight": 100, + "endpoint": "m3dbnode-1.m3dbnode:9000", + "hostname": "m3dbnode-1.m3dbnode", + "port": 9000 + }, + { + "id": "m3dbnode-2", + "isolation_group": "pod2", + "zone": "embedded", + "weight": 100, + "endpoint": "m3dbnode-2.m3dbnode:9000", + "hostname": "m3dbnode-2.m3dbnode", + "port": 9000 + } + ] +}' +``` + +```json +# Create a namespace to hold your metrics +curl -X POST localhost:7201/api/v1/namespace -d '{ + "name": "default", + "options": { + "bootstrapEnabled": true, + "flushEnabled": true, + "writesToCommitLog": true, + "cleanupEnabled": true, + "snapshotEnabled": true, + "repairEnabled": false, + "retentionOptions": { + "retentionPeriodDuration": "720h", + "blockSizeDuration": "12h", + "bufferFutureDuration": "1h", + "bufferPastDuration": "1h", + "blockDataExpiry": true, + "blockDataExpiryAfterNotAccessPeriodDuration": "5m" + }, + "indexOptions": { + "enabled": true, + "blockSizeDuration": "12h" + } + } +}' +``` + +Shortly after you should see your nodes finish bootstrapping: +``` +$ kubectl -n m3db logs -f m3dbnode-0 +21:36:54.831698[I] cluster database initializing topology +21:36:54.831732[I] cluster database resolving topology +21:37:22.821740[I] resolving namespaces with namespace watch +21:37:22.821813[I] updating database namespaces [{adds [metrics]} {updates []} {removals []}] +21:37:23.008109[I] node tchannelthrift: listening on 0.0.0.0:9000 +21:37:23.008384[I] cluster tchannelthrift: listening on 0.0.0.0:9001 +21:37:23.217090[I] node httpjson: listening on 0.0.0.0:9002 +21:37:23.217240[I] cluster httpjson: listening on 0.0.0.0:9003 +21:37:23.217526[I] bootstrapping shards for range starting [{run bootstrap-data} {bootstrapper filesystem} ... +... +21:37:23.239534[I] bootstrap data fetched now initializing shards with series blocks [{namespace metrics} {numShards 256} {numSeries 0}] +21:37:23.240778[I] bootstrap finished [{namespace metrics} {duration 23.325194ms}] +21:37:23.240856[I] bootstrapped +21:37:29.733025[I] successfully updated topology to 3 hosts +``` + +You can now write and read metrics using the API on the DB nodes: +``` +$ kubectl -n m3db port-forward svc/m3dbnode 9003 +Forwarding from 127.0.0.1:9003 -> 9003 +Forwarding from [::1]:9003 -> 9003 +``` + +```json +curl -sSf -X POST localhost:9003/writetagged -d '{ + "namespace": "default", + "id": "foo", + "tags": [ + { + "name": "city", + "value": "new_york" + }, + { + "name": "endpoint", + "value": "/request" + } + ], + "datapoint": { + "timestamp": '"$(date "+%s")"', + "value": 42.123456789 + } +}' +``` + +```json +$ curl -sSf -X POST http://localhost:9003/query -d '{ + "namespace": "default", + "query": { + "regexp": { + "field": "city", + "regexp": ".*" + } + }, + "rangeStart": 0, + "rangeEnd": '"$(date "+%s")"' +}' | jq . + +{ + "results": [ + { + "id": "foo", + "tags": [ + { + "name": "city", + "value": "new_york" + }, + { + "name": "endpoint", + "value": "/request" + } + ], + "datapoints": [ + { + "timestamp": 1527630053, + "value": 42.123456789 + } + ] + } + ], + "exhaustive": true +} +``` + +### Adding nodes + +You can easily scale your M3DB cluster by scaling the StatefulSet and informing the cluster topology of the change: +``` +kubectl -n m3db scale --replicas=4 statefulset/m3dbnode +``` + +Once the pod is ready you can modify the cluster topology: +``` +kubectl -n m3db port-forward svc/m3coordinator 7201 +Forwarding from 127.0.0.1:7201 -> 7201 +Forwarding from [::1]:7201 -> 7201 +``` + +```json +curl -sSf -X POST localhost:7201/api/v1/placement -d '{ + "instances": [ + { + "id": "m3dbnode-3", + "isolation_group": "pod3", + "zone": "embedded", + "weight": 100, + "endpoint": "m3dbnode-3.m3dbnode:9000", + "hostname": "m3dbnode-3.m3dbnode", + "port": 9000 + } + ] +}' +``` + +## Integrations + +### Prometheus + +As mentioned in our integrations [guide](../integrations/prometheus.md), M3DB can be used as a [remote read/write +endpoint](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#%3Cremote_write%3E) for Prometheus. + +If you run Prometheus on your Kubernetes cluster you can easily point it at M3DB in your Prometheus server config: + +``` +remote_read: + - url: "http://m3coordinator.m3db.svc.cluster.local:7201/api/v1/prom/remote/read" + # To test reading even when local Prometheus has the data + read_recent: true + +remote_write: + - url: "http://m3coordinator.m3db.svc.cluster.local:7201/api/v1/prom/remote/write" + # To differentiate between local and remote storage we will add a storage label + write_relabel_configs: + - target_label: metrics_storage + replacement: m3db_remote +``` + +## Scheduling + +In some cases, you might prefer M3DB to run on certain nodes in your cluster. For example: if your cluster is comprised +of different instance types and some have more memory than others then you'd like M3DB to run on those nodes if +possible. To accommodate this, the pods created by the StatefulSets use [pod +affinities](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/) and +[tolerations](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/) to prefer to run on +certain nodes. Specifically: + +1. The pods tolerate the taint `"dedicated-m3db"` to run on nodes that are specifically dedicated to m3db if you so + choose. +2. Via `nodeAffinity` the pods prefer to run on nodes with the label `m3db.io/dedicated-m3db="true"`. + +[kernel]: ../operational_guide/kernel_configuration.md diff --git a/docs-beta/content/how_to/query.md b/docs-beta/content/how_to/query.md new file mode 100644 index 0000000000..873c017e65 --- /dev/null +++ b/docs-beta/content/how_to/query.md @@ -0,0 +1,92 @@ +# Setting up m3query + +## Introduction + +m3query is used to query data that is stored in M3DB. For instance, if you are using the Prometheus remote write endpoint with [m3coordinator](../integrations/prometheus.md), you can use m3query instead of the Prometheus remote read endpoint. By doing so, you get all of the benefits of m3query's engine such as [block processing](http://m3db.github.io/m3/query_engine/architecture/blocks/). Furthermore, since m3query provides a Prometheus compatible API, you can use 3rd party graphing and alerting solutions like Grafana. + +## Configuration + +Before setting up m3query, make sure that you have at least [one M3DB node running](single_node.md). In order to start m3query, you need to configure a `yaml` file, that will be used to connect to M3DB. Here is a link to a [sample config](https://github.com/m3db/m3/blob/master/src/query/config/m3query-local-etcd.yml) file that is used for an embedded etcd cluster within M3DB. + +### Running + +You can run m3query by either building and running the binary yourself: + +```bash +make m3query +./bin/m3query -f ./src/query/config/m3query-local-etcd.yml +``` + +Or you can run it with Docker using the Docker file located at `$GOPATH/src/github.com/m3db/m3/docker/m3query/Dockerfile`. + +### Namespaces + +All namespaces that you wish to query from must be configured when [setting up M3DB](single_node.md). If you wish to add or change an existing namespace, please follow the namespace operational guide [here](../operational_guide/namespace_configuration.md). + +### etcd + +The configuration file linked above uses an embedded etcd cluster, which is fine for development purposes. However, if you wish to use this in production, you will want an [external etcd](../operational_guide/etcd.md) cluster. + + + +## Aggregation + +You will notice that in the setup linked above, M3DB has just one unaggregated namespace configured. If you want aggregated metrics, you will need to set up an aggregated namespace in M3DB **and** in the m3query configuration. It is important to note that all writes go to all namespaces so as long as you include all namespaces in your query config, you will be querying all namespaces. Aggregation is done strictly by the query service. For example if you have an aggregated namespace setup in M3DB named `metrics_10s_48h`, you can add the following to the query config: + +```yaml +- namespace: metrics_10s_48h + type: aggregated + retention: 48h + resolution: 10s +``` + +### Disabling automatic aggregation + +If you run Statsite, m3agg, or some other aggregation tier, you will want to set the `all` flag under `downsample` to `false`. Otherwise, you will be aggregating metrics that have already been aggregated. + +```yaml +- namespace: metrics_10s_48h + type: aggregated + retention: 48h + resolution: 10s + downsample: + all: false +``` + +## ID generation + +The default generation scheme for IDs, `legacy`, is unfortunately prone to collisions, but remains the default for backwards compatibility reasons. It is suggested to set the ID generation scheme to one of either `quoted` or `prepend_meta`. `quoted` generation scheme yields the most human-readable IDs, whereas `prepend_meta` is better for more compact IDs, or if tags are expected to contain non-ASCII characters. To set the ID generation scheme, add the following to your m3coordinator configuration yaml file: + +```yaml +tagOptions: + idScheme: +``` + +As an example of how these schemes generate IDs, consider a series with the following 4 tags, +`[{"t1":v1}, {t2:"v2"}, {t3:v3}, {t4:v4}]`. The following is an example of how different schemes will generate IDs. + +``` +legacy: "t1"=v1,t2="v2",t3=v3,t4=v4, +prepend_meta: 4,2,2,4,2,2,2,2!"t1"v1t2"v2"t3v3t4v4 +quoted: {\"t1\"="v1",t2="\"v2\"",t3="v3",t4="v4"} +``` + +If there is a chance that your metric tags will contain "control" characters, specifically `,` and `=`, it is highly recommended that one of either the `quoted` or `prepend_meta` schemes are specified, as the `legacy` scheme may cause ID collisions. As a general guideline, we suggest `quoted`, as it mirrors the more familiar Prometheus style IDs. + +We technically have a fourth ID generation scheme that is used for Graphite IDs, but it is exclusive to the Graphite ingestion path and is not selectable as a general scheme. + +**WARNING:** Once a scheme is selected, be very careful about changing it. If changed, all incoming metrics will resolve to a new ID, effectively doubling the metric cardinality until all of the older-style metric IDs fall out of retention. + +### Migration + +We recently updated our ID generation scheme in m3coordinator to avoid the collision issues discussed above. To ease migration, we're temporarily enforcing that an ID generation scheme be explicitly provided in the m3coordinator configuration files. + +If you have been running m3query or m3coordinator already, you may want to counterintuitively select the collision-prone `legacy` scheme, as all the IDs for all of your current metrics would have already been generated with this scheme, and choosing another will effectively double your index size. If the twofold increase in cardinality is an acceptable increase (and unfortunately, this is likely to mean doubled cardinality until your longest retention cluster rotates out), it's suggested to choose a collision-resistant scheme instead. + +An example of a configuration file for a standalone m3query instance with the ID generation scheme can be found [here](https://github.com/m3db/m3/blob/master/scripts/docker-integration-tests/prometheus/m3coordinator.yml). If you're running m3query or m3coordinator embedded, these configuration options should be nested under the `coordinator:` heading, as seen [here](https://github.com/m3db/m3/blob/28fe5e1e430a651a1d66a0a3e22617b6a7f59ec6/src/dbnode/config/m3dbnode-all-config.yml#L33). + +If none of these options work for you, or you would like further clarification, please stop by our [gitter channel](https://gitter.im/m3db/Lobby) and we'll be happy to help you. + +## Grafana + +You can also set up m3query as a [datasource in Grafana](http://docs.grafana.org/features/datasources/prometheus/). To do this, add a new datasource with a type of `Prometheus`. The URL should point to the host/port running m3query. By default, m3query runs on port `7201`. diff --git a/docs-beta/content/how_to/redoc_screenshot.png b/docs-beta/content/how_to/redoc_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..a18f693bc918c1e66bdfa2c4004caef2d8aa4d79 GIT binary patch literal 334063 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 u-0siEAv>lnqw`p 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 tuples. Timestamp resolution can be as granular as individual nanoseconds. + +The `value` portion of the tuple is a Protobuf message that matches the configured namespace schema, which requires that all values in the current time series must also match this schema. This limitation may be lifted in the future. + +### Schema Modeling + +Every M3DB namespace can be configured with a Protobuf-defined schema that every value in the time series must conform to + +For example, continuing with the vehicle fleet tracking example introduced earlier, a schema might look as follows: + +```Protobuf +syntax = "proto3"; + +message VehicleLocation { + double latitude = 1; + double longitude = 2; + double fuel_percent = 3; + string status = 4; +} +``` + +While M3DB strives to support the entire [proto3 language spec](https://developers.google.com/protocol-buffers/docs/proto3), only [the following features are currently supported](https://github.com/m3db/m3/blob/master/src/dbnode/encoding/proto/docs/encoding.md): + +1. [Scalar values](https://developers.google.com/protocol-buffers/docs/proto3#scalar) +2. Nested messages +3. Repeated fields +4. Map fields +5. Reserved fields + +The following features are currently not supported: + +1. `Any` fields +2. [`Oneof` fields](https://developers.google.com/protocol-buffers/docs/proto#oneof) +3. Options of any type +4. Custom field types + +#### Compression + +While M3DB supports schemas that contain nested messages, repeated fields, and map fields, currently it can only effectively compress top level scalar fields. For example, M3DB can compress every field in the following schema: + +```Protobuf +syntax = "proto3"; + +message VehicleLocation { + double latitude = 1; + double longitude = 2; + double fuel_percent = 3; + string status = 4; +} +``` + +however, it will not apply any form of compression to the `attributes` field in this schema: + +```Protobuf +syntax = "proto3"; + +message VehicleLocation { + double latitude = 1; + double longitude = 2; + double fuel_percent = 3; + string status = 4; + map attributes = 5; +} +``` + +While the latter schema is valid, the attributes field will not be compressed; users should weigh the tradeoffs between more expressive schema and better compression for each use case. + +For more details on the compression scheme and its limitations, review [the documentation for M3DB's compressed Protobuf encoding](https://github.com/m3db/m3/blob/master/src/dbnode/encoding/proto/docs/encoding.md). + + +### Getting Started + +#### M3DB setup + +For more advanced setups, it's best to follow the guides on how to configure an M3DB cluster [manually](./cluster_hard_way.md) or [using Kubernetes](./kubernetes.md). However, this tutorial will walk you through configuring a single node setup locally for development. + +First, run the following command to pull the latest M3DB image: + +``` +docker pull quay.io/m3db/m3dbnode:latest +``` + +Next, run the following command to start the M3DB container: + +``` +docker run -p 7201:7201 -p 7203:7203 -p 9000:9000 -p 9001:9001 -p 9002:9002 -p 9003:9003 -p 9004:9004 -p 2379:2379 --name m3db -v $(pwd)/m3db_data:/var/lib/m3db -v $(pwd)/src/dbnode/config/m3dbnode-local-etcd-proto.yml:/etc/m3dbnode/m3dbnode.yml -v :/etc/m3dbnode/default_schema.proto quay.io/m3db/m3dbnode:latest +``` + +Breaking that down: + +- All the `-p` flags expose the necessary ports. +- The `-v $(pwd)/m3db_data:/var/lib/m3db` section creates a bind mount that enables M3DB to persist data between container restarts. +- The `-v :/etc/m3dbnode/m3dbnode.yml` section mounts the specified configuration file in the container which allows configuration changes by restarting the container (rather than rebuilding it). [This example file](https://github.com/m3db/m3/blob/master/src/dbnode/config/m3dbnode-local-etcd-proto.yml) can be used as a good starting point. It configures the database to have the Protobuf feature enabled and expects one namespace with the name `default` and a Protobuf message name of `VehicleLocation` for the schema. You'll need to update that portion of the config if you intend to use a different schema than the example one used throughout this document. Note that hard-coding paths to the schema should only be done for local development and testing. For production use-cases, M3DB supports storing the current schema in `etcd` so that it can be update dynamically. TODO(rartoul): Document how to do that as well as what kind of schema changes are safe / backwards compatible. +- The `-v :/etc/m3dbnode/default_schema.proto` section mounts the Protobuf file containing the schema in the container, similar to the configuration file this allows the schema to be changed by restarting the container instead of rebuilding it. You can use [this example schema](https://github.com/m3db/m3/tree/master/examples/dbnode/proto_client/schema.proto) as a starting point. Is is also the same example schema that is used by the sample Go program discussed below in the "Clients" section. Also see the bullet point above about not hard coding schema files in production. + +Once the M3DB container has started, issue the following CURL statement to create the `default` namespace: + +``` +curl -X POST http://localhost:7201/api/v1/database/create -d '{ + "type": "local", + "namespaceName": "default", + "retentionTime": "4h" +}' +``` + +Note that the `retentionTime` is set artificially low to conserve resources. + +After a few moments, the M3DB container should finish bootstrapping. At this point it should be ready to serve write and read queries. + +#### Clients + +Note: M3DB only has a Go client; this is unlikely to change in the future due to the fact that the client is "fat" and contains a substantial amount of logic that would be difficult to port to other languages. + +Users interested in interacting with M3DB directly from Go applications can reference [this runnable example](https://github.com/m3db/m3/tree/master/examples/dbnode/proto_client) to get an understanding of how to interact with M3DB in Go. Note that the example above uses the same `default` namespace and `VehicleLocation` schema used throughout this document so it can be run directly against an M3DB docker container setup using the "M3DB setup" instructions above. + +M3DB will eventually support other languages by exposing an `M3Coordinator` endpoint which will allow users to write/read from M3DB directly using GRPC/JSON. \ No newline at end of file diff --git a/docs-beta/content/integrations/_index.md b/docs-beta/content/integrations/_index.md new file mode 100644 index 0000000000..99989b4256 --- /dev/null +++ b/docs-beta/content/integrations/_index.md @@ -0,0 +1,5 @@ +--- +title: "Integrations" +date: 2020-03-02T14:11:31-05:00 +# draft: true +--- diff --git a/docs-beta/content/integrations/grafana.md b/docs-beta/content/integrations/grafana.md new file mode 100644 index 0000000000..ce65eb6df1 --- /dev/null +++ b/docs-beta/content/integrations/grafana.md @@ -0,0 +1,24 @@ +--- +title: "Grafana" +date: 2020-03-02T14:11:31-05:00 +# draft: true +--- + + + + +M3 supports a variety of Grafana integrations. + +## Prometheus / Graphite Sources + +M3Coordinator can function as a datasource for Prometheus as well as Graphite. See the [Prometheus integration](./prometheus.md) and [Graphite integration](./graphite.md) documents respectively for more information. + +## Pre-configured Prometheus Dashboards + +All M3 applications expose Prometheus metrics on port `7203` by default as described in the [Prometheus integration guide](./prometheus.md), so if you're already monitoring your M3 stack with Prometheus and Grafana you can use our pre-configured dashboards. + +[M3DB Prometheus / Grafana dashboard](https://grafana.com/dashboards/8126) + +M3Coordinator Prometheus / Grafana dashboard: TODO + +Alternatively, you can obtain the JSON for our most up-to-date dashboards from our [git repo](https://github.com/m3db/m3/blob/master/integrations/grafana) directly. \ No newline at end of file diff --git a/docs-beta/content/integrations/graphite.md b/docs-beta/content/integrations/graphite.md new file mode 100644 index 0000000000..ed62e2279d --- /dev/null +++ b/docs-beta/content/integrations/graphite.md @@ -0,0 +1,163 @@ +--- +title: "Graphite" +date: 2020-03-02T14:11:31-05:00 +# draft: true +--- + + +This document is a getting started guide to integrating the M3 stack with Graphite. + +## Overview + +M3 supports ingesting Graphite metrics using the [Carbon plaintext protocol](https://graphite.readthedocs.io/en/latest/feeding-carbon.html#the-plaintext-protocol). We also support a variety of aggregation and storage policies for the ingestion pathway (similar to [storage-schemas.conf](https://graphite.readthedocs.io/en/latest/config-carbon.html#storage-schemas-conf) when using Graphite Carbon) that are documented below. Finally, on the query side, we support the majority of [graphite query functions](https://graphite.readthedocs.io/en/latest/functions.html). + +## Ingestion + +Setting up the M3 stack to ingest carbon metrics is straightforward. First, make sure you've followed our [other documentation](../how_to/single_node.md) to get m3coordinator and M3DB setup. Also, familiarize yourself with how M3 [handles aggregation](../how_to/query.md). + +Once you have both of those services running properly, modify your m3coordinator configuration to add the following lines and restart it: + +```yaml +carbon: + ingester: + listenAddress: "0.0.0.0:7204" +``` + +This will enable a line-based TCP carbon ingestion server on the specified port. By default, the server will write all carbon metrics to every aggregated namespace specified in the m3coordinator [configuration file](../how_to/query.md) and aggregate them using a default strategy of `mean` (equivalent to Graphite's `Average`). + +This default setup makes sense if your carbon metrics are unaggregated, however, if you've already aggregated your data using something like [statsite](https://github.com/statsite/statsite) then you may want to disable M3 aggregation. In that case, you can do something like the following: + +```yaml +carbon: + ingester: + listenAddress: "0.0.0.0:7204" + rules: + - pattern: .* + aggregation: + enabled: false + policies: + - resolution: 1m + retention: 48h +``` + +This replaces M3's default behavior with a single rule which states that all metrics (since `.*` will match any string) should be written to whichever aggregated M3DB namespace has been configured with a resolution of `1 minute` and a retention of `48 hours`, bypassing aggregation / downsampling altogether. Note that there *must* be a configured M3DB namespace with the specified resolution/retention or the coordinator will fail to start. + +In the situation that you choose to use M3's aggregation functionality, there are a variety of aggregation types you can choose from. For example: + +```yaml +carbon: + ingester: + listenAddress: "0.0.0.0:7204" + rules: + - pattern: .* + aggregation: + type: last + policies: + - resolution: 1m + retention: 48h +``` + +The config above will aggregate ingested carbon metrics into `1 minute` tiles, but instead of taking the `mean` of every datapoint, it will emit the `last` datapoint that was received within a given tile's window. + +Similar to Graphite's [storage-schemas.conf](https://graphite.readthedocs.io/en/latest/config-carbon.html#storage-schemas-conf), M3 carbon ingestion rules are applied in order and only the first pattern that matches is applied. In addition, the rules can be as simple or as complex as you like. For example: + +```yaml +carbon: + ingester: + listenAddress: "0.0.0.0:7204" + rules: + - pattern: stats.internal.financial-service.* + aggregation: + type: max + policies: + - resolution: 1m + retention: 4320h + - resolution: 10s + retention: 24h + - pattern: stats.internal.rest-proxy.* + aggregation: + type: mean + policies: + - resolution: 10s + retention: 2h + - pattern: stats.cloud.* + aggregation: + enabled: false + policies: + - resolution: 1m + retention: 2h + - pattern: .* + aggregation: + type: mean + policies: + - resolution: 1m + retention: 48h +``` + +Lets break that down. + +The first rule states that any metric matching the pattern `stats.internal.financial-service.*` should be aggregated using the `max` function (meaning the datapoint with the highest value that is received in a given window will be retained) to generate two different tiles, one with `1 minute` resolution and another with `10 second` resolution which will be written out to M3DB namespaces with `4320 hour` and `24 hour` retentions respectively. + +The second rule will aggregate all the metrics coming from our `rest-proxy` service using a `mean` type aggregation (all datapoints within a given window will be averaged) to generate `10 second` tiles and write them out to an M3DB namespace that stores data for `two hours`. + +The third will match any metrics coming from our cloud environment. In this hypoethical example, our cloud metrics are already aggregated using an application like [statsite](https://github.com/statsite/statsite), so instead of aggregating them again, we just write them directly to an M3DB namespace that retains data for `two hours`. Note that while we're not aggregating the data in M3 here, we still need to provide a resolution so that the ingester can match the storage policy to a known M3DB namespace, as well as so that when we fan out queries to multiple namespaces we know the resolution of the data contained in each namespace. + +Finally, our last rule uses a "catch-all" pattern to capture any metrics that don't match any of our other rules and aggregate them using the `mean` function into `1 minute` tiles which we store for `48 hours`. + +### Debug mode + +If at any time you're not sure which metrics are being matched by which patterns, or want more visibility into how the carbon ingestion rule are being evaluated, modify the config to enable debug mode: + +```yaml +carbon: + ingester: + debug: true + listenAddress: "0.0.0.0:7204" +``` + +This will make the carbon ingestion emit logs for every step that is taking. *Note*: If your coordinator is ingesting a lot of data, enabling this mode could bring the proccess to a halt due to the I/O overhead, so use this feature cautiously in production environments. + +### Supported Aggregation Functions + +- last +- min +- max +- mean +- median +- count +- sum +- sumsq +- stdev +- p10 +- p20 +- p30 +- p40 +- p50 +- p60 +- p70 +- p80 +- p90 +- p95 +- p99 +- p999 +- p9999 + +## Querying + +M3 supports the the majority of [graphite query functions](https://graphite.readthedocs.io/en/latest/functions.html) and can be used to query metrics that were ingested via the ingestion pathway described above. + +### Grafana + +`M3Coordinator` implements the Graphite source interface, so you can add it as a `graphite` source in Grafana by following [these instructions.](http://docs.grafana.org/features/datasources/graphite/) + +Note that you'll need to set the URL to: `http://:7201/api/v1/graphite` + +### Direct + +You can query for metrics directly by issuing HTTP GET requests directly against the `M3Coordinator` `/api/v1/graphite/render` endpoint which runs on port `7201` by default. For example: + +```bash +(export now=$(date +%s) && curl "localhost:7201/api/v1/graphite/render?target=transformNull(foo.*.baz)&from=$(($now-300))" | jq .) +``` + +will query for all metrics matching the `foo.*.baz` pattern, applying the `transformNull` function, and returning all datapoints for the last 5 minutes. \ No newline at end of file diff --git a/docs-beta/content/integrations/prometheus.md b/docs-beta/content/integrations/prometheus.md new file mode 100644 index 0000000000..9b4e3e4886 --- /dev/null +++ b/docs-beta/content/integrations/prometheus.md @@ -0,0 +1,128 @@ +--- +title: "Prometheus" +date: 2020-03-02T14:11:31-05:00 +# draft: true +--- + +This document is a getting started guide to integrating M3DB with Prometheus. + +## M3 Coordinator configuration + +To write to a remote M3DB cluster the simplest configuration is to run `m3coordinator` as a sidecar alongside Prometheus. + +Start by downloading the [config template](https://github.com/m3db/m3/blob/master/src/query/config/m3coordinator-cluster-template.yml). Update the `namespaces` and the `client` section for a new cluster to match your cluster's configuration. + +You'll need to specify the static IPs or hostnames of your M3DB seed nodes, and the name and retention values of the namespace you set up. You can leave the namespace storage metrics type as `unaggregated` since it's required by default to have a cluster that receives all Prometheus metrics unaggregated. In the future you might also want to aggregate and downsample metrics for longer retention, and you can come back and update the config once you've setup those clusters. You can read more about our aggregation functionality [here](../how_to/query.md). + +It should look something like: + +``` +listenAddress: + type: "config" + value: "0.0.0.0:7201" + +logging: + level: info + +metrics: + scope: + prefix: "coordinator" + prometheus: + handlerPath: /metrics + listenAddress: 0.0.0.0:7203 # until https://github.com/m3db/m3/issues/682 is resolved + sanitization: prometheus + samplingRate: 1.0 + extended: none + +tagOptions: + idScheme: quoted + +clusters: + - namespaces: +# We created a namespace called "default" and had set it to retention "48h". + - namespace: default + retention: 48h + type: unaggregated + client: + config: + service: + env: default_env + zone: embedded + service: m3db + cacheDir: /var/lib/m3kv + etcdClusters: + - zone: embedded + endpoints: +# We have five M3DB nodes but only three are seed nodes, they are listed here. + - M3DB_NODE_01_STATIC_IP_ADDRESS:2379 + - M3DB_NODE_02_STATIC_IP_ADDRESS:2379 + - M3DB_NODE_03_STATIC_IP_ADDRESS:2379 + writeConsistencyLevel: majority + readConsistencyLevel: unstrict_majority + writeTimeout: 10s + fetchTimeout: 15s + connectTimeout: 20s + writeRetry: + initialBackoff: 500ms + backoffFactor: 3 + maxRetries: 2 + jitter: true + fetchRetry: + initialBackoff: 500ms + backoffFactor: 2 + maxRetries: 3 + jitter: true + backgroundHealthCheckFailLimit: 4 + backgroundHealthCheckFailThrottleFactor: 0.5 + +``` + +Now start the process up: + +``` +m3coordinator -f +``` + +Or, use the docker container: + +``` +docker pull quay.io/m3db/m3coordinator:latest +docker run -p 7201:7201 --name m3coordinator -v :/etc/m3coordinator/m3coordinator.yml quay.io/m3db/m3coordinator:latest +``` + +## Prometheus configuration + +Add to your Prometheus configuration the `m3coordinator` sidecar remote read/write endpoints, something like: + +``` +remote_read: + - url: "http://localhost:7201/api/v1/prom/remote/read" + # To test reading even when local Prometheus has the data + read_recent: true +remote_write: + - url: "http://localhost:7201/api/v1/prom/remote/write" +``` + +Also, we recommend adding `M3DB` and `M3Coordinator`/`M3Query` to your list of jobs under `scrape_configs` so that you can monitor them using Prometheus. With this scraping setup, you can also use our pre-configured [M3DB Grafana dashboard](https://grafana.com/dashboards/8126). + +```json +- job_name: 'm3db' + static_configs: + - targets: [':7203', ':7203', ':7203'] +- job_name: 'm3coordinator' + static_configs: + - targets: [':7203'] +``` + +**NOTE:** If you are running `M3DB` with embedded `M3Coordinator`, you should only have one job. We recommend just calling this job `m3`. For example: + +```json +- job_name: 'm3' + static_configs: + - targets: [':7203'] +``` +## Querying With Grafana + +When using the Prometheus integration with Grafana, there are two different ways you can query for your metrics. The first option is to configure Grafana to query Prometheus directly by following [these instructions.](http://docs.grafana.org/features/datasources/prometheus/) + +Alternatively, you can configure Grafana to read metrics directly from `M3Coordinator` in which case you will bypass Prometheus entirely and use M3's `PromQL` engine instead. To set this up, follow the same instructions from the previous step, but set the `url` to: `http://:7201`. diff --git a/docs-beta/content/m3db/architecture/caching.md b/docs-beta/content/m3db/architecture/caching.md new file mode 100644 index 0000000000..258deabead --- /dev/null +++ b/docs-beta/content/m3db/architecture/caching.md @@ -0,0 +1,25 @@ +# Caching policies + +## Overview + +Blocks that are still being actively compressed / M3TSZ encoded must be kept in memory until they are sealed and flushed to disk. Blocks that have already been sealed, however, don't need to remain in-memory. In order to support efficient reads, M3DB implements various caching policies which determine which flushed blocks are kept in memory, and which are not. The "cache" itself is not a separate datastructure in memory, cached blocks are simply stored in their respective [in-memory objects](engine.md#in-memory-object-layout) with various different mechanisms (depending on the chosen cache policy) determining which series / blocks are evicted and which are retained. + +For general purpose workloads, the `lru` caching policy is reccommended. + +## None Cache Policy + +The `none` cache policy is the simplest. As soon as a block is sealed, its flushed to disk and never retained in memory again. This cache policy will have the lowest memory consumption, but also the poorest read performance as every read for a block that is already flushed will require a disk read. + +## All Cache Policy + +The `all` cache policy is the opposite of the `none` cache policy. All blocks are kept in memory until their retention period is over. This policy can be useful for read-heavy workloads with small datasets, but is obviously limited by the amount of memory on the host machine. Also keep in mind that this cache policy may have unintended side-effects on write throughput as keeping every block in memory creates a lot of work for the Golang garbage collector. + +## Recently Read Cache Policy + +The `recently_read` cache policy keeps all blocks that are read from disk in memory for a configurable duration of time. For example, if the `recently_read` cache policy is set with a duration of 10 minutes, then everytime a block is read from disk it will be kept in memory for at least 10 minutes. This policy can be very effective if only a small portion of your overall dataset is ever read, and especially if that subset is read frequently (i.e as is common in the case of database backing an automatic alerting system), but it can cause very high memory usage during workloads that involve sequentially scanning all of the data. + +Data eviction from memory is triggered by the "ticking" process described in the [background processes section](engine.md#background-processes) + +## Least Recently Used (LRU) Cache Policy + +The `lru` cache policy uses an `lru` list with a configurable max size to keep track of which blocks have been read least recently, and evicts those blocks first when the capacity of the list is full and a new block needs to be read from disk. This cache policy strikes the best overall balance and is the recommended policy for general case workloads. Review the comments in `wired_list.go` for implementation details. diff --git a/docs-beta/content/m3db/architecture/commitlogs.md b/docs-beta/content/m3db/architecture/commitlogs.md new file mode 100644 index 0000000000..92a68497ce --- /dev/null +++ b/docs-beta/content/m3db/architecture/commitlogs.md @@ -0,0 +1,58 @@ +# Commit Logs And Snapshot Files + +## Overview + +M3DB has a commit log that is equivalent to the commit log or write-ahead-log in other databases. The commit logs are completely uncompressed (no M3TSZ encoding), and there is one per database (multiple namespaces in a single process will share a commit log.) + +## Integrity Levels + +There are two integrity levels available for commit logs: + +- **Synchronous:** write operations must wait until it has finished writing an entry in the commit log to complete. +- **Behind:** write operations must finish enqueueing an entry to the commit log write queue to complete. + +Depending on the data loss requirements users can choose either integrity level. + +### Properties + +Commit logs will be stamped by the start time, aligned and rotated by a configured time window size. To restore data for an entire block you will require the commit logs from all time commit logs that overlap the block size with buffer past subtracted from the bootstrap start range and buffer future extended onto the bootstrap end range. + +### Structure + +Commit logs for a given time window are kept in a single file. An info structure keeping metadata is written to the header of the file and all consequent entries are a repeated log structure, optionally containing metadata describing the series if it's the first time a log entry for a given series appears. + +The structures can be conceptually described as: + +``` +CommitLogInfo { + start int64 + duration int64 + index int64 +} + +CommitLog { + created int64 + index uint64 + metadata bytes + timestamp int64 + value float64 + unit uint32 + annotation bytes +} + +CommitLogMetadata { + id bytes + namespace bytes + shard uint32 +} +``` + +### Compaction / Snapshotting + +Commit log files are compacted via the snapshotting proccess which (if enabled at the namespace level) will snapshot all data in memory into compressed files which have the same structure as the [fileset files](storage.md) but are stored in a different location. Once these snapshot files are created, then all the commit log files whose data are captured by the snapshot files can be deleted. This can result in significant disk savings for M3DB nodes running with large block sizes and high write volume where the size of the (uncompressed) commit logs can quickly get out of hand. + +In addition, since the snapshot files are already compressed, bootstrapping from them is much faster than bootstrapping from raw commit log files because the individual data points don't need to be decoded and then M3TSZ encoded. The M3DB node just needs to read the raw bytes off disk and load them into memory. + +### Cleanup + +Commit log files are automatically deleted once all the data they contain has been flushed to disk as immutable compressed filesets *or* all the data they contain has been captured by a compressed snapshot file. Similarly, snapshot files are deleted once all the data they contain has been flushed to disk as filesets. \ No newline at end of file diff --git a/docs-beta/content/m3db/architecture/consistencylevels.md b/docs-beta/content/m3db/architecture/consistencylevels.md new file mode 100644 index 0000000000..d66e2099c0 --- /dev/null +++ b/docs-beta/content/m3db/architecture/consistencylevels.md @@ -0,0 +1,38 @@ +# Consistency Levels + +M3DB provides variable consistency levels for read and write operations, as well as cluster connection operations. These consistency levels are handled at the client level. + +## Write consistency levels + +* **One:** Corresponds to a single node succeeding for an operation to succeed. + +* **Majority:** Corresponds to the majority of nodes succeeding for an operation to succeed. + +* **All:** Corresponds to all nodes succeeding for an operation to succeed. + +## Read consistency levels + +* **One**: Corresponds to reading from a single node to designate success. + +* **UnstrictMajority**: Corresponds to reading from the majority of nodes but relaxing the constraint when it cannot be met, falling back to returning success when reading from at least a single node after attempting reading from the majority of nodes. + +* **Majority**: Corresponds to reading from the majority of nodes to designate success. + +* **All:** Corresponds to reading from all of the nodes to designate success. + +## Connect consistency levels + +Connect consistency levels are used to determine when a client session is deemed as connected before operations can be attempted. + +* **Any:** Corresponds to connecting to any number of nodes for all shards, this strategy will attempt to connect to all, then the majority, then one and then fallback to none and as such will always succeed. + +* **None:** Corresponds to connecting to no nodes for all shards and as such will always succeed. + +* **One:** Corresponds to connecting to a single node for all shards. + + +* **Majority:** Corresponds to connecting to the majority of nodes for all shards. + + +* **All:** Corresponds to connecting to all of the nodes for all shards. + diff --git a/docs-beta/content/m3db/architecture/engine.md b/docs-beta/content/m3db/architecture/engine.md new file mode 100644 index 0000000000..d4727b32ad --- /dev/null +++ b/docs-beta/content/m3db/architecture/engine.md @@ -0,0 +1,256 @@ +# Storage Engine Overview + +M3DB is a time series database that was primarily designed to be horizontally scalable and able to handle high data throughput. + +## Time Series Compression + +One of M3DB's biggest strengths as a time series database (as opposed to using a more general-purpose horizontally scalable, distributed database like Cassandra) is its ability to compress time series data resulting in huge memory and disk savings. There are two compression algorithms used in M3DB: M3TSZ and protobuf encoding. + +### M3TSZ + +M3TSZ is used when values are floats. A variant of the streaming time series compression algorithm described in [Facebook's Gorilla paper](http://www.vldb.org/pvldb/vol8/p1816-teller.pdf), it achieves a high compression ratio. The compression ratio will vary depending on the workload and configuration, but we found that we were able to achieve a compression ratio of 1.45 bytes/datapoint with Uber's production workloads. This was a 40% improvement over standard TSZ, which only gave us a compression ratio of 2.42 bytes/datapoint under the same conditions. + +### Protobuf Encoding + +For more complex value types, M3DB also supports generic Protobuf messages with [a few exceptions](https://github.com/m3db/m3/blob/master/src/dbnode/encoding/proto/docs/encoding.md#supported-syntax). The algorithm takes on a hybrid approach and uses different compression schemes depending on the field types within the Protobuf message. + +Details on the encoding, marshaling and unmarshaling methods can be read [here](https://github.com/m3db/m3/tree/master/src/dbnode/encoding/proto). + +## Architecture + +M3DB is a persistent database with durable storage, but it is best understood via the boundary between its in-memory object layout and on-disk representations. + +### In-Memory Object Layout + +``` + ┌────────────────────────────────────────────────────────────┐ + │ Database │ + ├────────────────────────────────────────────────────────────┤ + │ │ + │ ┌────────────────────────────────────────────────────┐ │ + │ │ Namespaces │ │ + │ ├────────────────────────────────────────────────────┤ │ + │ │ │ │ + │ │ ┌────────────────────────────────────────────┐ │ │ + │ │ │ Shards │ │ │ + │ │ ├────────────────────────────────────────────┤ │ │ + │ │ │ │ │ │ + │ │ │ ┌────────────────────────────────────┐ │ │ │ + │ │ │ │ Series │ │ │ │ + │ │ │ ├────────────────────────────────────┤ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ ┌────────────────────────────┐ │ │ │ │ + │ │ │ │ │ Buffer │ │ │ │ │ + │ │ │ │ └────────────────────────────┘ │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ ┌────────────────────────────┐ │ │ │ │ + │ │ │ │ │ Cached blocks │ │ │ │ │ + │ │ │ │ └────────────────────────────┘ │ │ │ │ + │ │ │ │ ... │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ └────────────────────────────────────┘ │ │ │ + │ │ │ ... │ │ │ + │ │ │ │ │ │ + │ │ └────────────────────────────────────────────┘ │ │ + │ │ ... │ │ + │ │ │ │ + │ └────────────────────────────────────────────────────┘ │ + │ ... │ + │ │ + └────────────────────────────────────────────────────────────┘ +``` + +The in-memory portion of M3DB is implemented via a hierarchy of objects: + +1. A `database` of which there is only one per M3DB process. The `database` owns multiple `namespace`s. + +2. A `namespace` is similar to a table in other databases. Each `namespace` has a unique name and a set of configuration options, such as data retention and block size (which we will discuss in more detail later). A namespace owns multiple `shard`s. + +3. A [`shard`](sharding.md) is effectively the same as a "virtual shard" in Cassandra in that it provides an arbitrary distribution of time series data via a simple hash of the series ID. A shard owns multiple `series`. + +4. A `series` represents a sequence of time series datapoints. For example, the CPU utilization for a host could be represented as a series with the ID "host1.system.cpu.utilization" and a vector of (TIMESTAMP, CPU_LEVEL) tuples. Visualizing this example in a graph, there would a single line with time on the x-axis and CPU utilization on the y-axis. A `series` owns a `buffer` and any cached `block`s. + +5. The `buffer` is where all data that has yet to be written to disk gets stored in memory. This includes both new writes to M3DB and data obtained through bootstrapping. More details on the [buffer](engine.md#buffer) is explained below. Upon [flushing](engine.md#flushing), the buffer creates a `block` of its data to be persisted to disk. + +6. A `block` represents a stream of compressed time series data for a pre-configured block size, for example, a block could hold data for 6-8PM (block size of two hours). A `block` can arrive directly into the series only as a result of getting cached after a read request. Since blocks are in a compressed format, individual datapoints cannot be read from it. In other words, in order to read a single datapoint, the entire block up to that datapoint needs to be decompressed beforehand. + +### Persistent storage + +While in-memory databases can be useful (and M3DB supports operating in a memory-only mode), some form of persistence is required for durability. In other words, without a persistence strategy, it would be impossible for M3DB to restart (or recover from a crash) without losing all of its data. + +In addition, with large volumes of data, it becomes prohibitively expensive to keep all of the data in memory. This is especially true for monitoring workloads which often follow a "write-once, read-never" pattern where less than a few percent of all the data that's stored is ever read. With that type of workload, it's wasteful to keep all of that data in memory when it could be persisted on disk and retrieved when required. + +M3DB takes a two-pronged approach to persistant storage that involves combining a [commit log](commitlogs.md) for disaster recovery with periodic flushing (writing [fileset files](storage.md) to disk) for efficient retrieval: + +1. All writes are persisted to a commit log (the commit log can be configured to fsync every write, or optionally batch writes together which is much faster but leaves open the possibility of small amounts of data loss in the case of a catastrophic failure). The commit log is completely uncompressed and exists only to recover unflushed data in the case of a database shutdown (intentional or not) and is never used to satisfy a read request. +2. Periodically (based on the configured block size), all data in the buffer is flushed to disk as immutable [fileset files](storage.md). These files are highly compressed and can be indexed into via their complementary index files. Check out the [flushing section](engine.md#flushing) to learn more about the background flushing process. + +The block size parameter is the most important variable that needs to be tuned for a particular workload. A small block size will mean more frequent flushing and a smaller memory footprint for the data that is being actively compressed, but it will also reduce the compression ratio and data will take up more space on disk. + +If the database is stopped for any reason in between flushes, then when the node is started back up those writes will be recovered by reading the commit log or streaming in the data from a peer responsible for the same shard (if the replication factor is larger than one). + +While the fileset files are designed to support efficient data retrieval via the series ID, there is still a heavy cost associated with any query that has to retrieve data from disk because going to disk is always much slower than accessing main memory. To compensate for that, M3DB supports various [caching policies](caching.md) which can significantly improve the performance of reads by caching data in memory. + +## Write Path + +We now have enough context of M3DB's architecture to discuss the lifecycle of a write. A write begins when an M3DB client calls the [`writeBatchRaw`](https://github.com/m3db/m3/blob/06d3ecc94d13cff67b82a791271816caa338dcab/src/dbnode/generated/thrift/rpc.thrift#L59) endpoint on M3DB's embedded thrift server. The write itself will contain the following information: + +1. The namespace +2. The series ID (byte blob) +3. The timestamp +4. The value itself + +M3DB will consult the database object to check if the namespace exists, and if it does, then it will hash the series ID to determine which shard it belongs to. If the node receiving the write owns that shard, then it will lookup the series in the shard object. If the series exists, then an encoder in the buffer will encode the datapoint into the compressed stream. If the encoder doesn't exist (no writes for this series have occurred yet as part of this block) then a new encoder will be allocated and it will begin a compressed M3TSZ stream with that datapoint. There is also some additional logic for handling multiple encoders and filesets which is discussed in the [buffer](engine.md#buffer) section. + +At the same time, the write will be appended to the commit log, which is periodically compacted via a snapshot process. Details of this is outlined in the [commit log](commitlogs.md) page. + +**Note:** Regardless of the success or failure of the write in a single node, the client will return a success or failure to the caller for the write based on the configured [consistency level](consistencylevels.md). + +## Read Path + +A read begins when an M3DB client calls the [`FetchBatchResult`](https://github.com/m3db/m3/blob/master/src/dbnode/generated/thrift/rpc.thrift) or [`FetchBlocksRawResult`](https://github.com/m3db/m3/blob/master/src/dbnode/generated/thrift/rpc.thrift) endpoint on M3DB's embedded thrift server. The read request will contain the following information: + +1. The namespace +2. The series ID (byte blob) +3. The period of time being requested (start and end) + +M3DB will consult the database object to check if the namespace exists, and if it does, it will hash the series ID to determine which shard it belongs to. If the node receiving the read owns that shard, then M3DB needs to determine two things: + +1. Whether the series exists and if it does, +2. Whether the data exists in the buffer, cached in-memory, on disk, or some combination of all three. + +Determining whether the series exists is simple. M3DB looks up the series in the shard object. If it exists, then the series exists. If it doesn't, then M3DB consults in-memory bloom filters(s) for all shard/block start combinations(s) that overlap the query range to determine if the series exists on disk. + +If the series exists, then for every block that the request spans, M3DB needs to consolidate data from the buffer, in-memory cache, and fileset files (disk). + +Let's imagine a read for a given series that requests the last 6 hours worth of data, and an M3DB namespace that is configured with a block size of 2 hours, i.e. we need to find 3 different blocks. + +If the current time is 8PM, then the location of the requested blocks might be as follows: + +``` +[2PM - 4PM (fileset file)] - Flushed block that isn't cached +[4PM - 6PM (in-memory cache)] - Flushed block that is cached +[4PM - 6PM (cold write in active buffer)] - Cold write that hasn't been flushed yet +[6PM - 8PM (active buffer)] - Hasn't been flushed yet +``` + +Then M3DB will need to consolidate: + +1. The not-yet-sealed block from the buffer (located inside an internal lookup in the Series object) **[6PM - 8PM]** +2. The in-memory cached block (also located inside an internal lookup in the Series object). Since there are also cold writes in this block, the cold writes will be consolidated in memory with data found in the cached block before returning. **[4PM - 6PM]** +3. The block from disk (the block will be retrieved from disk and will then be cached according to the current [caching policy](caching.md)) **[2PM - 4PM]** + +Retrieving blocks from the buffer and in-memory cache is simple, the data is already present in memory and easily accessible via hashmaps keyed by series ID. Retrieving a block from disk is more complicated. The flow for retrieving a block from disk is as follows: + +1. Consult the in-memory bloom filter to determine if it's possible the series exists on disk. +2. If the bloom filter returns negative, we are sure that the series isn't there, so return that result. If the bloom filter returns positive, then binary search the in-memory index summaries to find the nearest index entry that is *before* the series ID that we're searching for. Review the `index_lookup.go` file for implementation details. +3. Jump to the offset in the index file that we obtained from the binary search in the previous step, and begin scanning forward until we identify the index entry for the series ID we're looking for *or* we get far enough in the index file that it becomes clear that the ID we're looking for doesn't exist (this is possible because the index file is sorted by ID) +4. Jump to the offset in the data file that we obtained from scanning the index file in the previous step, and begin streaming data. + +Once M3DB has retrieved the three blocks from their respective locations in memory / on-disk, it will transmit all of the data back to the client. Whether or not the client returns a success to the caller for the read is dependent on the configured [consistency level](consistencylevels.md). + +**Note:** Since M3DB nodes return compressed blocks (the M3DB client decompresses them), it's not possible to return "partial results" for a given block. If any portion of a read request spans a given block, then that block in its entirety must be transmitted back to the client. In practice, this ends up being not much of an issue because of the high compression ratio that M3DB is able to achieve. + +## Buffer + +Each series object contains a buffer, which is in charge of handling all data that has yet to be flushed - new writes and bootstrapped data. To accomplish this, it keeps mutable "buckets" of encoders (for new writes) and immutable blocks (for bootstrapped data). M3TSZ, the database's encoding scheme, is designed for compressing time series data in which each datapoint has a timestamp that is larger than the last encoded datapoint. For metrics workloads this works very well because every subsequent datapoint is almost always after the previous one. However, out of order writes will occasionally be received, for example due to clock skew. When this happens, M3DB will allocate a new encoder for the out of order datapoints. These encoders are contained in a bucket along with any blocks that got bootstrapped. + +Upon a flush (discussed further below), all data within a bucket gets merged and its version gets incremented - the specific version it gets set to depends on the number of times this block has previously been flushed. This bucket versioning allows the buffer to know which data has been flushed so that subsequent flushes will not try to flush it again. It also indicates to the clean up process (also discussed below) that that data can be evicted. + +Given this complex, concurrent logic, this has been [modeled in TLA](https://github.com/m3db/m3/blob/master/specs/dbnode/flush/FlushVersion.tla). + +``` + ┌─────────────────────────┐ + │ Buffer │ + ├─────────────────────────┤ + │ │ + │ ┌─────────────────┐ │ + │ │ 2-4PM buckets │ │ + │ └─────────────────┘ │ + │ │ + │ ┌─────────────────┐ │ + ┌────│───│ 4-6PM buckets │ | + │ │ └─────────────────┘ │ + │ │ │ + │ │ ... │ + │ └─────────────────────────┘ + │ + │ + v After flush: + ┌─────────────────────┐ ┌─────────────────────┐ + │ 4-6PM buckets │ │ 4-6PM buckets │ + ├─────────────────────┤ ├─────────────────────┤ + │ │ │ │ + │ ┌─────────────┐ │ │ ┌─────────────┐ │ + │ │ Bucket v0 │<--│--writes │ │ Bucket v3 │ │ + │ └─────────────┘ │ │ └─────────────┘ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + └─────────────────────┘ └─────────────────────┘ + + + More writes after flush: After clean up: + ┌─────────────────────┐ ┌─────────────────────┐ + │ 4-6PM buckets │ │ 4-6PM buckets │ + ├─────────────────────┤ ├─────────────────────┤ + │ │ │ │ + │ ┌─────────────┐ │ │ ┌─────────────┐ │ + │ │ Bucket v3 │ │ │ │ Bucket v0 │<--│--writes + │ └─────────────┘ │ │ └─────────────┘ │ + │ │ │ │ + │ ┌─────────────┐ │ │ │ + │ │ Bucket v0 │<--│--writes │ │ + │ └─────────────┘ │ │ │ + │ │ │ │ + └─────────────────────┘ └─────────────────────┘ +``` + +## Background processes + +M3DB has a variety of processes that run in the background during normal operation. + +### Flushing + +As discussed in the [architecture](engine.md#architecture) section, writes are actively buffered / compressed in memory and the commit log is continuously being written to, but eventually data needs to be flushed to disk in the form of [fileset files](storage.md) to facilitate efficient storage and retrieval. + +This is where the configurable "block size" comes into play. The block size is simply a duration of time that dictates how long new writes will be compressed (in a streaming manner) in memory before being flushed to disk. Let's use a block size of two hours as an example. + +If the block size is set to two hours, then all writes for all series for a given shard will be buffered in memory for two hours at a time. At the end of the two hour period all of the fileset files will be generated, written to disk, and then the in-memory objects can be released and replaced with new ones for the new block. The old objects will be removed from memory in the subsequent tick. + +If a flush happens for a namespace/shard/series/block for which there is already a fileset, in-memory data will get merged with data on disk from the fileset. The resultant merged data will then be flushed as a separate fileset. + +### Ticking + +The ticking process runs continously in the background and is responsible for a variety of tasks: + +1. Merging all encoders for a given series / block start combination +2. Removing expired / flushed series and blocks from memory +3. Clean up of expired data (fileset/commit log) from the filesystem + +#### Merging all encoders + +If there are multiple encoders for a block, they need to be merged before flushing the data to disk. To prevent huge memory spikes during the flushing process we continuously merge out of order encoders in the background. + +#### Removing expired / flushed series and blocks from memory + +Depending on the configured [caching policy](caching.md), the [in-memory object layout](engine.md#in-memory-object-layout) can end up with references to series or data blocks that are expired (have fallen out of the retention period) or no longer needed to be in memory (due to the data being flushed to disk or no longer needing to be cached). The background tick will identify these structures and release them from memory. + +#### Clean up of expired data + +Fileset files can become no longer necessary for two reasons: + +1. The fileset files for a block that has fallen out of retention +2. A flush occurred for a block that already has a fileset file. The new fileset will be a superset of the existing fileset with any new data that for that block, hence, the existing fileset is no longer required + +During the clean up process, these fileset files will get deleted. + +## Caveats / Limitations + +1. Currently M3DB does not support deletes. +2. M3DB does not support storing data with an indefinite retention period, every namespace in M3DB is required to have a retention policy which specifies how long data in that namespace will be retained for. While there is no upper bound on that value, it's still required and generally speaking M3DB is optimized for workloads with a well-defined [TTL](https://en.wikipedia.org/wiki/Time_to_live). +3. M3DB does not support either background data repair or Cassandra-style [read repairs](https://docs.datastax.com/en/cassandra/2.1/cassandra/operations/opsRepairNodesReadRepair.html). Future versions of M3DB will support automatic repairs of data as an ongoing background process. +4. M3DB does not support writing far into the future. Support for this will be added in future. diff --git a/docs-beta/content/m3db/architecture/index.md b/docs-beta/content/m3db/architecture/index.md new file mode 100644 index 0000000000..6767ce46e4 --- /dev/null +++ b/docs-beta/content/m3db/architecture/index.md @@ -0,0 +1,15 @@ +# Architecture + +## Overview + +M3DB is written entirely in Go and does not have any required dependencies. For larger deployments, one may use an etcd cluster to manage M3DB cluster membership and topology definition. + +## High Level Goals + +Some of the high level goals for the project are defined as: + +* **Monitoring support:** M3DB was primarily developed for collecting a high volume of monitoring time series data, distributing the storage in a horizontally scalable manner and most efficiently leveraging the hardware. As such time series that are not read frequently are not kept in memory. + +* **Highly configurable:** Provide a high level of configuration to support a wide set of use cases and runtime environments. + +* **Variable durability:** Providing variable durability guarantees for the write and read side of storing time series data enables a wider variety of applications to use M3DB. This is why replication is primarily synchronous and is provided with configurable consistency levels, to enable consistent writes and reads. It must be possible to use M3DB with strong guarantees that data was replicated to a quorum of nodes and that the data was durable if desired. diff --git a/docs-beta/content/m3db/architecture/peer_streaming.md b/docs-beta/content/m3db/architecture/peer_streaming.md new file mode 100644 index 0000000000..532f6c6aac --- /dev/null +++ b/docs-beta/content/m3db/architecture/peer_streaming.md @@ -0,0 +1,107 @@ +# Peer Streaming + +## Client + +Peer streaming is managed by the M3DB client. It fetches all blocks from peers for a specified time range for bootstrapping purposes. It performs the following steps: + +1. Fetch all metadata for blocks from all peers who own the specified shard +2. Compares metadata from different peers and determines the best peer(s) from which to stream the actual data +3. Streams the block data from peers + +Steps 1, 2 and 3 all happen concurrently. As metadata streams in, we begin determining which peer is the best source to stream a given block's data for a given series from, and then we begin streaming data from that peer while we continue to receive metadata. If the checksum for a given series block matches all three replicas then the least loaded (in terms of outstanding requests) and recently attempted will be selected to stream from. If the checksum differs for the series block across any of the peers then a fanout fetch of the series block is performed. + +In terms of error handling, the client will respect the consistency level specified for bootstrap. This means that when fetching metadata, indefinite retry is performed until the consistency level is achieved, for instance for quorum a majority of peers must successfully return metadata. For fetching the block data, if checksum matches from all peers then one successful fetch must occur, unless bootstrap consistency level "none" is specified, and if checksum mismatches then the specified consistency level must be achieved when the series block fetch is fanned out to peers. Fetching block data as well will indefinitely retry until the consistency level is achieved. + +The client supports dynamically changing the bootstrap consistency level, which is helpful in disaster scenarios where the consistency level cannot be achieved. To break the indefinite streaming attempt an operator can change the consistency level to "none" and a purely best-effort will be made to fetch the metadata and correspondingly to fetch the block data. + +The diagram below depicts the control flow and concurrency (goroutines and channels) in detail: + +``` + ┌───────────────────────────────────────────────┐ + │ │ + │ FetchBootstrapBlocksFromPeers │ + │ │ + └───────────────────────────────────────────────┘ + │ + │ + ┌────────────────────┘ + │ + ▼ +┌───────────────────────────────┐ +│ Main routine │ +│ │ +│ 1) Create metadataCh │────────────────┐ +│ 2) Spin up background routine │ │ +└───────────────────────────────┘ Create with metadataCh + │ │ + │ ▼ + │ ┌───────────────────────────────┐ + │ │ │ + │ │ Background routine │ + │ │ │ + │ └───────────────────────────────┘ + │ │ + │ For each peer + │ │ + │ ┌────────────────┼─────────────────┐ + │ │ │ │ + │ │ │ │ + │ ▼ ▼ ▼ + │ ┌───────────────────────────────────────────┐ + │ │ StreamBlocksMetadataFromPeer │ + │ │ │ + │ │ Stream paginated blocks metadata from a │ + │ │ peer while pageToken != nil │ + │ │ │ + │ │ For each blocks' metadata --> put │ + │ │ metadata into metadataCh │ + │ └───────────────────────────────────────────┘ + ▼ +┌───────────────────────────────────────────┐ +│ StreamBlocksFromPeers │ +│ │ +│ 1) Create a background goroutine (details │ +│ to the right) │ +│ │ +│ 2) Create a queue per-peer which each have│ +│ their own internal goroutine and will │ +│ stream blocks back per-series from a │──────────┐ +│ specific peer │ │ +│ │ │ +│ 3) Loop through the enqueCh and pick an │ Creates with metadataCh +│appropriate peer(s) for each series (based │ and enqueueCh +│on whether all the peers have the same data│ │ +│ or not) and then put that into the queue │ │ +│for that peer so the data will be streamed │ │ +└───────────────────────────────────────────┘ │ + │ ▼ + │ ┌──────────────────────────────────────────────────────────┐ + │ │ streamAndGroupCollectedBlocksMetadata (injected via │ + │ │ streamMetadataFn variable) │ + │ │ │ + │ │ Loop through the metadataCh aggregating blocks metadata │ + │ │per series/block combination from different peers until we│ + │ │ have them from all peers for a series/block metadata │ + │ │ combination and then "submit" them to the enqueueCh │ + │ │ │ + │ │At the end, flush any remaining series/block combinations │ + │ │(that we received from less than N peers) into the enqueCh│ + │ │ as well. │ + │ └──────────────────────────────────────────────────────────┘ + │ + For each peer + │ + ┌────────────┼─────────────┐ + │ │ │ + │ │ │ + ▼ ▼ ▼ +┌─────────────────────────────────────────────────────────────┐ +│ newPeerBlocksQueue (processFn = streamBlocksBatchFromPeer) │ +│ │ +│For each peer we're creating a new peerBlocksQueue which will│ +│ stream data blocks from a specific peer (using the │ +│ streamBlocksBatchFromPeer function) and add them to the │ +│ blocksResult │ +│ │ +└─────────────────────────────────────────────────────────────┘ +``` diff --git a/docs-beta/content/m3db/architecture/sharding.md b/docs-beta/content/m3db/architecture/sharding.md new file mode 100644 index 0000000000..386a2e9e12 --- /dev/null +++ b/docs-beta/content/m3db/architecture/sharding.md @@ -0,0 +1,76 @@ +# Sharding + +Timeseries keys are hashed to a fixed set of virtual shards. Virtual shards are then assigned to physical nodes. M3DB can be configured to use any hashing function and a configured number of shards. By default [murmur3](https://en.wikipedia.org/wiki/MurmurHash) is used as the hashing function and 4096 virtual shards are configured. + +## Benefits + +Shards provide a variety of benefits throughout the M3DB stack: + +1. They make horizontal scaling easier and adding / removing nodes without downtime trivial at the cluster level. +2. They provide more fine grained lock granularity at the memory level. +3. They inform the filesystem organization in that data belonging to the same shard will be used / dropped together and can be kept in the same file. + +## Replication + +Logical shards are placed per virtual shard per replica with configurable isolation (zone aware, rack aware, etc). For instance, when using rack aware isolation, the set of datacenter racks that locate a replica’s data is distinct to the racks that locate all other replicas’ data. + +Replication is synchronization during a write and depending on the consistency level configured will notify the client on whether a write succeeded or failed with respect to the consistency level and replication achieved. + +## Replica + +Each replica has its own assignment of a single logical shard per virtual shard. + +Conceptually it can be defined as: + +``` +Replica { + id uint32 + shards []Shard +} +``` + +## Shard state + +Each shard can be conceptually defined as: + +``` +Shard { + id uint32 + assignments []ShardAssignment +} + +ShardAssignment { + host Host + state ShardState +} + +enum ShardState { + INITIALIZING, + AVAILABLE, + LEAVING +} +``` + +## Shard assignment + +The assignment of shards is stored in etcd. When adding, removing or replacing a node shard goal states are assigned for each shard assigned. + +For a write to appear as successful for a given replica it must succeed against all assigned hosts for that shard. That means if there is a given shard with a host assigned as *LEAVING* and another host assigned as *INITIALIZING* for a given replica writes to both these hosts must appear as successful to return success for a write to that given replica. Currently however only *AVAILABLE* shards count towards consistency, the work to group the *LEAVING* and *INITIALIZING* shards together when calculating a write success/error is not complete, see [issue 417](https://github.com/m3db/m3/issues/417). + +It is up to the nodes themselves to bootstrap shards when the assignment of new shards to it are discovered in the *INITIALIZING* state and to transition the state to *AVAILABLE* once bootstrapped by calling the cluster management APIs when done. Using a compare and set this atomically removes the *LEAVING* shard still assigned to the node that previously owned it and transitions the shard state on the new node from *INITIALIZING* state to *AVAILABLE*. + +Nodes will not start serving reads for the new shard until it is *AVAILABLE*, meaning not until they have bootstrapped data for those shards. + +## Cluster operations + +### Node add + +When a node is added to the cluster it is assigned shards that relieves load fairly from the existing nodes. The shards assigned to the new node will become *INITIALIZING*, the nodes then discover they need to be bootstrapped and will begin bootstrapping the data using all replicas available. The shards that will be removed from the existing nodes are marked as *LEAVING*. + +### Node down + +A node needs to be explicitly taken out of the cluster. If a node goes down and is unavailable the clients performing reads will be served an error from the replica for the shard range that the node owns. During this time it will rely on reads from other replicas to continue uninterrupted operation. + +### Node remove + +When a node is removed the shards it owns are assigned to existing nodes in the cluster. Remaining servers discover they are now in possession of shards that are *INITIALIZING* and need to be bootstrapped and will begin bootstrapping the data using all replicas available. diff --git a/docs-beta/content/m3db/architecture/storage.md b/docs-beta/content/m3db/architecture/storage.md new file mode 100644 index 0000000000..9a190f4128 --- /dev/null +++ b/docs-beta/content/m3db/architecture/storage.md @@ -0,0 +1,56 @@ +# Storage + +## Overview + +The primary unit of long-term storage for M3DB are fileset files which store compressed streams of time series values, one per shard block time window size. + +They are flushed to disk after a block time window becomes unreachable, that is the end of the time window for which that block can no longer be written to. If a process is killed before it has a chance to flush the data for the current time window to disk it must be restored from the commit log (or a peer that is responsible for the same shard if replication factor is larger than 1.) + +## FileSets + +A fileset has the following files: + +* **Info file:** Stores the block time window start and size and other important metadata about the fileset volume. +* **Summaries file:** Stores a subset of the index file for purposes of keeping the contents in memory and jumping to section of the index file that within a few pages of linear scanning can find the series that is being looked up. +* **Index file:** Stores the series metadata, including tags if indexing is enabled, and location of compressed stream in the data file for retrieval. +* **Data file:** Stores the series compressed data streams. +* **Bloom filter file:** Stores a bloom filter bitset of all series contained in this fileset for quick knowledge of whether to attempt retrieving a series for this fileset volume. +* **Digests file:** Stores the digest checksums of the info file, summaries file, index file, data file and bloom filter file in the fileset volume for integrity verification. +* **Checkpoint file:** Stores a digest of the digests file and written at the succesful completion of a fileset volume being persisted, allows for quickly checking if a volume was completed. + +``` + ┌─────────────────────┐ +┌─────────────────────┐ ┌─────────────────────┐ │ Index File │ +│ Info File │ │ Summaries File │ │ (sorted by ID) │ +├─────────────────────┤ │ (sorted by ID) │ ├─────────────────────┤ +│- Block Start │ ├─────────────────────┤ ┌─>│- Idx │ +│- Block Size │ │- Idx │ │ │- ID │ +│- Entries (Num) │ │- ID │ │ │- Size │ +│- Major Version │ │- Index Entry Offset ├──┘ │- Checksum │ +│- Summaries (Num) │ └─────────────────────┘ │- Data Entry Offset ├──┐ +│- BloomFilter (K/M) │ │- Encoded Tags | | +│- Snapshot Time │ └─────────────────────┘ │ +│- Type (Flush/Snap) │ │ +└─────────────────────┘ │ + │ + ┌─────────────────────┐ ┌───────────────────────────┘ +┌─────────────────────┐ │ Bloom Filter File │ │ +│ Digests File │ ├─────────────────────┤ │ ┌─────────────────────┐ +├─────────────────────┤ │- Bitset │ │ │ Data File │ +│- Info file digest │ └─────────────────────┘ │ ├─────────────────────┤ +│- Summaries digest │ │ │List of: │ +│- Index digest │ └─>│ - Marker (16 bytes)│ +│- Data digest │ │ - ID │ +│- Bloom filter digest│ │ - Data (size bytes)│ +└─────────────────────┘ └─────────────────────┘ + +┌─────────────────────┐ +│ Checkpoint File │ +├─────────────────────┤ +│- Digests digest │ +└─────────────────────┘ +``` + +In the diagram above you can see that the data file stores compressed blocks for a given shard / block start combination. The index file (which is sorted by ID and thus can be binary searched or scanned) can be used to find the offset of a specific ID. + +FileSet files will be kept for every shard / block start combination that is within the retention period. Once the files fall out of the period defined in the configurable namespace retention period they will be deleted. diff --git a/docs-beta/content/m3db/index.md b/docs-beta/content/m3db/index.md new file mode 100644 index 0000000000..00077a5438 --- /dev/null +++ b/docs-beta/content/m3db/index.md @@ -0,0 +1,27 @@ +# M3DB, a distributed time series database + +## About + +M3DB, inspired by [Gorilla][gorilla] and [Cassandra][cassandra], is a distributed time series database released as open source by [Uber Technologies][ubeross]. It can be used for storing realtime metrics at long retention. + +Here are some attributes of the project: + +* Distributed time series storage, single nodes use a WAL commit log and persists time windows per shard independently +* Cluster management built on top of [etcd][etcd] +* Built-in synchronous replication with configurable durability and read consistency (one, majority, all, etc) +* M3TSZ float64 compression inspired by Gorilla TSZ compression, configurable as lossless or lossy +* Arbitrary time precision configurable from seconds to nanoseconds precision, able to switch precision with any write +* Configurable out of order writes, currently limited to the size of the configured time window's block size + +## Current Limitations + +Due to the nature of the requirements for the project, which are primarily to reduce the cost of ingesting and storing billions of timeseries and providing fast scalable reads, there are a few limitations currently that make M3DB not suitable for use as a general purpose time series database. + +The project has aimed to avoid compactions when at all possible, currently the only compactions M3DB performs are in-memory for the mutable compressed time series window (default configured at 2 hours). As such out of order writes are limited to the size of a single compressed time series window. Consequently backfilling large amounts of data is not currently possible. + +The project has also optimized the storage and retrieval of float64 values, as such there is no way to use it as a general time series database of arbitrary data structures just yet. + +[gorilla]: http://www.vldb.org/pvldb/vol8/p1816-teller.pdf +[cassandra]: http://cassandra.apache.org/ +[etcd]: https://github.com/etcd-io/etcd +[ubeross]: http://uber.github.io diff --git a/docs-beta/content/m3db/monodraw/m3db-file-layout.monopic b/docs-beta/content/m3db/monodraw/m3db-file-layout.monopic new file mode 100644 index 0000000000000000000000000000000000000000..5317f25eb590119e16fceb211de34b3a8243391e GIT binary patch literal 2283 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 ZJU2{|KGhfJQEsj0{{yH&ho*FM005tx*$e;x literal 0 HcmV?d00001 diff --git a/docs-beta/content/m3db/monodraw/placement_monodraw_template.monopic b/docs-beta/content/m3db/monodraw/placement_monodraw_template.monopic new file mode 100644 index 0000000000000000000000000000000000000000..166e4c2c182ddea78105fe1a4c78639f8d93f75d GIT binary patch literal 3118 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 literal 0 HcmV?d00001 diff --git a/docs-beta/content/misc/writing_docs.md b/docs-beta/content/misc/writing_docs.md new file mode 100644 index 0000000000..4ac258fe14 --- /dev/null +++ b/docs-beta/content/misc/writing_docs.md @@ -0,0 +1,335 @@ +# Tips For Writing Documentation + +Writing is easy. Writing _well_ is hard. Writing documentation is even harder and, as one might +expect, writing _good documentation_ can be very hard. The challenge ultimately stems from the fact +that good documentation requires attention to several things: consistency, clarity, detail, +information density, unambiguity, and grammar (of course). + +This page describes tips for writing documentation (for M3 or otherwise). There are many different, +equally-valid writing styles; this document isn't meant as a prescription for how to write, but +instead as optional (but encouraged) guidelines geared toward writing consistent, clear, +easy-to-read documentation. + +## Tip #1: Avoid first- and second-person pronouns. + +Documentation should always be written from a [third-person point of view][wp3p] (specifically, +with a [third-person objective narrative voice][wp3ponv]); avoid using [first-][wp1p] and +[second-person][wp2p]. The point of documentation is not to be a message from the author or to +convey their point of view, but rather to be objective, factual, and canonical. + +| Examples | | +| :-: | --- | +| BAD | ~~You will need to set Value X to "foo", as our testing indicated that "bar" can cause issues when solar rays are present.~~ | +| BAD | ~~We suggest setting Value X to "foo", as testing indicated that "bar" can cause issues when solar rays are present.~~ | +| GOOD | **Value X must not be set to "bar", as testing indicated that it may cause issues when solar rays are present.** | +| GOOD | **Value X must be set to "foo"; a value of "bar" may cause issues when solar rays are present.** | + +## Tip #2: Avoid subjective language. + +Subjective language – language that is open to interpretation, particularly based on perspective – +should be avoided wherever possible. Documentation should state objective or broadly empirical +truths (and should be supported by facts). Introducing perspective inherently creates ambiguity and +vagueness in the document, as its meaning becomes reader-dependent. Importantly, cases of subjective +language are distinct from cases of conditional behavior. + +| Examples | | +| :-: | --- | +| BAD | ~~Setting PowerLevel to 9000 is required, because efficiency is better than reliability in high-rate situations.~~ | +| GOOD | **In high-rate situations (≥1k req/s), PowerLevel should be set to 9000 in order to maximize efficiency; otherwise, the system defaults to ensuring reliability.** | + +## Tip #3: Focus on concrete ideas. + +It can be easy to get sidetracked within documentation, or to bury critical points amidst tangent, +ancillary, or otherwise extraneous information. When writing documentation, always ask, "What am I +trying to say?". [Using terse bullets][skeleton] can help structure information, and using a +[self-defined guideline for sentence (or paragraph) length][concise-sentences] can help to optimize +the message such that the information density is high (i.e., no fluff or filler). + +## Tip #4: Use concise sentences (or fragments). + +Sentences and sentence fragments should be simple and to the point (but not stuttering). Each +sentence should ideally convey a single idea, but clearly-structured compound sentences are +acceptable as well. + +| Examples | | +| :-: | --- | +| BAD | ~~In order to time travel the MaxSpeed setting must be set to 88MPH because lower speeds will not achieve the desired result, but users should be careful around turns as high speeds are dangerous.~~ | +| BAD | ~~Time travel requires MaxSpeed to be set. The ideal value is 88MPH. Lower speeds will not achieve the desired result. Users should be careful around turns as high speeds are dangerous.~~ | +| GOOD | **Setting MaxSpeed to 88MPH is required to enable time travel – lower speeds will not achieve the desired result. However, users should take care around turns, as high speeds are dangerous.** | + +## Tip #5: Write down questions that the documentation should answer. + +The point of writing documentation is to document the subject and educate the reader, but every +piece of documentation should be written with an understanding of which questions it is answering. +Questions can be as specific as "How do I deploy service X?", or as vague as "How does the system +work?", but for vaguer questions, there are ostensibly sub-questions (or +[skeleton bullets][skeleton]) that help to flesh them out. + +These questions can be included as a preface to the documentation if desired, which can serve to set +the reader's expectations and frame of reference (both of which can help to improve comprehension +and retention). + +A contrived example: + +``` +After reading this document, users should be able to answer: + + - What does the system's topology look like? + - What are components X, Y, and Z, and how are they related? + - When should one use Modes 1-3 of component X? + - How can component Y be deployed in a HA capacity? + - How can components X and Y be tuned to mitigate load on component Z? + - How can all of the components be configured for correctness versus availability? +``` + +## Tip #6: Write skeleton documentation first. + +Starting with a skeleton shows the full breadth and depth of a document (or set of documents) before +anything is written, enabling a more holistic view of the content and helping to ensure cohesion and +flow. Conversely, by fleshing out each section as it's added, it can be easy to lose track of the +scope of the section relative to the document, or the scope of the document itself. This approach +also serves as a TODO list, helping to ensure that sections aren't forgotten about and enabling the +documentation to be divided and conquered. + +A contrived example: + +``` +# The Document Title + +## Overview + + - One-sentence or elevator pitch summary + - Introduce components X, Y, and Z + +## Component X + +### Overview + - Responsible for all client ingress + - Sole entrypoint into the system + - Can be deployed to support multiple client encodings + - Adapter layer for translating all ingress from clients into + - Traffic goes: Client -> Component X -> Component Y -> Component Z + +### Deployment modes + - HA + - Lossless + - High-throughput + +## Component Y + +### Overview + - Dynamic, stateless, full-mesh cluster topology + - Deduplicates all ingress from Component X + - Partitions data among Component Z backends using perfect hashing + +### Deployment modes + - Dynamic cluster + - Static cluster + - Full mesh + - Ring network + - Isolated + +## Component Z + +### Overview + - Persists normalized client data + - Maintains a sharded, in-memory cache + +### Deployment modes + - HA + - Prioritized throughput + - Writethrough cache + - Readthrough cache + - Ring buffer + - LRU +``` + +## Tip #7: When in doubt, less is more. + +While it may seem counterintuitive to start by writing less in a given document, terseness – +specifically, fewer sentences or words to explain an idea – is easier to fix than verboseness. +It is far easier to find gaps in a reader's comprehension that are caused by missing documentation +than it is to try and find the minimal subset of documentation necessary to convey an idea. In other +words: start short, and build out. + +| Examples | | +| :-: | --- | +| BAD | ~~Configuring the cache to be a LRU readthrough cache ensures that the minimal amount of memory is used at the expense of guaranteed initial cache misses. Using minimal memory is important, as servers have finite memory that does not scale with the size of persisted data, and thus the bulk of the data will incur cache misses after a certain point (though compression may be used to mitigate this in the future).~~ | +| GOOD | **Configuring the cache as a LRU readthrough cache results in a minimal memory footprint (due to the combined behavior of both readthrough and LRU caching) at the expense of initial cache misses. Cache efficiency may be improved in the future.** | + + +## Tip #8: Write for an uninitiated target audience (and call out prerequisites). + +Every piece of technical documentation has at least one baseline prerequisite that the documentation +builds upon; otherwise, every document would need to explain +[how computers work][how-computers-work]. However, in the case of M3 (as an example), the reader +might be someone writing code that emits metrics, an infrastructure engineer that wants to run a +metrics stack, someone with experience running other metrics stacks that is looking for nuanced +tradeoffs between this and other platforms, or a distributed systems enthusiast (or a thousand other +folks). + +It's relatively straightforward to tailor a document to a given audience: an end-user looking to +emit metrics is a _much_ different demographic than someone wanting to run M3 in their +infrastructure (etc), and as such, there is often no conflation. However, the skill level or +technical depth of a given audience is often varied: a person who only vaguely understands what a +metric really is will require a much broader set of information than a person who has experience +using metrics in complex and interesting ways. + +Thus, it's important to cater to a baseline: don't expect that every piece of technical jargon will +be understood. Similarly, it's not a document's responsibility to satisfy its own prerequisites - +it's okay to inform the reader that they should be familiar with X, Y, and Z, else they won't get +much out of the document. If there are prerequisites that normalize the baseline of most or all +readers, call that out at the beginning (e.g., "Users should read and understand Document X before +reading this document"). + +## Tip #9: Make sure that documentation is reviewed thoroughly. + +Erroneous documentation can lead to confusion, misunderstanding, incorrect assumptions, or – in the +worst case – a user unknowingly implementing bad or faulty behavior. Documentation should ideally be +reviewed like code: thoroughly and pedantically. Depending on the complexity, it may be worth +[asking reviewers to answer basic questions][write-down-questions] and update the documentation +based on their responses – for example, if the question "When should `ConfigValueX` be set, and +what are its side effects?" can't be answered, it might merit adding more documentation around the +semantics of `ConfigValueX`, as well as its direct and side effects. + +## Tip #10: Have _at least_ one less-familiar person review documentation. + +It's _extremely_ easy to let assumptions, implicit points, jargon, etc sneak in. Folks who are +familiar with a subject are more likely to subconsciously or contextually fill in the gaps, but they +are not the documentation's intended audience. Instead, try to find one or more folks who are closer +to the target audience (relatively speaking) review documentation, and evaluate their comprehension +(e.g., ask basic questions that the documentation should provide answers for). + +Reviewers should sanity check all assumptions, and ask any questions freely – it's important to not +assume that they just missed the boat on some critical information that is obvious to everyone else +(most documentation should be explanatory and not expect readers to continually read between the +lines). + +## Tip #11: Document both reality _and_ intent. + +While documentation should reflect the current state of the world, in many cases, it's also +important to document the context or rationale around that state (the "what" and the "why"). +Documenting only the "what" leaves readers to draw their own inferences and conclusions, while the +"why" answers many of those questions outright (or, at the least, imparts a line of thinking that +will more accurately inform those inferences). + +## Tip #12: Focus on readability. + +The goal of documentation is to provide information to the reader. This means that, aside from +correctness, the most important metrics of documentation are its efficiency (words per idea) and +efficacy (readability of words and retention of ideas). + +Reading a sentence in isolation helps to analyze the readability of an idea in a narrow context, +but reading multiple sentences (or a paragraph) at a time can be a good signal of how well +information flows. + +## Tip #13: Be pedantic about grammar. + +English grammar can often be flexible, subjectively readable, or confusing (there is more than one +way to skin a cat). Being clear and using [simpler, well-structured sentences][concise-sentences] +can [help with readability][readability] by presenting digestible, unambiguous ideas. +[Verb tense][verb-tense] and [pronouns][pronouns] can play an important role as well. Ultimately, +the best litmus test may be the simplest: whether a reader needs to read a sentence twice to +understand it (technical terms notwithstanding). + +Realistically, it is impractical to strive for or expect perfect grammar. The goal isn't to write +flawless English; the goal is to write _clear, concise, unambiguous, and readable_ documentation, +for which grammar is an important (albeit not the only) tool. + +## Tip #14: Use verb tenses consistently. + +Generally speaking, the bulk of documentation only makes sense when written in the present tense +(its "common tense", so to speak), as objects are typically referred to in the abstract (e.g. +"Component X" is abstract, "The running instance of Component X" proverbially concrete) and do not +usually involve time (e.g. "Component X is an upstream of Component Y" refers to nominal abstract +state, "Component X will be an upstream of Component Y" is prospective state). Of course, this is +not always true: documentation can tell a story, and tenses should be used as needed to express ideas +relative to time. + +However, cases of general fact, such as describing cause and effect: + + Value X -> Behavior Y + +should be described in the present tense: + + Setting Value X causes Behavior Y. + +versus the future tense: + + Setting Value X will cause Behavior Y. + +in order to be consistent with the documentation's common tense, to maintain a time-less (and thus +ongoing) objective truth, and to contrast actual time-relative statements (e.g. "Setting Value X +causes Behavior Y, but will be updated to cause Behavior Z in the future"). + +## Tip #15: Make consistent references. + +When communicating verbally, there is no need to distinguish between represented forms for a given +artifact, value, method, etc - one can simply say "foo bar" to reference "the member function or +property `Bar` on type `Foo`", or "foo dot bar" to reference "the YAML key `bar` nested under +the key `foo`" (as simple examples). + +In written documentation, however, these references can either maintain continuity throughout a +document (when used consistently), or they can cause confusion (when used inconsistently). A simple +framework for references is, "if it's code (or code-like), it should look like code; otherwise, +treat it like a proper noun". Thankfully, most references fall into two such categories: + +- **Code (and code-like) references**, such as `MyClass` or `myVar` or `some.config.property`. In + these cases, `PreformattedText` should be used, and should reference the code verbatim. All + instances of such a reference should be consistent, and should not be abbreviated. +- **Proper (or effectively proper) names**, such as "My Component" or "My System Name". In these + cases, "Title Case" should be used, with the following exceptions: + - Established projects, such as "etcd", "PostgreSQL", and "GitHub", should use the project's + official name and format, versus arbitrary ones (e.g. "Etcd", "Postgres", "Github", etc). + - First-party components, such as "the M3 Aggregator", can use shorthand when doing so does not + contextually result in ambiguity (e.g. "the Aggregator", when already discussing the Aggregator), + but should still be proper nouns. + +For other or nuanced cases, it's more important to be consistent than it is to fit a reference into +one of these simple categories. + +| Examples | | +| :-: | --- | +| BAD | ~~The Flux Capactitor is a Y-shaped component that enables time travel. Importantly, the enclosing vehicle must be capable of providing 1.21 gigawatts of power, as the flux capacitor requires this energy to function.~~ | +| BAD | ~~FluxCapacitor's power level property should be set to 1.21.~~ | +| GOOD | **The Flux Capacitor is a Y-shaped component that enables time travel. Importantly, the enclosing vehicle must be capable of providing 1.21 gigawatts of power, as the Flux Capacitor requires this energy to function.** | +| GOOD | **`FluxCapacitor`'s `powerLevel` property should be set to `1.21`.** | + +## Tip #16: Use `TODO`/`TODOC` placeholders liberally. + +Often, it might not yet be the right time to write a part of the documentation – either because a +feature isn't ready yet, it's not the most practical time investment at present, or other reasons. +In these cases, consider adding a `TODO` (in exactly the same way that code `TODO`s are used). If +it's necessary/helpful to disambiguate code `TODO`s from documentation `TODO`s, `TODOC` can be used +instead: it's similar enough to match a naive `TODO` search, but both `TODO` and `TODOC` can be +reasoned about independently as desired. For example: + +```go +// FluxCapacitor TODOC(anyone) +type FluxCapacitor struct { + // TODO(anyone): use a discrete GigaWatts type instead of a float + RequiredPower float64 +} +``` + +```shell +$ grep -rnH 'TODOC(' . +./time/timetravel/flux_capacitor.go:123: // FluxCapacitor TODOC(anyone) +``` + +```shell +$ grep -rnH 'TODO(' . +./time/timetravel/flux_capacitor.go:125: // TODO(anyone): use a discrete GigaWatts type instead of a float +``` + +[concise-sentences]: #tip-4-use-concise-sentences-or-fragments +[how-computers-work]: https://softwareengineering.stackexchange.com/a/81715/4860 +[pronouns]: #tip--1-avoid-first-andsecond-person-pronouns +[readability]: #tip-12-focus-on-readability +[skeleton]: #tip-6-write-skeleton-documentation-first +[verb-tense]: #tip-14-use-verb-tenses-consistently +[wp1p]: https://en.wikipedia.org/wiki/Narration#First-person +[wp2p]: https://en.wikipedia.org/wiki/Narration#Second-person +[wp3p]: https://en.wikipedia.org/wiki/Narration#Third-person +[wp3ponv]: https://en.wikipedia.org/wiki/Narration#Third-person,_objective +[write-down-questions]: #tip-5-write-down-questions-that-the-documentation-should-answer diff --git a/docs-beta/content/operational_guide/availability_consistency_durability.md b/docs-beta/content/operational_guide/availability_consistency_durability.md new file mode 100644 index 0000000000..c2e4cd6437 --- /dev/null +++ b/docs-beta/content/operational_guide/availability_consistency_durability.md @@ -0,0 +1,127 @@ +# Tuning Availability, Consistency, and Durability + +## Overview + +M3DB is designed as a High Availability [HA](https://en.wikipedia.org/wiki/High_availability) system because it doesn't use a consensus protocol like Raft or Paxos to enforce strong consensus and consistency guarantees. +However, even within the category of HA systems, there is a broad spectrum of consistency and durability guarantees that a database can provide. +To address as many use cases as possible, M3DB can be tuned to achieve the desired balance between performance, availability, durability, and consistency. + +Generally speaking, [the default and example configuration for M3DB](https://github.com/m3db/m3/tree/master/src/dbnode/config) favors performance and availability, as that is well-suited for M3DB's most common metrics and Observability use cases. To instead favor consistency and durability, consider tuning values as described in the "Tuning for Consistency and Durability" section. +Database operators who are using M3DB for workloads that require stricter consistency and durability guarantees should consider tuning the default configuration to better suit their use case. + +The rest of this document describes the various configuration options that are available to M3DB operators to make such tradeoffs. +While reading it, we recommend referring to [the default configuration file](https://github.com/m3db/m3/blob/master/src/dbnode/config/m3dbnode-all-config.yml) (which has every possible configuration value set) to see how the described values fit into M3DB's configuration as a whole. + +## Tuning for Performance and Availability + +### Client Write and Read consistency + +We recommend running the client with `writeConsistencyLevel` set to `majority` and `readConsistencyLevel` set to `unstrict_majority`. +This means that all write must be acknowledged by a quorums of nodes in order to be considered succesful, and that reads will attempt to achieve quorum, but will return the data from a single node if they are unable to achieve quorum. This ensures that reads will normally ensure consistency, but degraded conditions will cause reads to fail outright as long as at least a single node can satisfy the request. + +You can read about the consistency levels in more detail in [the Consistency Levels section](../m3db/architecture/consistencylevels.md) + +### Commitlog Configuration + +We recommend running M3DB with an asynchronous commitlog. +This means that writes will be reported as successful by the client, though the data may not have been flushed to disk yet. + +For example, consider the default configuration: + +``` +commitlog: + flushMaxBytes: 524288 + flushEvery: 1s + queue: + calculationType: fixed + size: 2097152 +``` + +This configuration states that the commitlog should be flushed whenever either of the following is true: + +1. 524288 or more bytes have been written since the last time M3DB flushed the commitlog. +2. One or more seconds has elapsed since the last time M3DB flushed the commitlog. + +In addition, the configuration also states that M3DB should allow up to `2097152` writes to be buffered in the commitlog queue before the database node will begin rejecting incoming writes so it can attempt to drain the queue and catch up. Increasing the size of this queue can often increase the write throughput of an M3DB node at the cost of potentially losing more data if the node experiences a sudden failure like a hard crash or power loss. + +### Writing New Series Asynchronously + +The default M3DB YAML configuration will contain the following as a top-level key under the `db` section: + +``` +writeNewSeriesAsync: true +``` + +This instructs M3DB to handle writes for new timeseries (for a given time block) asynchronously. Creating a new timeseries in memory is much more expensive than simply appending a new write to an existing series, so the default configuration of creating them asynchronously improves M3DBs write throughput significantly when many new series are being created all at once. + +However, since new time series are created asynchronously, it's possible that there may be a brief delay inbetween when a write is acknowledged by the client and when that series becomes available for subsequent reads. + +M3DB also allows operators to rate limit the number of new series that can be created per second via the following configuration: + +``` +writeNewSeriesLimitPerSecond: 1048576 +``` + +This value can be set much lower than the default value for workloads in which a significant increase in cardinality usually indicates a misbehaving caller. + +### Ignoring Corrupt Commitlogs on Bootstrap + +If M3DB is shut down gracefully (i.e via SIGTERM), it will ensure that all pending writes are flushed to the commitlog on disk before the process exists. +However, in situations where the process crashed/exited unexpectedly or the node itself experienced a sudden failure, the tail end of the commitlog may be corrupt. +In such situations, M3DB will read as much of the commitlog as possible in an attempt to recover the maximum amount of data. However, it then needs to make a decision: it can either **(a)** come up successfully and tolerate an ostensibly minor amount of data or loss, or **(b)** attempt to stream the missing data from its peers. +This behavior is controlled by the following default configuration: + +``` +bootstrap: + commitlog: + returnUnfulfilledForCorruptCommitLogFiles: false +``` + +In the situation where only a single node fails, the optimal outcome is for the node to attempt to repair itself from one of its peers. +However, if a quorum of nodes fail and encounter corrupt commitlog files, they will deadlock while attempting to stream data from each other, as no nodes will be able to make progress due to a lack of quorum. +This issue requires an operator with significant M3DB operational experience to manually bootstrap the cluster; thus the official recommendation is to set `returnUnfulfilledForCorruptCommitLogFiles: false` to avoid this issue altogether. In most cases, a small amount of data loss is preferable to a quorum of nodes that crash and fail to start back up automatically. + +## Tuning for Consistency and Durability + +### Client Write and Read consistency + +The most important thing to understand is that **if you want to guarantee that you will be able to read the result of every successful write, then both writes and reads must be done with `majority` consistency.** +This means that both writes *and* reads will fail if a quorum of nodes are unavailable for a given shard. +You can read about the consistency levels in more detail in [the Consistency Levels section](../m3db/architecture/consistencylevels.md) + +### Commitlog Configuration + +M3DB supports running the commitlog synchronously such that every write is flushed to disk and fsync'd before the client receives a successful acknowledgement, but this is not currently exposed to users in the YAML configuration and generally leads to a massive performance degradation. +We only recommend operating M3DB this way for workloads where data consistency and durability is strictly required, and even then there may be better alternatives such as running M3DB with the bootstrapping configuration: `filesystem,peers,uninitialized_topology` as described in our [bootstrapping operational guide](./bootstrapping_crash_recovery.md). + + +### Writing New Series Asynchronously + +If you want to guarantee that M3DB will immediately allow you to read data for writes that have been acknowledged by the client, including the situation where the previous write was for a brand new timeseries, then you will need to change the default M3DB configuration to set `writeNewSeriesAsync: false` as a top-level key under the `db` section: + +``` +writeNewSeriesAsync: false +``` + +This instructs M3DB to handle writes for new timeseries (for a given time block) synchronously. Creating a new timeseries in memory is much more expensive than simply appending a new write to an existing series, so this configuration could have an adverse effect on performance when many new timeseries are being inserted into M3DB concurrently. + +Since this operation is so expensive, M3DB allows operator to rate limit the number of new series that can be created per second via the following configuration (also a top-level key under the `db` section): + +``` +writeNewSeriesLimitPerSecond: 1048576 +``` + +### Ignoring Corrupt Commitlogs on Bootstrap + +As described in the "Tuning for Performance and Availability" section, we recommend configuring M3DB to ignore corrupt commitlog files on bootstrap. However, if you want to avoid any amount of inconsistency or data loss, no matter how minor, then you should configure M3DB to return unfulfilled when the commitlog bootstrapper encounters corrupt commitlog files. You can do so by modifying your configuration to look like this: + +``` +bootstrap: + commitlog: + returnUnfulfilledForCorruptCommitLogFiles: true +``` + +This will force your M3DB nodes to attempt to repair corrupted commitlog files on bootstrap by streaming the data from their peers. +In most situations this will be transparent to the operator and the M3DB node will finish bootstrapping without trouble. +However, in the scenario where a quorum of nodes for a given shard failed in unison, the nodes will deadlock while attempting to stream data from each other, as no nodes will be able to make progress due to a lack of quorum. +This issue requires an operator with significant M3DB operational experience to manually bootstrap the cluster; thus the official recommendation is to avoid configuring M3DB in this way unless data consistency and durability are of utmost importance. diff --git a/docs-beta/content/operational_guide/bootstrapping_crash_recovery.md b/docs-beta/content/operational_guide/bootstrapping_crash_recovery.md new file mode 100644 index 0000000000..936c1aa3cb --- /dev/null +++ b/docs-beta/content/operational_guide/bootstrapping_crash_recovery.md @@ -0,0 +1,174 @@ +# Bootstrapping & Crash Recovery + +## Introduction + +We recommend reading the [placement operational guide](placement.md) before reading the rest of this document. + +When an M3DB node is turned on (goes through a placement change) it needs to go through a bootstrapping process to determine the integrity of data that it has, replay writes from the commit log, and/or stream missing data from its peers. In most cases, as long as you're running with the default and recommended bootstrapper configuration of: `filesystem,commitlog,peers,uninitialized_topology` then you should not need to worry about the bootstrapping process at all and M3DB will take care of doing the right thing such that you don't lose data and consistency guarantees are met. Note that the order of the configured bootstrappers *does* matter. + +Generally speaking, we recommend that operators do not modify the bootstrappers configuration, but in the rare case that you to, this document is designed to help you understand the implications of doing so. + +M3DB currently supports 5 different bootstrappers: + +1. `filesystem` +2. `commitlog` +3. `peers` +4. `uninitialized_topology` +5. `noop-all` + +When the bootstrapping process begins, M3DB nodes need to determine two things: + +1. What shards the bootstrapping node should bootstrap, which can be determined from the cluster placement. +2. What time-ranges the bootstrapping node needs to bootstrap those shards for, which can be determined from the namespace retention. + +For example, imagine a M3DB node that is responsible for shards 1, 5, 13, and 25 according to the cluster placement. In addition, it has a single namespace called "metrics" with a retention of 48 hours. When the M3DB node is started, the node will determine that it needs to bootstrap shards 1, 5, 13, and 25 for the time range starting at the current time and ending 48 hours ago. In order to obtain all this data, it will run the configured bootstrappers in the specified order. Every bootstrapper will notify the bootstrapping process of which shard/ranges it was able to bootstrap and the bootstrapping process will continue working its way through the list of bootstrappers until all the shards/ranges required have been marked as fulfilled. Otherwise the M3DB node will fail to start. + +## Bootstrappers + +### Filesystem Bootstrapper + +The `filesystem` bootstrapper's responsibility is to determine which immutable [Fileset files](../m3db/architecture/storage.md) exist on disk, and if so, mark them as fulfilled. The `filesystem` bootstrapper achieves this by scanning M3DB's directory structure and determining which Fileset files exist on disk. Unlike the other bootstrappers, the `filesystem` bootstrapper does not need to load any data into memory, it simply verifies the checksums of the data on disk and other components of the M3DB node will handle reading (and caching) the data dynamically once it begins to serve reads. + +### Commitlog Bootstrapper + +The `commitlog` bootstrapper's responsibility is to read the commitlog and snapshot (compacted commitlogs) files on disk and recover any data that has not yet been written out as an immutable Fileset file. Unlike the `filesystem` bootstrapper, the commit log bootstrapper cannot simply check which files are on disk in order to determine if it can satisfy a bootstrap request. Instead, the `commitlog` bootstrapper determines whether it can satisfy a bootstrap request using a simple heuristic. + +On a shard-by-shard basis, the `commitlog` bootstrapper will consult the cluster placement to see if the node it is running on has ever achieved the `Available` status for the specified shard. If so, then the commit log bootstrapper should have all the data since the last Fileset file was flushed and will return that it can satisfy any time range for that shard. In other words, the commit log bootstrapper is all-or-nothing for a given shard: it will either return that it can satisfy any time range for a given shard or none at all. In addition, the `commitlog` bootstrapper *assumes* it is running after the `filesystem` bootstrapper. M3DB will not allow you to run with a configuration where the `filesystem` bootstrapper is placed after the `commitlog` bootstrapper, but it will allow you to run the `commitlog` bootstrapper without the `filesystem` bootstrapper which can result in loss of data, depending on the workload. + +### Peers Bootstrapper + +The `peers` bootstrapper's responsibility is to stream in data for shard/ranges from other M3DB nodes (peers) in the cluster. This bootstrapper is only useful in M3DB clusters with more than a single node *and* where the replication factor is set to a value larger than 1. The `peers` bootstrapper will determine whether or not it can satisfy a bootstrap request on a shard-by-shard basis by consulting the cluster placement and determining if there are enough peers to satisfy the bootstrap request. For example, imagine the following M3DB placement where node A is trying to perform a peer bootstrap: + +``` + ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ + │ Node A │ │ Node B │ │ Node C │ +────┴─────────────────┴──────────┴─────────────────┴────────┴─────────────────┴─── +┌─────────────────────────┐ ┌───────────────────────┐ ┌──────────────────────┐ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ Shard 1: Initializing │ │ Shard 1: Initializing │ │ Shard 1: Available │ +│ Shard 2: Initializing │ │ Shard 2: Initializing │ │ Shard 2: Available │ +│ Shard 3: Initializing │ │ Shard 3: Initializing │ │ Shard 3: Available │ +│ │ │ │ │ │ +│ │ │ │ │ │ +└─────────────────────────┘ └───────────────────────┘ └──────────────────────┘ +``` + +In this case, the `peers` bootstrapper running on node A will not be able to fullfill any requests because node B is in the `Initializing` state for all of its shards and cannot fulfill bootstrap requests. This means that node A's `peers` bootstrapper cannot meet its default consistency level of majority for bootstrapping (1 < 2 which is majority with a replication factor of 3). On the other hand, node A would be able to peer bootstrap its shards in the following placement because its peers (nodes B/C) have sufficient replicas of the shards it needs in the `Available` state: + +``` + ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ + │ Node A │ │ Node B │ │ Node C │ +────┴─────────────────┴──────────┴─────────────────┴────────┴─────────────────┴─── +┌─────────────────────────┐ ┌───────────────────────┐ ┌──────────────────────┐ +│ │ │ │ │ │ +│ │ │ │ │ │ +│ Shard 1: Initializing │ │ Shard 1: Available │ │ Shard 1: Available │ +│ Shard 2: Initializing │ │ Shard 2: Available │ │ Shard 2: Available │ +│ Shard 3: Initializing │ │ Shard 3: Available │ │ Shard 3: Available │ +│ │ │ │ │ │ +│ │ │ │ │ │ +└─────────────────────────┘ └───────────────────────┘ └──────────────────────┘ +``` + +Note that a bootstrap consistency level of `majority` is the default value, but can be modified by changing the value of the key `m3db.client.bootstrap-consistency-level` in [etcd](https://coreos.com/etcd/) to one of: `none`, `one`, `unstrict_majority` (attempt to read from majority, but settle for less if any errors occur), `majority` (strict majority), and `all`. For example, if an entire cluster with a replication factor of 3 was restarted simultaneously, all the nodes would get stuck in an infinite loop trying to peer bootstrap from each other and not achieving majority until an operator modified this value. Note that this can happen even if all the shards were in the `Available` state because M3DB nodes will reject all read requests for a shard until they have bootstrapped that shard (which has to happen everytime the node is restarted). + +**Note**: Any bootstrappers configuration that does not include the `peers` bootstrapper will be unable to handle dynamic placement changes of any kind. + +### Uninitialized Topology Bootstrapper + +The purpose of the `uninitialized_topology` bootstrapper is to succeed bootstraps for all time ranges for shards that have never been completely bootstrapped (at a cluster level). This allows us to run the default bootstrapper configuration of: `filesystem,commitlog,peers,topology_uninitialized` such that the `filesystem` and `commitlog` bootstrappers are used by default in node restarts, the `peers` bootstrapper is used for node adds/removes/replaces, and bootstraps still succeed for brand new placement where both the `commitlog` and `peers` bootstrappers will be unable to succeed any bootstraps. In other words, the `uninitialized_topology` bootstrapper allows us to place the `commitlog` bootstrapper *before* the `peers` bootstrapper and still succeed bootstraps with brand new placements without resorting to using the noop-all bootstrapper which suceeds bootstraps for all shard/time-ranges regardless of the status of the placement. + +The `uninitialized_topology` bootstrapper determines whether a placement is "new" for a given shard by counting the number of nodes in the `Initializing` state and `Leaving` states and there are more `Initializing` than `Leaving`, then it succeeds the bootstrap because that means the placement has never reached a state where all nodes are `Available`. + +### No Operational All Bootstrapper + +The `noop-all` bootstrapper succeeds all bootstraps regardless of requests shards/time ranges. + +## Bootstrappers Configuration + +Now that we've gone over the various bootstrappers, let's consider how M3DB will behave in different configurations. Note that we include `uninitialized_topology` at the end of all the lists of bootstrappers because its required to get a new placement up and running in the first place, but is not required after that (although leaving it in has no detrimental effects). Also note that any configuration that does not include the `peers` bootstrapper will not be able to handle dynamic placement changes like node adds/removes/replaces. + +### filesystem,commitlog,peers,uninitialized_topology (default) + +This is the default bootstrappers configuration for M3DB and will behave "as expected" in the sense that it will maintain M3DB's consistency guarantees at all times, handle node adds/replaces/removes correctly, and still work with brand new placements / topologies. **This is the only configuration that we recommend using in production**. + +In the general case, the node will use only the `filesystem` and `commitlog` bootstrappers on node startup. However, in the case of a node add/remove/replace, the `commitlog` bootstrapper will detect that it is unable to fulfill the bootstrap request (because the node has never reached the `Available` state) and defer to the `peers` bootstrapper to stream in the data. + +Additionally, if it is a brand new placement where even the `peers` bootstrapper cannot fulfill the bootstrap, this will be detected by the `uninitialized_topology` bootstrapper which will succeed the bootstrap. + +### filesystem,peers,uninitialized_topology (default) + +Everytime a node is restarted it will attempt to stream in all of the the data for any blocks that it has never flushed, which is generally the currently active block and possibly the previous block as well. This mode can be useful if you want to improve performance or save disk space by operating nodes without a commitlog, or want to force a repair of any unflushed blocks. This mode can lead to violations of M3DB's consistency guarantees due to the fact that commit logs are being ignored. In addition, if you lose a replication factors worth or more of hosts at the same time, the node will not be able to bootstrap unless an operator modifies the bootstrap consistency level configuration in etcd (see `peers` bootstrap section above). Finally, this mode adds additional network and resource pressure on other nodes in the cluster while one node is peer bootstrapping from them which can be problematic in catastrophic scenarios where all the nodes are trying to stream data from each other. + +### peers,uninitialized_topology + +Every time a node is restarted, it will attempt to stream in *all* of the data that it is responsible for from its peers, completely ignoring the immutable Fileset files it already has on disk. This mode can be useful if you want to improve performance or save disk space by operating nodes without a commitlog, or want to force a repair of all data on an individual node. This mode can lead to violations of M3DB's consistency guarantees due to the fact that the commit logs are being ignored. In addition, if you lose a replication factors worth or more of hosts at the same time, the node will not be able to bootstrap unless an operator modifies the bootstrap consistency level configuration in etcd (see `peers` bootstrap section above). Finally, this mode adds additional network and resource pressure on other nodes in the cluster while one node is peer bootstrapping from them which can be problematic in catastrophic scenarios where all the nodes are trying to stream data from each other. + +## Invalid bootstrappers configuration + +For the sake of completeness, we've included a short discussion below of some bootstrapping configurations that we consider "invalid" in that they are likely to lose data / violate M3DB's consistency guarantees and/or not handle placement changes in a correct way. + +### filesystem,commitlog,uninitialized_topology + +This bootstrapping configuration will work just fine if nodes are never added/replaced/removed, but will fail when attempting a node add/replace/remove. + +### filesystem,uninitialized_topology + +Every time a node is restarted it will utilize the immutable Fileset files its already written out to disk, but any data that it had received since it wrote out the last set of immutable files will be lost. + +### commitlog,uninitialized_topology + +Every time a node is restarted it will read all the commit log and snapshot files it has on disk, but it will ignore all the data in the immutable Fileset files that it has already written. + +## Crash Recovery + +**NOTE:** These steps should not be necessary in most cases, especially if using the default bootstrappers configuration +of `filesystem,commitlog,peers,uninitialized_topology`. However in the case the configuration is non-default or the +cluster has been down for a prolonged period of time these steps may be necessary. A good indicator would be log +messages related to failing to bootstrap from peers due to consistency issues. + +M3DB may require manual intervention to recover in the event of a prolonged loss of quorum. This is because the [Peers +Boostrapper](#peers-bootstrapper) must read from a majority of nodes owning a shard to bootstrap. + +To relax this bootstrapping constraint, a value stored in etcd must be modified that corresponds to the +`m3db.client.bootstrap-consistency-level` runtime flag. Until the coordinator +[supports](https://github.com/m3db/m3/issues/1959) an API for this, this must be done manually. The M3 contributors are +aware of how cumbersome this is and are working on this API. + +To update this value in etcd, first determine the environment the M3DB node is using. For example in [this][cfg-env] +configuration, it is `default_env`. If using the M3DB Operator, the value will be `$KUBE_NAMESPACE/$CLUSTER_NAME`, where +`$KUBE_NAMESPACE` is the name of the Kubernetes namespace the cluster is located in and `$CLUSTER_NAME` is the name you +have assigned the cluster (such as `default/my-test-cluster`). + +The following base64-encoded string represents a Protobuf-serialized [message][string-proto] containing the string +`unstrict_majority`: `ChF1bnN0cmljdF9tYWpvcml0eQ==`. Decode this string and place it in the following etcd key, where +`$ENV` is the value determined above: + +``` +_kv/$ENV/m3db.client.bootstrap-consistency-level +``` + +Note that on MacOS, `base64` requires the `-D` flag to decode, whereas elsewhere it is likely `-d`. Also note the use of +`echo -n` to ensure removal of newlines if your shell does not support the `<< `rules` > `mappingRules` stanza. We will use the following as an +example. + +```yaml +downsample: + rules: + mappingRules: + - name: "mysql metrics" + filter: "app:mysql*" + aggregations: ["Last"] + storagePolicies: + - resolution: 1m + retention: 48h + - name: "nginx metrics" + filter: "app:nginx*" + aggregations: ["Last"] + storagePolicies: + - resolution: 30s + retention: 24h + - resolution: 1m + retention: 48h +``` + +Here, we have two mapping rules configured -- one for `mysql` metrics and one for `nginx` +metrics. The filter determines what metrics each rule applies to. The `mysql metrics` rule +will apply to any metrics where the `app` tag contains `mysql*` as the value (`*` being a wildcard). +Similarly, the `nginx metrics` rule will apply to all metrics where the `app` tag contains +`nginx*` as the value. + +The `aggregations` field determines what functions to apply to the datapoints within a +resolution tile. For example, if an application emits a metric every `10sec` and the resolution +for that metrics's storage policy is `1min`, M3 will need to combine 6 datapoints. If the `aggregations` +policy is `Last`, M3 will take the last value in that `1min` bucket. `aggregations` can be one +of the following: + +``` +Last +Min +Max +Mean +Median +Count +Sum +SumSq +Stdev +P10 +P20 +P30 +P40 +P50 +P60 +P70 +P80 +P90 +P95 +P99 +P999 +P9999 +``` + +Lastly, the `storagePolicies` field determines which namespaces to store the metrics in. For example, +the `mysql` metrics will be sent to the `1m:48h` namespace, while the `nginx` metrics will be sent to +both the `1m:48h` and `30s:24h` namespaces. + +**Note:** the namespaces listed under the `storagePolicies` stanza must exist in M3DB. + +## Rollup Rules + +Coming soon! diff --git a/docs-beta/content/operational_guide/monitoring.md b/docs-beta/content/operational_guide/monitoring.md new file mode 100644 index 0000000000..2827785b50 --- /dev/null +++ b/docs-beta/content/operational_guide/monitoring.md @@ -0,0 +1,99 @@ +## Metrics + +TODO: document how to retrieve metrics for M3DB components. + +## Logs + +TODO: document how to retrieve logs for M3DB components. + +## Tracing + +M3DB is integrated with [opentracing](https://opentracing.io/) to provide +insight into query performance and errors. + +### Jaeger + +To enable Jaeger as the tracing backend, set tracing.backend to "jaeger" (see also our [sample local +config](https://github.com/m3db/m3/blob/master/src/query/config/m3query-local-etcd.yml): + +``` +tracing: + backend: jaeger # enables jaeger with default configs + jaeger: + # optional configuration for jaeger -- see + # https://github.com/jaegertracing/jaeger-client-go/blob/master/config/config.go#L37 + # for options + ... +``` + +Jaeger can be run locally with docker as described in +https://www.jaegertracing.io/docs/1.9/getting-started/. + +The default configuration will report traces via udp to localhost:6831; +using the all-in-one jaeger container, they will be accessible at + +http://localhost:16686 + +N.B.: for production workloads, you will almost certainly want to use +sampler.type=remote with +[adaptive sampling](https://www.jaegertracing.io/docs/1.10/sampling/#adaptive-sampler) +for Jaeger, as write volumes are likely orders of magnitude higher than +read volumes in most timeseries systems. + +### LightStep + +To use LightStep as the tracing backend, set `tracing.backend` to `"lightstep"` and configure necessary information for +your client under `lightstep`. Any [options exposed][lightstep-options] in `lightstep-tracer-go` can be set in config. +Any environment variables may be interpolated. For example: + +```yaml +tracing: + serviceName: m3coordinator + backend: lightstep + lightstep: + access_token: ${LIGHTSTEP_ACCESS_TOKEN:""} + collector: + scheme: https + host: my-satellite-address.domain + port: 8181 +``` + +### Alternative backends + +If you'd like additional backends, we'd love to support them! + +File an issue against M3 and we can work with you on how best to add +the backend. The first time's going to be a little rough--opentracing +unfortunately doesn't support Go plugins (yet--see +https://github.com/opentracing/opentracing-go/issues/133), and `glide`'s +update model means that adding dependencies directly will update +*everything*, which isn't ideal for an isolated dependency change. +These problems are all solvable though, +and we'll work with you to make it happen! + +### Use cases + +Note: all URLs assume a local jaeger setup as described in Jaeger's +[docs](https://www.jaegertracing.io/docs/1.9/getting-started/). + + +#### Finding slow queries + +To find prom queries longer than , filter for `minDuration >= ` on +`operation="GET /api/v1/query_range"`. + +Sample query: +http://localhost:16686/search?end=1548876672544000&limit=20&lookback=1h&maxDuration&minDuration=1ms&operation=GET%20%2Fapi%2Fv1%2Fquery_range&service=m3query&start=1548873072544000 + +#### Finding queries with errors + +Search for `error=true` on `operation="GET /api/v1/query_range"` +http://localhost:16686/search?operation=GET%20%2Fapi%2Fv1%2Fquery_range&service=m3query&tags=%7B%22error%22%3A%22true%22%7D + +#### Finding 500 (Internal Server Error) responses + +Search for `http.status_code=500`. + +http://localhost:16686/search?limit=20&lookback=24h&maxDuration&minDuration&operation=GET%20%2Fapi%2Fv1%2Fquery_range&service=m3query&start=1548802430108000&tags=%7B"http.status_code"%3A"500"%7D + +[lightstep-options]: https://github.com/lightstep/lightstep-tracer-go/blob/v0.18.1/options.go#L110 diff --git a/docs-beta/content/operational_guide/namespace_configuration.md b/docs-beta/content/operational_guide/namespace_configuration.md new file mode 100644 index 0000000000..69ffc87e16 --- /dev/null +++ b/docs-beta/content/operational_guide/namespace_configuration.md @@ -0,0 +1,186 @@ +# Namespace Configuration + +## Introduction + +Namespaces in M3DB are analogous to tables in other databases. Each namespace has a unique name as well as distinct configuration with regards to data retention and blocksize. For more information about namespaces and the technical details of their implementation, read our [storage engine documentation](../m3db/architecture/engine.md). + +## Namespace Operations + +The operations below include sample cURLs, but you can always review the API documentation by navigating to + +`http://:/api/v1/openapi` or our [online API documentation](https://m3db.io/openapi/). + +Additionally, the following headers can be used in the namespace operations: + +--8<-- +docs/common/headers_placement_namespace.md +--8<-- + +### Adding a Namespace + +#### Recommended (Easy way) + +The recommended way to add a namespace to M3DB is to use our `api/v1/database/namespace/create` endpoint. This API abstracts over a lot of the complexity of configuring a namespace and requires only two pieces of configuration to be provided: the name of the namespace, as well as its retention. + +For example, the following cURL: + +```bash +curl -X POST :/api/v1/database/namespace/create -d '{ + "namespaceName": "default_unaggregated", + "retentionTime": "24h" +}' +``` + +will create a namespace called `default_unaggregated` with a retention of `24 hours`. All of the other namespace options will either use reasonable default values or be calculated based on the provided `retentionTime`. + +Adding a namespace does not require restarting M3DB, but will require modifying the M3Coordinator configuration to include the new namespace, and then restarting it. + +If you feel the need to configure the namespace options yourself (for performance or other reasons), read the `Advanced` section below. + +#### Advanced (Hard Way) + +The "advanced" API allows you to configure every aspect of the namespace that you're adding which can sometimes be helpful for development, debugging, and tuning clusters for maximum performance. +Adding a namespace is a simple as using the `POST` `api/v1/namespace` API on an M3Coordinator instance. + +``` +curl -X POST :/api/v1/namespace -d '{ + "name": "default_unaggregated", + "options": { + "bootstrapEnabled": true, + "flushEnabled": true, + "writesToCommitLog": true, + "cleanupEnabled": true, + "snapshotEnabled": true, + "repairEnabled": false, + "retentionOptions": { + "retentionPeriod": "2d", + "blockSize": "2h", + "bufferFuture": "10m", + "bufferPast": "10m", + "blockDataExpiry": true, + "blockDataExpiryAfterNotAccessedPeriod": "5m" + }, + "indexOptions": { + "enabled": true, + "blockSize": "2h" + } + } +}' +``` + +Adding a namespace does not require restarting M3DB, but will require modifying the M3Coordinator configuration to include the new namespace, and then restarting it. + +### Deleting a Namespace + +Deleting a namespace is a simple as using the `DELETE` `/api/v1/namespace` API on an M3Coordinator instance. + +`curl -X DELETE :/api/v1/namespace/` + +Note that deleting a namespace will not have any effect on the M3DB nodes until they are all restarted. In addition, the namespace will need to be removed from the M3Coordinator configuration and then the M3Coordinator node will need to be restarted. + +### Modifying a Namespace + +There is currently no atomic namespace modification endpoint. Instead, you will need to delete a namespace and then add it back again with the same name, but modified settings. Review the individual namespace settings above to determine whether or not a given setting is safe to modify. For example, it is never safe to modify the blockSize of a namespace. + +Also, be very careful not to restart the M3DB nodes after deleting the namespace, but before adding it back. If you do this, the M3DB nodes may detect the existing data files on disk and delete them since they are not configured to retain that namespace. + +### Viewing a Namespace + +In order to view a namespace and its attributes, use the `GET` `/api/v1/namespace` API on a M3Coordinator instance. +Additionally, for readability/debugging purposes, you can add the `debug=true` parameter to the URL to view block sizes, buffer sizes, etc. +in duration format as opposed to nanoseconds (default). + +## Namespace Attributes + +### bootstrapEnabled + +This controls whether M3DB will attempt to [bootstrap](bootstrapping_crash_recovery.md) the namespace on startup. This value should always be set to `true` unless you have a very good reason to change it as setting it to `false` can cause data loss when restarting nodes. + +Can be modified without creating a new namespace: `yes` + +### flushEnabled + +This controls whether M3DB will periodically flush blocks to disk once they become immutable. This value should always be set to `true` unless you have a very good reason to change it as setting it to `false` will cause increased memory utilization and potential data loss when restarting nodes. + +Can be modified without creating a new namespace: `yes` + +### writesToCommitlog + +This controls whether M3DB will includes writes to this namespace in the commitlog. This value should always be set to `true` unless you have a very good reason to change it as setting it to `false` will cause potential data loss when restarting nodes. + +Can be modified without creating a new namespace: `yes` + +### snapshotEnabled + +This controls whether M3DB will periodically write out [snapshot files](../m3db/architecture/commitlogs.md) for this namespace which act as compacted commitlog files. This value should always be set to `true` unless you have a very good reason to change it as setting it to `false` will increasing bootstrapping times (reading commitlog files is slower than reading snapshot files) and increase disk utilization (snapshot files are compressed but commitlog files are uncompressed). + +Can be modified without creating a new namespace: `yes` + +### repairEnabled + +If enabled, the M3DB nodes will attempt to compare the data they own with the data of their peers and emit metrics about any discrepancies. This feature is experimental and we do not recommend enabling it under any circumstances. + +### retentionOptions + +#### retentionPeriod + +This controls the duration of time that M3DB will retain data for the namespace. For example, if this is set to 30 days, then data within this namespace will be available for querying up to 30 days after it is written. Note that this retention operates at the block level, not the write level, so its possible for individual datapoints to only be available for less than the specified retention. For example, if the blockSize was set to 24 hour and the retention was set to 30 days then a write that arrived at the very end of a 24 hour block would only be available for 29 days, but the node itself would always support querying the last 30 days worth of data. + +Can be modified without creating a new namespace: `yes` + +#### blockSize + +This is the most important value to consider when tuning the performance of an M3DB namespace. Read the [storage engine documentation](../m3db/architecture/storage.md) for more details, but the basic idea is that larger blockSizes will use more memory, but achieve higher compression. Similarly, smaller blockSizes will use less memory, but have worse compression. In testing, good compression occurs with blocksizes containing around 720 samples per timeseries. + +Can be modified without creating a new namespace: `no` + +Below are recommendations for block size based on resolution: + +| Resolution | Block Size | +|------------|------------| +| 5s | 60m | +| 15s | 3h | +| 30s | 6h | +| 1m | 12h | +| 5m | 60h | + +#### bufferFuture and bufferPast + +These values control how far into the future and the past (compared to the system time on an M3DB node) writes for the namespace will be accepted. For example, consider the following configuration: + +``` +bufferPast: 10m +bufferFuture: 20m +currentSystemTime: 2:35:00PM +``` + +Now consider the following writes (all of which arrive at 2:35:00PM system time, but include datapoints with the specified timestamps): + +``` +2:25:00PM - Accepted, within the 10m bufferPast + +2:24:59PM - Rejected, outside the 10m bufferPast + +2:55:00PM - Accepted, within the 20m bufferFuture + +2:55:01PM - Rejected, outside the 20m bufferFuture +``` + +While it may be tempting to configure `bufferPast` and `bufferFuture` to very large values to prevent writes from being rejected, this may cause performance issues. M3DB is a timeseries database that is optimized for realtime data. Out of order writes, as well as writes for times that are very far into the future or past are much more expensive and will cause additional CPU / memory pressure. In addition, M3DB cannot evict a block from memory until it is no longer mutable and large `bufferPast` and `bufferFuture` values effectively increase the amount of time that a block is mutable for which means that it must be kept in memory for a longer period of time. + +Can be modified without creating a new namespace: `yes` + +### Index Options + +#### enabled + +Whether to use the built-in indexing. Must be `true`. + +Can be modified without creating a new namespace: `no` + +#### blockSize + +The size of blocks (in duration) that the index uses. +Should match the databases [blocksize](#blocksize) for optimal memory usage. + +Can be modified without creating a new namespace: `no` diff --git a/docs-beta/content/operational_guide/placement.md b/docs-beta/content/operational_guide/placement.md new file mode 100644 index 0000000000..1c5f25ff37 --- /dev/null +++ b/docs-beta/content/operational_guide/placement.md @@ -0,0 +1,220 @@ +# Placement + +## Overview + +**Note**: The words *placement* and *topology* are used interchangeably throughout the M3DB documentation and codebase. + +A M3DB cluster has exactly one Placement. That placement maps the cluster's shard replicas to nodes. A cluster also has 0 or more namespaces (analogous to tables in other databases), and each node serves every namespace for the shards it owns. In other words, if the cluster topology states that node A owns shards 1, 2, and 3 then node A will own shards 1, 2, 3 for all configured namespaces in the cluster. + +M3DB stores its placement (mapping of which NODES are responsible for which shards) in [etcd](https://coreos.com/etcd/). There are three possible states that each node/shard pair can be in: + +1. `Initializing` +2. `Available` +3. `Leaving` + +Note that these states are not a reflection of the current status of an M3DB node, but an indication of whether a given node has ever successfully bootstrapped and taken ownership of a given shard (achieved goal state). For example, in a new cluster all the nodes will begin with all of their shards in the `Initializing` state. Once all the nodes finish bootstrapping, they will mark all of their shards as `Available`. If all the M3DB nodes are stopped at the same time, the cluster placement will still show all of the shards for all of the nodes as `Available`. + +## Initializing State + +The `Initializing` state is the state in which all new node/shard combinations begin. For example, upon creating a new placement all the node/shard pairs will begin in the `Initializing` state and only once they have successfully bootstrapped will they transition to the `Available` state. + +The `Initializing` state is not limited to new placement, however, as it can also occur during placement changes. For example, during a node add/replace the new node will begin with all of its shards in the `Initializing` state until it can stream the data it is missing from its peers. During a node removal, all of the nodes who receive new shards (as a result of taking over the responsibilities of the node that is leaving) will begin with those shards marked as `Initializing` until they can stream in the data from the node leaving the cluster, or one of its peers. + +## Available State + +Once a node with a shard in the `Initializing` state successfully bootstraps all of the data for that shard, it will mark that shard as `Available` (for the single node) in the cluster placement. + +## Leaving State + +The `Leaving` state indicates that a node has been marked for removal from the cluster. The purpose of this state is to allow the node to remain in the cluster long enough for the nodes that are taking over its responsibilities to stream data from it. + +## Sample Cluster State Transitions - Node Add + +Node adds are performed by adding the new node to the placement. Some portion of the existing shards will be assigned to the new node based on its weight, and they will begin in the `Initializing` state. Similarly, the shards will be marked as `Leaving` on the node that are destined to lose ownership of them. Once the new node finishes bootstrapping the shards, it will update the placement to indicate that the shards it owns are `Available` and that the `Leaving` node should no longer own that shard in the placement. + +``` +Replication factor: 3 + + ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ + │ Node A │ │ Node B │ │ Node C │ │ Node D │ +┌──────────────────────────┬─────┴─────────────────┴─────┬────┴─────────────────┴────┬───┴─────────────────┴───┬───┴─────────────────┴───┐ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │ ┌──────────────────────┐│ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ Shard 1: Available │ │ │ Shard 1: Available │ │ │ Shard 1: Available ││ │ +│ 1) Initial Placement │ │ Shard 2: Available │ │ │ Shard 2: Available │ │ │ Shard 2: Available ││ │ +│ │ │ Shard 3: Available │ │ │ Shard 3: Available │ │ │ Shard 3: Available ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │ └──────────────────────┘│ │ +├──────────────────────────┼─────────────────────────────┼───────────────────────────┼─────────────────────────┼─────────────────────────┤ +│ │ │ │ │ │ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │ ┌──────────────────────┐│┌──────────────────────┐ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ Shard 1: Leaving │ │ │ Shard 1: Available │ │ │ Shard 1: Available │││Shard 1: Initializing │ │ +│ 2) Begin Node Add │ │ Shard 2: Available │ │ │ Shard 2: Leaving │ │ │ Shard 2: Available │││Shard 2: Initializing │ │ +│ │ │ Shard 3: Available │ │ │ Shard 3: Available │ │ │ Shard 3: Leaving │││Shard 3: Initializing │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │ └──────────────────────┘│└──────────────────────┘ │ +│ │ │ │ │ │ +├──────────────────────────┼─────────────────────────────┼───────────────────────────┼─────────────────────────┼─────────────────────────┤ +│ │ │ │ │ │ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │ ┌──────────────────────┐│┌──────────────────────┐ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ Shard 2: Available │ │ │ Shard 1: Available │ │ │ Shard 1: Available │││ Shard 1: Available │ │ +│ 3) Complete Node Add │ │ Shard 3: Available │ │ │ Shard 3: Available │ │ │ Shard 2: Available │││ Shard 2: Available │ │ +│ │ │ │ │ │ │ │ │ │││ Shard 3: Available │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │ └──────────────────────┘│└──────────────────────┘ │ +│ │ │ │ │ │ +└──────────────────────────┴─────────────────────────────┴───────────────────────────┴─────────────────────────┴─────────────────────────┘ +``` + +## Sample Cluster State Transitions - Node Remove + +Node removes are performed by updating the placement such that all the shards on the node that will be removed from the cluster are marked as `Leaving` and those shards are distributed to the remaining nodes (based on their weight) and assigned a state of `Initializing`. Once the existing nodes that are taking ownership of the leaving nodes shards finish bootstrapping, they will update the placement to indicate that the shards that they just acquired are `Available` and that the leaving node should no longer own those shards in the placement. + +``` +Replication factor: 3 + + ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ + │ Node A │ │ Node B │ │ Node C │ │ Node D │ +┌──────────────────────────┬─────┴─────────────────┴─────┬────┴─────────────────┴────┬───┴─────────────────┴───┬───┴─────────────────┴───┐ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │ ┌──────────────────────┐│┌──────────────────────┐ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ Shard 2: Available │ │ │ Shard 1: Available │ │ │ Shard 1: Available │││ Shard 1: Available │ │ +│ 1) Initial Placement │ │ Shard 3: Available │ │ │ Shard 3: Available │ │ │ Shard 2: Available │││ Shard 2: Available │ │ +│ │ │ │ │ │ │ │ │ │││ Shard 3: Available │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ │ │ │ │ │ │ │ │││ │ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │ └──────────────────────┘│└──────────────────────┘ │ +├──────────────────────────┼─────────────────────────────┼───────────────────────────┼─────────────────────────┼─────────────────────────┤ +│ │ │ │ │ │ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │┌───────────────────────┐│┌──────────────────────┐ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ │ Shard 1: Initializing │ │ │ Shard 1: Available │ ││ Shard 1: Available │││ Shard 1: Leaving │ │ +│ 2) Begin Node Remove │ │ Shard 2: Available │ │ │ Shard 2: Initializing│ ││ Shard 2: Available │││ Shard 2: Leaving │ │ +│ │ │ Shard 3: Available │ │ │ Shard 3: Available │ ││ Shard 3: Initializing│││ Shard 3: Leaving │ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │└───────────────────────┘│└──────────────────────┘ │ +│ │ │ │ │ │ +├──────────────────────────┼─────────────────────────────┼───────────────────────────┼─────────────────────────┼─────────────────────────┤ +│ │ │ │ │ │ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │ ┌──────────────────────┐│ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ Shard 1: Avaiable │ │ │ Shard 1: Available │ │ │ Shard 1: Available ││ │ +│ 3) Complete Node Remove │ │ Shard 2: Available │ │ │ Shard 2: Available │ │ │ Shard 2: Available ││ │ +│ │ │ Shard 3: Available │ │ │ Shard 3: Available │ │ │ Shard 3: Available ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │ └──────────────────────┘│ │ +│ │ │ │ │ │ +└──────────────────────────┴─────────────────────────────┴───────────────────────────┴─────────────────────────┴─────────────────────────┘ +``` + +## Sample Cluster State Transitions - Node Replace + +Node replaces are performed by updating the placement such that all the shards on the node that will be removed from the cluster are marked as `Leaving` and those shards are all added to the node that is being added and assigned a state of `Initializing`. Once the replacement node finishes bootstrapping, it will update the placement to indicate that the shards that it acquired are `Available` and that the leaving node should no longer own those shards in the placement. + +``` +Replication factor: 3 + + ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ + │ Node A │ │ Node B │ │ Node C │ │ Node D │ +┌──────────────────────────┬─────┴─────────────────┴─────┬────┴─────────────────┴────┬───┴─────────────────┴───┬───┴─────────────────┴───┐ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │ ┌──────────────────────┐│ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ Shard 1: Available │ │ │ Shard 1: Available │ │ │ Shard 1: Available ││ │ +│ 1) Initial Placement │ │ Shard 2: Available │ │ │ Shard 2: Available │ │ │ Shard 2: Available ││ │ +│ │ │ Shard 3: Available │ │ │ Shard 3: Available │ │ │ Shard 3: Available ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ │ │ │ │ │ │ │ ││ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │ └──────────────────────┘│ │ +├──────────────────────────┼─────────────────────────────┼───────────────────────────┼─────────────────────────┼─────────────────────────┤ +│ │ │ │ │ │ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │┌───────────────────────┐│┌──────────────────────┐ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ │ Shard 1: Available │ │ │ Shard 1: Available │ ││ Shard 1: Leaving │││Shard 1: Initializing │ │ +│ 2) Begin Node Replace │ │ Shard 2: Available │ │ │ Shard 2: Available │ ││ Shard 2: Leaving │││Shard 2: Initializing │ │ +│ │ │ Shard 3: Available │ │ │ Shard 3: Available │ ││ Shard 3: Leaving │││Shard 3: Initializing │ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ │ │ │ │ │ ││ │││ │ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │└───────────────────────┘│└──────────────────────┘ │ +│ │ │ │ │ │ +├──────────────────────────┼─────────────────────────────┼───────────────────────────┼─────────────────────────┼─────────────────────────┤ +│ │ │ │ │ │ +│ │ ┌─────────────────────────┐ │ ┌───────────────────────┐ │ │┌──────────────────────┐ │ +│ │ │ │ │ │ │ │ ││ │ │ +│ │ │ │ │ │ │ │ ││ │ │ +│ │ │ Shard 1: Avaiable │ │ │ Shard 1: Available │ │ ││ Shard 1: Available │ │ +│ 3) Complete Node Replace│ │ Shard 2: Available │ │ │ Shard 2: Available │ │ ││ Shard 2: Available │ │ +│ │ │ Shard 3: Available │ │ │ Shard 3: Available │ │ ││ Shard 3: Available │ │ +│ │ │ │ │ │ │ │ ││ │ │ +│ │ │ │ │ │ │ │ ││ │ │ +│ │ └─────────────────────────┘ │ └───────────────────────┘ │ │└──────────────────────┘ │ +│ │ │ │ │ │ +└──────────────────────────┴─────────────────────────────┴───────────────────────────┴─────────────────────────┴─────────────────────────┘ +``` + +## Cluster State Transitions - Placement Updates Initiation + +The diagram below depicts the sequence of events that happen during a node replace and illustrates which entity is performing the placement update (in etcd) at each step. + +``` + ┌────────────────────────────────┐ + │ Node A │ + │ │ + │ Shard 1: Available │ + │ Shard 2: Available │ Operator performs node replace by + │ Shard 3: Available │ updating placement in etcd such + │ │ that shards on node A are marked + └────────────────────────────────┤ Leaving and shards on node B are + │ marked Initializing + └─────────────────────────────────┐ + │ + │ + │ + │ + │ + ▼ + ┌────────────────────────────────┐ + │ Node A │ + │ │ + │ Shard 1: Leaving │ + │ Shard 2: Leaving │ + │ Shard 3: Leaving │ + │ │ + └────────────────────────────────┘ + + ┌────────────────────────────────┐ + │ Node B │ + │ │ + │ Shard 1: Initializing │ +┌────────────────────────────────┐ │ Shard 2: Initializing │ +│ │ │ Shard 3: Initializing │ +│ │ │ │ +│ Node A │ └────────────────────────────────┘ +│ │ │ +│ │ │ +│ │ │ +└────────────────────────────────┘ │ + │ +┌────────────────────────────────┐ │ +│ Node B │ │ +│ │ │ +│ Shard 1: Available │ Node B completes bootstrapping and +│ Shard 2: Available │◀────updates placement (via etcd) to +│ Shard 3: Available │ indicate shard state is Available and +│ │ that Node A should no longer own any shards +└────────────────────────────────┘ +``` diff --git a/docs-beta/content/operational_guide/placement_configuration.md b/docs-beta/content/operational_guide/placement_configuration.md new file mode 100644 index 0000000000..4bb980a7e2 --- /dev/null +++ b/docs-beta/content/operational_guide/placement_configuration.md @@ -0,0 +1,317 @@ +# Placement Configuration + +## Overview + +M3DB was designed from the ground up to be a distributed (clustered) database that is availability zone or rack aware (by using isolation groups). Clusters will seamlessly scale with your data, and you can start with a small number of nodes and grow it to a size of several hundred nodes with no downtime or expensive migrations. + +Before reading the rest of this document, we recommend familiarizing yourself with the [M3DB placement documentation](placement.md) + +**Note**: The primary limiting factor for the maximum size of an M3DB cluster is the number of shards. Picking an appropriate number of shards is more of an art than a science, but our recommendation is as follows: + +The number of shards that M3DB uses is configurable and there are a couple of key points to note when deciding the number to use. The +more nodes you have, the more shards you want because you want the shards to be evenly distributed amongst your nodes. However, +because each shard requires more files to be created, you also don’t want to have too many shards per node. This is due to the fact each +bit of data needs to be repartitioned and moved around the cluster (i.e. every bit of data needs to be moved all at once). Below are +some guidelines depending on how many nodes you will have in your cluster eventually - you will need to decide the number of shards up front, you +cannot change this once the cluster is created. + +| Number of Nodes | Number of Shards | +|-----------------|------------------| +| 3 | 64 | +| 6 | 128 | +| 12 | 256 | +| 24 | 512 | +| 48 | 1024 | +| 128+ | 4096 | + +After performing any of the instructions documented below a new placement will automatically be generated to distribute the shards among the M3DB nodes such that the isolation group and replication factor constraints are met. + +If the constraints cannot be met, because there are not enough nodes to calculate a new placement such that each shard is replicated on the desired number of nodes with none of the nodes owning the same shard existing in the same isolation group, then the operation will fail. + +In other words, all you have to do is issue the desired instruction and the M3 stack will take care of making sure that your data is distributed with appropriate replication and isolation. + +In the case of the M3DB nodes, nodes that have received new shards will immediately begin receiving writes (but not serving reads) for the new shards that they are responsible for. They will also begin streaming in all the data for their newly acquired shards from the peers that already have data for those shards. Once the nodes have finished streaming in the data for the shards that they have acquired, they will mark their status for those shards as `Available` in the placement and begin accepting writes. Simultaneously, the nodes that are losing ownership of any shards will mark their status for those shards as `Leaving`. Once all the nodes accepting ownership of the new shards have finished streaming data from them, they will relinquish ownership of those shards and remove all the data associated with the shards they lost from memory and from disk. + +M3Coordinator nodes will also pickup the new placement from etcd and alter which M3DB nodes they issue writes and reads to appropriately. + +### Understanding the Placement Configuration + +The placement configuration contains a few core values that control how the placement behaves. + +#### ID + +This is the identifier for a node in the placement and can be any value that uniquely identifies an M3DB node. + +#### Isolation Group + +This value controls how nodes that own the same M3DB shards are isolated from each other. For example, in a single datacenter configuration this value could be set to the rack that the M3DB node lives on. As a result, the placement will guarantee that nodes that exist on the same rack do not share any shards, allowing the cluster to survive the failure of an entire rack. Alternatively, if M3DB was deployed in an AWS region, the isolation group could be set to the region's availability zone and that would ensure that the cluster would survive the loss of an entire availability zone. + +#### Zone + +This value controls what etcd zone the M3DB node belongs to. + +#### Weight + +This value should be an integer and controls how the cluster will weigh the number of shards that an individual node will own. If you're running the M3DB cluster on homogenous hardware, then you probably want to assign all M3DB nodes the same weight so that shards are distributed evenly. On the otherhand, if you're running the cluster on heterogenous hardware, then this value should be higher for nodes with higher resources for whatever the limiting factor is in your cluster setup. For example, if disk space (as opposed to memory or CPU) is the limiting factor in how many shards any given node in your cluster can tolerate, then you could assign a higher value to nodes in your cluster that have larger disks and the placement calculations would assign them a higher number of shards. + +#### Endpoint + +This value should be in the form of `:` and identifies how network requests should be routed to this particular node in the placement. + +#### Hostname + +This value should be in the form of `` and identifies the address / host name of the M3DB node. + +#### Port + +This value should be in the form of `` and identifies the port over which this M3DB node expects to receive traffic (defaults to 9000). + +### Placement Operations + +**NOTE**: If you find yourself performing operations on seed nodes, please refer to the seed node-specific sections +below before making changes. + +The instructions below all contain sample curl commands, but you can always review the API documentation by navigating to + +`http://:/api/v1/openapi` or our [online API documentation](https://m3db.io/openapi/). + +**Note**: The [peers bootstrapper](bootstrapping_crash_recovery.md) must be configured on all nodes in the M3DB cluster for placement changes to work. The `peers` bootstrapper is enabled by default, so you only need to worry about this if you modified the default bootstrapping configuration + +Additionally, the following headers can be used in the placement operations: + +--8<-- +docs/common/headers_placement_namespace.md +--8<-- + +#### Placement Initialization + +Send a POST request to the `/api/v1/services/m3db/placement/init` endpoint + +```bash +curl -X POST localhost:7201/api/v1/services/m3db/placement/init -d '{ + "num_shards": , + "replication_factor": (recommended 3), + "instances": [ + { + "id": "", + "isolation_group": "", + "zone": "", + "weight": , + "endpoint": ":", + "hostname": "", + "port": + }, + { + "id": "", + "isolation_group": "", + "zone": "", + "weight": , + "endpoint": ":", + "hostname": "", + "port": + }, + { + "id": "", + "isolation_group": "", + "zone": "", + "weight": , + "endpoint": ":", + "hostname": "", + "port": + }, + ] +}' +``` + +#### Adding a Node + +Send a POST request to the `/api/v1/services/m3db/placement` endpoint + +```bash +curl -X POST :/api/v1/services/m3db/placement -d '{ + "instances": [ + { + "id": "", + "isolationGroup": "", + "zone": "", + "weight": , + "endpoint": ":(default 9000)", + "hostname": "", + "port": + } + ] +}' +``` + +After sending the add command you will need to wait for the M3DB cluster to reach the new desired state. You'll know that this has been achieved when the placement shows that all shards for all hosts are in the `Available` state. + +#### Removing a Node + +Send a DELETE request to the `/api/v1/services/m3db/placement/` endpoint. + +```bash +curl -X DELETE :/api/v1/services/m3db/placement/ +``` + +After sending the delete command you will need to wait for the M3DB cluster to reach the new desired state. You'll know that this has been achieved when the placement shows that all shards for all hosts are in the `Available` state. + +#### Adding / Removing Seed Nodes + +If you find yourself adding or removing etcd seed nodes then we highly recommend setting up an [external etcd](etcd.md) cluster, as +the overhead of operating two stateful systems at once is non-trivial. As this is not a recommended production setup, +this section is intentionally brief. + +To add or remove nodes to the etcd cluster, use `etcdctl member add` and `etcdctl member remove` as found in `Replacing +a Seed Node` below. A general rule to keep in mind is that any time the M3DB process starts on a seed node, the list of +cluster members in `etcdctl member list` must match *exactly* the list in config. + +#### Replacing a Node + +**NOTE**: If using embedded etcd and replacing a seed node, please read the section below. + +Send a POST request to the `/api/v1/services/m3db/placement/replace` endpoint containing hosts to replace and candidates to replace it with. + +```bash +curl -X POST :/api/v1/services/m3db/placement/replace -d '{ + "leavingInstanceIDs": [""], + "candidates": [ + { + "id": "", + "isolationGroup": "", + "zone": "", + "weight": , + "endpoint": ":(default 9000)", + "hostname": "", + "port": + } + ] +}' +``` + +#### Replacing a Seed Node + +If you are using the embedded etcd mode (which is only recommended for test purposes) and replacing a seed node then +there are a few more steps to be done, as you are essentially doing two replace operations at once (replacing an etcd +node *and* and M3DB node). To perform these steps you will need the `etcdctl` binary (version 3.2 or later), which can +be downloaded from the [etcd releases](https://github.com/etcd-io/etcd/releases) page. + +Many of the instructions here are mentioned in the [etcd operational +guide](https://github.com/etcd-io/etcd/blob/v3.3.11/Documentation/op-guide/runtime-configuration.md), which we recommend +reading for more context. + +To provide some context for the commands below, let's assume your cluster was created with the below configuration, and +that you'd like to replace `host3` with a new host `host4`, which has IP address `1.1.1.4`: + +``` +initialCluster: + - hostID: host1 + endpoint: http://1.1.1.1:2380 + - hostID: host2 + endpoint: http://1.1.1.2:2380 + - hostID: host3 + endpoint: http://1.1.1.3:2380 +``` + +1. On an existing node in the cluster that is **not** the one you're removing, use `etcdctl` to remove `host3` from the + cluster: + +``` +$ ETCDCTL_API=3 etcdctl member list +9d29673cf1328d1, started, host1, http://1.1.1.1:2380, http://1.1.1.1:2379 +f14613b6c8a336b, started, host2, http://1.1.1.2:2380, http://1.1.1.2:2379 +2fd477713daf243, started, host3, http://1.1.1.3:2380, http://1.1.1.3:2379 # <<< INSTANCE WE WANT TO REMOVE + +$ ETCDCTL_API=3 etcdctl member remove 2fd477713daf243 +Removed member 2fd477713daf243 from cluster +``` + +2. From the same host, use `etcdctl` to add `host4` to the cluster: + +``` +$ ETCDCTL_API=3 etcdctl member add host4 --peer-urls http://1.1.1.4:2380 +``` + +3. **Before** starting M3DB on `host4`, modify the initial cluster list to indicate `host4` has a cluster state of + `existing`. Note: if you had previously started M3DB on this host, you'll have to remove the `member` subdirectory in + `$M3DB_DATA_DIR/etcd/`. + +``` +initialCluster: + - hostID: host1 + endpoint: http://1.1.1.1:2380 + - hostID: host2 + endpoint: http://1.1.1.2:2380 + - hostID: host4 + clusterState: existing + endpoint: http://1.1.1.4:2380 +``` + +4. Start M3DB on `host4`. + +5. On all other seed nodes, update their `initialCluster` list to be exactly equal to the list on `host4` from step 3. + Rolling restart the hosts one at a time, waiting until they indicate they are bootstrapped (indicated in the + `/health`) endpoint before continuing to the next. + +6. Follow the steps from `Replacing a Seed Node` to replace `host3` with `host4` in the M3DB placement. + +#### Setting a new placement (Not Recommended) + +This endpoint is unsafe since it creates a brand new placement and therefore should be used with extreme caution. +Some use cases for using this endpoint include: + +- Changing IP addresses of nodes +- Rebalancing shards + +If the placement for `M3DB` needs to be recreated, the `/api/v1/services/m3db/placement/set` can be used to do so. +Please note, a placement already needs to exist to use this endpoint. If no placement exists, use the `Placement Initialization` +endpoint described above. Also, as mentioned above, this endpoint creates an entirely new placement therefore +complete placement information needs to be passed into the body of the request. The recommended way to this +is to get the existing placement using `/api/v1/placement` and modify that (as the `placement` field) along +with two additional fields -- `version` and `confirm`. Please see below for a full example: + +```bash +curl -X POST localhost:7201/api/v1/services/m3db/placement/set -d '{ + "placement": { + "num_shards": , + "replication_factor": (recommended 3), + "instances": [ + { + "id": "", + "isolation_group": "", + "zone": "", + "weight": , + "endpoint": ":", + "hostname": "", + "port": + }, + { + "id": "", + "isolation_group": "", + "zone": "", + "weight": , + "endpoint": ":", + "hostname": "", + "port": + }, + { + "id": "", + "isolation_group": "", + "zone": "", + "weight": , + "endpoint": ":", + "hostname": "", + "port": + } + ] + }, + "version": , + "confirm": +}' +``` + +**Note:** The `set` endpoint can also be used to set the placements in `M3Aggregator` and `M3Coordinator` using the following endpoints, respectively: +```bash +/api/v1/m3aggregator/set +/api/v1/m3coordinator/set +``` + diff --git a/docs-beta/content/operational_guide/repairs.md b/docs-beta/content/operational_guide/repairs.md new file mode 100644 index 0000000000..2794f334e7 --- /dev/null +++ b/docs-beta/content/operational_guide/repairs.md @@ -0,0 +1,46 @@ +# Background Repairs (beta) + +## Overview + +Background repairs enable M3DB to eventually reach a consistent state such that all nodes have identical view +An M3DB cluster can be configured to repair itself in the background. If background repairs are enabled, M3DB nodes will continuously scan the metadata of other nodes. If a mismatch is detected, affected nodes will perform a repair such that each node in the cluster eventually settles on a consistent view of the data. + +A repair is performed individually by each node when it detects a mismatch between its metadata and the metadata of its peers. Each node will stream the data for the relevant series, merge the data from its peers with its own, and then write out the resulting merged dataset to disk to make the repair durable. In other words, there is no coordination between individual nodes during the repair process, each node is detecting mismatches on its own and performing a "best effort" repair by merging all available data from all peers into a new stream. + +## Configuration + +The feature can be enabled by adding the following configuration to `m3dbnode.yml` under the `db` section: + +```yaml +db: + ... (other configuration) + repair: + enabled: true +``` + +By default M3DB will limit the amount of repaired data that can be held in memory at once to 2GiB. This is intended to prevent the M3DB nodes from streaming data from their peers too quickly and running out of memory. Once the 2GiB limit is hit the repair process will throttle itself until some of the streamed data has been flushed to disk (and as a result can be evicted from memory). This limit can be overriden with the following configuration: + +```yaml +db: + ... (other configuration) + limits: + maxOutstandingRepairedBytes: 2147483648 # 2GiB +``` + +In addition, the following two optional fields can also be configured: + +```yaml +db: + ... (other configuration) + repair: + enabled: true + throttle: 10s + checkInterval: 10s +``` + +The `throttle` field controls how long the M3DB node will pause between repairing each shard/blockStart combination and the `checkInterval` field controls how often M3DB will run the scheduling/prioritization algorithm that determines which blocks to repair next. In most situations, operators should omit these fields and rely on the default values. + +## Caveats and Limitations + +1. Background repairs do not currently support M3DB's inverted index; as a result, it can only be used for clusters / namespaces where the indexing feature is disabled. +2. Background repairs will wait until (`block start` + `block size` + `buffer past`) has elapsed before attempting to repair a block. For example, if M3DB is configured with a 2 hour block size and a 20 minute buffer past that M3DB will not attempt to repair the `12PM->2PM` block until at least `2:20PM`. This limitation is in place primarily to reduce "churn" caused by repairing mutable data that is actively being modified. **Note**: This limitation has no impact or negative interaction with M3DB's cold writes feature. In other words, even though it may take some time before a block becomes available for repairs, M3DB will repair the same block repeatedly until it falls out of retention so mismatches between nodes that were caused by "cold" writes will still eventually be repaired. diff --git a/docs-beta/content/operational_guide/replication_and_deployment_in_zones.md b/docs-beta/content/operational_guide/replication_and_deployment_in_zones.md new file mode 100644 index 0000000000..35972aa2cc --- /dev/null +++ b/docs-beta/content/operational_guide/replication_and_deployment_in_zones.md @@ -0,0 +1,94 @@ +# Replication and Deployment in Zones + +## Overview + +M3DB supports both deploying across multiple zones in a region or deploying to a single zone with rack-level isolation. It can also be deployed across multiple regions for a global view of data, though both latency and bandwidth costs may increase as a result. + +In addition, M3DB has support for automatically replicating data between isolated M3DB clusters (potentially running in different zones / regions). More details can be found in the [Replication between clusters](./replication_between_clusters.md) operational guide. + +### Replication + +A replication factor of at least 3 is highly recommended for any M3DB deployment, due to the consistency levels (for both reads and writes) that require quorum in order to complete an operation. For more information on consistency levels, see the documentation concerning [tuning availability, consistency and durability](availability_consistency_durability.md). + +M3DB will do its best to distribute shards evenly among the availability zones while still taking each individual node's weight into account, but if some of the availability zones have less available hosts than others then each host in that zone will be responsible for more shards than hosts in the other zones and will thus be subjected to heavier load. + + +### Replication Factor Recommendations + +Running with `RF=1` or `RF=2` is not recommended for any multi-node use cases (testing or production). In [the +future][1107] such topologies may be rejected by M3DB entirely. It is also recommended to only run with an odd number of +replicas. + +`RF=1` is not recommended as it is impossible to perform a safe upgrade or tolerate any node failures: as soon as one +node is down, all writes destined for the shards it owned will fail. If the node's storage is lost (e.g. the disk +fails), the data is gone forever. + +`RF=2`, despite having an extra replica, entails many of the same problems `RF=1` does. When M3DB is configured to +perform quorum writes and reads (the default), as soon as a single node is down (for planned maintenance or an unplanned +disruption) clients will be unable to read or write (as the quorum of 2 nodes is 2). Even if clients relax their +consistency guarantees and read from the remaining serving node, users may experience flapping results depending on +whether one node had data for a time window that the other did not. + +Finally, it is only recommended to run with an odd number of replicas. Because the quorum size of an even-RF `N` is +`(N/2)+1`, any cluster with an even replica factor N has the same failure tolerance as a cluster with `RF=N-1`. "Failure +tolerance" is defined as the number of [isolation groups][isolation-group] you can concurrently lose nodes across. The +following table demonstrates the quorum size and failure tolerance of various RF's, inspired by etcd's [failure +tolerance][failure-tolerance] documentation. + +| Replica Factor | Quorum Size | Failure Tolerance | +|:-:|:-:|:-:| +| 1 | 1 | 0 | +| 2 | 2 | 0 | +| 3 | 2 | 1 | +| 4 | 3 | 1 | +| 5 | 3 | 2 | +| 6 | 4 | 2 | +| 7 | 4 | 3 | + +### Upgrading hosts in a deployment + +When an M3DB node is restarted it has to perform a bootstrap process before it can serve reads. During this time the node will continue to accept writes, but will not be available for reads. + +Obviously, there is also a small window of time during between when the process is stopped and then started again where it will also be unavailable for writes. + +## Deployment across multiple availability zones in a region + +For deployment in a region, it is recommended to set the `isolationGroup` host attribute to the name of the availability zone a host is in. + +In this configuration, shards are distributed among hosts such that each will not be placed more than once in the same availability zone. This allows an entire availability zone to be lost at any given time, as it is guaranteed to only affect one replica of data. + +For example, in a multi-zone deployment with four shards spread over three availability zones: + +![Replication Region](replication_region.png) + +Typically, deployments have many more than four shards - this is a simple example that illustrates how M3DB maintains availability while losing an availability zone, as two of three replicas are still intact. + +## Deployment in a single zone + +For deployment in a single zone, it is recommended to set the `isolationGroup` host attribute to the name of the rack a host is in or another logical unit that separates groups of hosts in your zone. + +In this configuration, shards are distributed among hosts such that each will not be placed more than once in the same defined rack or logical unit. This allows an entire unit to be lost at any given time, as it is guaranteed to only affect one replica of data. + +For example, in a single-zone deployment with three shards spread over four racks: + +![Replication Single Zone](replication_single_zone.png) + +Typically, deployments have many more than three shards - this is a simple example that illustrates how M3DB maintains availability while losing a single rack, as two of three replicas are still intact. + +## Deployment across multiple regions + +For deployment across regions, it is recommended to set the `isolationGroup` host attribute to the name of the region a host is in. + +As mentioned previously, latency and bandwidth costs may increase when using clusters that span regions. + +In this configuration, shards are distributed among hosts such that each will not be placed more than once in the same region. This allows an entire region to be lost at any given time, as it is guaranteed to only affect one replica of data. + +For example, in a multi-region deployment with four shards spread over five regions: + +![Replication Global](replication_global.png) + +Typically, deployments have many more than four shards - this is a simple example that illustrates how M3DB maintains availability while losing up to two regions, as three of five replicas are still intact. + +[1107]: https://github.com/m3db/m3/issues/1107 +[failure-tolerance]: https://github.com/etcd-io/etcd/blob/cca0d5c1bed134ac30e1354241f7655d2a118db4/Documentation/faq.md#what-is-failure-tolerance +[isolation-group]: ./placement_configuration.md#isolation-group diff --git a/docs-beta/content/operational_guide/replication_between_clusters.md b/docs-beta/content/operational_guide/replication_between_clusters.md new file mode 100644 index 0000000000..cc731de9cb --- /dev/null +++ b/docs-beta/content/operational_guide/replication_between_clusters.md @@ -0,0 +1,73 @@ +# Replication between clusters (beta) + +## Overview + +M3DB clusters can be configured to passively replicate data from other clusters. This feature is most commonly used when operators wish to run two (or more) regional clusters that function independently while passively replicating data from the other cluster in an eventually consistent manner. + +The cross-cluster replication feature is built on-top of the [background repairs](repairs.md) feature. As a result, it has all the same caveats and limitations. Specifically, it does not currently work with clusters that use M3DB's indexing feature and the replication delay between two clusters will be at least (`block size` + `bufferPast`) for data written at the beginning of a block for a given namespace. For use-cases where a large replication delay is unacceptable, the current recommendation is to dual-write to both clusters in parallel and then rely upon the cross-cluster replication feature to repair any discrepancies between the clusters caused by failed dual-writes. This recommendation is likely to change in the future once support for low-latency replication is added to M3DB in the form of commitlog tailing. + +While cross-cluster replication is built on top of the background repairs feature, background repairs do not need to be enabled for cross-cluster replication to be enabled. In other words, clusters can be configured such that: + +1. Background repairs (within a cluster) are disabled and replication is also disabled. +2. Background repairs (within a cluster) are enabled, but replication is disabled. +3. Background repairs (within a cluster) are disabled, but replication is enabled. +4. Background repairs (within a cluster) are enabled and replication is also enabled. + +## Configuration + +**Important**: All M3DB clusters involved in the cross-cluster replication process must be configured such that they have the exact same: + +1. Number of shards +2. Replication factor +3. Namespace configuration + +The replication feature can be enabled by adding the following configuration to `m3dbnode.yml` under the `db` section: + +```yaml +db: + ... (other configuration) + replication: + clusters: + - name: "some-other-cluster" + repairEnabled: true + client: + config: + service: + env: + zone: + service: + cacheDir: /var/lib/m3kv + etcdClusters: + - zone: + endpoints: + - : +``` + +Note that the `repairEnabled` field in the configuration above is independent of the `enabled` field under the `repairs` section. For example, the example above will enable replication of data from `some-other-cluster` but will not perform background repairs within the cluster the M3DB node belongs to. + +However, the following configuration: + +```yaml +db: + ... (other configuration) + repair: + enabled: true + + replication: + clusters: + - name: "some-other-cluster" + repairEnabled: true + client: + config: + service: + env: + zone: + service: + cacheDir: /var/lib/m3kv + etcdClusters: + - zone: + endpoints: + - : +``` + +would enable both replication of data from `some-other-cluster` as well as background repairs within the cluster that the M3DB node belongs to. diff --git a/docs-beta/content/operational_guide/replication_global.png b/docs-beta/content/operational_guide/replication_global.png new file mode 100644 index 0000000000000000000000000000000000000000..a915b4cc3c408f14d7867841ecd7dd4b06ce91b3 GIT binary patch literal 36892 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 literal 0 HcmV?d00001 diff --git a/docs-beta/content/operational_guide/replication_region.png b/docs-beta/content/operational_guide/replication_region.png new file mode 100644 index 0000000000000000000000000000000000000000..de6a7ed468acd40ed0fe41038b5cb6b49715a86e GIT binary patch literal 23951 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 literal 0 HcmV?d00001 diff --git a/docs-beta/content/operational_guide/replication_single_zone.png b/docs-beta/content/operational_guide/replication_single_zone.png new file mode 100644 index 0000000000000000000000000000000000000000..bbca296dc74126a8f7eea4c5b8d76a303f263c30 GIT binary patch literal 16165 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 +``` + +3) Confirm m3dbnode has finished bootstrapping. + +``` +20:10:12.911218[I] updating database namespaces [{adds [default]} {updates []} {removals []}] +20:10:13.462798[I] node tchannelthrift: listening on 0.0.0.0:9000 +20:10:13.463107[I] cluster tchannelthrift: listening on 0.0.0.0:9001 +20:10:13.747173[I] node httpjson: listening on 0.0.0.0:9002 +20:10:13.747506[I] cluster httpjson: listening on 0.0.0.0:9003 +20:10:13.747763[I] bootstrapping shards for range starting ... +... +20:10:13.757834[I] bootstrap finished [{namespace metrics} {duration 10.1261ms}] +20:10:13.758001[I] bootstrapped +20:10:14.764771[I] successfully updated topology to 3 hosts +``` + +4) Repeat steps 2 and 3 until all nodes have been upgraded. + +### Kubernetes + +If running `M3DB` on Kubernetes, upgrade by completing the following steps. + +1. Identify the version of m3dbnode to upgrade to [on Quay](https://quay.io/repository/m3db/m3dbnode?tab=tags). + +2. Replace the Docker image in the `StatefulSet` manifest (or `m3db-operator` manifest) to be the new version of m3dbnode. + +```yaml +spec: + image: quay.io/m3db/m3dbnode:$VERSION +``` + +3. Once updated, apply the updated manifest and a rolling restart will be performed. + +```bash +kubectl apply -f +``` + +### Downgrading + +The `upgrading` steps above can also be used to downgrade M3DB. However, it is important to refer to the release notes to make sure that versions are +backwards compatible. + +## m3coordinator + +`m3coordinator` can be upgraded using similar steps as `m3dbnode`, however, the images can be [found here](https://quay.io/repository/m3db/m3coordinator) instead. + +## m3query + +`m3query` can be upgraded using similar steps as `m3dbnode`, however, the images can be [found here](https://quay.io/repository/m3db/m3query) instead. + +## m3aggregator + +`m3aggregator` can be upgraded using similar steps as `m3dbnode`, however, the images can be [found here](https://quay.io/repository/m3db/m3aggregator) instead. diff --git a/docs-beta/content/overview/components.md b/docs-beta/content/overview/components.md new file mode 100644 index 0000000000..e734e29a65 --- /dev/null +++ b/docs-beta/content/overview/components.md @@ -0,0 +1,17 @@ +# Components + +## M3 Coordinator + +M3 Coordinator is a service that coordinates reads and writes between upstream systems, such as Prometheus, and M3DB. It is a bridge that users can deploy to access the benefits of M3DB such as long term storage and multi-DC setup with other monitoring systems, such as Prometheus. See [this presentation](https://schd.ws/hosted_files/cloudnativeeu2017/73/Integrating%20Long-Term%20Storage%20with%20Prometheus%20-%20CloudNativeCon%20Berlin%2C%20March%2030%2C%202017.pdf) for more on long term storage in Prometheus. + +## M3DB + +M3DB is a distributed time series database that provides scalable storage and a reverse index of time series. It is optimized as a cost effective and reliable realtime and long term retention metrics store and index. For more details, see the [M3DB documentation](../m3db/). + +## M3 Query + +M3 Query is a service that houses a distributed query engine for querying both realtime and historical metrics, supporting several different query languages. It is designed to support both low latency realtime queries and queries that can take longer to execute, aggregating over much larger datasets, for analytical use cases. For more details, see the [query engine documentation](../query_engine/). + +## M3 Aggregator + +M3 Aggregator is a service that runs as a dedicated metrics aggregator and provides stream based downsampling, based on dynamic rules stored in etcd. It uses leader election and aggregation window tracking, leveraging etcd to manage this state, to reliably emit at-least-once aggregations for downsampled metrics to long term storage. This provides cost effective and reliable downsampling & roll up of metrics. These features also reside in the M3 Coordinator, however the dedicated aggregator is sharded and replicated, whereas the M3 Coordinator is not and requires care to deploy and run in a highly available way. There is work remaining to make the aggregator more accessible to users without requiring them to write their own compatible producer and consumer. diff --git a/docs-beta/content/overview/media.md b/docs-beta/content/overview/media.md new file mode 100644 index 0000000000..6b6461b4f1 --- /dev/null +++ b/docs-beta/content/overview/media.md @@ -0,0 +1,33 @@ +# Media + +## Blogs + +- [M3: Uber’s Open Source, Large-scale Metrics Platform for Prometheus](https://eng.uber.com/m3) By Rob Skillington - Aug 7, 2018. + +- [Building a Query Engine for High Cardinality Time Series Data](https://eng.uber.com/billion-data-point-challenge) By Nikunj Aggarwal and Ben Raskin - Dec 10, 2018. + +## Recorded Talks + +- [OSCON 2019: Large-Scale Automated Storage on Kubernetes](https://youtu.be/N9A7xSE9n-c) By Matt Schallert - Jul 18, 2019. [Slides](https://schallert.io/OSCON%20Large-Scale%20Automated%20Storage%20on%20Kubernetes.pdf) + +- [How to get the 30,000 ft view, 1 ft view and everything in between without breaking the bank](https://vimeo.com/341146220) By Martin Mao - June 5, 2019. [Slides](https://www.slideshare.net/MartinMao/monitorama-2019-pdx-martin-mao) + +- [M3 and Prometheus, Monitoring at Planet Scale for Everyone](https://kccnceu19.sched.com/event/MPbX/m3-and-prometheus-monitoring-at-planet-scale-for-everyone-rob-skillington-uber) By Rob Skillington - May 22, 2019. [Video](https://www.youtube.com/watch?v=EFutyuIpFXQ) + +- [Building Operators at Uber](https://www.youtube.com/watch?v=Ti5z1v-3jWA) By Matt Schallert & Paul Schooss - Mar 11, 2019. + +- [M3 and a new age of metrics and monitoring in an increasingly complex world](https://fosdem.org/2019/schedule/event/m3_and_a_new_age_of_metrics_and_monitoring_in_an_increasingly_complex_world/) By Rob Skillington - Feb 3, 2019. + +- [KubeCon Seattle 2018 Keynote: Smooth Operator♪: Large Scale Automated Storage with Kubernetes](https://www.youtube.com/watch?v=aDFm5KaTaOk) By Celina Ward & Matt Schallert - Dec 13, 2018. + +- [How to query millions of time series efficiently](https://www.youtube.com/watch?v=QmekBFUZnKE) By Martin Mao - Dec 10, 2018. [Slides](https://static.sched.com/hosted_files/opsummitna18/f7/OPS%20-%20How%20to%20query%20millions%20of%20time%20series%20efficiently.pdf) + +- [Learnings, patterns and Uber’s metrics platform M3, open sourced as a Prometheus long term storage backend](https://www.youtube.com/watch?v=mrq-TBXpztU) By Rob Skillington - Nov 5, 2018. [Slides](https://www.slideshare.net/NETWAYS/osmc-2018-learnings-patterns-and-ubers-metrics-platform-m3-open-sourced-as-a-prometheus-long-term-storage-backend-by-rob-skillington) + +- [Adventures in building a high-volume Time-Series Database](https://www.youtube.com/watch?v=W9duNO2dauc) By Richard Artoul & Prateek Rungta - Nov 4, 2018. + +- [PromCon 2018 Lightning Talk: M3 with Prometheus](https://www.youtube.com/watch?v=_L5RjJ7MVv4&t=1675) by Nikunj Aggarwal - Aug 9, 2018. + +- [PromCon 2018 Panel Discussion: Prometheus Long-Term Storage Approaches](https://youtube.com/watch?v=3pTG_N8yGSU) including highlights of the M3 stack by Nikunj Aggarwal - Aug 9, 2018. + +- [Putting billions of time series to work at Uber with autonomous monitoring](https://vimeo.com/274821002) By Prateek Rungta - Jun 6, 2018. [Slides](http://bit.ly/m3db-monitorama2018) diff --git a/docs-beta/content/overview/motivation.md b/docs-beta/content/overview/motivation.md new file mode 100644 index 0000000000..14e175d81e --- /dev/null +++ b/docs-beta/content/overview/motivation.md @@ -0,0 +1,3 @@ +# Motivation + +We decided to open source the M3 platform as a scalable remote storage backend for Prometheus and Graphite so that others may attempt to reuse our work and avoid building yet another scalable metrics platform. As documentation for Prometheus states, it is limited by single nodes in its scalability and durability. The M3 platform aims to provide a turnkey, scalable, and configurable multi-tenant store for Prometheus, Graphite and other standard metrics schemas. diff --git a/docs-beta/content/performance/index.md b/docs-beta/content/performance/index.md new file mode 100644 index 0000000000..8767efd545 --- /dev/null +++ b/docs-beta/content/performance/index.md @@ -0,0 +1,3 @@ +# Performance configurations and settings for M3DB and m3query + +**Please note:** This documentation is a work in progress and more detail is required. diff --git a/docs-beta/content/performance/m3db/index.md b/docs-beta/content/performance/m3db/index.md new file mode 100644 index 0000000000..5133851822 --- /dev/null +++ b/docs-beta/content/performance/m3db/index.md @@ -0,0 +1,3 @@ +## Performance configurations + + diff --git a/docs-beta/content/performance/m3query/index.md b/docs-beta/content/performance/m3query/index.md new file mode 100644 index 0000000000..aec029afbc --- /dev/null +++ b/docs-beta/content/performance/m3query/index.md @@ -0,0 +1,3 @@ +## Performance configurations + +Below are some common configurations related to performance for the query engine. diff --git a/docs-beta/content/query_engine/api/index.md b/docs-beta/content/query_engine/api/index.md new file mode 100644 index 0000000000..af8329854d --- /dev/null +++ b/docs-beta/content/query_engine/api/index.md @@ -0,0 +1,101 @@ +# API + +**Please note:** This documentation is a work in progress and more detail is required. + +## Query using PromQL + +Query using PromQL and returns JSON datapoints compatible with the Prometheus Grafana plugin. + +### URL + +`/api/v1/query_range` + +### Method + +`GET` + +### URL Params + +#### Required + +- `start=[time in RFC3339Nano]` +- `end=[time in RFC3339Nano]` +- `step=[time duration]` +- `target=[string]` + +#### Optional + +- `debug=[bool]` +- `lookback=[string|time duration]`: This sets the per request lookback duration to something other than the default set in config, can either be a time duration or the string "step" which sets the lookback to the same as the `step` request parameter. + +### Header Params + +#### Optional + +--8<-- +docs/common/headers_optional_read_write.md +--8<-- + +### Data Params + +None. + +### Sample Call + + +```bash +curl 'http://localhost:7201/api/v1/query_range?query=abs(http_requests_total)&start=1530220860&end=1530220900&step=15s' +{ + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "code": "200", + "handler": "graph", + "method": "get" + }, + "values": [ + [ + 1530220860, + "6" + ], + [ + 1530220875, + "6" + ], + [ + 1530220890, + "6" + ] + ] + }, + { + "metric": { + "code": "200", + "handler": "label_values", + "method": "get" + }, + "values": [ + [ + 1530220860, + "6" + ], + [ + 1530220875, + "6" + ], + [ + 1530220890, + "6" + ] + ] + } + ] + } +} +``` diff --git a/docs-beta/content/query_engine/architecture/blocks.md b/docs-beta/content/query_engine/architecture/blocks.md new file mode 100644 index 0000000000..80e76b2d35 --- /dev/null +++ b/docs-beta/content/query_engine/architecture/blocks.md @@ -0,0 +1,61 @@ +# Blocks + +**Please note:** This documentation is a work in progress and more detail is required. + +## Overview + +The fundamental data structures that M3 Query uses are `Blocks`. `Blocks` are what get created from the series iterators that M3DB returns. A `Block` is associated with a start and end time. It contains data from multiple time series stored in columnar format. + +Most transformations within M3 Query will be applied across different series for each time interval. Therefore, having data stored in columnar format helps with the memory locality of the data. Moreover, most transformations within M3 Query can work in parallel on different blocks which can significantly increase the computation speed. + +## Diagram + +Below is a visual representation of a set of `Blocks`. On top is the M3QL query that gets executed, and on the bottom, are the results of the query containing 3 different Blocks. + +``` + ┌───────────────────────────────────────────────────────────────────────┐ + │ │ + │ fetch name:sign_up city_id:{new_york,san_diego,toronto} os:* │ + │ │ + └───────────────────────────────────────────────────────────────────────┘ + │ │ │ + │ │ │ + │ │ │ + ▼ ▼ ▼ + ┌────────────┐ ┌────────────┐ ┌─────────────┐ + │ Block One │ │ Block Two │ │ Block Three │ + └────────────┘ └────────────┘ └─────────────┘ + ┌──────┬──────┬──────┐ ┌──────┬──────┬──────┐ ┌──────┬──────┬──────┐ + │ t │ t+1 │ t+2 │ │ t+3 │ t+4 │ t+5 │ │ t+6 │ t+7 │ t+8 │ + ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ +┌───────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ +│ name:sign_up │ │ │ │ │ │ │ │ │ │ │ │ │ +│ city_id:new_york os:ios │ │ 5 │ 2 │ 10 │ │ 10 │ 2 │ 10 │ │ 5 │ 3 │ 5 │ +└───────────────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ + ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ +┌───────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ +│ name:sign_up │ │ │ │ │ │ │ │ │ │ │ │ │ +│city_id:new_york os:android│ │ 10 │ 8 │ 5 │ │ 20 │ 4 │ 5 │ │ 10 │ 8 │ 5 │ +└───────────────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ + ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ +┌───────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ +│ name:sign_up │ │ │ │ │ │ │ │ │ │ │ │ │ +│ city_id:san_diego os:ios │ │ 10 │ 5 │ 10 │ │ 2 │ 5 │ 10 │ │ 8 │ 6 │ 6 │ +└───────────────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ + ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ ├──────┼──────┼──────▶ +┌───────────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ +│ name:sign_up │ │ │ │ │ │ │ │ │ │ │ │ │ +│ city_id:toronto os:ios │ │ 2 │ 5 │ 10 │ │ 2 │ 5 │ 10 │ │ 2 │ 5 │ 10 │ +└───────────────────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ + └──────┴──────┴──────┘ └──────┴──────┴──────┘ └──────┴──────┴──────┘ +``` + +## M3DB => M3 Query Blocks + +In order to convert M3DB blocks into M3 Query blocks, we need to consolidate across different namespaces. In short, M3DB namespaces are essentially different resolutions that metrics are stored at. For example, a metric might be stored at both 1min and 10min resolutions- meaning this metric is found in two namespaces. + +At a high level, M3DB returns to M3 Query `SeriesBlocks` that contain a list of `SeriesIterators` for a given timeseries per namespace. M3 Query then aligns the blocks across common time bounds before applying consolidation. + +For example, let's say we have a query that returns two timeseries from two different namespaces- 1min and 10min. When we create the M3 Query `Block`, in order to accurately consolidate results from these two namespaces, we need to convert everything to have a 10min resolution. Otherwise it will not be possible to perform correctly apply functions. + +> Coming Soon: More documentation on how M3 Query applies consolidation. diff --git a/docs-beta/content/query_engine/architecture/fanout.md b/docs-beta/content/query_engine/architecture/fanout.md new file mode 100644 index 0000000000..95a4bee4f6 --- /dev/null +++ b/docs-beta/content/query_engine/architecture/fanout.md @@ -0,0 +1,9 @@ +# Fetching and querying + +## Fetch fanout + +Since m3query does not currently have a view into the M3DB index, fanout to multiple clusters is rather complicated. Since not every metric is necessarily in every cluster (as an example, carbon metrics routed to a certain resolution), it is not trivial to determine which namespaces should be queried to return a fully correct set of recorded metrics. + +The general approach is therefore to attempt to fanout to any namespace which has a complete view of all metrics, for example, `Unaggregated`, and take that if it fulfills the query range; if not, m3query will attempt to stitch together namespaces with longer retentions to try and build the most complete possible view of stored metrics. + +For further details, please ask questions on [our gitter](https://gitter.im/m3db/Lobby), and we'll be happy to help! diff --git a/docs-beta/content/query_engine/architecture/functions.md b/docs-beta/content/query_engine/architecture/functions.md new file mode 100644 index 0000000000..578de59c9e --- /dev/null +++ b/docs-beta/content/query_engine/architecture/functions.md @@ -0,0 +1,71 @@ +# Function Processing + +## Supported Functions + +| M3QL | Prometheus | Graphite | +| ------ | ------ | ------ | +| abs/absolute | abs() | absolute(seriesList) | +| alias [alias] | | alias(seriesList, newName) | +| aliasByTags [tag] | | aliasByTags(seriesList, *tags) | +| aliasByBucket/aliasByHistogramBucket [tag] | | | +| anomalies [flags] | | | +| asPercent | / | asPercent(seriesList, total=None, *nodes) | +| avg/averageSeries [tag] | avg() | averageSeries(*seriesLists) | +| changed | | changed(seriesList) | +| constantLine [value] | | constantLine(value) | +| count | count() | countSeries(*seriesLists) | +| derivative | | derivative(seriesList) | +| diff | - | diffSeries(*seriesLists) | +| divideSeries | / | divideSeries(dividendSeriesList, divisorSeries) | +| eq/== [value] | == | removeBelowValue(seriesList, n)/removeAboveValue(seriesList, n) | +| ne/!= [value] | != | removeBelowValue(seriesList, n)/removeAboveValue(seriesList, n) | +| excludeByTag [tag, pattern] | | exclude(seriesList, pattern) | +| execute/exec [fetch] | | | +| fallbackSeries [replacement] | | fallbackSeries(seriesList, fallback) | +| fetch | | | +| ge/=> [value] | >= | removeBelowValue(seriesList, n) | +| gt/> [value] | > | removeBelowValue(seriesList, n) | +| head [limit] | topk() | highest(seriesList, n=1, func='average') | +| histogramCDF [idTag, rangeTag, value] | | | +| histogramPercentile [idTag, rangeTag, percentileValue] | | | +| identity [name] | | identity(name) | +| integral | | integral(seriesList) | +| intersect [tags] | and/or | | +| isNonNull | | isNonNull(seriesList) | +| jainCP | | | +| keepLastValue | | keepLastValue(seriesList, limit=inf) | +| le/<= [value] | <= | removeAboveValue(seriesList, n) | +| logarithm | ln() | logarithm(seriesList, base=10) | +| lt/< [value] | < | removeAboveValue(seriesList, n) | +| max/maxSeries [tag] | max() | maxSeries(*seriesLists) | +| min/minSeries [tag] | min() | minSeries(*seriesLists) | +| moving [interval, func] | _over_time() | movingMax, movingMin, movingMedian, movingAverage, etc. | +| multiply/multiplySeries [tag] | * | multiplySeries(*seriesLists) | +| nonNegativeDerivative [maxValue] | | nonNegativeDerivative(seriesList, maxValue=None) | +| nPercentile [percentile] | | nPercentile(seriesList, n) | +| offset [amount] | | offset(seriesList, factor) | +| percentileOfSeries [n, true/false, tag] | | percentileOfSeries(seriesList, n, interpolate=False) | +| perSecond | rate() | perSecond(seriesList, maxValue=None) | +| promHistogramPercentile [percentileValue] | | | +| range [tag] | | rangeOfSeries(*seriesLists) | +| removeAbovePercentile [percentile] | | removeAbovePercentile(seriesList, n) | +| removeBelowPercentile [percentile] | | removeBelowPercentile(seriesList, n) | +| removeAboveValue [value] | | removeAboveValue(seriesList, n) | +| removeBelowValue [value] | | removeBelowValue(seriesList, n) | +| removeEmpty | | removeEmptySeries(seriesList, xFilesFactor=None) | +| scale [factor] | | scale(seriesList, factor) | +| scaleToSeconds [seconds] | | scaleToSeconds(seriesList, seconds) | +| setDiff [tags] | | | +| showAnomalyThresholds [level, model] | | | +| showTags [true/false, tagName(s)] | | | +| sort/sortSeries [avg, current, max, stddev, sum] | sort() | sortBy(seriesList, func='average', reverse=False) | +| stdev [points, windowTolerance] | stddev() | stdev(seriesList, points, windowTolerance=0.1) | +| sqrt/squareRoot | sqrt() | squareRoot(seriesList) | +| summarize [interval, func, alignToFrom] | | summarize(seriesList, intervalString, func='sum', alignToFrom=False) | +| sum/sumSeries [tag] | sum() | sumSeries(*seriesLists) | +| sustain [duration] | | | +| sustainedAbove & sustainedBelow | | | +| tail [limit] | bottomk() | lowest(seriesList, n=1, func='average') | +| timeshift [duration] | | timeShift(seriesList, timeShift, resetEnd=True, alignDST=False) | +| timestamp | timestamp() | | +| transformNull [value] | | transformNull(seriesList, default=0, referenceSeries=None) | diff --git a/docs-beta/content/query_engine/architecture/index.md b/docs-beta/content/query_engine/architecture/index.md new file mode 100644 index 0000000000..5fa51edfc2 --- /dev/null +++ b/docs-beta/content/query_engine/architecture/index.md @@ -0,0 +1,7 @@ +# Architecture + +**Please note:** This documentation is a work in progress and more detail is required. + +## Overview + +M3 Query and M3 Coordinator are written entirely in Go, M3 Query is as a query engine for [M3DB](https://m3db.github.io/m3/) and M3 Coordinator is a remote read/write endpoint for Prometheus and M3DB. To learn more about Prometheus's remote endpoints and storage, [see here](https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage). diff --git a/docs-beta/content/query_engine/config/annotated_config.md b/docs-beta/content/query_engine/config/annotated_config.md new file mode 100644 index 0000000000..26ffea59b3 --- /dev/null +++ b/docs-beta/content/query_engine/config/annotated_config.md @@ -0,0 +1,3 @@ +# Annotated Config + +Please [see here](./annotated_config.yaml) for a link to the annotated config. diff --git a/docs-beta/content/query_engine/config/annotated_config.yaml b/docs-beta/content/query_engine/config/annotated_config.yaml new file mode 100644 index 0000000000..4c7080847e --- /dev/null +++ b/docs-beta/content/query_engine/config/annotated_config.yaml @@ -0,0 +1,84 @@ +listenAddress: + type: "config" + value: "0.0.0.0:7201" + +logging: + level: info + +# metrics configuration +metrics: + scope: + prefix: "coordinator" + prometheus: + handlerPath: /metrics + listenAddress: 0.0.0.0:7203 # until https://github.com/m3db/m3/issues/682 is resolved + sanitization: prometheus + samplingRate: 1.0 + extended: none + +clusters: + - namespaces: + - namespace: default + type: unaggregated + retention: 48h + client: + config: + service: + env: default_env + zone: embedded + service: m3db + cacheDir: /var/lib/m3kv + etcdClusters: + - zone: embedded + endpoints: + - 127.0.0.1:2379 + seedNodes: + initialCluster: + - hostID: m3db_local + endpoint: http://127.0.0.1:2380 + writeConsistencyLevel: majority + readConsistencyLevel: unstrict_majority + writeTimeout: + # fetchTimeout defines the fetch timeout for any given query. + # The default is 30s and the max is 5m. + fetchTimeout: + connectTimeout: 20s + writeRetry: + initialBackoff: 500ms + backoffFactor: 3 + maxRetries: 2 + jitter: true + fetchRetry: + initialBackoff: 500ms + backoffFactor: 2 + maxRetries: 3 + jitter: true + backgroundHealthCheckFailLimit: 4 + backgroundHealthCheckFailThrottleFactor: 0.5 + +readWorkerPoolPolicy: + grow: + size: + +writeWorkerPoolPolicy: + grow: + size: + +tagOptions: + # See here for more information: http://m3db.github.io/m3/how_to/query/#id-generation + idScheme: + +# lookbackDuration defines, at each step, how long we lookback until we see a non-NaN value. +# If not set, we default to 5m, which matches Prometheus. +lookbackDuration: + +# ResultOptions are the result options for query. +resultOptions: + # KeepNans keeps NaNs before returning query results. + # The default is false, which matches Prometheus + keepNans: + +# Enables local jaeger tracing. See https://www.jaegertracing.io/docs/1.9/getting-started/ +# for quick local setup (which this config will send data to). +tracing: + backend: jaeger diff --git a/docs-beta/content/query_engine/index.md b/docs-beta/content/query_engine/index.md new file mode 100644 index 0000000000..108332327f --- /dev/null +++ b/docs-beta/content/query_engine/index.md @@ -0,0 +1,3 @@ +# M3 Query, a distributed query engine for M3DB and Prometheus + +**Please note:** This documentation is a work in progress and more detail is required. diff --git a/docs-beta/content/query_engine/roadmap.md b/docs-beta/content/query_engine/roadmap.md new file mode 100644 index 0000000000..dd4f622fa0 --- /dev/null +++ b/docs-beta/content/query_engine/roadmap.md @@ -0,0 +1,44 @@ +# Roadmap + +## Q3-Q4 2019: M3QL support + +- Complete support for the [M3 Query Language (M3QL)](architecture/functions.md) + +## Q1-Q2 2019: Graphite and Prometheus feature parity + +- Ingestion and querying support for Graphite (Added in v0.5.0: [#1308](https://github.com/m3db/m3/pull/1308)) +- Full support for Prometheus functions (Added in v0.6.0: [#1367](https://github.com/m3db/m3/pull/1367) and [#1373](https://github.com/m3db/m3/pull/1373)) +- Tracing support using [Jaeger](https://www.jaegertracing.io/) (Added in v0.7.0: [#1321](https://github.com/m3db/m3/pull/1321)) +- Basic cost accounting: (Currently in master: [#1207](https://github.com/m3db/m3/pull/1207)) +- Performance improvements: (Ongoing) + +## Q3-Q4 2018: Dashboards can directly interact with M3 Query or M3 Coordinator to get data from M3DB (Q3-Q4 2018) + +- Write a PromQL parser. +- Write the current M3QL interfaces to conform to the common DAG structure. +- Suggest auto aggregation rules. +- Provide advanced query tracking to figure out bottlenecks. + +## Q2 2018: M3 Query and optimizations for M3 Coordinator (Q2 2018) + +- Dedicated query engine service, M3 Query. +- Support authentication and rate limiting. +- Cost accounting per query and memory management to prevent M3 Query and M3 Coordinator from going OOM. +- Push computation to storage nodes whenever possible. +- Execution state manager to keep track of running queries. +- Port the distributed computation to M3 Query service. + +## Q1 2018: Launch M3 Coordinator as a bridge for the read/write path of M3DB into open source + +### Late Q1 2018: V2 + +- Support cross datacenter calls with remote aggregations. +- Benchmark the performance of the coordinator and M3DB using popular datasets. +- Support for multiple M3DB clusters. + +### Early Q1 2018: V1 + +- Create a gRPC/Protobuf service. +- Handlers for Prometheus remote read/write endpoints. +- Perform fanout to M3DB nodes. +- Tooling to set up M3 Coordinator alongside Prometheus. diff --git a/docs-beta/content/theme/__init__.py b/docs-beta/content/theme/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs-beta/content/theme/assets/images/M3-logo.png b/docs-beta/content/theme/assets/images/M3-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d10c4af195749048c715c88b9df311cd06ce620a GIT binary patch literal 126282 zcmbTebwHHg^9H)REG;D{CEb$Jl1rC_D4hz32nf>6u7Y$(ryw2DCA}7)Al;23sf5zC z_bh(CzkC0_e;}y)o_EfiiD#afLxi4=8VL~{5d;Du(NI^`hd|)qN4PWr9{5I)JNp}a zgSzXhDMBjyZ>&Qg2#AKV!hIj;uQ@`W`(wvPyN7-34-BaEo>f#-T-D%2%npv{ojcBz z8L%fJiJ#V=lpD6rc$)t1m~5FaEG!9u7n)XRQ5Qz#H4v~9yu0u0XrVBb$}X~snP;wK z@3Y+s>ijF?`$*V*>-P3>7T;mV;jFug4>J-1Bl!RG2LcYi1AoY_3@1lGpz!Y;))lYL z<-`y~*)NpENvUqV_~b>B5TI$bx-WY^FIh$0zlqXc3mQNCRaDDrYKh0KS=eDzYIjq4 zZ>nS0X?{P@`}UBq={)#(Z%R{hVUx;6%G3WmA$Du~^YKN@#JDfUc_H)L&z6PFQK|8$ zR|cltPihQv_B~k|H1$uUezuLTMt(IIer3f!6K%}lE@)Qe`4=k|kPQWat3%*Ooy5ys z-l8nYG35z0kXA3It;Fw;UVFbssvpm=w`ktE*K92=YZk~qXQk8-?Y@)U7WPU&n@*DO zg~9Z(!JG!pt*Y{|@{{(UbR%{<%Q4%oqN=h;qrxYX?IOy7|5&XiB!;?BuOg*H%fD_uxb(*{`rqg}rZnhuv}%6W1nMOMP|~ zH$%whZv!W>{sC@{!N8YXh6|-y=K6ef>r2t0#PJXUAIM`y?6#PhQM=7VCg*(u2@BP& zRKxz^-?l65bM||04|EXJg?4pD; zmls{o^B{QRq(Oe_4JRFP8tp5S5|nV=FV$a*ZTss<%w}UHE_Fd3{tiNj3@2k=VguTU zxZd+q-|ci*cF*rr8~@NSC&s6%-toj@bv5IFxAJEt(NeMciA_YuOc!aOvo*N zPt;cQrI3T}gT6(H9wm+;B~G%IUDc1AWD}BOYo&b8e@5FVfPh(VswQ1p%8r)xLr2rs z9X3o~s5ka90%RAd15<`hWIj}pKgLJN5qPZm;pjT(f7Kx68`UCO*(9M}?LA8u+KOBD;t0B4pTF;P zv4Rt5FV$H`!$by8;H*{^WHX-3rgBZdanL6HCHv=Ddh(_^9sFDcE7pz`5{|^I)Q4m3 z(Fon#F#nY!zd)<&30L=8D&yWJsT-qMZAVA%vNp@SqcO|^+Pe%~(MO#902 zY+HuP`;zX_Kry&)D;ah|I44C};{DWz*PH)Le$z76MPpF8Dp)K13S)=l$@qPW1v~TM zSu}6Wxm~ELJg^hRxMOx4F5Xm^s;w^pBS>PlwhirXNuN2l^C&_OzKQF}D))?m{%2H9 zCP+9s#lnXg>`?tR(*67*lEbE;cZ2p~tL~J^Fyzgb7rEU8%JJOW#<^dH-4ZK{>)!GC@^LEJsPX=@Wf+3-p>>R)5}e!$hdVsr^*YqItTA^T%D7Nq*vF^(k4GVliEKtZkJsU2rPZ+42}T>Q?(rG zMQu%(z=Fv$TgX1)XURLcVGhWpPdICrump1rcm6rN>&X8n9gX{`%)&rFUHMy@ksMh4}0BL9&b9 zq$h>r?O#g?!KWslBX0?=Eo8K|CPIrgbcel0rumb;^J5(x6_1UW#}Eoepv*yj*TrRL zJBx{KPki%%z0Lizhhc0lz|wH`>bv&%eZFk8JO0{uGW2>kM5DkzGwbC6d%yag8*5%i zoO(HPT2enLU2g1cR-8B$x;T%JV?Wb|e%LO95WF^66{zDEE=^2DrltX2jdlT{ASi0& z^2LehPviA6w@$5jCUqZE$d0&_```R}iq$GNZnUq(j~27eM_;O;hhMTB=oM+X6tD+K zc#RnvKZq)x0j_@)714at*X_%zgj77)MR~(~I=X}&0&LvoHnR3Sw1bI@X}vt`46{Wv zXF0_IX_EvIu-pKpC)lv2d71ARcw+}+_HwP{O7ES8B^g2su_3gF@a>Q%&Q?Nw{}q~d zy|TiGwfnC&p-`+n-y&y*lD|+WAO^38ViS#T;BL3a&mh?~39gO(vl%t!CyH28pQRRh zRKY2?osiUQaI>l1Y{jCf|6H|%0?3B2)&l<7Sn$Cg>=a248>gd9lr?VYW3T8>|32{b z{OLP=5Dq@6p~D%^G8Y`f9z~S4WX=$G**{(L6lqy)U3Al&%zpl^FrNZ^s7f(0c~fvnEP*-=-7y zkqftHFccLpJ4*u_Y^A}ca@C-J1z&^uVZ2Q5F16?k z`yoKbTyAv|lGet!*L(LwV{At5CkOZ#66p;yj6U}F7S46+;j@r&E%esDD+2z5To(ww zd&9^t6asrnBpG!)CdMFu>!0!ZxBT7m`L1sprNr2!bMHgz6q??(OVbLuePFURRO%R| z5t7_SDY)Hg2*xbbaj7a?sE#HdK4cfwgNXT+H9V$|wC`g&MP%DHyaJUNA z3y%hd-gD&|iWP|zgi*R1)Ovg&lxoNDId2ol{>b@LXhC$H59Mh!vVn*AF;T;5C}eiWHsnGW?6;H3iI0hv7#ruwMv_gdI&?zQ ztoI{JcsMy$AUy)$pr3`vLF|LG>d80gOBn{~lbsBVytvp!eM014KFdg)7MhS?^;P`E z(-eFc?`t%psNIX1&A$1gdD6n|Z1Ddox}| z^E$2;LbnEQf~_ugLI@$4Zw|n|&!}j;$MsCwPp&xs89CWkkk2goU(BH~DUCp8dMqLA z4bge=YFa)(7{nBChOe9jFgQ6uA);s(k^Mcm(l~K!^Yk=KSoOIgFlcguMD&8naA(p+ zpsAf4!qK@U8EP= z{~g}J)3n7tw+o(&Y{~=4DnuKdzG78P9a+P*X@ZHY4po!6d|?fFwcjDqf8VV(N5g+J z=iv~W6bb-5Y|NT`Q~U#@ODvR1nfFTA3b!c0KmWlxP5eO>yT|Z6Va#ozKRmSVIRK2mO_~Tv;!1On5ek^Nu-{DUqm& zo-=x@7z@lA2*IDQpwKBSC6cp3zyOptcU zZWqMoEP}}j-x>zNJ-h%srcO$)z(#I^n$}<7kwO4Z5|(W1)1p%Y5W5GA+#x zUShMYNSnhoN*IB%8IZHSJ8q34JPyHWmLGKzs4{RQvEeQy$B@r;snsu3Ld2e`=t8&Q zo~eZ1YY7gBDv;=%z-fFCXZ`d7F${l_*%iTW{uckD+hO83GpT;JxD$I|v$)YFWf92j zF9&Ryb~=^3TXTiMVAD^bUX34R<&?t^0k|8rYMPc=IGEkt-|VuNG9ng9plkz?1wqVg zYC4G~&7|ho?J{F)r8hd61nefvBR*}$r~K!1nYMT**d)jtuLotrQ07PB8j>C-_q9H? zP`tJ#j!mEdC@}kEs4zc+r5ELUlwmmh7CWuJpXh{Lni;uI6Y`bO{@13QFO4rM6Mze! zZ^a#BtC$@{km0GzMk63F7ed<%($wdSM^Umz6%xK60AA{34%XFHIbhVY_`Wl~d7|?r z5!NFLfky~>meQlxiATi(jsMKyU;IeyLoEDz8@DF9N7I6Bu~^t?%}#iALrle4i3J-q zl|h{1czzee|3=n$2N^x018Ki5OixA9vJLjAfjmA2`1R#Y7Lt#`EX57O?5? zCkRvAYH`jKh(&(X9j~`k%QG&s{o56X|0ic5F^#XKJv>0|WlYLY5bQX9vmd&|ONfVm98 ze${jN9j(j20?8+XzY0cu!$1b zr(5^y*KB$jh?P+V{mCQT?4To+8ZSKu`g?RhIam#uUlUr<&3K6^<9qBoI_6h;1qy%2 zkDhA1^ddAaDx$(cqj+F^^UU7SIcKoyCiRm-qW^Tut-FZRa`?D%aDn}q+I|C3<3Ce{K;v+uJsgNTlgd1FR>Tqs zcG5C8D8g%jBXY+v*03!mBi*&+9fRLa95HPfP>x>WH=tbsVj7b-5vN+Vw)@G#yc0`q zzwd|rf5FW=PQBo1#^IW!R=-7glg;Jr7mn5UvDybIx(cSd8N4f~>A(5Aqfyfa_>&*h zYez|586J)#gYDl7Q}2$9`kXPav2k%8`1lp)KMO*j-Jv3C!z=E!t}6ipnR!5O;UU;~ zafMQWb@3JAd{lGl-G=$A4-yTb4;UL18!oLJES`qsS#v@zs2lv8u$})Vh<6>21SD~8 z;Eo{=X$W9|#K5}nd&|m^^FzX1&kQX3!oD&Xclzjj_+! zv4`V8JO9D%mEfX#=emE&HKza7st{B)K^i9Vmes4ql}CY%4XLIitH z9Gx?4mEv-gr*k;rcy5Q-fl@%RY5}@|b6WSYv6e;^wEI4_zBMQW&@m{Z(cW%!%FGbd zosV1|sLq_tigP(~#HJ|l?8~Q?sH&xi7bWy>?Pv*Ox{N;3vfgDuA~Qj3n;k6>fPdh; ztOD&<1^3XHwCYgRe|ZMzgn#y&elg^kpvWL<=`YbzSc0n9$f1Yef_rl zR66SHH{&>Y#3if(8dbb$&0bXptxQ2(vr1KaYI1Fun-Kip2{!=Lajs4;5o_?SN9Be0 zDhJmun20T$;Qx#T0=rA;qoKb(;JLuh{Nxp-An;%8BWiSV2xiv*aNtqn{LG=E>`_&; z`e?}i^m3P6$gMN2>~F#E6|OvTfm^Id#5Pch-{I0d_y>NynH`Kr#=M}(oc!!ZWsiUQ zS2oX8`hkgXs@p8YLUxL6;w85D$Kd257=xskOi<74Ns`4Jg8&4($2x-#yR6+oWPeOZ z^EZpeA64HlPg{YGxDJJjgPc3b_g(~cm!ib6PxFmyv+>len=F)<>;pKrPwMD2>4MJN zR*c!l3pD$YmCW%3*w@fJlAozr`#l7u>f^O`i?3)5jnqUm9el3(97t4#gdR@u3* z=_wnxf6}%Tv#Pxi^|xc_@b}ETcgMuxy_45s77vLn5{AcGiBFPsJU!*5w~PCV4sZUk zIMJ}YnI*igT{V)BqS%o$=^?K{y=T&?T=uDGuVG9uP-neP(yIS-C1%1ax2rX~QC`_* zK}VjxcD_mX^9nx+@&m{`PcnzF@E6?`sRr(owf|gH_?u zx1%pEP`$SEp4q!=XET1cQ~wu&mmFX)`gDpOun5_PCF>S)`YMa;g*#?UBDY|+<5NV|7uEfLwEN-7gr;;|ye z62EY_MO49>NGESGCIt1Xa)0a1m*=v3>9&t^;-?6paqyPJoRxC7KRvu0sk}a;L}LK$ z69ZE-M-&jj&8gGU$`iO!f()wmJB>Fh-P(h0Dnn4-glW%T7X~SiiRTQF?P=x29P1vw z@3_DAzJqb6X|Ddjf_~Ro?~>=Tpg$b!y)MeK^GF|IMbCA+IxP05z)6r)$T z{=UTa9h1pFwr(VAw_!_wo*>`aWocn2ihe4oJP>fMNhVX4I2m{njSPd8@8`~^=belz zbQsGHRt2bf&0XAXUX6@lY}6hLB9csHejD_NdVOP7NwDcC_d<5A__Q}tuGjM9=UWFX zn<+yf)M6NMo)Rr{Tr6D9vaLaRKN3_X;FW{+QsT;JJJd63l6Wz}Gri)bAXUc|?-4u8 zGOc(d#cFh5CgV=Srh99_u&zcZF7fWY&rI~MBt8JQGEm7O;4?_Y}oqlhOLji);9twK|P6e2#<&MM7HkgFDf#C z1T+ywxz|k!@SpuYDa1ePe;Nor*d)U0_a2HOc$ZU?qhGLA$iK0;ZjEz4W3xgubR$~l(kp-SP z7pwqT-0Hu1th=$@!`fb$&A3LrhmbGCKM~2{ed15VqF0HA7Lz2BFyxEzQ>rl*#mglE0hQ)sn20FJpM4M9VDCEkurh4=!oE*+I2bRlubK#~f{lt;g zR#rjSpAlW^R`7pwW{Qv@OlB*#wx4{58W$p0BtpxM?6|A<^7r&&zv^zMTx#ZpkXVWbZ8~NxmELXz-KC57fP02 zWO;M!N)VmCCwCs~8o%tBf*cA#HrR+(m$|~#s0faDthW-OI7L1ABbI;a45k&CzW@y- z$eirWF`;hR|6;aq3@)8$&tB7gQU4sl3~L##8~U96%iLnuWMIeWTXN_KhFYCnG!iii zkCp4pIomd9r@yo0s!edC2qT!Kg@2+_LH{WVu>kKAwlMyC!@;G!-DRfk8laF^LHeTN z|H`UY2C7w`?1N+8x%8QuQEi?$L=UdzsD`cIqlM$)x>MFO!hc-PnoHFn{7NH=` zU|;8tEG_6<_vXn58B~)w(xl2ZYvHvwpnn}T3@o^vB`WxfuQ#edQ1gIn+1vV9Ot7cT z?7qQVLoYaigAqA3gqpFC3j+#yW8g22AG2G|eZzU)xVbZr9#-}n@bA2fXS%N{;~pzc zr85Atl{U;7+5Igft5uC2NvKTYBep+ddynVA0M!Mn`+U{<89`Oz@HPBP(?cz@IP^Pv|Y%KECHM(Cp zdvq86D#M2wGyDT;Tt2KS%xN$b{3*W5C30Ux8_&W23B|KPe!HRM%vWue*=eX8CwEuaN$h6|5 z^$;&7w#xu*qPG*8+P#U%*CvF%BI{}>-{Yl#m2)J^SxsjICx*|1;xz#9dW$&1+MmpG zi=N5L{us`?CnQh)_w{hQ4?$bW#4bi5`t?#(lKj`U6}#QF>+JwH@DoM9-ecie`vq}~ z8!JG+F@4!e>_ibMp~P=pV1Q@%nk{a&_U7obt2ba2Ske%s!1{@t*tRxj%pfDUfWi&4 zLQZzCR%xW}OqFr8O1dzAb5dXm){xjp{biv<`Ysnc{qy;-`?*SFN81xBNsppR+mxzu z0yqkuUA+$QDF>j6Z4dNU4PQ`-h9r9Y&X{{a6zWC6tzex$A9TQ~4Ku&@L7WO0U=!$h z`OxDDQgCZpd;EAmZ18xz)}PAYwIab0i?waGv3s25fV^2*<9RzMb_E$*GDE3_W5GCm(SjJ*^4S^fu6g^OVQr20kcTCAa3 zp7^D#MePMWweEWU=^g}$AOsOW6P@??Ic`^0%?pppRt@hEx!2aXEsS_5ZT$1YHHBba z{PPDiPt{egn%_Y#_j3)_FDz9P;>QV^&E1tWGu=~+-i zBw^~QeZ%42v3jE+bi7b|{BEg{Q!~4@>Q>wSF~^5vvQmKK8zNup$VWV=t)zD)N+ndb z>A6Z-`05d@c)(2z6Q#&^kNPVhSJ*AqIKbdf>T-rHE#HhV^HL6)wb0x|ZPn2oMry1p zU=F-%?@^Y$XQ6?UgW{H}F*gEYk!X2m{#@FcI|-^CaOfn zp_po7nmTpw43~ua7&F_YJxr*q`FCt7+Q|K{iI7@ni7q`kR@>h;eG>K4hZ0(a8$HWc zv`}nvW5V(AMjW%b%-y-4A2dfTEZeQ~X9C344?-VD905ICT*!vTB2EY<$vW z7V(v+$xf`-l@dWbu^E$)q9lRZq(m0zBpo~oTmk%5CWvHCDT}nIj4s_xMaNY4c6oUs zMk3?vjI}$vm}JoKYr+<{56tcZvVb5&$=bs!*y4_NSwF$!Q6yd%8+V@iOQZ=0k41fL z#eV-~KCku!XJjUkr#y@MZeD(i?Z(TC_5%Eikpj&i{=cRd*IpvSp`gCpv9Lb#ePMU( zsGUKOR`%uKJisLfFY#vXm&4Jff{J7Pb1SFBNJJ;aBp>Lb*1-q9P%ZjlY-3xQ+Qkzl z9&L?jSy!blv3Xv@n5X{p9%gbv)KH?TmeIwHY+nfzK?<6y5ov_N-(im$uP}K@d5=XL z30)2Pk1KuNL*&{XY#S!9jFRUs9gRsyaS#q(A!dn7-T{>_%KEbMi!~sTVq3hCP3!7f z{eIBz7wD*%+yBT$JGD*5i8B0B0mdyT89-$Ntvrm|UBnv_t5Yz`F1&Z8Dz%X|*e>z` zxeX!{Aah?-OVQl~LCFZnssK!hZGlOOTnAL1sY#+=KcvWqh#>M5(Pltr^C$ZLlklw5 zYcA%#4O`|}42^@~T+d-$GR5**6Fta_iC+04!8mI&0$QLxf*kbF>R}>=-;v7f=q>27 zPk%^y@O`bLN+i4X|2+z&MBiyF?NFo#J|l3!MN%=!}Q`_d$Zg=Yub(2S0}_ z>-sffG;cdBTL4b*Iave&cJFCKwsi8WxThu-yo-q~h6pKaR8b(LaY%XJ`Wid_z;vIW zJ_@-2LdDtj;&y9zmP2UhS$50coeOJN?pO~nZ^MBDT}lnBFS4O*@);h$w)6fYLv}Hu z5!-!>KmH&~Vyx1Bh&}4KU!a?GEONoHA{0RaZ34OJ9fyYO(zOz2Nma5l`zOem5D9fw z;u^G8OUc4D;m3mw!iOgliZ{64U>UAmY8vk$h{@l)N(yViL0fdmk#`#737d6_Mrb-W z@uU9TVp&rKW=Wvi_fsRaOfWH$9O_&0!wjKGOy7o7qv6pe1?|V_(Qi9c9{rShI4aU| z=`~8sBS$q`y*SFTKQRF^FGU9}Y1Xeg%5g=RRuYJk(y5_sz=Di8_W}|B8XCJ|ek+(h zBx~+e2@%Z?^99U32geSHG7ILXfJI@x3)`P+FHn-p7lHK;2Z_uG-hHvHV*hPSUv>$W zJ{EtN=e42Cj4iPh;vm0U1*;uuI;UFLb|?;ci@S`8Xhury<4iqH7IbZcdOsK+ywbt$ z`x!NjterHElcdYY9FA@GJMYvBUvBHZIbkPb!xi)Pu8)Q#bSMN+Cj5g={%bzjq`puhE;7j+|E}dURU#d|1as8Lh5ihXCUBP}-aDwJV5I+&QjEkvBvhtpO<9 zgstEkr}#gW^p)OWVS}Sgc+m}1%dck%O(OL~MVRCtX(7%rpkzBvcamN+`m;zuZ+3T)s4%44g;jHNCO^1CQ<-2|W*D=8DPUZ#HM~ zg@FD)IGJ3t+{*Qj`aQua_VBfA93N)A0_4!%t6QsDX1!u6PZe?s8^s8>?5HoGRd z+~;gNHodU%9@E`ungV*LLSzvIZnY)HafG#r2M>F=jXrtdJ)&WFc?@J&E+{Y{6qbsw#?`oy&VUXIuK%slAcWx}&WE*^Hg z_mB-@zNGy8uF=S@DvtDijjNBJ2Ka;ueofgFnkVg3MV~R~q z)KHB7#>3#l^>j=-i^3uUOm%wy)CJ2jZu{i8T&_sIrk&g9P%tkiRII|8K(IyjlOlK}P|z0BAXVjr1(O$4|!`_kPXDEnT)6 zA+XQjKxuKmI9y$1p9?=<{{Az;XgF=PAWw0d+_m@nvgd0?H4~(~(_O~)g3od-OXL>M ze+pz5HCYU|=mh&y`IruuZuiV{eTxT^GmKih|FM9D1kqo{HBtl2bS1O&zCKFQPD8#* zPDr4%d$5T^xOsanrW&h4GRr*0s$Rz8renvk7Z_;7hD7#UEi%!wY2_-doEv~Sp3cqW z+n1wK%z8zL-|QBSC0dlwS+U$ZUnE^R?hZdn;B!i6Sk)PBIs$+@e89M?i7UNmA*ka^%x&P!o6s zSA33hXT&cPZPi`v?ZNX1TW*Ty)@2}ktdOS;X`W25r9 zV!2L*w18U;WwjP;MO?!m@GjX|j%TT2*?%KV(w7q`KYKe%NCGS=p)cAT!!y`8te3ro zovc%|sM*AxL=dFF5v(t7vu57_@owGJyIA#fDO~wZ+7=NXd18m&bSCEe(}vNPAl?90 zo$RvFMn4{Gru#6funsmXSFcX_fLds!s>OA87kquK4$}4QuEhCBo36-e zx+}h>M!MRL#_r_4@u3NcZU!pL3|8HA?-2+hp|2 z?J*mBwK8_JZPYcazV0&0U*zIrm*^03N(qSdql+|zB#fYy!JbvnO=E?j!F>DfIl{&%1a~QKmqH!D!KM% z-Oc+^n``lf(v7PbX#}6lplrV%>QigX^vV0rkT+b87crBwqWVf(B&}B`3iOV$RL2CB zUr|KnV4Gv9vW(@M4Bz(aOr{kVe}g6GE8ja};KJH!4&nigjAvv!Rd-E^bkKYwGbe%f z4$@s2nm!RerFx77Cj|0= zW#rX=r>(?{!?-MYG}QP?pl0P}DNTGL?ug;h5WDkbTLAP&P}9GL=za`%1|r*)n0TQr zf}n_cO>fR4L2_nJ&hos(w_?paO3`@Uoi%H9oVm8S!NsOKA;x0L|6Q(*IrJa-OjenHiNit$O46rf#ITw21VnXyacUR-% z#@6A1M-II%U_!%UdBxo?8?$}(H2vV8$AxF1)4D7Q%6F8s;aOLkCkfx(0gYk(Qp&=L zDHHNcd{_sFGCQH^ss-ZGcdNWJ-(Y5M4u+Q^MY6T~IBI8NQ@_X>IYm1Nu7ffYyXkoX zEPeTBg-G_Ua91W?iC6)Qp2JxuC6wPgR8;OmWI70fX(W%iTNA&CZ^+kW?k~zSd_5v4 z3xKi(Q;lrjn_XxO(7YVeAy==)GSgF9a)qbb3lry@TM0>7OrfL}G(zRXIP&j}7PCQffmFuu2b%g4%-syw(<*~gB}l~x7$v}}>&qp$R9=Pwm1HP>iO) z_fiD#m_fvY>`h9n&u$D%o9#!9UHlN8?3ZV^2@*(F>frfXIf9G%-^4P~1uy~|Dt{){ zFUE`)rVHL6;dd15VOgcXHnb7YL8oY78=rh!an?<>f7GysPEC6mF#jGYk$`peO?-Cf zPiai)ZgW7I{)?Rm>v9;S*+}j3II$QD##tMFW%`LPk+Lyb1D00mXZCZGZI)1x>Uq3hpREffx;rV&{W98T^u zJ#397l(`Pu(MNCGLAtBMd^ED!S~MW+E`9Cm&nynqvzdd!EOW*efE|r_L!bU$mA*~# zUusN1Xy1Ebd3}d??vb*_%w0)E*jy@3R$eNOs2cZUMUonDIJCWuLy{&kwk1^)Gh%Bx1ttBYK5RYfZaCB5;<)46|FG_@LXUE{#cQalWs zFN~cKyTOUutc6*>;!&zvMyQW8JH;*4{Rg24_AG!!BvAblYte1AS>S!pOHS;eJ{|D9 zRVdUag!L*N82P<&pZnumXUY36_uM3+21DFDG>Ie4PLo$u9R3By58Og4(F_HS6_q5+ zTw%9l9^Sl%?(wTw;?5@AnGkk-_!o|CjO;9?j_m_dV$HU|zajR$-Pp&j_rx^EF;3D) z0lqsg$KK;B{TqM*UGzo-=S&Ic+>QFZOtzrD7NTw4P{4bU!P-eApXvq#DG4F9Eh1oPQ{Y3f|x9_I$rg>^(VJJg=3 zQjs+An4ef{I`#uW31~nDUD2fM$*PT`lEPG$pOXnXD`|#lp=Fp$BS#8;r>uUwMm_W| zG$N7Zu=HOJe$6X_q7>EH<@@?3)nICpLL>P8bY?0ZJwb((|wl1 z?!IvvH5cLrn1(*c;%crW7*Ltn419zsqFuiG*%?tfNJvw6Klle1z|S^sqGFK$d>n!H zN8R~hqR(w!MDmQb_;C87evxn4=_c9FPqFf|&mM=;LY~p6RGsR{d*)8I&2PlL2(BuX zEtlt*&>V~RBfXHNEPD9g!3qwF|Me>^qbuivuV5*4K27x3)6ZT~BG7l|Hg~P5SfS_v zkOzLaUmLE`r;ez@KeUY3RpPN;Hqa>4iEkWtx10CeRHS87_-C_7WH1bHzxC0xMu(ey zf@h9NDKgipYvU$k<-fkGd+9e#n%u33)Pg*`70u}R!IZ5brgP{8=AP^m)RT59A-~M7 z3!H&?wc_?=JCRW=JAyqA3efxwP$Y88R~`5bW0MNmCYVW6^XOV#%G&b{BU)(F0^b z?LFq224}eSLiUUE9L@a>Z8uEvo#VJg$W`Hg`$Q4)y|(+A+|3l9t+vjPv#cKTq7@Do zr>PW`G4!HK-eSCGRF9D1Xqc%&c2tLywZC+YeV^DofohWB9ow0qG ze|!28U;=nVLmYkE27ldD+Tsv5F7lZm<#5AjvlQ>%bcjdF)9XB-YoK1DOa%gwGSLB< z-&`<8c~62gTXaQNKlw?5@3-FXgA6C&3@#6Xh1~V}^Ge6F=bX@v@;XIcC2|UuJryu% zEg@|(ZRWDwyW&Kt3mu1quf9u}F9#4$_Af@7^g^qc*ol};e$??G_WPoIHAU`&f6DvL zv-p;6bo`Hv1@)pH`0CvKWefBB*|*kEWTGl@BLO)-{FxOu4XVd}|80~VxIM7Va1#E= z=P=q+{>MnOSV98N@VK8@K#Q_2IYBx?JHIY%MPBLpwI!_0To8{+kfg?*UCAbK4Z*~W zT?A)I&+djVmQAG#|1k?@qUVO;>4fwxGZf_gLjU^^K^fS89npMF(>5aTVI zZ(s(1!I%07O$M_UrLty54*$uZn z_AJvcYRN`yctVkpf63XznvBQkof;UGnEKP*mPrMu3=P_K{(bj@1g3Q{443md+dOe1 zaz1gQpo7O*L^laL`%u&qj*IdkniSc;Ga<11i@qH@rTCTnu}ibsP2R4J7D!ymUE)kU z4(mcgDZ^P7wVVaP67t6qK49_paSB2dwzaDpk(eB^qGzW3reNOooXfwhexOacZtG4f zFJ0_&g1x)B7fIQkCzv5WlTqf|%XhY3%&Do0D`BmyFK5@KwDO|5Qti|4pLvpfhH^It zI^7Z_MNq!%`bd=S_v(p9+1WF^36uNk`%`J%92U=z0?G%c>Yuf%36xE8^EXAaFLJiF zK5URaf-3v+MKD0&ZIo%rn}hq|{ns>d%0!CBeJ9Ap{8_DkD>pmu>dKU6YAS)jY34np zWjCZvt*774!pRD0W$)O%Y%Q4T)8q#qNfU5IUb}&Wr~pCb!97kenQ@hK^8sIovG#{L zB;tG0VPenCSYoByai}y;*nmuqDrkK6q{N0@QWp!jKF|$oW+%(HzI7M(bya6$=X+Lp zC_%lcC{1Yx=yeEyy-b%SE8%eaf>Vv2H49qemJfD-agTX$yjH!Dp+2V{{;nbHY8!(o z>VrXogOp7D5=9yp0R1u#NFEga7@+4nCh=ZR4}OZF_^`B2`Xz0G!#VENK?+ldnDTc; z=5g5Z+3xmQ&Jrol_RbPn3X&j+2 ze0ob8-Ir9x@}nTIOQb#dy9lUi^+0pxwO@bPK{o&7p~lK6!@@D+!ex5cyE!=T7MAw) z#Xe}A`SW*&Em5p>oK<-oKd=85P>`x0049!t2(hh7241T%t-_lNGX?4SbsnVt+ox@yI|HCl zJ%ZE!^+n8isO6K-RDbh^U^gGLSMf7dMM=#w=)pxdYak*J89dU0lao@MeXrmq$C(>v z_`;BO(I*8KH;3`vb{3*2m{=B@5UXWujR8AVD4Np;v|!k|Qz=gtm<+Qa%$eV4^A3`& zLATdttV+_WOVgB6OvIBDp^YsYl!LGNe$vgg`5Xhnzr~r<^<73<_c(yr$kXM2EKqC{ zF0p};aYwTC8m0cJvIfW4&0Tl7%k;vnV-4t|hc`VeAay10NVu=%qQx`d@9u#U zV7(gF(4UjMoz8d}wNKs1Qhngy(+le|XJO+CP|P}A{sX+wmC)GVwF+wT?5V@&OAMZC z4qc5^n;{+UY+mViD}U%8hx>N!p47y-A+{sl&40Ij04y7TcUa#%jn_Vw(>yvNUeYEC zU6s0-coJRTWX@bim*rRnst!aNyi0ez%09nqk1;`3zso{2_fR+h%$8gZak>jHFK_5> z$Zd+LBp2%;VNyz4omFQy(U8Z}IH-DjPklRbnCDdcejlcNT2#7J;mD;%yH2wzPwMWp zX-3o0Ef+BQwF6TsBTGyeo=20mi5 zZT~~H05Ct#a+Q18Kj#ATs3fHqGGD)l3%0SC04C+VJ+F_aKP>1iq$}+rhB^lGHIRh) z-4*jZ0l^U+?Cxz=Ki)H4Y36~u`D)AXjV7?mo)vs?Q~qY0j(_Q|mJ*P9+Ni4!(0O#v9vM5Ej~U-LA-aqKNt_@C#94~_ zruD;p8tO@SerF;Zq&19|4Aaxf|5Rwx{ZR&8KCZWN1{n@%fcml8FBQv}DnmNFdUeXk z51Q9c%2jwkhJO$G|DFPwbay?NyIz}lm=ImoUP+wQxj*lgzLhezhsoTVewlQjjs7ZW zQoFp`(V(XEnt(?4NumBWuJ9CH`wHek_KAGYY1iWiH#ki1h{`{y}#U@lBt7es@i~o ze?%@E)tG7d>cPkE%@zn>fjKO*N`*Mov9R(PZ`0tu7%LsG0;u%}jo9Kr z>yK>E!K-ioiO&-L5?s#6^*{|%Lb}A)A0lU;6?!-}VqG+nI?a8bZe3!TG6SAwd8V4Q zr;9#FeV)z#qn~cWDzkq1-(`jKGOiJy6wAZlGOKSxI%Kdp-m#6yhC9I<(C{XTa3nH0 zP&0P;D`M*1pZbKROL-xvVfc#01W%Ny&ID~r)?*&+{+!|QEuQiTQ7wV)-2(aVl?@+| z&8q84DsvO()RjALI5O4@0I4N{3END^`1|p9g@HESQ|L&T79@+2wpp)h_2!4U+j-co z?L$^zA~k8F_Iq(IES$2DcO`zka@%~^&PE$|Nz8wJ-0nNqc_m!4rzUzNZFNsvEUf1P zZ6W`S>snW&LJ^;E-~JjaW;8y9nskJu8wY-{VZ&;e4E9^3YWTb=A_G1-7*;X$$qW@$ zDDMBfNn5Y=-(c%rtw8IpY31qR)puzv->#Ml0Z8%3_EsSeh|?_B*E-^A<{AemOpod6 zASZ9TUjj^wScegtJ<^i$46(er#I2}OaF&%v&L&=z`4nvphCX| zr)p+L@chZq>rQ{SDEj7gQ|C4NF5$RAP;L{Pl8@Y^9DO@9F;U#U8^~ zbJ>U4V)f6Dwi4gBGV=GgKlTO6Y=b*}je#TA0^`$h$*Xd%U~eehrSS2X*3wU=tI|Lo z-zB_F@yyge228lTQQi~F%Vvj?kE1p_wiXf;h@S*RH(QjI$E7x>R*>CGfoe{aInst*m1!KDN5v0o;2lG}G&2BeybS=+W-(c%dM14&z-y#ie_@uC3tpa)Ob zR(X;kY<{@idSXUG=aBMXj1t`P`SI_rL(Nt0NtUhsZcA2hY51&CFXn&03t-hUaP)G< zSg#)4wrTjadP!}AAGS)>PJ-Kht=j9YOwCdEytv};K)}Kc8r`mHEC)A)?z{=zyl98b zo3^j`rB`qB2y;y|G$aIoI~)|()eEEjhh~D{mU_y33x*50`J0Hc>-uD&r5*SJefK{+%BLwtY?L0AuUac+$?a zLki3ddzY-=F7qQ^fTBHYc2&z?wAK@)xTHGO`RuTQx*#M63;ssuP0c)~68HM#Cla21 z`w}$}bNmXV+}w1VO_hD@wUArX)%q+9ZYF*H8i!br?MmF2-l*WUunV8dX_cNuadNi2 zsqGMYVYc$pu}uTayvqnDdMCD>8yJ7kFubwS?YD#ZX}h034~AV&VFy3-Q)TL>3RLz&2{kImnA%N|%Iatmo_5ak@Uu)6eW!lij8J*5Y z4vBb0nRbl+SiQXQm&6*Mnp5-V8IN@m_L7neC}`a(E9FeUj<*zk-!~~kHdrO!8CfcP zs_N^4EdhR*npQLkjMoi#1vt>(ZE*tk)-KHCjsA0{HXdtvc3r;njm(8Vm-i8wX`oz$ zdSV5D*POk62U35Mf*ecCKF+iQZOOKM#;WI60j-sEw&Jx3I$ehX=lv@#z6V-p^O3-B zognmra|qGO%{BVvzwg@bA=%{q6I)F%lfMPFBxUF0nZM=Ogk_(~(fz{>UM&J%Ti-2w zTz^La(xRiJx#8QdyyTgQ~5ei1G$dv^ROB`B$BAHe(EYu#1460%>-Cmzw_P(1<~wD z@tE{C!FvPo=9TfrI8wlkTnO*q_mRf2zNdBm>3Zcvr}SA>pw??6YyfwK^#@t+hluRE zAN4#tnLhEMYB&IE#caZ-Pq)}}BlK@!=M2U($3pf?xu0`uttKKKki z&pTL^Vp`F3{ajMhZ;f*-+6PGv3j9*?dR`Ci_} zBQQocOQWlylzSL3IjxqkxUxTvwD4-N)nQ1o4nef&z|gt}(;E9yKh-HAG659euEMXz zdx?_eod9Y>;qwC3>u$N2_H+ILOEX&LP{pX|*2hSDXT5*F0l@+0UgR9V^f7iK9YU7c z$Wk~*Irw?dxm$OxJT4;=wD|O*6X@+WiVY(@=6d)svuM6NQkx5&8Pbb_S@+LfteW@W z;P(UY?9{u=HF_nz^<5HPn9gUp)J6qyU$b9K0sf5&5$N@&?Lr(f6x9d!^fSk9EiR>k zny<4!+Azq1?85QkXIj{}r62$|rm7@Prq6+2T&+Ga_W(0`P3`XnX6hdBz%Z{a zR@Boc+TJF`aD#hCgj7OZ3vi^8dAya@xr0BuUZw!n+?K9k(+=x8n$oDTNwu_g*ii87DU_pDl7_GyQ^VgE zfAY)neZ6k^rRcIm^-Z%ZoPjApPyP8m;xiIX#%Xc-SE?o7t01DGlDS&)El8#KB6uNx zy3{KXnSB4`3V_)p%veR{z@OB14xhKyoz_>-)6>?e-x*T?ze~VWqKr6@VVv&vujruK zHXG!9Dm?YCr13gK_UB(W9ao#JPd4YjKx#M(2N+H|>+f}|ckVS5NXUA3+DjFb<+aj>7rPh4!Mr`CQs#R(ibKh{Z=ZqF3V8{0LIv1c%C5wkO zW4;+`g=JUK@AHC|LMrzTuF3yH(^ZB=^?lu$VSu4qq`M^qq+9l!cT+>|Qp zT|dPJ?O=QoM4=pZnI|I@nZr4B7J^2;JY&1=l`- zs;;J`m^Gnq{_>$K&%Us>+71f&{`enr{nkFx>Ju$tr#oVwdS_Ph^qP6TWd!gtL2t+X z!?AlEn5q65u1*`DJE3|nv>kbz=MLaJ7CG0@#pU$Vefp--V|@!dk5g6set<#UAw+fj z9bn6eBJT@-v0U`4A6AI;37yGV=%>qKJ-o{j^Yv1@m;Z`n9@w}oDh~@GXI4_$#tAf~ zs@)eg_wA3={K?3g8|sX9$HdRb(ibfVJP1ZA&nBx)8cH73zK1^8?s#I<%8I$>x220WkZVs7f?Brl#~E#B9@LF6S47gaBBCOQn4wvr+W7kx0D;yeq>8^jVL z0lh-I1`4iBhChPR2P7;(2Lg1@_6t#DV!rt`M{mtF_%wAC;+0D=167wV7EMi_(*L7x zPxgPO9qY_wipTroxgRO25Dz-Pm~(VaX96$%9XR?$VVT06I@T;&gX+Vmeoy@KH=`&kMR8XBewl=9AP7Dll&ic&l(BL!Mty zW{y4(e7Yhkrn>}g@9&}p{?)ZVSeFAziYP$cdLA)<@%e6X>am!NqSP4b=fR)+dxA6L zVmzT202WY%x*;99tmnTMwuC;Ji`*(%k%Z9b#9n=Qlp?w=nf=cJ2T;#kJbU-ZwDuY5 zy*StShZU;wn0K{;MzCzcijSD6mC2AnEoq2J80Zi>Yz=u1Ug;=WPe z2A^dZ;%Ngq!3+BT1VV$Ooi)$Sw$XfjNxnbJMUnF!lsAhs$w82jqm?dS%u%3>O$Gh& z8WyktXg&^m9}rJQKpODsPWLZ9^87Y>tq)+D4%z<7)npTyjpbP%#mtNI#q2H!CZ%vU z8zku7%ON-BF}fFWzs~V6X};F7eX`m`^iUg!d!vvikyp}P3uP9i_e4AjNQ==+75v!7 zq!0ZiZ`JS5RI@Zj>i6i4GF0%_+Gjs$8-A#O_OJF!|NMAci!Ta=)~l^^(k_(ZzLpm^(?f50EEXl;v1rN z7SRH_h`urhn#{e8Z z5{jw|=TM=zuf!jPT>UzWiKMzSGoV>;1}=cgUzc27xA9R}Ix!e73j0P#3O3g-XjKy_ z4Pp^1Qp)MGfDA#EoMc>F?f|%xv~b34UB_R9aO6fkHvjt9T6?=`Wr8L6l^i68dLMuq zy^r@3bKxsXl6F$%+`Ds`-$}4Y*GXv;-?n8SZAwA~ zqR=8Z*XdYgm!x-+%>k6TVLBJx;qd3sj9D}u;~Tr({SPF+)-AE`7I?4bh9p?X(C{toiWTYaK~i3ThAG-!ux)Ctr=AH*V6zn3 zIBVL5yb3wu980avUGb-Ei-+<$8X5Gb8U6^;AN_v(|#Oi zDosl>d(w9Qcim&f^OMK>=laMB;&?HDuXS35{SUvVL+3BvVS0yucXpwqp&LZVchp8} zt(F`f?f_^Jbc0Gl)B)-h&OhSx@bE-g(_vn~R$wwhIY@!LuYJpG|Hy?1sPV$#0h+Nh zJ5MDqT!V(M+q8=iReKz3e#U~w=Qal2Yxj5WA|Moq-dsF?95kC!36Rd0_5-|sM)F%P zJ-YAmcQk2)0@t2K$jti}-D%>+#eXv&Wd+(b1O zk;T%R+-%ajbdP#ZXUjHWF&yz&z>9L2ph+kEpBJ1f`jv8okY&5e+ZiG^W8{p?)r(hY ztF5%LX*-KO&C>onKcuqy2lPI`wIRFQ(!VGwC&~4bWd8!342z%E1f11zt1g4mA9TLA z0aBfL?wd{>p;t4#16kgx&528D64raAG2ZQBw$K!*R`@%D#3|I)L}xVFq4lh&u^Cf#CS z+I(F}$UKC1i0fz8sjrG1U=O!{!*g_?VQFXFvSZ_ac^Dip`LxZ^mI(R$M_uC~bwjff0aX>OO85%5k&5IVn zp^^F=T}Rh@RN9Oq@jiJ5D0SrP-dhyEh$x9B$==%=!3v$hcG=Y$*zYv^HS+Oei5fKf z`Xh|^K06z5!gI(&$muLtnG__edYcrudp=H@m-OA(BUZhOdbpxJpJ_vxoj{}^%tFDX zwtMf%brbk|uv0969z9-9QV}&U+)_DQrE2ud2zSKLi}Dyik%`h^enyk9FJ_KxlUKia z@EBsAhBO+i=bX$c@3eFVHQFi97ogp^2&7fUf~ID^L}m$^e7YU~9e(JK1yR^b-onb} zwZaL%zp3xAA36K$3{TwjE-E zyKE=z0JJg(F?r@-U03;w3g!@e4xdqYkGqR zzWLYc?t&;DuhAWOnA$xL&{QNk&{_K1__y}OE=d~bXTY@Dw{2Q>v&&sC8DuN*-pGsd zW@rvu+JsYQA>HoWuODp|fSt|aMqcn_(igIx`v?0JET4 zRfZSur=S{)9+LKyJ_{0IduQMZJBaY};bCsC^=KRy+#`>(mnFx*LU7}K^c>dUB6kKF z^4sx92u0g=bI?p&J?g&^k5uszDh0i(W_odpIM;HebW z0rx&l7Q{NRKM^PXO}jC}TIA+$l#e6E!vmfggW*;?{6=?|sxOT8tA2WaV)QzJ({9mW zvYbSEZxrx`$gS#Dv$*4tzql@%p9P-`V0)BHGNq~+6{zAv{RHkKy=vv}PMeJW_GK81 zogWghzG~BL)c#BD&MUGx*m^n2Ag6WPCNSbu2hlT%J$r3$3_Y0tJ|rm2_G_>U4_w|f zDyA`Gy6=DQz%xV&XIwC= zWZPw6@A%Alsul5g_~*|pN5J23qusJr$_4{D`=j-B84qR6AB`ZVpRb-i5g{ z5tbmiB9i)|p3FMowj8h$5I`G~|MpuX8$OWSk(rOJjH3X#(zVR&G@Vuq3oqV1sJ_0J zbOf|^uACUiHby`BOmTnGqwmX~YO*$M)Lryxu?!$@0iHAC(rl={Qg-TYrZygXrF@MWwDt$~8Md^R9hz2@dGdE%IJn=F0?qp11+Hs=?2d^Myjt@m4Eapb~nGhM+XvEmzamjuAXct%r$ig zHZQA~mJ2*Ovf!<9<5!6V`FUpGERF|ThA!MBkq43R73q$#swP#s208=kRw*ozX0ioyweT#l*E(ksb|Q0s75{E^*4s>?+wA)7Jk|;~i9Yoi z6^9ILwHxtEvB=Fz4w)ryO{4m(ahpH13wm^_J-mEDV4CB2pB+j7wB)Dl?TgZyDJ*fp@> zzixdx`dK!=tWbs1uL!Wu)Xjt8mslwuthM_YUQRri2uK0P>|b@@(|(Nc2!0bO8WD=} zAesiektB$Isx7FC8Qi=J4c7E3B?U06irWIOO0xndw2YBgGE#tk^<@aaY-1Mk#-KEZ zO@*@j@~b6(qF6d)O?UBIC`ixwwMGKQqlB8GRTBp%N#TSVB2qx|V|uT2jpLmgN=>jv zJsi0PY+#%UTCQY)BL!1^+8qM7N9V`ujCu2naOQ%MD&;cygi0rKbvB7L5Ci@PGxl~G zPje~4W~3?`M^ohKy%ejBLF<=ap4YUr=fSWh6kQ4^a3N9WwM1 zkl%X+UvG>JSMQwt-Y^maKj6TqpE!10p5fD@Ee5>Ao0jUQ?Ib~w(y0OH*p27S4q(QWt1Q-JJ91W>(Q zy3E9I5VtRdg8_XTSJ4(405x&FG@yFd5+{sid6RJ0;+YchZRxF$g56eD>2vR~5q!cB zh8TE=+|ZnY;T1{}6NN?ns)gDG*r>pfZ`R44=bE8m2!KkEmXwJpIt34QJ%}@GXbA0o zskZtEvC0BUs{AESx3kxK&EZ?~gF{sO<1{}xdMP$w;YjMXm)ho7xv-`gpDed~X z!qhkYeXlHK5DnLhB4yM5=<62I*?UyA3h?-t(-jj(vHmt_HQ`MJO4mhz9ihwG8R z+V!TIt^a1G>yep1lYfWLIAb#+mFNdZM|3 z>QF9pQQ9rTwU*j7_@_m>VRBV;~(`~Lz10vS~vqt3^+V| zVLz~ny;2V>}5 z6P+4YoRl1(Uo3J>zxRo_r;GpyOs#Fh(9>FPo(ZKVz+gULC&iDu8C-yEr!2)*_cML= z6~+=j96%cHsBF5PG}n?n)I|n%V(p!BW_&;z6%0X6TalI<^V0(NP_pW)V~eXsZqxg% z!voYp?wdyb)q7jxt$IuoK&_|;t=M6G_ia%SD@On#d*mJwN6C5mNz4JC7m>Ig5 zgl8e|Od&!nnL_IZE>=}+cfp^<49yC}Kh3`LC;Ud0?yu4~{df7`yCPtA7y}CdNKiJH zM~mBPRiVVA7Gglpai7f1)?*DPI3evj$>OyYV!vS3!ecgWAM+ttoz2*Cq{@PbNs~Dh zIniO7%Kk*1!f+ec%H~i5^eL-0a|+T_x&4bEiz7@qlLx@z7K;Y~^Bur&R1UBWpfX%2 zz(jp$(WdbRo+JU?IXH8|zucN~7+alpt?ALY5&oDdxdy(v8Z?d?Y$rXR!qGwtXAsRi zt1njI=v;BYVJMMUz(N2Hhnv&E?NEebFGS&Wo-S%Vsf~u}9$S71$bvmvx`N}<_3zD3 zpBlr9Hy>bk#;N_ z8ghA2aapl0&Ft=sOeq93FN>dEO#U-4R00eEYqKs<3U3)%^?<}m5ou4ngi-2(`=fp2 zgFec@m8nr}n0kQ+a8mq3@D*jZFR@fmQPml|H{fjHW1M83u<*8!NuCHNX$t2J<5b@F zm(GuiTo#xqP1T-1|8z+enL}#&ocM_WDG|DZ>VEs=yv_B%+_^*qGAVW1Kj3;knn_^T zbH8~#aKBDqSaP^|J&&BQM2@~(5@m2SW=8q~7G|IO_)P{!Pb)r%!XJ@Md3YAgz6EoG zX=}}??MoXLR?#?yf?x&#XjTt0w@pt6~vJ30rX>WV(1ZWqH>j2SsS`X|}XgNenZ{9WhBv za2|_5$5Ha==Lb+YQX7iR+EnCrVG$^hxyjz1gA0sP2UEg6x?R{FM{V^x8$N;yIC{qj z#`!+-AM**yL7-rdGVfTZBF(^`DE*22yVQ7}&PrBJ z-@c&-)JH5iJEb(0uha1)dRrB~@e_i;UBCb}b#AP9DQ>Y={0%V9wC0TXn#vLv&c8tw z1Rlxuf5L>WUDEgIoM|Su z0n!^FC>#V`CNgS2;=Ot5>ecp31RoITKpw*ibl&=6K6E?ve>`ODr$ieG(F*vaGNipU z*ccsSkk>H2e-?JABo*;l;Y^TY`k1B8Hf9IE)q=`~; z5g5k=|9b#ZwJ*t?ov!?9w9pU`?BXMwQodW--xpEmEFi{m`W7wc%v|sY!_3V$&E+cR zMKH0E*mf{=f4PW5sIgI83a>*SzKFPtD5_j%AGi5&o#er{J9T`$l6{B)tzaZnx@Pdz zchvW#-D8X7E;fZi|2bE24un^g;+2yg5kz(+V7 z4XgpBxh24B9=iG7le$H{% zCy#<7`^JJoyph#~~4PfQhe_Pff;M+?RfEyPGYpux;{apO|Dc;0Kug zZ?xL#s`}_xWKhOwaJ6t`s6McRqS*M3)*g^X-pn5c$jShV?@Jsb__i#~EahpA@maJ8r%krFCiz6ZViP3O%`B zZTug@9GLLMqLFRMe!Z@Q{$nT61Il{30hO;GpQ*Zaq5?*^IP(JkFF6UUzx4Aq8E-+JuXblgzgX*j3v$a7{umq?bggR2^oN8HhIS ztOh^(vmc{MMdv$7Wy2ExnmLVeQdHNei)=H5I6c`a0gN=156kF zW3WH}$Bj-kix0dGPO_2(5}8*PFKo=;yxm$V(1ZzYA2|7FxSV`!SWDsf`;d~)Jx26f zW$czYCj9H_Z&EU0qtITGb~gYNrd_~h+ro0PgaS`<4NFM4O-OvXE!C6z82DTaQ}X9@ zCAcUk6~b!nbhtdiqU0--`*o^?2E}FM+n>fx@=BH&yWwJG-1n?I-17!$4W5gB5}Y4A zsGKlU%eVQpZam8t@Nf6*!*DyQ#6PsQTw#*Dzyb~+1ElXOyq^JOn4ui$a$VyhOHtyH#&tKjqoEa z7&P!{PSF)bqtJxngDyQ_XRVX?rM_1a?InE@KksWc_BSIQ)M}i{4ZhO_55W13T* zOK1qn(u;$(;aU81^#@-J=DQ2E=pFmazY$p@#~vID|InBDFjS-fC>J)W-!Kb z$M?VhSn@CL5w%px-Vb7H7c*4j<=rI37tm11Xl1yBj>D0=;&4F3&bt3!1yfme_>@}Hz|K+ zdP~AzIWL&(EOA!!3jzLCd<-GxhIb#6A&*pzFxgf}V#d=N_uGYDqpxRaAO2k>WWvzg z=+cZE@(2?eGGzK`s^6v^CMlgMtusOhZBw>HZHZ5P?pP4SHvo=;-&-Wwxa;z}_cM%o zdpayO40tUyiMe9%hcITwgYOeW*duZu%a)$SL!YJ2{tUuLP)gjo9_dIJ$c!k~d#wdW z1$B4+J7F9le{_$O57fE;-321)2>S55P;6FjK{fS;Sv}Rh!ZeQ+CL&w`*c%CD%gqXu zJ1J5zt9}qWzu-|0*f85c-caG}4-Y1Mmv&6BM+vl$$l}-9nSj~mME3~TE^ZPbM`af7 zYbc2y+gRxL+a1B4o%e?VqpD{z?&O3OIK~8_U`P@%3@ZwvwT8!@274+pGh@?ZhL4D= z-A;8CNPgU?XvScXXH#uu7A<))$^}CpbDT8Sim}_wxc>d-FYgf4>X-(%eGgsasZKqt z5t&7u+Kc$ya5!d2k3h0V{em71@y)`CtWKktkG6X<8a%ExiL}rGqNs!sJ6-3XQ34!H z%LgG!7epPg>W@_=R{sSA4rsv*5!o}(Byep5H=CA^8b=D>H^dzS1b8n9z0T`CjqC7L zs+=_}$j+DY(&qJUyY)`bXdp^1Pq&>~(5*9hBi@G~SLy?=Xff>}WI$lNQL-HAJ|iup zy0sT`#sKC<5-h`iCA>h%r<=_p)>s}z>;c{gjsES3McUq&8DH^YlCNPdY9jea;cn=s z1pwBeJ0=rX9bRXKTK&lv5Wv^ zQv5r!zA4#Gr_<@XgKKmWeNG76ppS$a{j;W=svtvO(bjVMJmeb3iA*muCK?sZj`Nr{1hPIlgMs zCT#{q)gh@=VS&dcSlUa;Nhg1MG!hE8bdI7Jhj{ngK;wESM3>H+p&t&d?~hCEue@d( z5cdJ`j)lIQZfSoT7X?B51wJp(Bew(cW0OTH41;*$%SwcP$Vj?*Jj?@afxlvM!B)@j zxUgz|hgY>te%Sf0(RDm$nS4wGTEWrv=YGJi%;x#z-Nx&?{KQ^8c^V*u5b|Xpf2Ny$ zKBww6!NbG}0S0I!jH#vjaC&Fty{PS8wk1?U8TON@27l!tEJeZ6$10@&>0M0r`O{og zLuuk}#y-fXVU7QF+IXJ|d)1EWNP4~X?`MWv_=Uh`Zj)J3+6;15Y83tyLI!*@JrdY6 zSa@mUhAa`NhVur3aI z3e`lVcUYEvl$CaDp>+J04k|-6G84Mu_Jx$iy8rD*GeCDi{rV#|PJF8!t=9{#q0r}Z zLa((KbjZ-56|97W1jh4)Y*)HT6^8nvQUp347PdZ-Kan3ZFE>%5KHmFjuhEu8P0p?q zCO2^8?|-{u4r8Eju!Zn>mepq%aBH7KnKd^S%@Z?11$16>1d~%HH>r%-jHA*PI_S_q zpOfID1J(YD2;<*ATd@n!APe0+LYzV0Ml^caJ|FC=pGEe6Ql4z6BxnW9tl;4yF zMv8FdIF`ecMX{v~EMN!^NZf0=zR=R5@B~94efhus9RyLF{pDJ4{Kx* z060(}a6Fb$s=U?Z5+5%HbEuNqdykJ9J`4sF)?6oM#?g;xsAlY z$p{Z{#~JK?Q|I8yxF-KFrAPqUnuXjk z

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

}|V^johy0QHcv4 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 HXM+C^pos3B literal 0 HcmV?d00001 diff --git a/docs-beta/content/theme/assets/images/favicon.ico b/docs-beta/content/theme/assets/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e85006a3ce1c6fd81faa6d5a13095519c4a6fc96 GIT binary patch literal 1150 zcmd6lF-yZh9L1kl>(HSEK`2y^4yB6->f+$wD)=oNY!UheIt03Q=;qj=;8*Bap_4*& za8yAl;wmmx5Yyi^7dXN-WYdJ-{qNqpcez|5t#Fr0qTSYcPTG`I2PBk8r$~4kg^0zN zCJe(rhix3do!L$bZ+IuZ{i08x=JR3=e+M4pv0KsKA??{u_*EFfo|`p&t`Vf=jn{)F z1fKk9hWsmYwqWAP^JO*5u*R;*L&dX3H$%S7oB$f0{ISh{QVXuncnzN67WQH2`lip7 zhX+VI$6x$1+$8gMjh4+1l0N#8_0Fh=N#EwpKk{SeE!)SHFB@xQFX3y+8sF#_@!bDW eIdI-IC`$c%>bk?KbPeN9RHtL<1^)v~#xMt8oB^@` literal 0 HcmV?d00001 diff --git a/docs-beta/content/theme/assets/images/favicon.png b/docs-beta/content/theme/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..23ccc2bac7294c857add8e40e27c5c4e4d8e6397 GIT binary patch literal 1056 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UEa{HEjtq=#3k+XOiwE+VlDyqr z82-2SpV<%OaTa()76WMyFm^kcZO6dCc)`=fF~sBe-K+5#y@fJtAI{&lymfQKwqr2~ zCt6K)HCrDwC3%)PcB-t_tS?fYGKKrp)FS6~VQY2-dr2vsGT6H4XK{CbKb{VJ-6tv z`N9hwdeTYJqKX$@btNXswa09W3h1oa`Ppu!-h_6i%XU`FHRJBQXsHYS-&uU7;_VF9 zi;tq%ZKmpJo-4eR{QHdlyzhSHe|5Ca6`qmJT~+kSH1Aj3MvLQuvDYTKxJ6l9wvAqK zdB%3mo~lLnWlsN#UBy#ZvCMI+dDW-(9mfxMwN=FL4x8V)&NX(mep&BcE0cuQgBr{k zMYq~dDC{l1G$|*PvpMZ7$Ce!_D;)kEbzRNEq#HKP%p&W6WcS1^_evK#EnL4YO1*LE zxvKXGnaz)#_V2y0Qcm;sool(PwM;A)`5)Wj{E=t_3#|VxqKu$ENSsedl>&so{FHT&Co_$S0K>llS_qPdW8u zfu7wmU%#m*4m!l~B?(S#KA6L&Kd7c7#Uj`TLO``fq|8Q!QsPte^E5# z=BH$)RpQpLY2GwPpawUP4aNCsCFO}lsSKXEiRr1niRqci*$QTQ=6V*omI^>CO>_-R zbq$Ra0u9X+GD=Dctn~HE%ggmLL8^fms9G<-DE&^`TcCjq5+D;pGD>rktgKw}lS^|` z^Gd9&0)R@384Q>I->r|P25hI5RYq!NdPWI@p`{T&Ls2VGjX07yP&MJ1DJ2;oC70JI zasZV`A}R6B%uOw+EJ$SlyGp+xFWr7qm>-%sz9B$W42C8arlw{F#^#o8MbqyAmGC2( z6P#I<%3$E+G-Z+98=zDel2mArCqr6hPAbs*`nh=}Ir-`OX^CZ-$@zK3`iO|pPc|G%zu?NJ~mFH!-tJvPd-q+M1H42h^bla^IYl8-X@3c)I$ztaD0e0sse~ BmzDqk literal 0 HcmV?d00001 diff --git a/docs-beta/content/theme/assets/images/icons/bitbucket-670608a71a.svg b/docs-beta/content/theme/assets/images/icons/bitbucket-670608a71a.svg new file mode 100644 index 0000000000..7d95cb22d9 --- /dev/null +++ b/docs-beta/content/theme/assets/images/icons/bitbucket-670608a71a.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-beta/content/theme/assets/images/icons/github-1da075986e.svg b/docs-beta/content/theme/assets/images/icons/github-1da075986e.svg new file mode 100644 index 0000000000..3cacb2e0fc --- /dev/null +++ b/docs-beta/content/theme/assets/images/icons/github-1da075986e.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-beta/content/theme/assets/images/icons/gitlab-5ad3f9f9e5.svg b/docs-beta/content/theme/assets/images/icons/gitlab-5ad3f9f9e5.svg new file mode 100644 index 0000000000..b036a9b52b --- /dev/null +++ b/docs-beta/content/theme/assets/images/icons/gitlab-5ad3f9f9e5.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-beta/content/theme/assets/javascripts/application-8e4952e681.js b/docs-beta/content/theme/assets/javascripts/application-8e4952e681.js new file mode 100644 index 0000000000..49fe7d1b8f --- /dev/null +++ b/docs-beta/content/theme/assets/javascripts/application-8e4952e681.js @@ -0,0 +1 @@ +window.app=function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=35)}([function(e,t,n){"use strict";var r=n(23)("wks"),i=n(14),o=n(1).Symbol,a="function"==typeof o;(e.exports=function(e){return r[e]||(r[e]=a&&o[e]||(a?o:i)("Symbol."+e))}).store=r},function(e,t,n){"use strict";var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},function(e,t,n){"use strict";var r=n(10),i=n(25);e.exports=n(5)?function(e,t,n){return r.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){"use strict";var r=n(11);e.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},function(e,t,n){"use strict";var r=n(1),i=n(2),o=n(6),a=n(14)("src"),s=Function.toString,c=(""+s).split("toString");n(7).inspectSource=function(e){return s.call(e)},(e.exports=function(e,t,n,s){var u="function"==typeof n;u&&(o(n,"name")||i(n,"name",t)),e[t]!==n&&(u&&(o(n,a)||i(n,a,e[t]?""+e[t]:c.join(String(t)))),e===r?e[t]=n:s?e[t]?e[t]=n:i(e,t,n):(delete e[t],i(e,t,n)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[a]||s.call(this)})},function(e,t,n){"use strict";e.exports=!n(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t,n){"use strict";var r={}.hasOwnProperty;e.exports=function(e,t){return r.call(e,t)}},function(e,t,n){"use strict";var r=e.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";var r={}.toString;e.exports=function(e){return r.call(e).slice(8,-1)}},function(e,t,n){"use strict";var r=n(3),i=n(38),o=n(39),a=Object.defineProperty;t.f=n(5)?Object.defineProperty:function(e,t,n){if(r(e),t=o(t,!0),r(n),i)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};e.exports=function(e){return"object"===(void 0===e?"undefined":r(e))?null!==e:"function"==typeof e}},function(e,t,n){"use strict";var r=n(18);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}}},function(e,t,n){"use strict";var r=n(9),i=n(0)("toStringTag"),o="Arguments"==r(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=a(t=Object(e),i))?n:o?r(t):"Object"==(s=r(t))&&"function"==typeof t.callee?"Arguments":s}},function(e,t,n){"use strict";var r=0,i=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+i).toString(36))}},function(e,t,n){"use strict";var r=n(11),i=n(1).document,o=r(i)&&r(i.createElement);e.exports=function(e){return o?i.createElement(e):{}}},function(e,t,n){"use strict";var r=Math.ceil,i=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?i:r)(e)}},function(e,t,n){"use strict";e.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t,n){"use strict";var r=n(47),i=n(17);e.exports=function(e){return r(i(e))}},function(e,t,n){"use strict";var r=n(23)("keys"),i=n(14);e.exports=function(e){return r[e]||(r[e]=i(e))}},function(e,t,n){"use strict";var r=n(10).f,i=n(6),o=n(0)("toStringTag");e.exports=function(e,t,n){e&&!i(e=n?e:e.prototype,o)&&r(e,o,{configurable:!0,value:t})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default={createElement:function(e,t){var n=document.createElement(e);t&&Array.prototype.forEach.call(Object.keys(t),function(e){n.setAttribute(e,t[e])});for(var r=arguments.length,i=Array(r>2?r-2:0),o=2;o0?i(r(e),9007199254740991):0}},function(e,t,n){"use strict";e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t,n){"use strict";e.exports=n(1).document&&document.documentElement},function(e,t,n){"use strict";var r,i,o,a=n(12),s=n(63),c=n(31),u=n(15),l=n(1),f=l.process,h=l.setImmediate,d=l.clearImmediate,p=l.MessageChannel,m=0,y={},v=function(){var e=+this;if(y.hasOwnProperty(e)){var t=y[e];delete y[e],t()}},g=function(e){v.call(e.data)};h&&d||(h=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return y[++m]=function(){s("function"==typeof e?e:Function(e),t)},r(m),m},d=function(e){delete y[e]},"process"==n(9)(f)?r=function(e){f.nextTick(a(v,e,1))}:p?(i=new p,o=i.port2,i.port1.onmessage=g,r=a(o.postMessage,o,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+"","*")},l.addEventListener("message",g,!1)):r="onreadystatechange"in u("script")?function(e){c.appendChild(u("script")).onreadystatechange=function(){c.removeChild(this),v.call(e)}}:function(e){setTimeout(a(v,e,1),0)}),e.exports={set:h,clear:d}},function(e,t){(function(t){e.exports=t}).call(t,{})},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=function(){function e(e,t){for(var n=0;n=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){"use strict";var r=n(16),i=n(17);e.exports=function(e){return function(t,n){var o,a,s=String(i(t)),c=r(n),u=s.length;return c<0||c>=u?e?"":void 0:(o=s.charCodeAt(c),o<55296||o>56319||c+1===u||(a=s.charCodeAt(c+1))<56320||a>57343?e?s.charAt(c):o:e?s.slice(c,c+2):a-56320+(o-55296<<10)+65536)}}},function(e,t,n){"use strict";var r=n(43),i=n(25),o=n(21),a={};n(2)(a,n(0)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:i(1,n)}),o(e,t+" Iterator")}},function(e,t,n){"use strict";var r=n(3),i=n(44),o=n(30),a=n(20)("IE_PROTO"),s=function(){},c=function(){var e,t=n(15)("iframe"),r=o.length;for(t.style.display="none",n(31).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write("