设为首页 收藏本站
查看: 1234|回复: 0

[经验分享] python监控单台多实例数据库服务器的数据库端口

[复制链接]

尚未签到

发表于 2017-5-8 09:25:12 | 显示全部楼层 |阅读模式
  http://wangwei007.blog.iyunv.com/68019/1118809
  最近公司做数据库的单台服务器多实例,需要对各个数据库的进程进行监控,因为我们的资产数据库中已经有这个服务器跑多少个实例,端口是什么,用来做什么的,所以就拿资产数据库的端口和服务器本地运行的数据库端口进行对比,报出没有运行的mysql实例以及他的用途。一种方法是根据"ps auxww|grep mysqld|grep -v root|grep -v grep"这个命令抓取本地运行的数据库端口,不过你也可以根据netstat命令来获取本地数据库实例的所有端口;还有一种方法就是从资产中得到这个服务器应该运行的所有mysql端口,用python的socket模块来检测端口是否存活,这种方法比较简单一些。我用第一种方法是因为我的这段代码我已经写过用于其他用途,等于复用,图个省事。以下是代码内容:

    #!/bin/env python
    # -*- coding: utf-8 -*-
    
    import os,sys,MySQLdb
    
    def center(sql):#连接数据库
        try:
            center_ip = '192.168.1.100'
            center_user = 'root'
            center_passwd = 'xxxxxx'
            conn = MySQLdb.connect(host = center_ip,user = center_user,passwd = center_passwd,charset='utf8',connect_timeout=20)
            cursor = conn.cursor() 
            cursor.execute(sql)
            alldata = cursor.fetchall()
            cursor.close()
            conn.close()
            return alldata
        except:
            return 0
    
    class check_port():#走资产中获取本地IP中应该有多少个mysql实例端口
    
        def __init__(self):
            conn = "ip a|grep glob|grep -v '192.168'|awk '{print $2}'"
            self.host = os.popen(conn).readlines()[0].split("/")[0]
    
        def remot(self):
            sql = "SELECT PORT FROM center.host_info WHERE flag='1' AND del_info!=0 AND ip='%s' AND host_name IN ('a','b','c')" % self.host
            alldata = center(sql)
            cent_port = []
            if alldata != 0:
                for i in alldata:
                    cent_port.append(str(i[0]))
                return cent_port
            else:
                return cent_port
    
        def local(self):#获取本地mysql有多少个实例运行
            psinfo = os.popen("ps auxww|grep mysqld|grep -v root|grep -v grep").readlines()
            local_port = []
            if not psinfo:
                return local_port
            for i in psinfo:
                for j in i.split("--"):
                    if j.find("port") != -1:
                        port = j.split("=")[1].strip()
                        local_port.append(port)
            return local_port
    
        def main(self):
            local_port = self.local()
            cent_port = self.remot()
                    cent_port.sort()
                    local_port.sort()
            if local_port == cent_port and len(local_port) != 0 and len(cent_port) != 0:
                print 0
            else:
                error = ""
                diff_list = list(set(local_port) ^ set(cent_port))
                for port in diff_list:
                    sql = "SELECT CONCAT(a.main_name,'_',b.sub_name,'_',c.app_name,'_',c.port) AS used FROM center_app.main_category a, center_app.sub_category b, center_app.app_info c WHERE a.id = b.main_id AND b.dist_id = c.dist_id AND b.main_id = c.main_id AND b.main_id='2' AND c.flag='1' AND c.del_info!=0 AND c.ip='%s' and c.port='%s'" % (self.host,port)
                    alldata = center(sql)
                    if error == "":
                        error = error + alldata[0][0]
                    else:
                        error = error + ";" + alldata[0][0]
                print error
    
    if __name__ == "__main__":
        boss = check_port()
        boss.main()

 如果用第二种方法的话,很简单,用下面的函数可以实现这个端口测试:

    ipmort socket
    
    def test_port()
        s = socket.socket()
        address = '127.0.0.1'
        port = 80
        try:
            s.connect((address,port))
            s.close()
            return True
        except Exception,e:
            return False

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-374474-1-1.html 上篇帖子: Learn Python The Hard Way学习(52) 下篇帖子: 字体定义python正则表达式修复网站文章字体不统一问题 字体定义
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表