High availability configuration in Apache Airflow - Time & Space Complexity
When setting up high availability in Airflow, we want to know how the system handles more tasks and workers.
We ask: How does adding more workers or tasks affect the system's work and response time?
Analyze the time complexity of the following Airflow scheduler and worker setup.
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
def create_task(task_id, dag):
return BashOperator(
task_id=task_id,
bash_command='echo Hello',
dag=dag
)
dag = DAG('ha_dag', start_date=datetime(2024,1,1))
tasks = [create_task(f'task_{i}', dag) for i in range(100)]
This code creates 100 tasks in a DAG, simulating a workload for a high availability Airflow setup.
Look for loops or repeated actions that affect performance.
- Primary operation: Creating and scheduling each task in the DAG.
- How many times: 100 times, once per task.
As the number of tasks grows, the scheduler must handle more work.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 task creations and scheduling steps |
| 100 | 100 task creations and scheduling steps |
| 1000 | 1000 task creations and scheduling steps |
Pattern observation: The work grows directly with the number of tasks; doubling tasks doubles the work.
Time Complexity: O(n)
This means the time to schedule tasks grows in a straight line with the number of tasks.
[X] Wrong: "Adding more workers makes scheduling time stay the same no matter how many tasks there are."
[OK] Correct: Even with more workers, the scheduler still processes each task, so the total scheduling work grows with tasks.
Understanding how task scheduling scales helps you design reliable Airflow setups that keep running smoothly as work grows.
"What if we split the tasks into multiple DAGs running in parallel? How would the time complexity of scheduling change?"
Practice
Solution
Step 1: Understand high availability concept
High availability means the system keeps working even if parts fail.Step 2: Apply to Airflow context
In Airflow, this means tasks and services continue running despite failures.Final Answer:
To keep Airflow running even if some components fail -> Option BQuick Check:
High availability = system stays up despite failures [OK]
- Confusing high availability with performance optimization
- Thinking it limits users or DAGs
- Assuming it only affects the UI
Solution
Step 1: Recall executor types in Airflow
SequentialExecutor runs tasks one by one, LocalExecutor runs tasks locally in parallel.Step 2: Identify executor for distributed task handling
CeleryExecutor uses workers and message brokers for distributed task execution, suitable for high availability.Final Answer:
CeleryExecutor -> Option DQuick Check:
Distributed task handling = CeleryExecutor [OK]
- Choosing SequentialExecutor which is single-threaded
- Confusing LocalExecutor with distributed execution
- Selecting DebugExecutor which is for testing only
[celery] broker_url = redis://localhost:6379/0
Solution
Step 1: Identify Redis role in CeleryExecutor
Redis is used as a message broker to pass task messages between scheduler and workers.Step 2: Differentiate Redis from other components
Redis is not for storing results permanently or running webserver or metadata DB.Final Answer:
Acts as a message broker between scheduler and workers -> Option CQuick Check:
Redis = message broker in CeleryExecutor [OK]
- Thinking Redis stores metadata or results
- Confusing Redis with PostgreSQL database
- Assuming Redis runs the webserver
Solution
Step 1: Understand metadata database requirements
CeleryExecutor requires a robust metadata database like PostgreSQL, not SQLite.Step 2: Identify why SQLite causes issues
SQLite locks the database and does not support concurrent writes well, blocking task distribution.Final Answer:
Using SQLite as the metadata database -> Option AQuick Check:
SQLite blocks concurrency, breaks CeleryExecutor [OK]
- Assuming Redis broker_url is wrong when it is correct
- Thinking multiple schedulers cause task distribution failure
- Confusing webserver settings with task distribution
Solution
Step 1: Understand scheduler high availability needs
Multiple scheduler instances increase reliability and avoid single point of failure.Step 2: Combine with proper backend and executor
PostgreSQL supports concurrency well; CeleryExecutor enables distributed task execution.Step 3: Eliminate incorrect options
SQLite and single scheduler limit availability; webservers alone don't schedule tasks; LocalExecutor is not distributed.Final Answer:
Run multiple scheduler instances with PostgreSQL backend and CeleryExecutor -> Option AQuick Check:
Multiple schedulers + PostgreSQL + CeleryExecutor = HA scheduler [OK]
- Using SQLite which blocks concurrency
- Running only one scheduler instance
- Confusing webserver role with scheduler
Ready to prove it?
Pass the test and this pattern moves unknown
