实战Pinba

   2016-10-31 0
核心提示:谁都知道监控系统很重要,但是要自己搭建一套好用的系统却不是一件简单的事情。国内已经有不少厂商提供类似的服务,比如: OneAPM 、 听云 ,其原理就是通过在服务器上部署一套探针,把数据汇总上报,但是问题却不像说起来这么简单,我曾经买过国内某个厂商高

谁都知道监控系统很重要,但是要自己搭建一套好用的系统却不是一件简单的事情。国内已经有不少厂商提供类似的服务,比如: OneAPM听云 ,其原理就是通过在服务器上部署一套探针,把数据汇总上报,但是问题却不像说起来这么简单,我曾经买过国内某个厂商高大上的 APM 服务,谁知道它监控的指标太多了,并且无法自定义,结果导致一上线,系统性能就下降百分之二十,最后无奈只好放弃。

我想要的是一种对系统性能影响尽可能小的监控系统,它不需要监控太多指标,只要有 RPS、CPU、内存、响应时间等几个核心数据即可,而 Pinba 简直就是为此量身打造的:PINBA(PHP Is Not A Bottleneck Anymore)原本是 PHP 专用的,其工作原理大致是:在每个请求处理完成后,PHP 把相关数据通过 UDP 发送给 Pinba 自定义的 MySQL 引擎。因为数据是通过 UDP 传输的,所以对原有系统的性能影响很小。如果非要说说 Pinba 的缺点,那么它没有提供一个官方的 UI 算一个,好在  Pinboard 弥补了不足:

实战Pinba

Pinboard

说到这,估计大家都迫不及待的想试试 Pinba + Pinboard 了,不过从我的经历来看,想把这套系统跑起来的话需要绕开很多坑,我前前后后搞了五六次才算成功,失败的主要原因在于各个软件更新频率不一样,依赖关系复杂,于是就出现所有软件都装了最新稳定版,但是整个系统却不能正常运转,实际上想清楚了也简单,截止本文发稿前,这些软件的最新版 Pinboard 最老,所以就以它为参照点,找其它软件在对应的发布版本:

在安装 Pinba 之前,先要安装好 MySQL,在 Pinba 官网描述支持 MySQL 5.1 以上版本,但是我测试了最新稳定版并不能正常工作,稳妥起见,我选择安装 MySQL 5.1.72,此版本比较旧,和当前主流版本的安装步骤略有不同,所以我还是把操作贴出来:

shell> groupadd mysql
shell> useradd -r -g mysql -s /bin/false mysql
shell> tar zxvf mysql-5.1.72.tar.gz
shell> cd mysql-5.1.72
shell> ./configure --prefix=/usr/local/mysql
shell> make
shell> make install
shell> cd /usr/local/mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> bin/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql var
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> cp support-files/mysql.server /etc/init.d/mysql.server
shell> chmod +x /etc/init.d/mysql.server
shell> chkconfig mysql.server on
shell> /etc/init.d/mysql.server start

然后安装 Pinba 1.1.0,记得之前需要先装好 Judy 1.0.5Libevent 1.4.15

shell> tar zxvf pinba_engine-1.2.0.tar.gz
shell> ./configure
       --with-judy=/usr/local \
       --with-event=/usr/local \
       --with-mysql=/path/to/mysql/source/code \
       --libdir=/usr/local/mysql/lib/mysql/plugin
shell> make
shell> make install

接下来在 MySQL 里加载 Pinba 插件,并创建必要的数据结构:

mysql> INSTALL PLUGIN pinba SONAME 'libpinba_engine.so';
mysql> CREATE DATABASE pinba;
shell> mysql -D pinba < default_tables.sql

为了稍后在 Pinboard 中使用,我们还需要创建一个账号来访问 pinba 数据库:

mysql> GRANT ALL PRIVILEGES ON pinba.* TO pinba@"<HOST>"
       IDENTIFIED BY "<PASSWORD>";

