8 25

记一次日志存储优化(mongodb)

背景

之前写的代码所有的日志都通过mongodb来存储和检索,目前硬盘200G已经使用了195G,监控一直报警。一开始通过精简已有日志中的字段,发现空间下降不明显。于是翻了下官方手册,刚好翻到mongodb的备份,想了想历史日志也用不着及时搜索,于是就备份了

备份命令
mongodump --archive=xxxx.archive --db db --collection collection
压缩备份
gzip xxxx.archive
写个脚本删除备份的日志
后续
备份恢复命令
mongorestore --gzip --archive=xxxx.archive.gz --db db
shell脚本

由于我的日志是按照日期分天存储,因此比较好导出,脚本如下

#!/bin/bash
a="mongodump --archive="
b=".archive"
c="--db php_log --collection "
for i in $( seq $1 $2 )
do
    collection="$3_$i"
    archive="$collection$b"
    $a$archive $c$collection
    gzip $archive
done

脚本比较烂,不要嘲笑😂

删除1/2日志成果

删除前:剩余5G 删除后:剩余95G 数据压缩包:5G 节约空间90G,不得不说mongo很吃硬盘啊(更吃内存)

6 14

使用tideways和xhgui搭建PHP性能分析平台

背景

一直想做个性能分析工具,在代码中埋点不但麻烦,还污染现有代码。一开始看到了xhprof,官方版本已经不维护了。后来看到了tideways可以做无侵入监控,变了解了下,官网地址

安装

参考官网:安装方法

安装后再/usr/lib/tideways文件夹下会生成各个版本的.so文件,找到你所使用的版本的扩展文件,拷贝到扩展文件夹,并将其加入到php.ini中。重启php-fpm,安装成功。

安装xhgui

英文版地址:perftools/xhgui 中文版地址:laynefyc/xhgui-branch

注意,xhgui依赖mongodb扩展,务必确保已经安装。安装完毕后修改xhgui/config/config.default.php相应的配置项。

mongodb使用的db默认为xhprof,可在xhgui中自行配置。 为mongodb加索引:

 > db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
 > db.results.ensureIndex( { 'profile.main().wt' : -1 } )
 > db.results.ensureIndex( { 'profile.main().mu' : -1 } )
 > db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
 > db.results.ensureIndex( { 'meta.url' : 1 } )

xhgui nginx配置

server {
        charset utf-8;
        listen       80;
        server_name  xhgui.tccbest.com;
        root /xxx/xxx/xhgui/webroot;
        index  index.html index.htm index.php;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
            root           /xxx/xxx/xhgui/webroot;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
            try_files      $uri = 404;
        }
}

访问xhgui.tccbest.com展示如下页面:

xhgui

应用nginx配置

将以下两行加入到项目的nginx配置中

fastcgi_param TIDEWAYS_SAMPLERATE "25";
fastcgi_param PHP_VALUE "auto_prepend_file={xhgui-path}/xhgui/external/header.php";

重启nginx生效

6 13

PHP规范代码 - git hook 配置PHPCS

PHPCS

安装

使用 composer:
composer global require "squizlabs/php_codesniffer=*"

其他安装方式请自行查找。注意,你可能需要将 ~/.composer/vendor/bin/ 添加到 PATH 环境变量中,或者将~/.composer/vendor/bin/中的phpcsphpcbf软链到/usr/local/bin/否则会报命令找不到。

使用

使用PSR2标准检测代码

phpcs xxx.php --standard=PSR2

修复不符合PSR2标准的代码

phpcbf xxx.php --standard=PSR2

git hook中检测

复制pre-commit中的内容到项目中的{project_root}/.git/hooks/pre-commit下,chmod +x {project_root}/.git/hooks/pre-commit。在提交代码时,不符合PSR2标准的文件将会报错。

5 27

consul服务注册与服务发现

consul介绍

git地址

使用goapi实现服务注册

consul地址:10.10.222.19 服务地址:10.10.92.222 以下程序使用gin框架实现

    package main
    
    import (
            "github.com/gin-gonic/gin"
            "om-api/api"
            consulapi "github.com/hashicorp/consul/api"
            "fmt"
            "log"
    )
    
    const Id = "test"
    
    func main() {
            TestRegister()
            r := gin.Default()
            r.GET("/check", func(c *gin.Context) {
                    c.JSON(200, gin.H{
                            "code" : 200,
                    })
            })
    
            r.Run("0.0.0.0:5203") 
    }
    
    func TestRegister() {
            fmt.Println("test begin .")
            config := consulapi.DefaultConfig()
            config.Address = "10.10.222.19:8500"
    
            //config.Address = "localhost"
            fmt.Println("defautl config : ", config)
            client, err := consulapi.NewClient(config)
            if err != nil {
                    log.Fatal("consul client error : ", err)
            }
    
            //创建一个新服务。
            registration := new(consulapi.AgentServiceRegistration)
            registration.ID = Id
            registration.Name = "test"
            registration.Port = 5203
            registration.Tags = []string{"test"}
            registration.Address = "127.0.0.1"
            //增加check。
            check := new(consulapi.AgentServiceCheck)
            check.HTTP = fmt.Sprintf("http://%s:%d%s", registration.Address, registration.Port, "/check")
            check.Timeout = "5s"
            check.Interval = "5s"
            //注册check服务。
            registration.Check = check
            log.Println("get check.HTTP:", check)
    
            err = client.Agent().ServiceRegister(registration)
    
            if err != nil {
                    log.Fatal("register server error : ", err)
            }
    }

运行代码则会注册该服务到consul

使用HTTP GET发现该服务

http://10.10.222.19:8500/v1/health/service/test?passing=true

返回值如下:

[
  {
    "Node": {
      "ID": "3ab01748-5a81-b1b8-04c0-340e34654028",
      "Node": "Lin-Dev",
      "Address": "127.0.0.1",
      "Datacenter": "dc1",
      "TaggedAddresses": {
        "lan": "127.0.0.1",
        "wan": "127.0.0.1"
      },
      "Meta": {},
      "CreateIndex": 5,
      "ModifyIndex": 6
    },
    "Service": {
      "ID": "test",
      "Service": "test",
      "Tags": [
        "test"
      ],
      "Address": "10.10.92.222",
      "Port": 5203,
      "EnableTagOverride": false,
      "CreateIndex": 11,
      "ModifyIndex": 11
    },
    "Checks": [
      {
        "Node": "Lin-Dev",
        "CheckID": "serfHealth",
        "Name": "Serf Health Status",
        "Status": "passing",
        "Notes": "",
        "Output": "Agent alive and reachable",
        "ServiceID": "",
        "ServiceName": "",
        "ServiceTags": [],
        "CreateIndex": 5,
        "ModifyIndex": 5
      },
      {
        "Node": "Lin-Dev",
        "CheckID": "service:test",
        "Name": "Service 'test' check",
        "Status": "passing",
        "Notes": "",
        "Output": "HTTP GET http://10.10.92.222:5203/check: 200 OK Output: {\"code\":200}\n",
        "ServiceID": "test",
        "ServiceName": "test",
        "ServiceTags": [
          "test"
        ],
        "CreateIndex": 11,
        "ModifyIndex": 315
      }
    ]
  }
]
Prev Next