当前位置: 首页 > news >正文

基于名字自动发布之数据库(4)

为什么80%的码农都做不了架构师?>>>   hot3.png

基于名字自动发布之数据库(4)

项目地址: https://gitee.com/lookingdreamer/RexDeploy_v1

流程图

几个重要的表

数据库表主要包含以下7个表

表名说明
pre_auto_configure配置模板关联表
pre_auto_template_vars配置模板表
pre_bwzzbmonitor监控信息表
pre_deploy_manage自动发布信息记录表
pre_deploy_status自动发布状态表
pre_external_server_detailCMDB主机配置外网表
pre_server_detailCMDB主机配置表

这7个表中最关键的是CMDB主机配置表pre_server_detail,所有名字服务关联的自动发布等都从这个表中取关键信息。

  • pre_server_detail

     涵盖了很多方面的记录,比如工程路径、进程、容器路径等可以作为建设cmdb的度量参考值

  • pre_deploy_manage

     发布前中后的相关统计,比如发布前应用的目录,发布的时间,启动的时间,发布是否成功等,可以用来分析发布数据,作为dashboard

  • pre_deploy_status

     发布状态表

perl DB demo

#查询
sub query {
    my ($env,$sql) = @_;
    if ( "$sql" eq "" ) {
        Rex::Logger::info("SQL不能为空","error");
        return;
    }
    my $dbh = init($env);
    $dbh->do('set SESSION wait_timeout=72000');
    $dbh->do('set SESSION interactive_timeout=72000');
    $dbh->do("SET NAMES utf8"); 
    my $sth = $dbh->prepare($sql);
    $sth->execute() or die( $sth->errstr );
    my @return;
    while ( my $row = $sth->fetchrow_hashref ) {
      push @return, $row;
    }    
    $sth->finish();
    $dbh->disconnect();
    return @return;
};

#初始数据库
sub init{
    my $env = $_[0]; 
    my $dbname;
    my $dbhost;
    my $dbuser;
    my $dbpassword;
    my $dbport;   

    Rex::Config->register_config_handler("$env", sub {
     my ($param) = @_;
      $dbname = $param->{dbname} ;
      $dbhost = $param->{dbhost} ;
      $dbuser = $param->{dbuser} ;
      $dbpassword = $param->{dbpassword} ;
      $dbport = $param->{dbport} ;
    });
    Rex::Logger::info("初始化$env环境数据库 host: $dbhost dbname: $dbname");
    my $dbh = DBI->connect("DBI:mysql:database=$dbname;host=$dbhost;port=$dbport",
                       "$dbuser", "$dbpassword",
                       {'RaiseError' => 1, 'AutoCommit' => 1 ,'mysql_auto_reconnect'=>1});
    return $dbh;
}

问题总结

1. 中文编码

问题

因为CMDB中保存中文,有时候查询出的数据是乱码.

解决问题

$dbh->do("SET NAMES utf8");

2. mysql has gone away

问题

在进行查询的时候,偶尔出现mysql has gone away的报错,尤其是进行多进程查询的时候

分析问题

mysql服务端是正常工作的,问题是偶尔出现.

  1. mysql宕机

       然而并没有,因为通过命令行去查询也是正常的(pass)

     2. 连接超时

       通过show global variables like '%wait_timeout'; wait_timeout被设置为3600秒,我执行也就几分钟的时间,不可能超过这个时间被服务端关闭.(pass)

     3. 被kill

      基本不可能,这台数据库就我一个用户,当然我也查询了show global status like 'com_kill',然而并没有.(pass)

     4. 执行sql太大了

     有可能你在导入大语句的时候有可能会出现这种情况,通过添加maxallowedpacket即可解决.但在这里我只是简单的查询数据.基本上没有多大的数据量. (pass)

 

折腾以上都么找到原因,么办法只能去啃源码和debug了. 源码有以下关键字段… 想要去看源码文件的请撮

use vars qw(@EXPORT $dbh);

