AWS/Aurora : 是否可以知道从站是否被正确使用
AWS/Aurora : is it possible to know if the slaves are correctly used
我有一个工作的极光集群,有一个主节点和一个从节点。
我使用以下代码创建数据源
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...
有没有办法知道我们是在和 slave 还是 master 说话?
好的,在进一步挖掘之后,我在 https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-21-aurora-monitor/#how-aurora-is-monitored 的 mariadb 文档中找到了答案(重点是我的)
SELECT @@aurora_server_id, server_id FROM information_schema.replica_host_status WHERE session_id = 'MASTER_SESSION_ID';
returns一行有两个相同字段的节点是主节点。所有其他节点都是只读副本,将被标记为从服务器。
所以在 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")
我有一个工作的极光集群,有一个主节点和一个从节点。
我使用以下代码创建数据源
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...
有没有办法知道我们是在和 slave 还是 master 说话?
好的,在进一步挖掘之后,我在 https://mariadb.com/kb/en/mariadb-enterprise/mariadb-maxscale-21-aurora-monitor/#how-aurora-is-monitored 的 mariadb 文档中找到了答案(重点是我的)
SELECT @@aurora_server_id, server_id FROM information_schema.replica_host_status WHERE session_id = 'MASTER_SESSION_ID';
returns一行有两个相同字段的节点是主节点。所有其他节点都是只读副本,将被标记为从服务器。
所以在 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")