Just wanted to clarify that this is the design that came from the requirements discussed in this thread: https://lists.apache.org/thread.html/rf985a2b9e8a440d396a0097a71882919bff5b3cb5f8d6c3a53143162%40%3Cdev.trafficcontrol.apache.org%3E
I am +1, but interested in hearing all the feedback from the community. Thanks, Dave On Thu, Jul 15, 2021 at 12:35 PM Robert O Butts <r...@apache.org> wrote: > The current Traffic Monitor polls the entire CDN, which doesn't scale with > large numbers of caches. > > We've long intended to make it scalable. Several of us have a design > proposal. I'm putting it here, just so people don't have to click an > external link, but if anyone wants I can also put this on the Apache wiki, > just ask. > > We typically do designs with Blueprints in git, but this project is large > enough, we felt the need to come up with a higher-level design first. Once > we have consensus on the design, the intent is to make a blueprint with > more technical details, and then seek consensus on that. Design follows. > > > # Implementation > - Should not mandate or preclude a deployment environment > - Such as VMs or Containers > - This design intentionally minimizes Traffic Ops/Traffic Portal changes, > to reduce development cost for the MVP. TO changes may be desirable, and > may be implemented in a future iteration. > > ## Stats > The existing Traffic Monitor monitors both stats and health. The existing > Monitor will have health polling disabled and will continue to be used for > stat polling for the immediate future. Beyond that, this document does not > address stat monitoring. > > Currently, it’s possible to use stats for health consideration, but it’s > unlikely it’s commonly used by anyone. > > - Should not preclude adding an interface (JSON/HTTP) to send health > information (such as from stats) to be used in the health calculation > - For either cache or delivery service health > - This won’t be in the MVP, but is likely to be added in a future version > > ## Health > - Must get and use Snapshotted (CRConfig, monitoring.json) data > exclusively. > - Must Not request un-snapshotted Traffic Ops endpoints. > - This is because health monitoring must match Router configuration, and > to prevent potentially multi-state operational changes from being deployed > until an operator intends. > - Monitors must get their own config and data from Traffic Ops without > intervention. > - Deployment and running must be Stateless (in terms of persistent state; > notwithstanding transient health state). > - Local configuration should be limited to Traffic Ops authentication. > - Must use Traffic Ops as the Source-Of-Truth for all data about what to > poll, but should be agnostic (i.e. handle generic JSON endpoints without > special Traffic Ops–specific logic). > - Monitors will be divided into “monitor groups,” which will be implemented > as Traffic Control CacheGroups. > - CacheGroups will be used to minimize Traffic Ops (TO) and Traffic > Portal (TP) development in the MVP. > - These Monitor CacheGroups have no correlation with Cache CacheGroups. > TO CacheGroups are simply the grouping mechanism. > - Should not preclude a different grouping mechanism. > - Monitors will directly poll the health of caches in their designated > CacheGroup(s), and will request the health of other CacheGroups from a > Monitor in each other Monitor Group. > - Monitors will serve the health of all caches in the CDN. > - Both cache health directly polled and received from other monitors. > - Monitors must distinguish in their health endpoint (/CrStates) between > caches/cachegroups they polled themselves, and health received from other > monitors. > - The endpoint should be backwards-compatible with the existing /CrStates > endpoint used by existing Traffic Routers. > - Cache health should be boolean, but must not preclude a more granular > score in the future > - For example, 0.0–1.0 or 0–100 > - The current Traffic Monitor cache health is boolean > - Note this is a “must,” not a “should,” unlike most extensibility > requirements. > > ## Peering > - Monitors must poll all peers in their own Group, and use the health of > caches reported by those monitors combined with their own direct polling > results to achieve consensus on the health of each cache. > - This is currently implemented in Traffic Monitor, with each Monitor > polling all Caches in the CDN. > - The consensus will be Optimistic. If any Monitor directly polling a > cache considers it healthy, then it’s considered healthy. This is the > current behavior of Traffic Monitor. > - Should not preclude other consensus algorithms. > - Monitors must select an arbitrary Monitor in each other Monitor Group > each polling interval, to query for the health of CacheGroups not polled > directly. This selection must be deterministic and load-balanced. > - For example, deterministic such as via alphabetic hostname. > - For example, load-balanced by round-robin or consistent hash on the > deterministic selection order. > - Should not preclude alternate determinism or load-balance algorithms. > - The selected Monitor must be logged, for operational debugging. > - The number of CacheGroups each Monitor polls must be the number of > CacheGroups in the CDN which contain a cache divided by the number of > Monitor Groups. > - Note this means all Monitors in a Group poll the same Caches and > CacheGroups > - Note this means the number of Monitors in a Group is the level of > consensus. > - For example, if you want to make sure at least 3 Monitors poll every > Cache, then every Monitor Group must have 3 Monitors. > - The CacheGroups polled by each Monitor Group will be the nearest > geographically > - Should not preclude an alternate nearest algorithm (for example, > network distance) > - Note the number and which Caches polled above imply each Monitor must be > aware of which Caches are being polled by every other Monitor Group. > - For example, if there are 3 Monitor Groups and 10 CacheGroups with > Caches, then MonitorGroup1 must poll 3 CacheGroups, MonitorGroup2 must poll > 3 CacheGroups, and MonitorGroup3 must poll 4 CacheGroups. > - For safety, each Monitor must inspect the Peer results from every other > Monitor Group, and if any CacheGroup is unpolled, poll that CacheGroup > itself. > - This safety should not execute under normal operation. But it may > execute during a normal upgrade of the Monitors if the peering algorithm > was changed. > - If this occurs, an error must be logged. > - The algorithm to decide to poll an unpolled CacheGroup should be: > `time_unpolled * log(nth_distance) > poll_interval` > - Using the logarithm of the poll interval times distance prevents > “flapping” and all Monitors in the entire CDN polling a CacheGroup when any > slight network blip occurs, while still ensuring that any Monitor observing > an unpolled CacheGroup will poll it after some hard limit (like 10 > seconds). > - For safety, a Profile Parameter which overrides the CacheGroups polled by > a Monitor must be used if it exists. > - This is a safety to fix outages, for example if there is a bug deciding > which CacheGroups to poll. > - This should not be used under normal operation. > - For safety, a Profile Parameter which overrides the number of CacheGroups > to poll (normally automatically calculated from the number of MonitorGroups > divided by CacheGroups) must be used if it exists. > - This is a safety, to fix outages in an emergency. It should not be used > under normal operation. > - All failed polling must retry the selected target, and if the target is > an arbitrary group member, an alternative target. > - Retry intervals should be a factor of the poll interval by default. > - For example, if the poll interval is 1 second, retries should not > exceed around 3 seconds before marking as failed and stopping retrying. > - Retry intervals should be configurable > > ## Extensibility > The implementation should not preclude: > - Using a GSLB for Monitors and clients (Routers) to talk to an arbitrary > monitor in a Monitor Group. > - A GSLB provides some distinct advantages, but we need to support > non-GSLB for small ATC operators. Therefore, it will be an additional > feature, which may be implemented in a future version > - Adding more intelligent logic around Optimism, and how consensus is > chosen when monitors disagree. > - Adding “far” polling, to determine if a cache is reachable from far away, > and to report that cache as healthy or unhealthy to Traffic Routers or > clients far away. > - The present design only implements “near” polling, and does not > implement polling from “far” away, to ensure the cache is reachable to > clients far away. This is mostly ok, because clients should mostly be > requesting nearby Traffic Routers, which should mostly be sending them to > nearby caches. > However, far-away requests do happen regularly in Production. Thus, we > should retain the ability to implement “far health” if necessary in the > future. > - Ideally, “near health” would be sent to nearby Traffic Routers or > clients, and “far health” would be sent to far clients, reflecting their > own distance from the Cache. > But that granularity is expensive in both developer-time and performance. > - Adding an interface to send health information (such as from stats) to be > used in the health calculation. > > > Thoughts? Feedback? Votes? > > Once we have consensus on the list, we'll start on a git blueprint with > more technical details, and then also seek consensus on that. > > Normal Apache voting procedure is 72 hours, but this is large enough, I'd > like to give it at least a week, just to give everyone enough time to think > it through. > > So if you're interested in this project, please reply within a week with > feedback, or let us know if you need more time to think it through and we > can extend that time. > > Thanks, >