@EXPORT = qw(db);
......
sub import {
........
  if ($opt) {
    $dbh = DBI->connect(
      $opt->{"dsn"}, $opt->{"user"},
      $opt->{"password"} || "", $opt->{"attr"}
    );
    $dbh->{mysql_auto_reconnect} = 1;
  }
......
}

原来是这样…

rex在执行任何模块之前会进行初始化模块,同时也包含数据库的初始化,数据库初始化之后会通过Var保存初始化的$dbh变量,以供之后的程序使用.但是从初始化变量开始到真正使用这中间隔了一段时间,同时我在更新字段之后添加了disconnect,一旦更新字段之后,原有的数据库链接其实不存在了.但是数据库初始化的变量还在,程序就以为该数据库连接当前还是可用的,于是就报mysql has gone away

我想本来作者也是想充分的利用数据库的连接,就相当于你开1个MYSQL终端去进行数据库操作,你之后的SQL操作都在这个终端上操作,不用的时候暂时挂起终端.使用的时候,再来打开,这样使用起来虽然方便,利用率也很高.但是这个复用链接的方式不是很可取,将复用链接保存到内存.关闭连接的时候数据也没有销毁,也没有重新创建.

补充一个问题: mysql_auto_reconnect 只有在DBD::mysql 4.012以后才支持

解决问题

目前我项目中采取很简单直接的方法: 每次进行数据库操作的时候,会重新连接数据库进行操作,同时异常连接的时候会重试几次数据库连接。当然这样对数据库会带来一定的压力,但是我的数据量很小,所以我就没花大力气去重新修改源码了(我承认我的方法太低端了)

更好的解决方法当然是引入数据库连接池,如java中的c3p0的连接池.perl MYSQL db也有它自己的数据库连接池。可以参考: DBIx::Connector

转载于:https://my.oschina.net/pwd/blog/1931614

相关文章:

  • 洛谷P2526 [SHOI2001]小狗散步(二分图匹配)
  • 关于Nginx负载均衡的6种策略
  • 阿里云和腾讯云搭建hadoop
  • 模块和包
  • Idea+maven+scala构建包并在spark on yarn 运行
  • linux基础语法
  • 谈谈如何通过linux系统RHCE考试
  • 漫谈计算机组成原理(八)原码、补码、反码
  • 【c】插入排序
  • 20180824Noip模拟赛10分总结
  • jquery 取id模糊查询
  • DBA:快速了解MySQL及语法
  • 回顾·数据分析的势道术
  • WPF中ListBox滚动时的缓动效果
  • MySQL事务
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【Amaple教程】5. 插件
  • 〔开发系列〕一次关于小程序开发的深度总结
  • es6
  • Facebook AccountKit 接入的坑点
  • JavaScript设计模式之工厂模式
  • js中forEach回调同异步问题
  • October CMS - 快速入门 9 Images And Galleries
  • Unix命令
  • 前端工程化(Gulp、Webpack)-webpack
  • 我的zsh配置, 2019最新方案
  • 用 Swift 编写面向协议的视图
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (70min)字节暑假实习二面(已挂)
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)kafka实战——kafka源码编译启动
  • (转)JAVA中的堆栈
  • (转)Linux下编译安装log4cxx
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET处理HTTP请求
  • /3GB和/USERVA开关
  • [ solr入门 ] - 利用solrJ进行检索
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • [BUG] Authentication Error
  • [Contiki系列论文之2]WSN的自适应通信架构
  • [C语言]编译和链接
  • [Excel VBA]单元格区域引用方式的小结
  • [Git].gitignore失效的原因
  • [hdu 3652] B-number
  • [jQuery]10 Things I Learned from the jQuery Source
  • [Kubernetes]4. 借助腾讯云TKE快速创建Pod、Deployment、Service部署k8s项目
  • [Python] Ubuntu12.04LTS
  • [python]用python获取EXCEL文件内容并保存到DBC