Experimental Feature Toggle: databaseReadReplica (#89232)

This adds a version of the SQLStore that includes a ReadReplica. The primary DB can be accessed directly - from the caller's standpoint, there is no difference between the SQLStore and ReplStore unless they wish to explicitly call the ReadReplica() and use that for the DB sessions.

Currently only the stats service GetSystemStats and GetAdminStats are using the ReadReplica(); if it's misconfigured or if the databaseReadReplica feature flag is not turned on, it will fall back to the usual (SQLStore) behavior.

Testing requires a database and read replica - the replication should already be configured. I have been testing this locally with a docker mysql setup (https://medium.com/@vbabak/docker-mysql-master-slave-replication-setup-2ff553fceef2) and the following config:

[feature_toggles]
databaseReadReplica = true

[database]
type = mysql
name = grafana
user = grafana
password = password
host = 127.0.0.1:3306

[database_replica]
type = mysql
name = grafana
user = grafana
password = password
host = 127.0.0.1:3307
This commit is contained in:
Kristin Laemmert
2024-06-18 11:07:15 -04:00
committed by GitHub
parent 791bcd93df
commit 50244ed4a1
16 changed files with 272 additions and 23 deletions

View File

@@ -15,6 +15,7 @@ import (
func ProvideTestEnv(
server *Server,
db db.DB,
repldb db.ReplDB,
cfg *setting.Cfg,
ns *notifications.NotificationServiceMock,
grpcServer grpcserver.Provider,
@@ -26,6 +27,7 @@ func ProvideTestEnv(
return &TestEnv{
Server: server,
SQLStore: db,
ReadReplStore: repldb,
Cfg: cfg,
NotificationService: ns,
GRPCServer: grpcServer,
@@ -39,6 +41,7 @@ func ProvideTestEnv(
type TestEnv struct {
Server *Server
SQLStore db.DB
ReadReplStore db.ReplDB
Cfg *setting.Cfg
NotificationService *notifications.NotificationServiceMock
GRPCServer grpcserver.Provider