Configuring SQL for High Availability in Terraform





0/5 (0 vote)
Hello All, a short post this week, but as we talk about availability, chaos engineering, etc. One of the most common data elements I see out there is SQL, and Azure SQL. SQL is a prevelant and common data store, it’s everywhere you look.
Given that, many shops are implementing infrastructure-as-code to manage configuration drift and provide increased resiliency for their applications. Which is definitely a great way to do that. The one thing that I’ve had a couple of people talk to me about that isn’t clear…how can I configure geo-replication in TerraForm.
This actually built into the TerraForm azure rm provider, and can be done with the following code:
provider "azurerm" { subscription_id = "" features { key_vault { purge_soft_delete_on_destroy = true } } } data "azurerm_client_config" "current" {} resource "azurerm_resource_group" "rg" { name = "sqlpoc" location = "{region}" } resource "azurerm_sql_server" "primary" { name = "kmack-sql-primary" resource_group_name = azurerm_resource_group.rg.name location = azurerm_resource_group.rg.location version = "12.0" administrator_login = "sqladmin" administrator_login_password = "{password}" } resource "azurerm_sql_server" "secondary" { name = "kmack-sql-secondary" resource_group_name = azurerm_resource_group.rg.name location = "usgovarizona" version = "12.0" administrator_login = "sqladmin" administrator_login_password = "{password}" } resource "azurerm_sql_database" "db1" { name = "kmackdb1" resource_group_name = azurerm_sql_server.primary.resource_group_name location = azurerm_sql_server.primary.location server_name = azurerm_sql_server.primary.name } resource "azurerm_sql_failover_group" "example" { name = "sqlpoc-failover-group" resource_group_name = azurerm_sql_server.primary.resource_group_name server_name = azurerm_sql_server.primary.name databases = [azurerm_sql_database.db1.id] partner_servers { id = azurerm_sql_server.secondary.id } read_write_endpoint_failover_policy { mode = "Automatic" grace_minutes = 60 } }
Now above TF, will deploy two database servers with geo-replication configured. The key part is the following:
resource "azurerm_sql_failover_group" "example" { name = "sqlpoc-failover-group" resource_group_name = azurerm_sql_server.primary.resource_group_name server_name = azurerm_sql_server.primary.name databases = [azurerm_sql_database.db1.id] partner_servers { id = azurerm_sql_server.secondary.id } read_write_endpoint_failover_policy { mode = "Automatic" grace_minutes = 60 } }
The important elements are “server_name” and “partner_servers”, this makes the connection to where the data is being replicated. And then the “read_write_endpoint_failover_policy” setups up the failover policy.