说明:Pinba 请求池缺省保存 900 秒的数据,也就是 15 分钟,后续 Pinboard 的 cron 设置必须与此相同,但是不得不说跨度有点长,建议在 my.cnf 里改为 60 秒:

mysql> SHOW VARIABLES LIKE 'pinba%';
+------------------------------+---------+
| Variable_name                | Value   |
+------------------------------+---------+
| pinba_address                |         |
| pinba_cpu_start              | 0       |
| pinba_data_pool_size         | 0       |
| pinba_histogram_max_time     | 10      |
| pinba_port                   | 30002   |
| pinba_request_pool_size      | 1000000 |
| pinba_stats_gathering_period | 10000   |
| pinba_stats_history          | 60      |
| pinba_temp_pool_size         | 10000   |
| pinba_temp_pool_size_limit   | 1000    |
| pinba_timer_pool_size        | 100000  |
+------------------------------+---------+

如此 Pinba 就安装好了,下面需要安装 PHP 扩展,需要注意的是当前默认仓库里保存的是 PHP7 相关的代码,如果你和我一样还使用 PHP5,那么需要切换分支:

shell> git clone https://github.com/tony2001/pinba_extension.git
shell> cd pinba_extension
shell> git checkout -b php5 remotes/origin/php5
shell> phpize
shell> ./configure
shell> make
shell> make install

稍后安装 Pinboard 的时候,还需要安装 apc 扩展,不过 apc 扩展已经不在维护了,好在我们可以安装 apcu 扩展,并激活兼容模式,用来来实现 apc 扩展的功能:

shell> wget http://pecl.php.net/get/apcu-4.0.11.tgz
shell> tar zxvf apcu-4.0.11.tgz
shell> cd apcu-4.0.11
shell> phpize
shell> ./configure --enable-apc-bc
shell> make
shell> make install

最后安装 Pinboard,记得之前需要先安装好 Composer

shell> tar zxvf v1.5.2.tar.gz
shell> cd pinboard-1.5.2
shell> composer install
shell> ./console migrations:migrate
shell> ./console register-crontab

说明:Pinboard 在通过 cron 执行 aggregate 的时候,内部通过一个 lock 文件来避免并发操作,实际上效果并不好,如果某次执行失败没能正常删除锁文件,后续操作就无法执行了,其实在设置 cron 的时候搭配操作系统本身的 flock -xn -c … 命令更好。

当然了,我们还需要修改一下 PHP 程序的前端控制器,在里面激活 Pinba,比如:

<?php

if (extension_loaded('pinba')) {
    ini_set('pinba.enabled', true);
    ini_set('pinba.server', '<IP>');

    pinba_script_name_set($_SERVER['REQUEST_URI']);
}

?>

一切就绪后,我们可以利用 tcpdump 在服务器上确认看看有没有数据:

shell> tcpdump -nn -i any udp port 30002

本文介绍的都是 Pinba 最基本,同时也是最常用的功能,实际上 Pinba 还有很多杀手级功能,比如 timer ,利用它我们可以精确控制监控粒度,实现类似 鹰眼 的效果,网上能找到很多 例子 ,本文篇幅所限,在这里我就不再赘述了。

