From ed2429b8ef341bda1f7287effda37d58b2910100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elek=20M=C3=A1rton?= Date: Mon, 9 Nov 2020 12:23:14 +0100 Subject: [PATCH 1/4] HDDS-4440. Use per-request authentication and persistent connections between S3g and OM --- .../docs/content/design/s3-performance.md | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 hadoop-hdds/docs/content/design/s3-performance.md diff --git a/hadoop-hdds/docs/content/design/s3-performance.md b/hadoop-hdds/docs/content/design/s3-performance.md new file mode 100644 index 000000000000..6ef1737efefd --- /dev/null +++ b/hadoop-hdds/docs/content/design/s3-performance.md @@ -0,0 +1,205 @@ +--- +title: Persistent OM connection for S3 gateway +summary: Use per-request authentication and persistent connections between S3g and OM +date: 2020-11-09 +jira: HDDS-4440 +status: accepted +author: Márton Elek +--- + + +# Overview + +* Hadoop RPC authenticate the calls at the beginning of the connections. All the subsequent messages on the same call will use existing, initialized authentication. +* S3 gateway sends the authentication as Hadoop RPC delegation token for **each requests**. +* To authenticate each of the S3 REST requests Ozone creates a new `OzoneClient` for eac HTTP requests, which introduces problems with performance and error handling. +* This proposal suggests to create a new transport (**in addition** to the existing Hadoop RPC) for the OMClientProtocol where the requests can be authenticated per-request. + +# Authentication with S3 gateway + +AWS S3 request authentication based on [signing the REST messages](https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html). Each of the HTTP requests must include and authentication header which contains the used the *access key id* and a signatures created with the help of the *secret key*. + +``` +Authorization: AWS AWSAccessKeyId:Signature +``` + +Ozone S3g is a REST gateway for Ozone which receives AWS compatible HTTP calls and forwards the requests to the Ozone Manager and Datanode services. Ozone S3g is **stateless**, it couldn't check any authentication information which are stored on the Ozone Manager side. It can check only the format of the signature. + +For the authentication S3g parses the HTTP header and sends all the relevant (and required) information to Ozone Manager which can check the signature with the help of stored *secret key*. + +This is implemented with the help of the delegation token mechanism of Hadoop RPC. Hadoop RPC supports Kerberos and token based authentication where tokens can be customized. The Ozone specific implementation `OzoneTokenIdentifier` contains a `type` field which can `DELEGATION_TOKEN` or `S3AUTHINFO`. The later one is used to authenticate the request based on S3 REST header (signature + required information). + +Both token and Kerberos based authentication are checked by Hadoop RPC during the connection initialization phase using the SASL standard. SASL defines the initial handshake of the creation where server can check the authentication information with a challenge-response mechanism. + +As a result Ozone S3g requires to create a new Hadoop RPC client for each of the HTTP requests as each requests may have different AWS authentication information / signature. Ozone S3g creates a new `OzoneClient` for each of the requests which includes the creation of Hadoop RPC client. + +There are two problems with this approach: + +1. **performance**: Creating a new `OzoneClient` requires to create new connection, to perform the SASL handshake and to send the initial discovery call to the OzoneManager to get the list of available services. It makes S3 performance very slow. +2. **error handling:** Creating new `OzoneClient` for each requests makes the propagation of error code harder with CDI. + +[CDI](http://cdi-spec.org/) is the specification of *Contexts and Dependency Injection* for Java. Can be used for both JavaEE and JavaSE and it's integrated with most web frameworks. Ozone S3g uses this specification to inject different services to to REST handlers using `@Inject` annotation. + +`OzoneClient` is created by the `OzoneClientProduced`: + +``` +@RequestScoped +public class OzoneClientProducer { + + private OzoneClient client; + + @Inject + private SignatureProcessor signatureParser; + + @Inject + private OzoneConfiguration ozoneConfiguration; + + @Inject + private Text omService; + + @Inject + private String omServiceID; + + + @Produces + public OzoneClient createClient() throws OS3Exception, IOException { + client = getClient(ozoneConfiguration); + return client; + } +... +} +``` + +As we can see here, the producer is *request* scoped (see the annotation on the class), which means that the `OzoneClient` bean will be created for each request. If the client couldn't be created a specific exception will be thrown by the CDI framework (!) as one bean couldn't be injected with CDI. This error is different from the regular business exceptions therefore the normal exception handler (`OS3ExceptionMapper` implements `javax.ws.rs.ext.ExceptionMapper`) -- which can transform exceptions to HTTP error code -- doesn't apply. It can cause strange 500 error instead of some authentication error. + +## Caching + +Hadoop RPC has a very specific caching layer which is **not used** by Ozone S3g. This section describe the caching of the Hadoop RPC, but safe to skip (It explain how is the caching ignored). + +As creating new Hadoop RPC connection is an expensive operation Hadoop RPC has an internal caching mechanism to cache client and connections (!). This caching is hard-coded and based on static fields (couldn't be adjusted easily). + +Hadoop RPC client is usually created by `RPC.getProcolProxy`. For example: + +``` +HelloWorldServicePB proxy = RPC.getProtocolProxy( + HelloWorldServicePB.class, + scmVersion, + new InetSocketAddress(1234), + UserGroupInformation.getCurrentUser(), + configuration, + new StandardSocketFactory(), + Client.getRpcTimeout(configuration), + retryPolicy).getProxy(); +``` + +This code fragment creates a new client which can be used from the code, and it uses multiple caches for client creation. + +1. Protocol engines are cached by `RPC.PROTOCOL_ENGINES` static field, but it's safe to assume that the `ProtobufRpcEngine` is used for most of the current applications. + +2. `ProtobufRpcEngine` has a static `ClientCache` field which caches the client instances with the `socketFactory` and `protocol` as the key. + +3. Finally the `Client.getConnection` method uses a cache to cache the connections: + + ``` + connection = connections.computeIfAbsent(remoteId, + id -> new Connection(id, serviceClass, removeMethod)); + ``` + + The key for the cache is the `remoteId` which includes all the configuration, connection parameters (like destination host) and `UserGroupInformation` (UGI). + +The caching of the connections can cause very interesting cases. As an example, let's assume that delegation token is invalidated with an RPC call. The workflow can be something like this: + +1. create protocol proxy (with token authentication) +2. invalidate token (rpc call) +3. close protocol proxy (connection may not be closed. depends from the cache) +4. create a new protocol proxy +5. If connection is cached (same UGI) services can be used even if the token is invalidated earlier (as the token is checked during the initialization of the tokens). + +Fortunately this behavior doesn't cause any problem in case of Ozone and S3g. UGI (which is part of the cache key of the connection cache) equals if (and only if) the underlying `Subject` is the same. + +``` +public class UserGroupInformation { + + ... + + @Override + public boolean equals(Object o) { + if (o == this) { + return true; + } else if (o == null || getClass() != o.getClass()) { + return false; + } else { + return subject == ((UserGroupInformation) o).subject; + } + } +} +``` + + But the UGI initialization of Ozone always creates a new `Subject` instance for each request (even if the subject name is the same). In `OzoneClientProducer`: + +``` + UserGroupInformation remoteUser = + UserGroupInformation.createRemoteUser(awsAccessId); // <-- new Subject is created + + if (OzoneSecurityUtil.isSecurityEnabled(config)) { + try { + OzoneTokenIdentifier identifier = new OzoneTokenIdentifier(); + //setup identifier + + Token token = new Token(identifier.getBytes(), + identifier.getSignature().getBytes(UTF_8), + identifier.getKind(), + omService); + remoteUser.addToken(token); + .... +``` + +**As a result Hadoop RPC caching doesn't apply to Ozone S3g**. It's a good news because it's secure, but bad news as the performance is bad. + +# Proposed change + +We need an RPC mechanism between the Ozone S3g service and Ozone Manager service which can support per-request authentication and accepts + +The Ozone Manager client already has a pluggable transport interface: `OmTransport` is a simple interface which can deliver `OMRequest` messages: + +``` +public interface OmTransport { + + /** + * The main method to send out the request on the defined transport. + */ + OMResponse submitRequest(OMRequest payload) throws IOException; + ... +``` + + The proposal is to create a new **additional** transport, based on GRPC, which can do the per-request authentication. **Existing Hadoop clients will use the well-known Hadoop RPC client**, but S3g can start to use this specific transport to achieve better performance. + +As this is nothing more, just a transport: exactly the same messages (`OmRequest`) will be used, it's not a new RPC interface. + +Only one modification is required in the RPC interface: a new per-request`token` field should be introduced in `OMRequest` which is optional. + +A new GRPC service should be started in Ozone Manager, which receives `OMRequest` and for each request, the Hadoop `UserGroupInformation` is set based on the new token field (after authentication). + +`OzoneToken` identifier can be simplified (after deprecation period) with removing the S3 specific part, as it won't be required any more. + +With this approach the `OzoneClient` instances can be cached on S3g side (with persistent GRPC connections) as the authentication information is not part of the OzoneClient any more (added by the `OmTransport` implementation per request (in case of GRPC) or per connection (in case of HadoopRPC)). + +# Possible alternatives + +* It's possible to use pure Hadoop RPC client instead of Ozone Client which would make the client connection slightly cheaper (service discovery call is not required) but it's still require to create new connections for each requests (and downloading data without OzoneClient may have own challenges). +* CDI error handling can be improved with using other dependency injection (eg. Guice, which is already used by Recon) or some additional wrappers and manual connection creation. But it wouldn't solve the perfomance problem. + + + From b0bf60dbf01add562556574358f0cfdaa5814065 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elek=20M=C3=A1rton?= Date: Mon, 23 Nov 2020 09:36:23 +0100 Subject: [PATCH 2/4] fix typo --- hadoop-hdds/docs/content/design/s3-performance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-hdds/docs/content/design/s3-performance.md b/hadoop-hdds/docs/content/design/s3-performance.md index 6ef1737efefd..8687563ebc7e 100644 --- a/hadoop-hdds/docs/content/design/s3-performance.md +++ b/hadoop-hdds/docs/content/design/s3-performance.md @@ -52,7 +52,7 @@ There are two problems with this approach: [CDI](http://cdi-spec.org/) is the specification of *Contexts and Dependency Injection* for Java. Can be used for both JavaEE and JavaSE and it's integrated with most web frameworks. Ozone S3g uses this specification to inject different services to to REST handlers using `@Inject` annotation. -`OzoneClient` is created by the `OzoneClientProduced`: +`OzoneClient` is created by the `OzoneClientProducer`: ``` @RequestScoped From af946408c560e1ccbb5a1e6711775eb7e140113b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elek=20M=C3=A1rton?= Date: Mon, 7 Dec 2020 16:01:28 +0100 Subject: [PATCH 3/4] diagram about the old a new approach --- .../docs/content/design/s3-performance.md | 33 +++++++++++++++++- .../docs/static/design/s3-performance-new.png | Bin 0 -> 33688 bytes .../docs/static/design/s3-performance-old.png | Bin 0 -> 34927 bytes 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 hadoop-hdds/docs/static/design/s3-performance-new.png create mode 100644 hadoop-hdds/docs/static/design/s3-performance-old.png diff --git a/hadoop-hdds/docs/content/design/s3-performance.md b/hadoop-hdds/docs/content/design/s3-performance.md index 8687563ebc7e..7ce5683a4800 100644 --- a/hadoop-hdds/docs/content/design/s3-performance.md +++ b/hadoop-hdds/docs/content/design/s3-performance.md @@ -184,7 +184,7 @@ public interface OmTransport { ... ``` - The proposal is to create a new **additional** transport, based on GRPC, which can do the per-request authentication. **Existing Hadoop clients will use the well-known Hadoop RPC client**, but S3g can start to use this specific transport to achieve better performance. +The proposal is to create a new **additional** transport, based on GRPC, which can do the per-request authentication. **Existing Hadoop clients will use the well-known Hadoop RPC client**, but S3g can start to use this specific transport to achieve better performance. As this is nothing more, just a transport: exactly the same messages (`OmRequest`) will be used, it's not a new RPC interface. @@ -196,6 +196,37 @@ A new GRPC service should be started in Ozone Manager, which receives `OMRequest With this approach the `OzoneClient` instances can be cached on S3g side (with persistent GRPC connections) as the authentication information is not part of the OzoneClient any more (added by the `OmTransport` implementation per request (in case of GRPC) or per connection (in case of HadoopRPC)). +To make it easier to understand the implementation of this approach, let's compare the old (existing) and new (proposed) approach. + +### Old approach + +1. OzoneClientProvider creates a new OzoneClient for each of the HTTP requests (@RequestScope) + +2. OzoneToken is created based on the authentication header (signature, string to sign) + +3. OzoneClient creates new OM connection (Hadoop RPC) with the new OzoneToken + +4. OM extracts the information from OzoneToken and validates the signature + +5. OzoneClient is injected to the REST endpoints + +6. OzoneClient is used for any client calls + +7. When HTTP request is handled, the OzoneClient is closed + + ![old approach](s3-performance-old.png) + +### New approach + +1. OzoneClientProvider creates client with @ApplicationScope. Connection is always open to the OM (clients can be pooled) +2. OM doesn't authentication the connection, each of the requests should be authenticated one-by-one +3. OzoneClients are always injected to the REST endpoints +4. For each new HTTP request the authorization header is extracted and added to the outgoing GRPC request as a token +5. OM authenticate each of the request and calls the same request handler as before +6. OzoneClient can be open long-term + +![new approach](s3-performance-new.png) + # Possible alternatives * It's possible to use pure Hadoop RPC client instead of Ozone Client which would make the client connection slightly cheaper (service discovery call is not required) but it's still require to create new connections for each requests (and downloading data without OzoneClient may have own challenges). diff --git a/hadoop-hdds/docs/static/design/s3-performance-new.png b/hadoop-hdds/docs/static/design/s3-performance-new.png new file mode 100644 index 0000000000000000000000000000000000000000..f2cb40599137ae0746b15e70b8b5ed5f7dc4c8a4 GIT binary patch literal 33688 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 literal 0 HcmV?d00001 diff --git a/hadoop-hdds/docs/static/design/s3-performance-old.png b/hadoop-hdds/docs/static/design/s3-performance-old.png new file mode 100644 index 0000000000000000000000000000000000000000..20ebfc2baac9c9c30ab2ff762a7c136f87bfc7f0 GIT binary patch literal 34927 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 literal 0 HcmV?d00001 From 9c6ce9158a9425ca331fea72fbf7153891047ea1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elek=20M=C3=A1rton?= Date: Mon, 1 Mar 2021 20:18:05 +0100 Subject: [PATCH 4/4] adding proposal word to the title and summary --- hadoop-hdds/docs/content/design/s3-performance.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-hdds/docs/content/design/s3-performance.md b/hadoop-hdds/docs/content/design/s3-performance.md index 7ce5683a4800..a90f662fd57a 100644 --- a/hadoop-hdds/docs/content/design/s3-performance.md +++ b/hadoop-hdds/docs/content/design/s3-performance.md @@ -1,6 +1,6 @@ --- -title: Persistent OM connection for S3 gateway -summary: Use per-request authentication and persistent connections between S3g and OM +title: Proposed persistent OM connection for S3 gateway +summary: Proposal to use per-request authentication and persistent connections between S3g and OM date: 2020-11-09 jira: HDDS-4440 status: accepted