You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stratos.apache.org by Imesh Gunaratne <im...@apache.org> on 2013/12/08 11:07:15 UTC

[Announce] [Load Balancer] Multi-Tenancy Support is READY

Hi All,

Multi-tenancy support in Stratos Load Balancer is now ready. Changes have
been committed with commit revision:
57cccfbf83c3c3b7a322cd6b3124a74eae08ce29.

*How it works:*
- According to the discussions had on Multi-Tenancy support, Stratos
Manager publishes tenant information to the message broker via a topic.
- A sample complete tenant event message:
{"tenants":[{"tenantId":1,"tenantDomain":"foo.org
","serviceNameMap":{"app-server":true}},{"tenantId":2,"tenantDomain":"
abc.org","serviceNameMap":{"app-server":true}}]}
- Events: CompleteTenantEvent, TenantCreatedEvent, TenantUpdatedEvent,
TenantRemovedEvent, TenantSubscribedEvent, TenantUnSubscribedEvent.
- These event messages are received by load balancer and a corresponding
tenant data model is maintained.
- Multi-tenancy is enabled in load balancer and tenant identifier is
specified either as tenant-id or tenant-domain.
- Then tenant identifier regular expression is defined: default:
t/([^/]*)/. This is used to scan the request URL and find the tenant
identifier value.
- Load balancer maintains two hash maps:
  - Map<HostName, Cluster>: map hostname to cluster
  - Map<HostName, Map<TenantId, Cluster>>: map hostname, tenant id to
cluster
- When a request is received if multi-tenancy is disabled it will use
Map<Hostname, Cluster> map to identify the service cluster and forward the
request to the next available member.
- If multi-tenancy is enabled: it will scan the request URL using the
regular expression given and find the tenant identifier value.
- Then the matching cluster will be identified using Map<HostName,
Map<TenantId, Cluster>>.

*Test Case*
The above functionality was tested with two Application Server clusters:

    services {
         app-server {  # service name, a unique identifier to identify a
service
             multi-tenant: true;
             clusters {
                 app-server-cluster1 {  # cluster id, a unique identifier
to identify a cluster
                     hosts: foo.org, cluster1.org;  # comma separated
hostname list
                     tenant-range: 0-1;
                     algorithm: round-robin;  # algorithm name
                     members {
                         m1 {  # member id, a unique identifier to identify
a member
                             ip: 192.168.1.110; # member ip address
                             ports {
                                 http {
                                     value: 9773; # application port
                                     proxy: 80;   # proxy port exposed by
load balancer transport, set this value in axis2.xml
                                 }
                                 https {
                                     value: 9453;
                                     proxy: 443;
                                 }
                             }
                         }
                     }
                 }
                 app-server-cluster2 {  # cluster id, a unique identifier
to identify a cluster
                     hosts: foo.org, cluster1.org;  # comma separated
hostname list
                     tenant-range: 2-*;
                     algorithm: round-robin;  # algorithm name
                     members {
                         m2 {
                             ip: 192.168.1.110;
                             ports {
                                 http {
                                     value: 9774;
                                     proxy: 80;
                                 }
                                 https {
                                     value: 9454;
                                     proxy: 443;
                                 }
                             }
                         }
                     }
                 }
             }
                 }
             }
         }

*Tenant Definitions:*

Tenant 1:
Tenant ID: 1, Tenant Domain: foo.org, Subscriptions: app-server

Tenant 2:
Tenant ID: 2, Tenant Domain: abc.org, Subscriptions: app-server


*Super Tenant Request Log:*

[...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled,
scanning URL for tenant...
[...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL: /
[...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
t/([^/]*)/
[...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier not found in
URL
[...] DEBUG - RoundRobin Searching for next member: [service] app-server
[cluster]: app-server-cluster1 [member-count]: 1 [current-index] 0
[...] DEBUG - RequestDelegator Next member identified in 1ms: [service]
app-server [cluster] app-server-cluster1 [member] m1
[...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
https://192.168.1.110:9453/

*Tenant 1 Request Log:*

[...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled,
scanning URL for tenant...
[...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL: /t/
foo.org/carbon/admin/index.jsp
[...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
t/([^/]*)/
[...] DEBUG - TenantAwareLoadBalanceEndpoint Identifying tenant using
tenant domain...
[...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier found:
[tenant-domain] foo.org [tenant-id] 1
[...] DEBUG - RoundRobin Searching for next member: [service] app-server
[cluster]: app-server-cluster1 [member-count]: 1 [current-index] 0
[...] DEBUG - RequestDelegator Next member identified in 4ms: [service]
app-server [cluster] app-server-cluster1 [tenant-id] 1 [member] m1
[...]  INFO - LoadBalancerInFlightRequestCountCollector Load balancing
statistics notifier thread started
[...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
https://192.168.1.110:9453/t/foo.org/carbon/admin/index.jsp

*Tenant 2 Request Log:*

[...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled,
scanning URL for tenant...
[...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL: /t/
abc.org/carbon/admin/login.jsp
[...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
t/([^/]*)/
[...] DEBUG - TenantAwareLoadBalanceEndpoint Identifying tenant using
tenant domain...
[...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier found:
[tenant-domain] abc.org [tenant-id] 2
[...] DEBUG - RoundRobin Searching for next member: [service] app-server
[cluster]: app-server-cluster2 [member-count]: 1 [current-index] 0
[...] DEBUG - RequestDelegator Next member identified in 1ms: [service]
app-server [cluster] app-server-cluster2 [tenant-id] 2 [member] m2
[...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
https://192.168.1.110:9454/t/abc.org/carbon/admin/login.jsp
[...] DEBUG - TenantAwareLoadBalanceEndpoint Existing session found:
JSESSIONID=585B7333AD1C2920FE0CDDE1BCC610B2
[...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
https://192.168.1.110:9454/carbon/admin/login.jsp


Please feel free to add your thoughts on this.

Many Thanks
Imesh

Re: [Announce] [Load Balancer] Multi-Tenancy Support is READY

Posted by Imesh Gunaratne <im...@apache.org>.
Thanks for your feedback Kishanthan!

Yes definitely, tenant identifier regex is a configuration parameter
defined in loadbalancer.conf. The idea is to update it as required by
multi-tenant applications deployed in Stratos.

At the moment this is global to all cartridges, but we could also make it
local to services.

Thanks


On Sun, Dec 8, 2013 at 8:43 PM, Kishanthan Thangarajah <
kshanth2101@gmail.com> wrote:

> Hi Imesh,
>
> One question,
>
> This is one way of identifying tenant (from URL using t/([^/]*)/).
> What if someone want to plug-in a different way for that? Is that
> possible?
>
> On Sun, Dec 8, 2013 at 3:37 PM, Imesh Gunaratne <im...@apache.org> wrote:
> > Hi All,
> >
> > Multi-tenancy support in Stratos Load Balancer is now ready. Changes have
> > been committed with commit revision:
> > 57cccfbf83c3c3b7a322cd6b3124a74eae08ce29.
> >
> > How it works:
> > - According to the discussions had on Multi-Tenancy support, Stratos
> Manager
> > publishes tenant information to the message broker via a topic.
> > - A sample complete tenant event message:
> > {"tenants":[{"tenantId":1,"tenantDomain":"foo.org
> ","serviceNameMap":{"app-server":true}},{"tenantId":2,"tenantDomain":"
> abc.org","serviceNameMap":{"app-server":true}}]}
> > - Events: CompleteTenantEvent, TenantCreatedEvent, TenantUpdatedEvent,
> > TenantRemovedEvent, TenantSubscribedEvent, TenantUnSubscribedEvent.
> > - These event messages are received by load balancer and a corresponding
> > tenant data model is maintained.
> > - Multi-tenancy is enabled in load balancer and tenant identifier is
> > specified either as tenant-id or tenant-domain.
> > - Then tenant identifier regular expression is defined: default:
> t/([^/]*)/.
> > This is used to scan the request URL and find the tenant identifier
> value.
> > - Load balancer maintains two hash maps:
> >   - Map<HostName, Cluster>: map hostname to cluster
> >   - Map<HostName, Map<TenantId, Cluster>>: map hostname, tenant id to
> > cluster
> > - When a request is received if multi-tenancy is disabled it will use
> > Map<Hostname, Cluster> map to identify the service cluster and forward
> the
> > request to the next available member.
> > - If multi-tenancy is enabled: it will scan the request URL using the
> > regular expression given and find the tenant identifier value.
> > - Then the matching cluster will be identified using Map<HostName,
> > Map<TenantId, Cluster>>.
> >
> > Test Case
> > The above functionality was tested with two Application Server clusters:
> >
> >     services {
> >          app-server {  # service name, a unique identifier to identify a
> > service
> >              multi-tenant: true;
> >              clusters {
> >                  app-server-cluster1 {  # cluster id, a unique
> identifier to
> > identify a cluster
> >                      hosts: foo.org, cluster1.org;  # comma separated
> > hostname list
> >                      tenant-range: 0-1;
> >                      algorithm: round-robin;  # algorithm name
> >                      members {
> >                          m1 {  # member id, a unique identifier to
> identify
> > a member
> >                              ip: 192.168.1.110; # member ip address
> >                              ports {
> >                                  http {
> >                                      value: 9773; # application port
> >                                      proxy: 80;   # proxy port exposed by
> > load balancer transport, set this value in axis2.xml
> >                                  }
> >                                  https {
> >                                      value: 9453;
> >                                      proxy: 443;
> >                                  }
> >                              }
> >                          }
> >                      }
> >                  }
> >                  app-server-cluster2 {  # cluster id, a unique
> identifier to
> > identify a cluster
> >                      hosts: foo.org, cluster1.org;  # comma separated
> > hostname list
> >                      tenant-range: 2-*;
> >                      algorithm: round-robin;  # algorithm name
> >                      members {
> >                          m2 {
> >                              ip: 192.168.1.110;
> >                              ports {
> >                                  http {
> >                                      value: 9774;
> >                                      proxy: 80;
> >                                  }
> >                                  https {
> >                                      value: 9454;
> >                                      proxy: 443;
> >                                  }
> >                              }
> >                          }
> >                      }
> >                  }
> >              }
> >                  }
> >              }
> >          }
> >
> > Tenant Definitions:
> >
> > Tenant 1:
> > Tenant ID: 1, Tenant Domain: foo.org, Subscriptions: app-server
> >
> > Tenant 2:
> > Tenant ID: 2, Tenant Domain: abc.org, Subscriptions: app-server
> >
> >
> > Super Tenant Request Log:
> >
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled,
> scanning
> > URL for tenant...
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL: /
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
> > t/([^/]*)/
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier not found
> in
> > URL
> > [...] DEBUG - RoundRobin Searching for next member: [service] app-server
> > [cluster]: app-server-cluster1 [member-count]: 1 [current-index] 0
> > [...] DEBUG - RequestDelegator Next member identified in 1ms: [service]
> > app-server [cluster] app-server-cluster1 [member] m1
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> > https://192.168.1.110:9453/
> >
> > Tenant 1 Request Log:
> >
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled,
> scanning
> > URL for tenant...
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL:
> > /t/foo.org/carbon/admin/index.jsp
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
> > t/([^/]*)/
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Identifying tenant using
> tenant
> > domain...
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier found:
> > [tenant-domain] foo.org [tenant-id] 1
> > [...] DEBUG - RoundRobin Searching for next member: [service] app-server
> > [cluster]: app-server-cluster1 [member-count]: 1 [current-index] 0
> > [...] DEBUG - RequestDelegator Next member identified in 4ms: [service]
> > app-server [cluster] app-server-cluster1 [tenant-id] 1 [member] m1
> > [...]  INFO - LoadBalancerInFlightRequestCountCollector Load balancing
> > statistics notifier thread started
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> > https://192.168.1.110:9453/t/foo.org/carbon/admin/index.jsp
> >
> > Tenant 2 Request Log:
> >
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled,
> scanning
> > URL for tenant...
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL:
> > /t/abc.org/carbon/admin/login.jsp
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
> > t/([^/]*)/
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Identifying tenant using
> tenant
> > domain...
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier found:
> > [tenant-domain] abc.org [tenant-id] 2
> > [...] DEBUG - RoundRobin Searching for next member: [service] app-server
> > [cluster]: app-server-cluster2 [member-count]: 1 [current-index] 0
> > [...] DEBUG - RequestDelegator Next member identified in 1ms: [service]
> > app-server [cluster] app-server-cluster2 [tenant-id] 2 [member] m2
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> > https://192.168.1.110:9454/t/abc.org/carbon/admin/login.jsp
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Existing session found:
> > JSESSIONID=585B7333AD1C2920FE0CDDE1BCC610B2
> > [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> > https://192.168.1.110:9454/carbon/admin/login.jsp
> >
> >
> > Please feel free to add your thoughts on this.
> >
> > Many Thanks
> > Imesh
>

Re: [Announce] [Load Balancer] Multi-Tenancy Support is READY

Posted by Kishanthan Thangarajah <ks...@gmail.com>.
Hi Imesh,

One question,

This is one way of identifying tenant (from URL using t/([^/]*)/).
What if someone want to plug-in a different way for that? Is that
possible?

On Sun, Dec 8, 2013 at 3:37 PM, Imesh Gunaratne <im...@apache.org> wrote:
> Hi All,
>
> Multi-tenancy support in Stratos Load Balancer is now ready. Changes have
> been committed with commit revision:
> 57cccfbf83c3c3b7a322cd6b3124a74eae08ce29.
>
> How it works:
> - According to the discussions had on Multi-Tenancy support, Stratos Manager
> publishes tenant information to the message broker via a topic.
> - A sample complete tenant event message:
> {"tenants":[{"tenantId":1,"tenantDomain":"foo.org","serviceNameMap":{"app-server":true}},{"tenantId":2,"tenantDomain":"abc.org","serviceNameMap":{"app-server":true}}]}
> - Events: CompleteTenantEvent, TenantCreatedEvent, TenantUpdatedEvent,
> TenantRemovedEvent, TenantSubscribedEvent, TenantUnSubscribedEvent.
> - These event messages are received by load balancer and a corresponding
> tenant data model is maintained.
> - Multi-tenancy is enabled in load balancer and tenant identifier is
> specified either as tenant-id or tenant-domain.
> - Then tenant identifier regular expression is defined: default: t/([^/]*)/.
> This is used to scan the request URL and find the tenant identifier value.
> - Load balancer maintains two hash maps:
>   - Map<HostName, Cluster>: map hostname to cluster
>   - Map<HostName, Map<TenantId, Cluster>>: map hostname, tenant id to
> cluster
> - When a request is received if multi-tenancy is disabled it will use
> Map<Hostname, Cluster> map to identify the service cluster and forward the
> request to the next available member.
> - If multi-tenancy is enabled: it will scan the request URL using the
> regular expression given and find the tenant identifier value.
> - Then the matching cluster will be identified using Map<HostName,
> Map<TenantId, Cluster>>.
>
> Test Case
> The above functionality was tested with two Application Server clusters:
>
>     services {
>          app-server {  # service name, a unique identifier to identify a
> service
>              multi-tenant: true;
>              clusters {
>                  app-server-cluster1 {  # cluster id, a unique identifier to
> identify a cluster
>                      hosts: foo.org, cluster1.org;  # comma separated
> hostname list
>                      tenant-range: 0-1;
>                      algorithm: round-robin;  # algorithm name
>                      members {
>                          m1 {  # member id, a unique identifier to identify
> a member
>                              ip: 192.168.1.110; # member ip address
>                              ports {
>                                  http {
>                                      value: 9773; # application port
>                                      proxy: 80;   # proxy port exposed by
> load balancer transport, set this value in axis2.xml
>                                  }
>                                  https {
>                                      value: 9453;
>                                      proxy: 443;
>                                  }
>                              }
>                          }
>                      }
>                  }
>                  app-server-cluster2 {  # cluster id, a unique identifier to
> identify a cluster
>                      hosts: foo.org, cluster1.org;  # comma separated
> hostname list
>                      tenant-range: 2-*;
>                      algorithm: round-robin;  # algorithm name
>                      members {
>                          m2 {
>                              ip: 192.168.1.110;
>                              ports {
>                                  http {
>                                      value: 9774;
>                                      proxy: 80;
>                                  }
>                                  https {
>                                      value: 9454;
>                                      proxy: 443;
>                                  }
>                              }
>                          }
>                      }
>                  }
>              }
>                  }
>              }
>          }
>
> Tenant Definitions:
>
> Tenant 1:
> Tenant ID: 1, Tenant Domain: foo.org, Subscriptions: app-server
>
> Tenant 2:
> Tenant ID: 2, Tenant Domain: abc.org, Subscriptions: app-server
>
>
> Super Tenant Request Log:
>
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled, scanning
> URL for tenant...
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL: /
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
> t/([^/]*)/
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier not found in
> URL
> [...] DEBUG - RoundRobin Searching for next member: [service] app-server
> [cluster]: app-server-cluster1 [member-count]: 1 [current-index] 0
> [...] DEBUG - RequestDelegator Next member identified in 1ms: [service]
> app-server [cluster] app-server-cluster1 [member] m1
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> https://192.168.1.110:9453/
>
> Tenant 1 Request Log:
>
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled, scanning
> URL for tenant...
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL:
> /t/foo.org/carbon/admin/index.jsp
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
> t/([^/]*)/
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Identifying tenant using tenant
> domain...
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier found:
> [tenant-domain] foo.org [tenant-id] 1
> [...] DEBUG - RoundRobin Searching for next member: [service] app-server
> [cluster]: app-server-cluster1 [member-count]: 1 [current-index] 0
> [...] DEBUG - RequestDelegator Next member identified in 4ms: [service]
> app-server [cluster] app-server-cluster1 [tenant-id] 1 [member] m1
> [...]  INFO - LoadBalancerInFlightRequestCountCollector Load balancing
> statistics notifier thread started
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> https://192.168.1.110:9453/t/foo.org/carbon/admin/index.jsp
>
> Tenant 2 Request Log:
>
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Multi-tenancy enabled, scanning
> URL for tenant...
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Request URL:
> /t/abc.org/carbon/admin/login.jsp
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier regex:
> t/([^/]*)/
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Identifying tenant using tenant
> domain...
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Tenant identifier found:
> [tenant-domain] abc.org [tenant-id] 2
> [...] DEBUG - RoundRobin Searching for next member: [service] app-server
> [cluster]: app-server-cluster2 [member-count]: 1 [current-index] 0
> [...] DEBUG - RequestDelegator Next member identified in 1ms: [service]
> app-server [cluster] app-server-cluster2 [tenant-id] 2 [member] m2
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> https://192.168.1.110:9454/t/abc.org/carbon/admin/login.jsp
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Existing session found:
> JSESSIONID=585B7333AD1C2920FE0CDDE1BCC610B2
> [...] DEBUG - TenantAwareLoadBalanceEndpoint Sending request to endpoint:
> https://192.168.1.110:9454/carbon/admin/login.jsp
>
>
> Please feel free to add your thoughts on this.
>
> Many Thanks
> Imesh