此外,大家可能会关注 Pinba 服务器的性能如何,如果在大流量网站上使用会不会出现问题,我是在一个日访问量几百万左右的网站上部署测试的 Pinba,得益于 Pinba 自定义引擎的性能,MySQL 本身毫无压力,可以预想千万级请求量问题不大。如果流量多到几个亿,可能会有问题,但即使那样也不要紧,我们只要控制一个采样百分比就好了。

 
标签: MySQL PHP
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Perl操作Mysql数据库 perl操作excel
    一. 安装DBI模块步骤1:从TOOLS栏目中下载DBI.zip,下载完后用winzip解开到一个temp目录,共有三个文件:ReadmeDBI.ppdDBI.tar.gz步骤2: 在DOS窗口下,temp目录中运行下面的DOS命令:ppm install DBI.ppd 如果提示无效命令,可在perl/bin目录下运行 二. 安装DBD
    02-09
  • Nodejs+Express+Mysql实现简单用户管理增删改查
    Nodejs+Express+Mysql实现简单用户管理增删改查
     源码地址  https://github.com/king-y/NodeJs/tree/master/user目录结构  mysql.jsvar mysql = require('mysql');var pool = mysql.createPool({host : '127.0.0.1',user : 'root',password : '',database : 's79'});exports.que
    02-09
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
    PHP 使用 Swoole - TaskWorker 实现异步操作 My
    在一般的 Server 程序中都会有一些耗时的任务,比如:发送邮件、聊天服务器发送广播等。如果我们采用同步阻塞的防水去执行这些任务,那么这肯定会非常的慢。Swoole 的 TaskWorker 进程池可以用来执行一些异步的任务,而且不会影响接下来的任务,很适合处理以
    02-09
  • Mysql数据库一个小程序实现自动创建分表。
    每当跨月的时候也是系统出问题最多的时候,没有表和字段缺失是两个最常见的错误。为了解决这个问题,研究了一下mysql的 information_schema 表:information_schema这张数据表保存了MySQL服务器所有数据库的信息。如数据库名,数据库的表,表栏的数据类型与访
    02-09
  • delphi10.3安装使用mySQL及遇到的问题(01)
    delphi10.3安装使用mySQL及遇到的问题(01)
    1】下载安装好mySQL环境2】FDConnection1的设置3】执行增删改SQL语句和查询Select语句4】客户端连接5]长文本类型,及SQLITE导出,导入到MySQL6】遇到过的问题及解决1】下载安装好mySQL环境,注意32位/64位。本篇为32位mysql32位下载链接: https://pan.baidu.c
    02-09
  • Delphi XE中使用dbExpress连接MySQL数据库疑难
    Delphi IDE中包含一个Data Explorer的组件,如下图所示:  该组件基于dbExpress(包含TSQLConnection、TSQLDataSet、TSQLQuery、TSQLStoredProc、TSQLTable、TsqlServerMethod、TSQLMonitor、TSimpleDataSet)。但是因为该组件只提供了各种数据库的抽象驱动
    02-09
  • DELPHI 10.2 TOKYO搭建LINUX MYSQL开发环境
    DELPHI 10.2 TOKYO搭建LINUX MYSQL开发环境笔者使用ubuntu64位LINUX首先必须保证LINUX可以连互联网。安装MYSQLsudo apt-get update sudo apt-get install mysql-serversudo apt-get install mysql-clientsudo apt-get install libmysqlclient-dev复制MYSQL的
    02-09
  • Centos7上安装MySQL5.5报错,/usr/bin/perl is
    今天在Centos7上安装MySQL5.5时报了如下错/usr/bin/perl is needed by MySQL-server-...按照网上的几种说法进行了尝试1、在perl官网下载perl后安装到相应的目录下,仍无法解决问题2、采用强制安装 rpm -ivh MySQL-server-5.6.22-1.el6.i686.rpm --nodeps 
    02-09
  • 用perl做数据库迁移,从MSSQL到MYSQL(三)--V1
    从前边的程序的运行情况来看,程序是可以运行的,但速度太扯了,在读写1000W条之前速度还是可以的(大概2000条/秒左右),但过了1000W之后(变成400条/秒左右),当然这个与SQL SERVER读取,网络还有服务器等性能都是有关系的,但,这速度,不晓得有测试过的
    02-09
  • R语言连接MYSQL r语言连接数据库
     操作系统:centos 6.4 64bit R语言可以使用RMySQL来连接Mysql数据库,直接使用数据库里面的数据生成图像。 这个是RMYSQL的说明:http://cran.r-project.org/web/packages/RMySQL/index.htmlRMYSQL的依赖:Depends:R (≥ 2.8.0), methods, DBI (≥ 0.2-2),
    02-09
点击排行