diff --git a/housewatch/admin/__init__.py b/housewatch/admin/__init__.py new file mode 100644 index 0000000..7a3e788 --- /dev/null +++ b/housewatch/admin/__init__.py @@ -0,0 +1,6 @@ +from django.contrib import admin + +from housewatch.models.preferred_replica import PreferredReplica + + +admin.site.register(PreferredReplica) diff --git a/housewatch/clickhouse/clusters.py b/housewatch/clickhouse/clusters.py index c466667..90969ff 100644 --- a/housewatch/clickhouse/clusters.py +++ b/housewatch/clickhouse/clusters.py @@ -1,6 +1,8 @@ from collections import defaultdict from housewatch.clickhouse.client import run_query +from housewatch.models.preferred_replica import PreferredReplica + def get_clusters(): QUERY = """Select cluster, shard_num, shard_weight, replica_num, host_name, host_address, port, is_local, user, default_database, errors_count, slowdowns_count, estimated_recovery_time FROM system.clusters""" @@ -28,8 +30,19 @@ def get_shards(cluster): def get_node_per_shard(cluster): + # We want to return a node per shard, but if we have preferred replicas we should use those + shards = get_shards(cluster) nodes = [] + + preferred = PreferredReplica.objects.filter(cluster=cluster).values_list("replica", flat=True) for shard, n in shards.items(): - nodes.append((shard, n[0])) + preferred_shard_found = False + for node in n: + if node["host_name"] in preferred: + nodes.append((shard, node)) + preferred_shard_found = True + break + if not preferred_shard_found: + nodes.append((shard, n[0])) return nodes diff --git a/housewatch/migrations/0012_preferredreplica.py b/housewatch/migrations/0012_preferredreplica.py new file mode 100644 index 0000000..cd3623b --- /dev/null +++ b/housewatch/migrations/0012_preferredreplica.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.1 on 2024-05-29 16:34 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('housewatch', '0011_scheduledbackup_is_sharded_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='PreferredReplica', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('cluster', models.CharField(max_length=255)), + ('replica', models.CharField(max_length=255)), + ], + ), + ] diff --git a/housewatch/models/preferred_replica.py b/housewatch/models/preferred_replica.py new file mode 100644 index 0000000..74a5b95 --- /dev/null +++ b/housewatch/models/preferred_replica.py @@ -0,0 +1,9 @@ +import uuid +from django.db import models + + +class PreferredReplica(models.Model): + id: models.UUIDField = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + created_at: models.DateTimeField = models.DateTimeField(auto_now_add=True) + cluster: models.CharField = models.CharField(max_length=255) + replica: models.CharField = models.CharField(max_length=255)