Commit 5d14a7a6 authored by Marcel Amirault's avatar Marcel Amirault

Merge branch 'gy-update-ra-db-load-balancing-docs' into 'master'

Update RA docs to add Database LB guidance

See merge request gitlab-org/gitlab!74612
parents cacf2fa9 7a2d2d93
...@@ -49,6 +49,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -49,6 +49,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 10k @startuml 10k
skinparam linetype ortho
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
card "**Internal Load Balancer**" as ilb #9370DB card "**Internal Load Balancer**" as ilb #9370DB
...@@ -73,8 +75,8 @@ card "Gitaly Cluster" as gitaly_cluster { ...@@ -73,8 +75,8 @@ card "Gitaly Cluster" as gitaly_cluster {
card "Database" as database { card "Database" as database {
collections "**PGBouncer** x3" as pgbouncer #4EA7FF collections "**PGBouncer** x3" as pgbouncer #4EA7FF
card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF card "**PostgreSQL** //Primary//" as postgres_primary #4EA7FF
collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF collections "**PostgreSQL** //Secondary// x2" as postgres_secondary #4EA7FF
pgbouncer -[#4EA7FF]-> postgres_primary pgbouncer -[#4EA7FF]-> postgres_primary
postgres_primary .[#4EA7FF]> postgres_secondary postgres_primary .[#4EA7FF]> postgres_secondary
...@@ -83,31 +85,38 @@ card "Database" as database { ...@@ -83,31 +85,38 @@ card "Database" as database {
card "redis" as redis { card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347 collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347 collections "**Redis Cache** x3" as redis_cache #FF6347
redis_cache -[hidden]-> redis_persistent
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor elb -[#6a9be7,norank]--> monitor
gitlab -[#32CD32]--> ilb gitlab -[#32CD32,norank]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r-> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32]----> redis
gitlab .[#32CD32]----> database
gitlab -[hidden]-> monitor gitlab -[hidden]-> monitor
gitlab -[hidden]-> consul gitlab -[hidden]-> consul
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1,norank]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r-> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1]----> redis
sidekiq .[#ff8dd1]----> database
sidekiq -[hidden]-> monitor sidekiq -[hidden]-> monitor
sidekiq -[hidden]-> consul sidekiq -[hidden]-> consul
ilb -[#9370DB]-> gitaly_cluster ilb -[#9370DB]--> gitaly_cluster
ilb -[#9370DB]-> database ilb -[#9370DB]--> database
ilb -[hidden]--> redis
ilb -[hidden]u-> consul
ilb -[hidden]u-> monitor
consul .[#e76a9b]u-> gitlab consul .[#e76a9b]u-> gitlab
consul .[#e76a9b]u-> sidekiq consul .[#e76a9b]u-> sidekiq
consul .[#e76a9b]> monitor consul .[#e76a9b]r-> monitor
consul .[#e76a9b]-> database consul .[#e76a9b]-> database
consul .[#e76a9b]-> gitaly_cluster consul .[#e76a9b]-> gitaly_cluster
consul .[#e76a9b,norank]--> redis consul .[#e76a9b,norank]--> redis
...@@ -471,8 +480,8 @@ run: node-exporter: (pid 30093) 76833s; run: log: (pid 29663) 76855s ...@@ -471,8 +480,8 @@ run: node-exporter: (pid 30093) 76833s; run: log: (pid 29663) 76855s
## Configure PostgreSQL ## Configure PostgreSQL
In this section, you'll be guided through configuring an external PostgreSQL database In this section, you'll be guided through configuring a highly available PostgreSQL
to be used with GitLab. cluster to be used with GitLab.
### Provide your own PostgreSQL instance ### Provide your own PostgreSQL instance
...@@ -488,12 +497,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL: ...@@ -488,12 +497,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL:
needs privileges to create the `gitlabhq_production` database. needs privileges to create the `gitlabhq_production` database.
1. Configure the GitLab application servers with the appropriate details. 1. Configure the GitLab application servers with the appropriate details.
This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails). This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails).
1. For improved performance, configuring [Database Load Balancing](../postgresql/database_load_balancing.md)
with multiple read replicas is recommended.
See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for
further configuration steps. further configuration steps.
### Standalone PostgreSQL using Omnibus GitLab ### Standalone PostgreSQL using Omnibus GitLab
The recommended Omnibus GitLab configuration for a PostgreSQL cluster with
replication and failover requires:
- A minimum of three PostgreSQL nodes.
- A minimum of three Consul server nodes.
- A minimum of three PgBouncer nodes that track and handle primary database reads and writes.
- An [internal load balancer](#configure-the-internal-load-balancer) (TCP) to balance requests between the PgBouncer nodes.
- [Database Load Balancing](../postgresql/database_load_balancing.md) enabled.
A local PgBouncer service to be configured on each PostgreSQL node. Note that this is separate from the main PgBouncer cluster that tracks the primary.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.21`: PostgreSQL primary - `10.6.0.21`: PostgreSQL primary
...@@ -548,8 +570,8 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -548,8 +570,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section: 1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
```ruby ```ruby
# Disable all components except Patroni and Consul # Disable all components except Patroni, PgBouncer and Consul
roles(['patroni_role']) roles(['patroni_role', 'pgbouncer_role'])
# PostgreSQL configuration # PostgreSQL configuration
postgresql['listen_address'] = '0.0.0.0' postgresql['listen_address'] = '0.0.0.0'
...@@ -594,6 +616,15 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -594,6 +616,15 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace 10.6.0.0/24 with Network Address # Replace 10.6.0.0/24 with Network Address
postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Local PgBouncer service for Database Load Balancing
pgbouncer['databases'] = {
gitlabhq_production: {
host: "127.0.0.1",
user: "pgbouncer",
password: '<pgbouncer_password_hash>'
}
}
# Set the network addresses that the exporters will listen on for monitoring # Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100' node_exporter['listen_address'] = '0.0.0.0:9100'
postgres_exporter['listen_address'] = '0.0.0.0:9187' postgres_exporter['listen_address'] = '0.0.0.0:9187'
...@@ -654,9 +685,11 @@ If the 'State' column for any node doesn't say "running", check the ...@@ -654,9 +685,11 @@ If the 'State' column for any node doesn't say "running", check the
</a> </a>
</div> </div>
## Configure PgBouncer ### Configure PgBouncer
Now that the PostgreSQL servers are all set up, let's configure PgBouncer
for tracking and handling reads/writes to the primary database.
Now that the PostgreSQL servers are all set up, let's configure PgBouncer.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.31`: PgBouncer 1 - `10.6.0.31`: PgBouncer 1
...@@ -1671,8 +1704,8 @@ To configure the Sidekiq nodes, on each one: ...@@ -1671,8 +1704,8 @@ To configure the Sidekiq nodes, on each one:
gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql' gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs
gitlab_rails['db_encoding'] = 'unicode'
## Prevent database migrations from running on upgrade automatically ## Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -1797,6 +1830,8 @@ On each node perform the following: ...@@ -1797,6 +1830,8 @@ On each node perform the following:
gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs
# Prevent database migrations from running on upgrade automatically # Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -2212,6 +2247,7 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -2212,6 +2247,7 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 10k @startuml 10k
skinparam linetype ortho
card "Kubernetes via Helm Charts" as kubernetes { card "Kubernetes via Helm Charts" as kubernetes {
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
...@@ -2221,7 +2257,6 @@ card "Kubernetes via Helm Charts" as kubernetes { ...@@ -2221,7 +2257,6 @@ card "Kubernetes via Helm Charts" as kubernetes {
collections "**Sidekiq** x4" as sidekiq #ff8dd1 collections "**Sidekiq** x4" as sidekiq #ff8dd1
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4
card "**Supporting Services**" as support card "**Supporting Services**" as support
} }
...@@ -2249,37 +2284,33 @@ card "Database" as database { ...@@ -2249,37 +2284,33 @@ card "Database" as database {
card "redis" as redis { card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347 collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347 collections "**Redis Cache** x3" as redis_cache #FF6347
redis_cache -[hidden]-> redis_persistent
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]-> monitor elb -[hidden]-> sidekiq
elb -[hidden]-> support elb -[hidden]-> support
gitlab -[#32CD32]--> ilb gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r--> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32,norank]----> redis
gitlab -[hidden]--> consul gitlab -[#32CD32]----> database
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r--> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1,norank]----> redis
sidekiq -[hidden]--> consul sidekiq .[#ff8dd1]----> database
ilb -[#9370DB]-> gitaly_cluster
ilb -[#9370DB]-> database
consul .[#e76a9b]-> database ilb -[#9370DB]--> gitaly_cluster
consul .[#e76a9b]-> gitaly_cluster ilb -[#9370DB]--> database
consul .[#e76a9b,norank]--> redis ilb -[hidden,norank]--> redis
monitor .[#7FFFD4]> consul consul .[#e76a9b]--> database
monitor .[#7FFFD4]-> database consul .[#e76a9b,norank]--> gitaly_cluster
monitor .[#7FFFD4]-> gitaly_cluster consul .[#e76a9b]--> redis
monitor .[#7FFFD4,norank]--> redis
monitor .[#7FFFD4]> ilb
monitor .[#7FFFD4,norank]u--> elb
@enduml @enduml
``` ```
......
...@@ -49,6 +49,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -49,6 +49,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 25k @startuml 25k
skinparam linetype ortho
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
card "**Internal Load Balancer**" as ilb #9370DB card "**Internal Load Balancer**" as ilb #9370DB
...@@ -73,8 +75,8 @@ card "Gitaly Cluster" as gitaly_cluster { ...@@ -73,8 +75,8 @@ card "Gitaly Cluster" as gitaly_cluster {
card "Database" as database { card "Database" as database {
collections "**PGBouncer** x3" as pgbouncer #4EA7FF collections "**PGBouncer** x3" as pgbouncer #4EA7FF
card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF card "**PostgreSQL** //Primary//" as postgres_primary #4EA7FF
collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF collections "**PostgreSQL** //Secondary// x2" as postgres_secondary #4EA7FF
pgbouncer -[#4EA7FF]-> postgres_primary pgbouncer -[#4EA7FF]-> postgres_primary
postgres_primary .[#4EA7FF]> postgres_secondary postgres_primary .[#4EA7FF]> postgres_secondary
...@@ -83,31 +85,38 @@ card "Database" as database { ...@@ -83,31 +85,38 @@ card "Database" as database {
card "redis" as redis { card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347 collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347 collections "**Redis Cache** x3" as redis_cache #FF6347
redis_cache -[hidden]-> redis_persistent
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor elb -[#6a9be7,norank]--> monitor
gitlab -[#32CD32]--> ilb gitlab -[#32CD32,norank]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r-> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32]----> redis
gitlab .[#32CD32]----> database
gitlab -[hidden]-> monitor gitlab -[hidden]-> monitor
gitlab -[hidden]-> consul gitlab -[hidden]-> consul
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1,norank]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r-> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1]----> redis
sidekiq .[#ff8dd1]----> database
sidekiq -[hidden]-> monitor sidekiq -[hidden]-> monitor
sidekiq -[hidden]-> consul sidekiq -[hidden]-> consul
ilb -[#9370DB]-> gitaly_cluster ilb -[#9370DB]--> gitaly_cluster
ilb -[#9370DB]-> database ilb -[#9370DB]--> database
ilb -[hidden]--> redis
ilb -[hidden]u-> consul
ilb -[hidden]u-> monitor
consul .[#e76a9b]u-> gitlab consul .[#e76a9b]u-> gitlab
consul .[#e76a9b]u-> sidekiq consul .[#e76a9b]u-> sidekiq
consul .[#e76a9b]> monitor consul .[#e76a9b]r-> monitor
consul .[#e76a9b]-> database consul .[#e76a9b]-> database
consul .[#e76a9b]-> gitaly_cluster consul .[#e76a9b]-> gitaly_cluster
consul .[#e76a9b,norank]--> redis consul .[#e76a9b,norank]--> redis
...@@ -474,8 +483,8 @@ run: node-exporter: (pid 30093) 76833s; run: log: (pid 29663) 76855s ...@@ -474,8 +483,8 @@ run: node-exporter: (pid 30093) 76833s; run: log: (pid 29663) 76855s
## Configure PostgreSQL ## Configure PostgreSQL
In this section, you'll be guided through configuring an external PostgreSQL database In this section, you'll be guided through configuring a highly available PostgreSQL
to be used with GitLab. cluster to be used with GitLab.
### Provide your own PostgreSQL instance ### Provide your own PostgreSQL instance
...@@ -491,12 +500,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL: ...@@ -491,12 +500,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL:
needs privileges to create the `gitlabhq_production` database. needs privileges to create the `gitlabhq_production` database.
1. Configure the GitLab application servers with the appropriate details. 1. Configure the GitLab application servers with the appropriate details.
This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails). This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails).
1. For improved performance, configuring [Database Load Balancing](../postgresql/database_load_balancing.md)
with multiple read replicas is recommended.
See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for
further configuration steps. further configuration steps.
### Standalone PostgreSQL using Omnibus GitLab ### Standalone PostgreSQL using Omnibus GitLab
The recommended Omnibus GitLab configuration for a PostgreSQL cluster with
replication and failover requires:
- A minimum of three PostgreSQL nodes.
- A minimum of three Consul server nodes.
- A minimum of three PgBouncer nodes that track and handle primary database reads and writes.
- An [internal load balancer](#configure-the-internal-load-balancer) (TCP) to balance requests between the PgBouncer nodes.
- [Database Load Balancing](../postgresql/database_load_balancing.md) enabled.
A local PgBouncer service to be configured on each PostgreSQL node. Note that this is separate from the main PgBouncer cluster that tracks the primary.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.21`: PostgreSQL primary - `10.6.0.21`: PostgreSQL primary
...@@ -551,8 +573,8 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -551,8 +573,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section: 1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
```ruby ```ruby
# Disable all components except Patroni and Consul # Disable all components except Patroni, PgBouncer and Consul
roles(['patroni_role']) roles(['patroni_role', 'pgbouncer_role'])
# PostgreSQL configuration # PostgreSQL configuration
postgresql['listen_address'] = '0.0.0.0' postgresql['listen_address'] = '0.0.0.0'
...@@ -597,6 +619,15 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -597,6 +619,15 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace 10.6.0.0/24 with Network Address # Replace 10.6.0.0/24 with Network Address
postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Local PgBouncer service for Database Load Balancing
pgbouncer['databases'] = {
gitlabhq_production: {
host: "127.0.0.1",
user: "pgbouncer",
password: '<pgbouncer_password_hash>'
}
}
# Set the network addresses that the exporters will listen on for monitoring # Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100' node_exporter['listen_address'] = '0.0.0.0:9100'
postgres_exporter['listen_address'] = '0.0.0.0:9187' postgres_exporter['listen_address'] = '0.0.0.0:9187'
...@@ -657,9 +688,11 @@ If the 'State' column for any node doesn't say "running", check the ...@@ -657,9 +688,11 @@ If the 'State' column for any node doesn't say "running", check the
</a> </a>
</div> </div>
## Configure PgBouncer ### Configure PgBouncer
Now that the PostgreSQL servers are all set up, let's configure PgBouncer
for tracking and handling reads/writes to the primary database.
Now that the PostgreSQL servers are all set up, let's configure PgBouncer.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.31`: PgBouncer 1 - `10.6.0.31`: PgBouncer 1
...@@ -1677,8 +1710,8 @@ To configure the Sidekiq nodes, on each one: ...@@ -1677,8 +1710,8 @@ To configure the Sidekiq nodes, on each one:
gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql' gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs
gitlab_rails['db_encoding'] = 'unicode'
## Prevent database migrations from running on upgrade automatically ## Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -1805,6 +1838,8 @@ On each node perform the following: ...@@ -1805,6 +1838,8 @@ On each node perform the following:
gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs
# Prevent database migrations from running on upgrade automatically # Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -2212,16 +2247,16 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -2212,16 +2247,16 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 25k @startuml 25k
skinparam linetype ortho
card "Kubernetes via Helm Charts" as kubernetes { card "Kubernetes via Helm Charts" as kubernetes {
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
together { together {
collections "**Webservice** x7" as gitlab #32CD32 collections "**Webservice** x4" as gitlab #32CD32
collections "**Sidekiq** x4" as sidekiq #ff8dd1 collections "**Sidekiq** x4" as sidekiq #ff8dd1
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4
card "**Supporting Services**" as support card "**Supporting Services**" as support
} }
...@@ -2249,37 +2284,33 @@ card "Database" as database { ...@@ -2249,37 +2284,33 @@ card "Database" as database {
card "redis" as redis { card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347 collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347 collections "**Redis Cache** x3" as redis_cache #FF6347
redis_cache -[hidden]-> redis_persistent
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]-> monitor elb -[hidden]-> sidekiq
elb -[hidden]-> support elb -[hidden]-> support
gitlab -[#32CD32]--> ilb gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r--> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32,norank]----> redis
gitlab -[hidden]--> consul gitlab -[#32CD32]----> database
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r--> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1,norank]----> redis
sidekiq -[hidden]--> consul sidekiq .[#ff8dd1]----> database
ilb -[#9370DB]-> gitaly_cluster
ilb -[#9370DB]-> database
consul .[#e76a9b]-> database ilb -[#9370DB]--> gitaly_cluster
consul .[#e76a9b]-> gitaly_cluster ilb -[#9370DB]--> database
consul .[#e76a9b,norank]--> redis ilb -[hidden,norank]--> redis
monitor .[#7FFFD4]> consul consul .[#e76a9b]--> database
monitor .[#7FFFD4]-> database consul .[#e76a9b,norank]--> gitaly_cluster
monitor .[#7FFFD4]-> gitaly_cluster consul .[#e76a9b]--> redis
monitor .[#7FFFD4,norank]--> redis
monitor .[#7FFFD4]> ilb
monitor .[#7FFFD4,norank]u--> elb
@enduml @enduml
``` ```
......
...@@ -41,6 +41,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -41,6 +41,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 2k @startuml 2k
skinparam linetype ortho
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
collections "**GitLab Rails** x3" as gitlab #32CD32 collections "**GitLab Rails** x3" as gitlab #32CD32
...@@ -1038,6 +1040,7 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -1038,6 +1040,7 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 2k @startuml 2k
skinparam linetype ortho
card "Kubernetes via Helm Charts" as kubernetes { card "Kubernetes via Helm Charts" as kubernetes {
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
...@@ -1045,10 +1048,8 @@ card "Kubernetes via Helm Charts" as kubernetes { ...@@ -1045,10 +1048,8 @@ card "Kubernetes via Helm Charts" as kubernetes {
together { together {
collections "**Webservice** x3" as gitlab #32CD32 collections "**Webservice** x3" as gitlab #32CD32
collections "**Sidekiq** x2" as sidekiq #ff8dd1 collections "**Sidekiq** x2" as sidekiq #ff8dd1
card "**Supporting Services**" as support
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4
card "**Supporting Services**" as support
} }
card "**Gitaly**" as gitaly #FF8C00 card "**Gitaly**" as gitaly #FF8C00
...@@ -1057,7 +1058,6 @@ card "**Redis**" as redis #FF6347 ...@@ -1057,7 +1058,6 @@ card "**Redis**" as redis #FF6347
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor
gitlab -[#32CD32]--> gitaly gitlab -[#32CD32]--> gitaly
gitlab -[#32CD32]--> postgres gitlab -[#32CD32]--> postgres
...@@ -1066,14 +1066,8 @@ gitlab -[#32CD32]--> redis ...@@ -1066,14 +1066,8 @@ gitlab -[#32CD32]--> redis
sidekiq -[#ff8dd1]--> gitaly sidekiq -[#ff8dd1]--> gitaly
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]-> object_storage
sidekiq -[#ff8dd1]---> postgres sidekiq -[#ff8dd1]--> postgres
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1]--> redis
monitor .[#7FFFD4]u-> gitlab
monitor .[#7FFFD4]-> gitaly
monitor .[#7FFFD4]-> postgres
monitor .[#7FFFD4,norank]--> redis
monitor .[#7FFFD4,norank]u--> elb
@enduml @enduml
``` ```
......
...@@ -58,6 +58,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -58,6 +58,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 3k @startuml 3k
skinparam linetype ortho
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
card "**Internal Load Balancer**" as ilb #9370DB card "**Internal Load Balancer**" as ilb #9370DB
...@@ -66,7 +68,10 @@ together { ...@@ -66,7 +68,10 @@ together {
collections "**Sidekiq** x4" as sidekiq #ff8dd1 collections "**Sidekiq** x4" as sidekiq #ff8dd1
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4 together {
card "**Prometheus + Grafana**" as monitor #7FFFD4
collections "**Consul** x3" as consul #e76a9b
}
card "Gitaly Cluster" as gitaly_cluster { card "Gitaly Cluster" as gitaly_cluster {
collections "**Praefect** x3" as praefect #FF8C00 collections "**Praefect** x3" as praefect #FF8C00
...@@ -79,47 +84,45 @@ card "Gitaly Cluster" as gitaly_cluster { ...@@ -79,47 +84,45 @@ card "Gitaly Cluster" as gitaly_cluster {
card "Database" as database { card "Database" as database {
collections "**PGBouncer** x3" as pgbouncer #4EA7FF collections "**PGBouncer** x3" as pgbouncer #4EA7FF
card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF card "**PostgreSQL** //Primary//" as postgres_primary #4EA7FF
collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF collections "**PostgreSQL** //Secondary// x2" as postgres_secondary #4EA7FF
pgbouncer -[#4EA7FF]-> postgres_primary pgbouncer -[#4EA7FF]-> postgres_primary
postgres_primary .[#4EA7FF]> postgres_secondary postgres_primary .[#4EA7FF]> postgres_secondary
} }
card "**Consul + Sentinel**" as consul_sentinel {
collections "**Consul** x3" as consul #e76a9b
collections "**Redis Sentinel** x3" as sentinel #e6e727
}
card "Redis" as redis { card "Redis" as redis {
collections "**Redis** x3" as redis_nodes #FF6347 collections "**Redis** x3" as redis_nodes #FF6347
redis_nodes <.[#FF6347]- sentinel
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor elb -[#6a9be7,norank]--> monitor
gitlab -[#32CD32]--> ilb gitlab -[#32CD32,norank]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r-> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32]----> redis
gitlab .[#32CD32]----> database
gitlab -[hidden]-> monitor gitlab -[hidden]-> monitor
gitlab -[hidden]-> consul gitlab -[hidden]-> consul
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1,norank]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r-> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1]----> redis
sidekiq .[#ff8dd1]----> database
sidekiq -[hidden]-> monitor sidekiq -[hidden]-> monitor
sidekiq -[hidden]-> consul sidekiq -[hidden]-> consul
ilb -[#9370DB]-> gitaly_cluster ilb -[#9370DB]--> gitaly_cluster
ilb -[#9370DB]-> database ilb -[#9370DB]--> database
ilb -[hidden]--> redis
ilb -[hidden]u-> consul
ilb -[hidden]u-> monitor
consul .[#e76a9b]u-> gitlab consul .[#e76a9b]u-> gitlab
consul .[#e76a9b]u-> sidekiq consul .[#e76a9b]u-> sidekiq
consul .[#e76a9b]> monitor consul .[#e76a9b]r-> monitor
consul .[#e76a9b]-> database consul .[#e76a9b]-> database
consul .[#e76a9b]-> gitaly_cluster consul .[#e76a9b]-> gitaly_cluster
consul .[#e76a9b,norank]--> redis consul .[#e76a9b,norank]--> redis
...@@ -769,8 +772,8 @@ run: sentinel: (pid 30098) 76832s; run: log: (pid 29704) 76850s ...@@ -769,8 +772,8 @@ run: sentinel: (pid 30098) 76832s; run: log: (pid 29704) 76850s
## Configure PostgreSQL ## Configure PostgreSQL
In this section, you'll be guided through configuring an external PostgreSQL database In this section, you'll be guided through configuring a highly available PostgreSQL
to be used with GitLab. cluster to be used with GitLab.
### Provide your own PostgreSQL instance ### Provide your own PostgreSQL instance
...@@ -786,12 +789,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL: ...@@ -786,12 +789,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL:
needs privileges to create the `gitlabhq_production` database. needs privileges to create the `gitlabhq_production` database.
1. Configure the GitLab application servers with the appropriate details. 1. Configure the GitLab application servers with the appropriate details.
This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails). This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails).
1. For improved performance, configuring [Database Load Balancing](../postgresql/database_load_balancing.md)
with multiple read replicas is recommended.
See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for
further configuration steps. further configuration steps.
### Standalone PostgreSQL using Omnibus GitLab ### Standalone PostgreSQL using Omnibus GitLab
The recommended Omnibus GitLab configuration for a PostgreSQL cluster with
replication and failover requires:
- A minimum of three PostgreSQL nodes.
- A minimum of three Consul server nodes.
- A minimum of three PgBouncer nodes that track and handle primary database reads and writes.
- An [internal load balancer](#configure-the-internal-load-balancer) (TCP) to balance requests between the PgBouncer nodes.
- [Database Load Balancing](../postgresql/database_load_balancing.md) enabled.
A local PgBouncer service to be configured on each PostgreSQL node. Note that this is separate from the main PgBouncer cluster that tracks the primary.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.31`: PostgreSQL primary - `10.6.0.31`: PostgreSQL primary
...@@ -846,8 +862,8 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -846,8 +862,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section: 1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
```ruby ```ruby
# Disable all components except Patroni and Consul # Disable all components except Patroni, PgBouncer and Consul
roles(['patroni_role']) roles(['patroni_role', 'pgbouncer_role'])
# PostgreSQL configuration # PostgreSQL configuration
postgresql['listen_address'] = '0.0.0.0' postgresql['listen_address'] = '0.0.0.0'
...@@ -892,6 +908,15 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -892,6 +908,15 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace 10.6.0.0/24 with Network Address # Replace 10.6.0.0/24 with Network Address
postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Local PgBouncer service for Database Load Balancing
pgbouncer['databases'] = {
gitlabhq_production: {
host: "127.0.0.1",
user: "pgbouncer",
password: '<pgbouncer_password_hash>'
}
}
# Set the network addresses that the exporters will listen on for monitoring # Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100' node_exporter['listen_address'] = '0.0.0.0:9100'
postgres_exporter['listen_address'] = '0.0.0.0:9187' postgres_exporter['listen_address'] = '0.0.0.0:9187'
...@@ -952,9 +977,11 @@ If the 'State' column for any node doesn't say "running", check the ...@@ -952,9 +977,11 @@ If the 'State' column for any node doesn't say "running", check the
</a> </a>
</div> </div>
## Configure PgBouncer ### Configure PgBouncer
Now that the PostgreSQL servers are all set up, let's configure PgBouncer
for tracking and handling reads/writes to the primary database.
Now that the PostgreSQL servers are all set up, let's configure PgBouncer.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.21`: PgBouncer 1 - `10.6.0.21`: PgBouncer 1
...@@ -1613,8 +1640,8 @@ To configure the Sidekiq nodes, one each one: ...@@ -1613,8 +1640,8 @@ To configure the Sidekiq nodes, one each one:
gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql' gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.31', '10.6.0.32', '10.6.0.33'] } # PostgreSQL IPs
gitlab_rails['db_encoding'] = 'unicode'
## Prevent database migrations from running on upgrade automatically ## Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -1773,6 +1800,8 @@ On each node perform the following: ...@@ -1773,6 +1800,8 @@ On each node perform the following:
gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.31', '10.6.0.32', '10.6.0.33'] } # PostgreSQL IPs
# Prevent database migrations from running on upgrade automatically # Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -2183,25 +2212,21 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -2183,25 +2212,21 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 3k @startuml 3k
skinparam linetype ortho
card "Kubernetes via Helm Charts" as kubernetes { card "Kubernetes via Helm Charts" as kubernetes {
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
together { together {
collections "**Webservice** x2" as gitlab #32CD32 collections "**Webservice** x4" as gitlab #32CD32
collections "**Sidekiq** x3" as sidekiq #ff8dd1 collections "**Sidekiq** x4" as sidekiq #ff8dd1
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4
card "**Supporting Services**" as support card "**Supporting Services**" as support
} }
card "**Internal Load Balancer**" as ilb #9370DB card "**Internal Load Balancer**" as ilb #9370DB
collections "**Consul** x3" as consul #e76a9b
card "**Consul + Sentinel**" as consul_sentinel {
collections "**Consul** x3" as consul #e76a9b
collections "**Redis Sentinel** x3" as sentinel #e6e727
}
card "Gitaly Cluster" as gitaly_cluster { card "Gitaly Cluster" as gitaly_cluster {
collections "**Praefect** x3" as praefect #FF8C00 collections "**Praefect** x3" as praefect #FF8C00
...@@ -2221,41 +2246,33 @@ card "Database" as database { ...@@ -2221,41 +2246,33 @@ card "Database" as database {
postgres_primary .[#4EA7FF]> postgres_secondary postgres_primary .[#4EA7FF]> postgres_secondary
} }
card "Redis" as redis { card "redis" as redis {
collections "**Redis** x3" as redis_nodes #FF6347 collections "**Redis** x3" as redis_nodes #FF6347
redis_nodes <.[#FF6347]- sentinel
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]-> monitor elb -[hidden]-> sidekiq
elb -[hidden]-> support elb -[hidden]-> support
gitlab -[#32CD32]--> ilb gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r--> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32,norank]----> redis
gitlab -[hidden]--> consul gitlab -[#32CD32]----> database
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r--> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1,norank]----> redis
sidekiq -[hidden]--> consul sidekiq .[#ff8dd1]----> database
ilb -[#9370DB]-> gitaly_cluster
ilb -[#9370DB]-> database
consul .[#e76a9b]-> database ilb -[#9370DB]--> gitaly_cluster
consul .[#e76a9b]-> gitaly_cluster ilb -[#9370DB]--> database
consul .[#e76a9b,norank]--> redis ilb -[hidden,norank]--> redis
monitor .[#7FFFD4]> consul consul .[#e76a9b]--> database
monitor .[#7FFFD4]-> database consul .[#e76a9b,norank]--> gitaly_cluster
monitor .[#7FFFD4]-> gitaly_cluster consul .[#e76a9b]--> redis
monitor .[#7FFFD4,norank]--> redis
monitor .[#7FFFD4]> ilb
monitor .[#7FFFD4,norank]u--> elb
@enduml @enduml
``` ```
......
...@@ -49,6 +49,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -49,6 +49,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 50k @startuml 50k
skinparam linetype ortho
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
card "**Internal Load Balancer**" as ilb #9370DB card "**Internal Load Balancer**" as ilb #9370DB
...@@ -73,8 +75,8 @@ card "Gitaly Cluster" as gitaly_cluster { ...@@ -73,8 +75,8 @@ card "Gitaly Cluster" as gitaly_cluster {
card "Database" as database { card "Database" as database {
collections "**PGBouncer** x3" as pgbouncer #4EA7FF collections "**PGBouncer** x3" as pgbouncer #4EA7FF
card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF card "**PostgreSQL** //Primary//" as postgres_primary #4EA7FF
collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF collections "**PostgreSQL** //Secondary// x2" as postgres_secondary #4EA7FF
pgbouncer -[#4EA7FF]-> postgres_primary pgbouncer -[#4EA7FF]-> postgres_primary
postgres_primary .[#4EA7FF]> postgres_secondary postgres_primary .[#4EA7FF]> postgres_secondary
...@@ -83,31 +85,38 @@ card "Database" as database { ...@@ -83,31 +85,38 @@ card "Database" as database {
card "redis" as redis { card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347 collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347 collections "**Redis Cache** x3" as redis_cache #FF6347
redis_cache -[hidden]-> redis_persistent
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor elb -[#6a9be7,norank]--> monitor
gitlab -[#32CD32]--> ilb gitlab -[#32CD32,norank]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r-> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32]----> redis
gitlab .[#32CD32]----> database
gitlab -[hidden]-> monitor gitlab -[hidden]-> monitor
gitlab -[hidden]-> consul gitlab -[hidden]-> consul
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1,norank]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r-> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1]----> redis
sidekiq .[#ff8dd1]----> database
sidekiq -[hidden]-> monitor sidekiq -[hidden]-> monitor
sidekiq -[hidden]-> consul sidekiq -[hidden]-> consul
ilb -[#9370DB]-> gitaly_cluster ilb -[#9370DB]--> gitaly_cluster
ilb -[#9370DB]-> database ilb -[#9370DB]--> database
ilb -[hidden]--> redis
ilb -[hidden]u-> consul
ilb -[hidden]u-> monitor
consul .[#e76a9b]u-> gitlab consul .[#e76a9b]u-> gitlab
consul .[#e76a9b]u-> sidekiq consul .[#e76a9b]u-> sidekiq
consul .[#e76a9b]> monitor consul .[#e76a9b]r-> monitor
consul .[#e76a9b]-> database consul .[#e76a9b]-> database
consul .[#e76a9b]-> gitaly_cluster consul .[#e76a9b]-> gitaly_cluster
consul .[#e76a9b,norank]--> redis consul .[#e76a9b,norank]--> redis
...@@ -480,8 +489,8 @@ run: node-exporter: (pid 30093) 76833s; run: log: (pid 29663) 76855s ...@@ -480,8 +489,8 @@ run: node-exporter: (pid 30093) 76833s; run: log: (pid 29663) 76855s
## Configure PostgreSQL ## Configure PostgreSQL
In this section, you'll be guided through configuring an external PostgreSQL database In this section, you'll be guided through configuring a highly available PostgreSQL
to be used with GitLab. cluster to be used with GitLab.
### Provide your own PostgreSQL instance ### Provide your own PostgreSQL instance
...@@ -497,12 +506,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL: ...@@ -497,12 +506,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL:
needs privileges to create the `gitlabhq_production` database. needs privileges to create the `gitlabhq_production` database.
1. Configure the GitLab application servers with the appropriate details. 1. Configure the GitLab application servers with the appropriate details.
This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails). This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails).
1. For improved performance, configuring [Database Load Balancing](../postgresql/database_load_balancing.md)
with multiple read replicas is recommended.
See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for
further configuration steps. further configuration steps.
### Standalone PostgreSQL using Omnibus GitLab ### Standalone PostgreSQL using Omnibus GitLab
The recommended Omnibus GitLab configuration for a PostgreSQL cluster with
replication and failover requires:
- A minimum of three PostgreSQL nodes.
- A minimum of three Consul server nodes.
- A minimum of three PgBouncer nodes that track and handle primary database reads and writes.
- An [internal load balancer](#configure-the-internal-load-balancer) (TCP) to balance requests between the PgBouncer nodes.
- [Database Load Balancing](../postgresql/database_load_balancing.md) enabled.
A local PgBouncer service to be configured on each PostgreSQL node. Note that this is separate from the main PgBouncer cluster that tracks the primary.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.21`: PostgreSQL primary - `10.6.0.21`: PostgreSQL primary
...@@ -557,8 +579,8 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -557,8 +579,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section: 1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
```ruby ```ruby
# Disable all components except Patroni and Consul # Disable all components except Patroni, PgBouncer and Consul
roles(['patroni_role']) roles(['patroni_role', 'pgbouncer_role'])
# PostgreSQL configuration # PostgreSQL configuration
postgresql['listen_address'] = '0.0.0.0' postgresql['listen_address'] = '0.0.0.0'
...@@ -604,6 +626,15 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -604,6 +626,15 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace 10.6.0.0/24 with Network Address # Replace 10.6.0.0/24 with Network Address
postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Local PgBouncer service for Database Load Balancing
pgbouncer['databases'] = {
gitlabhq_production: {
host: "127.0.0.1",
user: "pgbouncer",
password: '<pgbouncer_password_hash>'
}
}
# Set the network addresses that the exporters will listen on for monitoring # Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100' node_exporter['listen_address'] = '0.0.0.0:9100'
postgres_exporter['listen_address'] = '0.0.0.0:9187' postgres_exporter['listen_address'] = '0.0.0.0:9187'
...@@ -664,9 +695,11 @@ If the 'State' column for any node doesn't say "running", check the ...@@ -664,9 +695,11 @@ If the 'State' column for any node doesn't say "running", check the
</a> </a>
</div> </div>
## Configure PgBouncer ### Configure PgBouncer
Now that the PostgreSQL servers are all set up, let's configure PgBouncer
for tracking and handling reads/writes to the primary database.
Now that the PostgreSQL servers are all set up, let's configure PgBouncer.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.31`: PgBouncer 1 - `10.6.0.31`: PgBouncer 1
...@@ -891,7 +924,7 @@ a node and change its status from primary to replica (and vice versa). ...@@ -891,7 +924,7 @@ a node and change its status from primary to replica (and vice versa).
package of your choice. Be sure to both follow _only_ installation steps 1 and 2 package of your choice. Be sure to both follow _only_ installation steps 1 and 2
on the page, and to select the correct Omnibus GitLab package, with the same version on the page, and to select the correct Omnibus GitLab package, with the same version
and type (Community or Enterprise editions) as your current install. and type (Community or Enterprise editions) as your current install.
1. Edit `/etc/gitlab/gitlab.rb` and add the same contents as the priimary node in the previous section by replacing `redis_master_node` with `redis_replica_node`: 1. Edit `/etc/gitlab/gitlab.rb` and add the same contents as the primary node in the previous section by replacing `redis_master_node` with `redis_replica_node`:
```ruby ```ruby
# Specify server role as 'redis_replica_role' with Sentinel and enable Consul agent # Specify server role as 'redis_replica_role' with Sentinel and enable Consul agent
...@@ -1684,8 +1717,8 @@ To configure the Sidekiq nodes, on each one: ...@@ -1684,8 +1717,8 @@ To configure the Sidekiq nodes, on each one:
gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql' gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs
gitlab_rails['db_encoding'] = 'unicode'
## Prevent database migrations from running on upgrade automatically ## Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -1819,6 +1852,8 @@ On each node perform the following: ...@@ -1819,6 +1852,8 @@ On each node perform the following:
gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.21', '10.6.0.22', '10.6.0.23'] } # PostgreSQL IPs
# Prevent database migrations from running on upgrade automatically # Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -2226,16 +2261,16 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -2226,16 +2261,16 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 50k @startuml 50k
skinparam linetype ortho
card "Kubernetes via Helm Charts" as kubernetes { card "Kubernetes via Helm Charts" as kubernetes {
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
together { together {
collections "**Webservice** x16" as gitlab #32CD32 collections "**Webservice** x4" as gitlab #32CD32
collections "**Sidekiq** x4" as sidekiq #ff8dd1 collections "**Sidekiq** x4" as sidekiq #ff8dd1
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4
card "**Supporting Services**" as support card "**Supporting Services**" as support
} }
...@@ -2263,37 +2298,33 @@ card "Database" as database { ...@@ -2263,37 +2298,33 @@ card "Database" as database {
card "redis" as redis { card "redis" as redis {
collections "**Redis Persistent** x3" as redis_persistent #FF6347 collections "**Redis Persistent** x3" as redis_persistent #FF6347
collections "**Redis Cache** x3" as redis_cache #FF6347 collections "**Redis Cache** x3" as redis_cache #FF6347
redis_cache -[hidden]-> redis_persistent
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]-> monitor elb -[hidden]-> sidekiq
elb -[hidden]-> support elb -[hidden]-> support
gitlab -[#32CD32]--> ilb gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r--> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32,norank]----> redis
gitlab -[hidden]--> consul gitlab -[#32CD32]----> database
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r--> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1,norank]----> redis
sidekiq -[hidden]--> consul sidekiq .[#ff8dd1]----> database
ilb -[#9370DB]-> gitaly_cluster
ilb -[#9370DB]-> database
consul .[#e76a9b]-> database ilb -[#9370DB]--> gitaly_cluster
consul .[#e76a9b]-> gitaly_cluster ilb -[#9370DB]--> database
consul .[#e76a9b,norank]--> redis ilb -[hidden,norank]--> redis
monitor .[#7FFFD4]> consul consul .[#e76a9b]--> database
monitor .[#7FFFD4]-> database consul .[#e76a9b,norank]--> gitaly_cluster
monitor .[#7FFFD4]-> gitaly_cluster consul .[#e76a9b]--> redis
monitor .[#7FFFD4,norank]--> redis
monitor .[#7FFFD4]> ilb
monitor .[#7FFFD4,norank]u--> elb
@enduml @enduml
``` ```
......
...@@ -55,6 +55,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -55,6 +55,8 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 5k @startuml 5k
skinparam linetype ortho
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
card "**Internal Load Balancer**" as ilb #9370DB card "**Internal Load Balancer**" as ilb #9370DB
...@@ -63,7 +65,10 @@ together { ...@@ -63,7 +65,10 @@ together {
collections "**Sidekiq** x4" as sidekiq #ff8dd1 collections "**Sidekiq** x4" as sidekiq #ff8dd1
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4 together {
card "**Prometheus + Grafana**" as monitor #7FFFD4
collections "**Consul** x3" as consul #e76a9b
}
card "Gitaly Cluster" as gitaly_cluster { card "Gitaly Cluster" as gitaly_cluster {
collections "**Praefect** x3" as praefect #FF8C00 collections "**Praefect** x3" as praefect #FF8C00
...@@ -76,47 +81,45 @@ card "Gitaly Cluster" as gitaly_cluster { ...@@ -76,47 +81,45 @@ card "Gitaly Cluster" as gitaly_cluster {
card "Database" as database { card "Database" as database {
collections "**PGBouncer** x3" as pgbouncer #4EA7FF collections "**PGBouncer** x3" as pgbouncer #4EA7FF
card "**PostgreSQL** (Primary)" as postgres_primary #4EA7FF card "**PostgreSQL** //Primary//" as postgres_primary #4EA7FF
collections "**PostgreSQL** (Secondary) x2" as postgres_secondary #4EA7FF collections "**PostgreSQL** //Secondary// x2" as postgres_secondary #4EA7FF
pgbouncer -[#4EA7FF]-> postgres_primary pgbouncer -[#4EA7FF]-> postgres_primary
postgres_primary .[#4EA7FF]> postgres_secondary postgres_primary .[#4EA7FF]> postgres_secondary
} }
card "**Consul + Sentinel**" as consul_sentinel {
collections "**Consul** x3" as consul #e76a9b
collections "**Redis Sentinel** x3" as sentinel #e6e727
}
card "Redis" as redis { card "Redis" as redis {
collections "**Redis** x3" as redis_nodes #FF6347 collections "**Redis** x3" as redis_nodes #FF6347
redis_nodes <.[#FF6347]- sentinel
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]--> monitor elb -[#6a9be7,norank]--> monitor
gitlab -[#32CD32]--> ilb gitlab -[#32CD32,norank]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r-> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32]----> redis
gitlab .[#32CD32]----> database
gitlab -[hidden]-> monitor gitlab -[hidden]-> monitor
gitlab -[hidden]-> consul gitlab -[hidden]-> consul
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1,norank]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r-> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1]----> redis
sidekiq .[#ff8dd1]----> database
sidekiq -[hidden]-> monitor sidekiq -[hidden]-> monitor
sidekiq -[hidden]-> consul sidekiq -[hidden]-> consul
ilb -[#9370DB]-> gitaly_cluster ilb -[#9370DB]--> gitaly_cluster
ilb -[#9370DB]-> database ilb -[#9370DB]--> database
ilb -[hidden]--> redis
ilb -[hidden]u-> consul
ilb -[hidden]u-> monitor
consul .[#e76a9b]u-> gitlab consul .[#e76a9b]u-> gitlab
consul .[#e76a9b]u-> sidekiq consul .[#e76a9b]u-> sidekiq
consul .[#e76a9b]> monitor consul .[#e76a9b]r-> monitor
consul .[#e76a9b]-> database consul .[#e76a9b]-> database
consul .[#e76a9b]-> gitaly_cluster consul .[#e76a9b]-> gitaly_cluster
consul .[#e76a9b,norank]--> redis consul .[#e76a9b,norank]--> redis
...@@ -760,8 +763,8 @@ run: sentinel: (pid 30098) 76832s; run: log: (pid 29704) 76850s ...@@ -760,8 +763,8 @@ run: sentinel: (pid 30098) 76832s; run: log: (pid 29704) 76850s
## Configure PostgreSQL ## Configure PostgreSQL
In this section, you'll be guided through configuring an external PostgreSQL database In this section, you'll be guided through configuring a highly available PostgreSQL
to be used with GitLab. cluster to be used with GitLab.
### Provide your own PostgreSQL instance ### Provide your own PostgreSQL instance
...@@ -777,12 +780,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL: ...@@ -777,12 +780,25 @@ If you use a cloud-managed service, or provide your own PostgreSQL:
needs privileges to create the `gitlabhq_production` database. needs privileges to create the `gitlabhq_production` database.
1. Configure the GitLab application servers with the appropriate details. 1. Configure the GitLab application servers with the appropriate details.
This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails). This step is covered in [Configuring the GitLab Rails application](#configure-gitlab-rails).
1. For improved performance, configuring [Database Load Balancing](../postgresql/database_load_balancing.md)
with multiple read replicas is recommended.
See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for See [Configure GitLab using an external PostgreSQL service](../postgresql/external.md) for
further configuration steps. further configuration steps.
### Standalone PostgreSQL using Omnibus GitLab ### Standalone PostgreSQL using Omnibus GitLab
The recommended Omnibus GitLab configuration for a PostgreSQL cluster with
replication and failover requires:
- A minimum of three PostgreSQL nodes.
- A minimum of three Consul server nodes.
- A minimum of three PgBouncer nodes that track and handle primary database reads and writes.
- An [internal load balancer](#configure-the-internal-load-balancer) (TCP) to balance requests between the PgBouncer nodes.
- [Database Load Balancing](../postgresql/database_load_balancing.md) enabled.
A local PgBouncer service to be configured on each PostgreSQL node. Note that this is separate from the main PgBouncer cluster that tracks the primary.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.31`: PostgreSQL primary - `10.6.0.31`: PostgreSQL primary
...@@ -837,8 +853,8 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -837,8 +853,8 @@ in the second step, do not supply the `EXTERNAL_URL` value.
1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section: 1. On every database node, edit `/etc/gitlab/gitlab.rb` replacing values noted in the `# START user configuration` section:
```ruby ```ruby
# Disable all components except Patroni and Consul # Disable all components except Patroni, PgBouncer and Consul
roles(['patroni_role']) roles(['patroni_role', 'pgbouncer_role'])
# PostgreSQL configuration # PostgreSQL configuration
postgresql['listen_address'] = '0.0.0.0' postgresql['listen_address'] = '0.0.0.0'
...@@ -883,6 +899,15 @@ in the second step, do not supply the `EXTERNAL_URL` value. ...@@ -883,6 +899,15 @@ in the second step, do not supply the `EXTERNAL_URL` value.
# Replace 10.6.0.0/24 with Network Address # Replace 10.6.0.0/24 with Network Address
postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32) postgresql['trust_auth_cidr_addresses'] = %w(10.6.0.0/24 127.0.0.1/32)
# Local PgBouncer service for Database Load Balancing
pgbouncer['databases'] = {
gitlabhq_production: {
host: "127.0.0.1",
user: "pgbouncer",
password: '<pgbouncer_password_hash>'
}
}
# Set the network addresses that the exporters will listen on for monitoring # Set the network addresses that the exporters will listen on for monitoring
node_exporter['listen_address'] = '0.0.0.0:9100' node_exporter['listen_address'] = '0.0.0.0:9100'
postgres_exporter['listen_address'] = '0.0.0.0:9187' postgres_exporter['listen_address'] = '0.0.0.0:9187'
...@@ -943,9 +968,11 @@ If the 'State' column for any node doesn't say "running", check the ...@@ -943,9 +968,11 @@ If the 'State' column for any node doesn't say "running", check the
</a> </a>
</div> </div>
## Configure PgBouncer ### Configure PgBouncer
Now that the PostgreSQL servers are all set up, let's configure PgBouncer
for tracking and handling reads/writes to the primary database.
Now that the PostgreSQL servers are all set up, let's configure PgBouncer.
The following IPs will be used as an example: The following IPs will be used as an example:
- `10.6.0.21`: PgBouncer 1 - `10.6.0.21`: PgBouncer 1
...@@ -1604,8 +1631,8 @@ To configure the Sidekiq nodes, one each one: ...@@ -1604,8 +1631,8 @@ To configure the Sidekiq nodes, one each one:
gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.40' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_adapter'] = 'postgresql' gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.31', '10.6.0.32', '10.6.0.33'] } # PostgreSQL IPs
gitlab_rails['db_encoding'] = 'unicode'
## Prevent database migrations from running on upgrade automatically ## Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -1764,6 +1791,8 @@ On each node perform the following: ...@@ -1764,6 +1791,8 @@ On each node perform the following:
gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP gitlab_rails['db_host'] = '10.6.0.20' # internal load balancer IP
gitlab_rails['db_port'] = 6432 gitlab_rails['db_port'] = 6432
gitlab_rails['db_password'] = '<postgresql_user_password>' gitlab_rails['db_password'] = '<postgresql_user_password>'
gitlab_rails['db_load_balancing'] = { 'hosts' => ['10.6.0.31', '10.6.0.32', '10.6.0.33'] } # PostgreSQL IPs
# Prevent database migrations from running on upgrade automatically # Prevent database migrations from running on upgrade automatically
gitlab_rails['auto_migrate'] = false gitlab_rails['auto_migrate'] = false
...@@ -2153,25 +2182,21 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm ...@@ -2153,25 +2182,21 @@ For all PaaS solutions that involve configuring instances, it is strongly recomm
```plantuml ```plantuml
@startuml 5k @startuml 5k
skinparam linetype ortho
card "Kubernetes via Helm Charts" as kubernetes { card "Kubernetes via Helm Charts" as kubernetes {
card "**External Load Balancer**" as elb #6a9be7 card "**External Load Balancer**" as elb #6a9be7
together { together {
collections "**Webservice** x5" as gitlab #32CD32 collections "**Webservice** x4" as gitlab #32CD32
collections "**Sidekiq** x3" as sidekiq #ff8dd1 collections "**Sidekiq** x4" as sidekiq #ff8dd1
} }
card "**Prometheus + Grafana**" as monitor #7FFFD4
card "**Supporting Services**" as support card "**Supporting Services**" as support
} }
card "**Internal Load Balancer**" as ilb #9370DB card "**Internal Load Balancer**" as ilb #9370DB
collections "**Consul** x3" as consul #e76a9b
card "**Consul + Sentinel**" as consul_sentinel {
collections "**Consul** x3" as consul #e76a9b
collections "**Redis Sentinel** x3" as sentinel #e6e727
}
card "Gitaly Cluster" as gitaly_cluster { card "Gitaly Cluster" as gitaly_cluster {
collections "**Praefect** x3" as praefect #FF8C00 collections "**Praefect** x3" as praefect #FF8C00
...@@ -2191,41 +2216,33 @@ card "Database" as database { ...@@ -2191,41 +2216,33 @@ card "Database" as database {
postgres_primary .[#4EA7FF]> postgres_secondary postgres_primary .[#4EA7FF]> postgres_secondary
} }
card "Redis" as redis { card "redis" as redis {
collections "**Redis** x3" as redis_nodes #FF6347 collections "**Redis** x3" as redis_nodes #FF6347
redis_nodes <.[#FF6347]- sentinel
} }
cloud "**Object Storage**" as object_storage #white cloud "**Object Storage**" as object_storage #white
elb -[#6a9be7]-> gitlab elb -[#6a9be7]-> gitlab
elb -[#6a9be7]-> monitor elb -[hidden]-> sidekiq
elb -[hidden]-> support elb -[hidden]-> support
gitlab -[#32CD32]--> ilb gitlab -[#32CD32]--> ilb
gitlab -[#32CD32]-> object_storage gitlab -[#32CD32]r--> object_storage
gitlab -[#32CD32]---> redis gitlab -[#32CD32,norank]----> redis
gitlab -[hidden]--> consul gitlab -[#32CD32]----> database
sidekiq -[#ff8dd1]--> ilb sidekiq -[#ff8dd1]--> ilb
sidekiq -[#ff8dd1]-> object_storage sidekiq -[#ff8dd1]r--> object_storage
sidekiq -[#ff8dd1]---> redis sidekiq -[#ff8dd1,norank]----> redis
sidekiq -[hidden]--> consul sidekiq .[#ff8dd1]----> database
ilb -[#9370DB]-> gitaly_cluster
ilb -[#9370DB]-> database
consul .[#e76a9b]-> database ilb -[#9370DB]--> gitaly_cluster
consul .[#e76a9b]-> gitaly_cluster ilb -[#9370DB]--> database
consul .[#e76a9b,norank]--> redis ilb -[hidden,norank]--> redis
monitor .[#7FFFD4]> consul consul .[#e76a9b]--> database
monitor .[#7FFFD4]-> database consul .[#e76a9b,norank]--> gitaly_cluster
monitor .[#7FFFD4]-> gitaly_cluster consul .[#e76a9b]--> redis
monitor .[#7FFFD4,norank]--> redis
monitor .[#7FFFD4]> ilb
monitor .[#7FFFD4,norank]u--> elb
@enduml @enduml
``` ```
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment