From 4bb1a9d8d8fd12556a10e063151f75a746e5b86b Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Fri, 8 Jul 2016 17:13:57 -0700 Subject: [PATCH] added lb diagram and some more detail --- doc/images/load_balancing_design.png | Bin 0 -> 38180 bytes doc/load-balancing.md | 73 ++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 14 deletions(-) create mode 100644 doc/images/load_balancing_design.png diff --git a/doc/images/load_balancing_design.png b/doc/images/load_balancing_design.png new file mode 100644 index 0000000000000000000000000000000000000000..716378c0db20da9875b0cc1892e0e1aa217c1540 GIT binary patch literal 38180 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

oXQe~N~ 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 Vn`JgvQafaeb~dMumLGP%{U5zNV6gxI literal 0 HcmV?d00001 diff --git a/doc/load-balancing.md b/doc/load-balancing.md index 681be02a72f..05d555a3f13 100644 --- a/doc/load-balancing.md +++ b/doc/load-balancing.md @@ -4,7 +4,7 @@ Load Balancing in gRPC # Objective To design a load balancing API between a gRPC client and a Load Balancer to -instruct the client how to send load to multiple backend servers. +instruct the client how to send load to multiple backend servers. # Background @@ -19,7 +19,7 @@ have temporary copies of the RPC request and response. This model also increases latency to the RPCs. The proxy model was deemed inefficient when considering request heavy services -like storage. +like storage. ### Balancing-aware Client @@ -28,7 +28,7 @@ example, the client could contain many load balancing policies (Round Robin, Random, etc) used to select servers from a list. In this model, a list of servers would be either statically configured in the client, provided by the name resolution system, an external load balancer, etc. In any case, the client -is responsible for choosing the preferred server from the list. +is responsible for choosing the preferred server from the list. One of the drawbacks of this approach is writing and maintaining the load balancing policies in multiple languages and/or versions of the clients. These @@ -53,14 +53,67 @@ unavailability or health issues. The load balancer will make any necessary complex decisions and inform the client. The load balancer may communicate with the backend servers to collect load and health information. + +## Requirements + +#### Simple API and client + +The gRPC client load balancing code must be simple and portable. The client +should only contain simple algorithms (ie Round Robin) for server selection. For +complex algorithms, the client should rely on a load balancer to provide load +balancing configuration and the list of servers to which the client should send +requests. The balancer will update the server list as needed to balance the load +as well as handle server unavailability or health issues. The load balancer will +make any necessary complex decisions and inform the client. The load balancer +may communicate with the backend servers to collect load and health information. + +#### Security + +The load balancer may be separate from the actual server backends and a +compromise of the load balancer should only lead to a compromise of the +loadbalancing functionality. In other words, a compromised load balancer should +not be able to cause a client to trust a (potentially malicious) backend server +any more than in a comparable situation without loadbalancing. + # Proposed Architecture -The gRPC load balancing approach follows the third approach, by having an -external load balancer which provides simple clients with a list of servers. +The gRPC load balancing implements the external load balancing server approach: +an external load balancer provides simple clients with an up-to-date list of +servers. + +![image](images/load_balancing_design.png) + +1. On startup, the gRPC client issues a name resolution request for the service. + The name will resolve to one or more IP addresses to gRPC servers, a hint on + whether the IP address(es) point to a load balancer or not, and also return a + client config. +2. The gRPC client connects to a gRPC Server. + 1. If the name resolution has hinted that the endpoint is a load balancer, + the client will attempt to open a stream to the load balancer service. The + server may respond in only one of the following ways. + 1. `status::UNIMPLEMENTED`. There is no loadbalancing in use. The client + proceeds by sending all RPCs to this gRPC server. + 1. "I am a Load Balancer and here is the server list." (Goto Step 4.) + 1. "Please contact Load Balancer X" (See Step 3.) The client will close + this connection and cancel the stream. + 1. If the server fails to respond, the client will wait for some timeout + and then re-resolve the name (process to Step 1 above). + 1. If the name resolution has not hinted that the endpoint is a load + balancer, the client connects directly to the service it wants to talk to. +3. The gRPC client opens a separate connection to the Load Balancer. If this + fails, it will go back to step 1 and try another address. + 1. During channel initialization to the Load Balancer, the client will + attempt to open a stream to the Load Balancer service. + 1. The load balancer will return a server list to the gRPC client. + Optional: The load balancer will also open channels to the gRPC servers if + load reporting is needed. +4. The gRPC client will send RPCs to the gRPC servers contained in the server + list from the load balancer. +5. Optional: The gRPC servers may periodically report load to the Load Balancer. ## Client -When establishing a gRPC stream to the balancer, the client will send an initial +When establishing a gRPC _stream_ to the balancer, the client will send an initial request to the load balancer (via a regular gRPC message). The load balancer will respond with client config (including, for example, settings for flow control, RPC deadlines, etc.) or a redirect to another load balancer. If the @@ -87,11 +140,3 @@ balancer in order to compute the next list of servers. The gRPC Server is responsible for answering RPC requests and providing responses to the client. The server will also report load to the load balancer if a reporting stream was opened for this purpose. - -### Security - -The load balancer may be separate from the actual server backends and a -compromise of the load balancer should only lead to a compromise of the -loadbalancing functionality. In other words, a compromised load balancer should -not be able to cause a client to trust a (potentially malicious) backend server -any more than in a comparable situation without loadbalancing.