资讯专栏INFORMATION COLUMN

数据库集群主从架构查询功能设计

shevy / 1403人阅读

摘要:按照任意一个或者域名查找该数据库实例所在集群架构是否是主库或者从库,是运维中非常常见和必不可少的功能。回溯主库回溯主库使用账号登录执行命令,查找当前库的主库信息进行整理。

按照任意一个IP或者域名查找该数据库实例所在集群架构、是否是主库或者从库,是DBA运维中非常常见和必不可少的功能。本文描述的功能实现已经实际应用于某互联网公司内部,目前运行稳定,持续提供服务。这里和大家分享实现方式,和大家一起学习。

1. 前提条件
        为了能够统一查找所有集群架构,这些机器需要有一个统一的能够访问所有机器的账号和密码,这里使用db_admin;另外做主从同步的时候,需要使用统一的账号和密码,这里使用repl。
        作为示例,这里使用如下的集群结构:


        这里A、B、C是主库的从库,是一级从库,D、E是从库C的从库,是二级从库,如果实际有其他更复杂的结构,以此类推即可。

2. 搜索查找
        平时查找,任意给一个IP或者域名进行查找,由于集群中是无法标示域名的,因此需要将域名转化为IP进行查找。按照任意IP查找,不会知道它在集群所处的位置,为了得到整个集群的结构需要先回溯到整个集群的主库。

3. 回溯主库
       回溯主库使用db_admin账号登录MySQL执行"SHOW SLAVE STATUS"命令,查找当前库的主库信息进行整理。
针对之前的集群结构常见的回溯类型如下图的三种:

最终要获得的都是主库实例,python的实现代码如下:

# curr_node 当前搜索节点
# lisense 统一访问的账号,密码
# sub_node 子节点
def traceback_root(curr_node, lisense, sub_node):
    query_process = "SHOW SLAVE STATUS"
    master_row = None
    conn = None
    try:
        # 连接当前数据库,查找主库信息
        conn = get_connection(
            curr_node.get("ip"), curr_node.get("port"),
            lisense.get("account"), lisense.get("passwd"))
        with open_cursor(conn) as cursor:
            cursor.execute(query_process)
            master_row = cursor.fetchone()

    except Exception as e:
        return None

    if master_row:
        return curr_node
    # 读取主库信息
    io_run = master_row.get("Slave_IO_Running", "")
    sql_run = master_row.get("Slave_SQL_Running", "")
    master_ip = master_row.get("Master_Host", "")
    master_port = master_row.get("Master_Port", "")

    # 检查主库状态,状态不对返回当前节点
    if io_run.lower() == "yes" and sql_run.lower() == "yes":
        may_master_node = dict()
        may_master_node["ip"] = master_ip
        may_master_node["port"] = master_port

        # 检查父节点实例信息是否和子节点一样,
        # 用来避免双主库回溯陷入无线循环的情况
        if sub_node and sub_node.get("ip", "") == master_ip  and
                sub_node.get("port", "") == master_port:
            return None

        # 由于考虑了双主的情况,当前库的父节点只是可能主库,
        # 使用父节点继续回溯主库实例
        master_node = traceback_root(
            may_master_node, lisense, curr_node)
        
        # 如果回溯到主库,返回;否则返回当前节点
        if master_node:
            return master_node
        else:
            return curr_node

    else:
            return curr_node

4. 遍历从库
       找到主库之后,从主库开始,查找主库下的所有从库。查找从库使用db_admin登录MySQL执行"SHOW PROCESSLIST"命令,然后从结果里,按照User是否是repl进行筛选,对于用户是repl的从库,连接上去使用回溯主库使用的查看主库的方法,验证从库的主库是否是当前查询的数据库实例,是的话,加入集群;否则放弃。对于查找出来的从库,继续使用上述方式查找从库,知道找到所有从库。

5. 返回集群结构
       查找出来的集群结构,按照json格式组织,可以返回给需要的服务,也可以整理之后显示在页面,下图是对查找出来的整个集群结构的简单显示:

6. 结束语
       整个查询的大致过程如此,这里没有说太多的编码细节。在实际使用的过程中,可以根据需要自行进行调整,如添加多线程提高查询速度等。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17576.html

相关文章

  • 据库集群主从架构查询功能设计

    摘要:按照任意一个或者域名查找该数据库实例所在集群架构是否是主库或者从库,是运维中非常常见和必不可少的功能。回溯主库回溯主库使用账号登录执行命令,查找当前库的主库信息进行整理。 按照任意一个IP或者域名查找该数据库实例所在集群架构、是否是主库或者从库,是DBA运维中非常常见和必不可少的功能。本文描述的功能实现已经实际应用于某互联网公司内部,目前运行稳定,持续提供服务。这里和大家分享实现方式,...

    oysun 评论0 收藏0
  • 储存高可用架构

    摘要:一双机高可用主备方式主机和备机双方只需要进行数据复制即可,无须进行状态判断和主备切换这类复杂的操作应用场景内部的后台管理系统主从复制从机需要提供读操作,需要考虑主从复制延迟客户端感知主从关系等问题应用场景写少读多的新闻网站双机切换设计要点主 showImg(https://segmentfault.com/img/bVbtpqk?w=648&h=174);​ 一、双机高可用 1、主备方...

    Lin_YT 评论0 收藏0
  • 【最全】Java 进阶面试总结

    摘要:这里有一份面试题相关总结,涉及高并发分布式高可用相关知识点,在此分享给大家,希望大家能拿到一份理想的知识点会陆续更新在上,觉得还算凑和的话可以关注一下噢高并发架构消息队列为什么使用消息队列消息队列有什么优点和缺点都有什么优点和缺点如何保证消 这里有一份面试题相关总结,涉及高并发、分布式、高可用相关知识点,在此分享给大家,希望大家能拿到一份理想的 Offer! 知识点会陆续更新在 Git...

    nifhlheimr 评论0 收藏0

发表评论

0条评论

shevy

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<