AWS / Aurora: можно ли узнать, правильно ли используются рабы? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть работающий кластер сияний с хозяином и рабом.

Я использую следующий код для создания источника данных

    val jdbi: Jdbi by lazy {
        val ds = MariaDbDataSource()
        ds.setUrl("jdbc:mysql:aurora://cluster_endpoint/db")
        ds.user = System.getenv("DB_USERNAME")
        ds.setPassword(System.getenv("DB_PASSWORD"))

        val jdbi = Jdbi.create(ds)
        jdbi.installPlugin(SqlObjectPlugin())
        jdbi.installPlugin(KotlinSqlObjectPlugin())
        jdbi
    }

Затем, когда я нахожусь в операции только для чтения, я делаю следующее:

jdbi.open().use { handle ->
    handle.setReadOnly(true)
    ...
}

Как я могу быть уверен, что когда я это сделаю, запросы / соединения будут правильно перенаправлены на ведомое устройство?

Я попытался записать соединение экземпляра БД

val url = handle.connection.getMetaData().getURL()
val connServer = url.substring(url.indexOf("//") + 2 , url.indexOf("."));

Но это всегда дает мне URL кластера ...

Есть ли способ узнать, разговариваем ли мы с рабом или с хозяином?

1 Ответ

0 голосов
/ 16 мая 2018

Хорошо, после еще нескольких копаний я нахожу ответ, похороненный в mariadb doc на https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-21-aurora-monitor/#how-aurora-is-monitored (акцент мой)

SELECT @@aurora_server_id, server_id FROM information_schema.replica_host_status WHERE session_id = 'MASTER_SESSION_ID';

Узел, который возвращает строку с двумяидентичные поля - это главное. Все остальные узлы являются репликами только для чтения и будут помечены как подчиненные серверы.

Так что в kotlin с jdbi вы можете сделать:

        //https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-21-aurora-monitor/#how-aurora-is-monitored
        val sql = "SELECT @@aurora_server_id, server_id FROM information_schema.replica_host_status WHERE session_id = 'MASTER_SESSION_ID'"
        val serverIds = handle.select(sql)
                .map { rs, _ -> Pair(rs.getString(1), rs.getString(2)) }
                .single()
        val serverId = serverIds.first
        val isMaster = serverId == serverIds.second
        val masterOrSlave = if (isMaster) "the master" else "a slave"
        Logger.getLogger(this.javaClass.name).debug("Connected to db instance $serverId which is $masterOrSlave")
...