新溪blog

新溪-gordon之胡写乱画

0%

前言

前几天我一朋友问我有关webrtc的事,简单了解了下相关知识,搭建了一个webrtc的服务,以及经历的各种踩坑事件,感觉踩坑主要是Python、Node、OpenSSL等版本问题和证书问题导致。本来以为很简单的搭建,但在搭建的过程中遇到各种阻碍,写一篇文章梳理一下。

阅读全文 »

结论先行

​ 最最重要的是要去学!投入时间去学习,英语学习属于没有太多捷径,必须要投入大量时间去做的事。当然,虽然没有捷径,还是有一些方法和技巧可以提高一些速度的。但是最重要的是要做好心理准备,这是一场持久战。

阅读全文 »

背景

Mongo集群CPU报警,查看现象是那一小段突然有一个请求小高峰,经过分析把问题定位到一个新增的接口上,这个接口中有一个Mongo的慢查询,这个慢查询对应的相关信息有:

  1. 集合总文档数超过 6 亿条
  2. 按条件查询后获取的数据也有几万条
  3. 之前已经加了几个索引,但效果不是特别理想
阅读全文 »

简介

当数据量不大时,查询语句随便写,只要实现逻辑功能即可;但当数据量大到一定程度时,可能以前的方法就不可行了,因为一是查询数度变慢,更有甚者可能因数据量大而导致查询失败。解决这种问题最简单的方法是添加索引并利用好这些索引。可以通过explain函数来分析:1、在建索引前数据请求情况2、创建索引后数据请求是否有变好。现在就来看看explain相关知识。

阅读全文 »

前言

关于Chrome插件,我用的比较多的主要是下面几个 Anything to QRcodeAxure RP Extension for ChromeEvernote Web Clipper有道云笔记网页剪报gitlab-code-viewGoogle TranslateOctotree。之前还有个Proxy代理的,自从使用SS的pac功能之后就用不到了。上面这几个你知道名字,自己去 chrome web store 上自己搜索安装就好了,很简单。今天要讲的这个插件,属于那种 难者不会,会者不难 的情况,你用过之后就会感觉很简单,没用之前很可能一个很小的门槛就把你档在外面。

阅读全文 »

简介

提前看了《云原生架构白皮书》一直想着要写点东西,拖延来去《白皮书》已经正式发布2天了,我还迟迟没有动手。没动手的一方面原因是我的懒癌症又犯了;另一个原因是《白皮书》覆盖面之广,基本触及到云原生的方方面面,而我在云原生方面的知识储备不足以支撑我写出一篇好文。

阅读全文 »

简介

前段时间grafana监控出问题,定位发现磁盘满了。今天grafana监控又出问题了,是去一看磁盘又满了。肯定是某一个服务在不停的吃磁盘,才7天时间,就吃掉了近200G。

问题定位

定位到哪个文件在吃磁盘

通过df和du命令一点点定位找到真凶:/var/lib/grafana.db。此文件已经占用486G了。

定位是哪个表数据量大

我们grafana用的是sqlite存储配置相关信息,grafana.db文件就是sqlite的数据文件,登录sqlite:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$> sqlite3 /var/lib/grafana.db
sqlite> .table
alert dashboard_version quota
alert_notification data_source session
annotation login_attempt star
annotation_tag migration_log tag
api_key org team
dashboard org_user team_member
dashboard_acl playlist temp_user
dashboard_provisioning playlist_item test_data
dashboard_snapshot plugin_setting user
dashboard_tag preferences user_auth
$> select count(*) from dashboard_version;
4462809

为啥这个表这么多数据

Google、百度各种关键词都查不到相关问题,没办法,只好去github上看Issues了。搜索grafana.db和dashboard_version找到原因。这是grafana的一个bug,5.2.2、5.3.0都有这个问题,我们的版本是5.1.4也有这个问题。这个问题在今年1月份由bergquist提供了解决方案。

原因:

dashboards的来源中2个不同的文件夹下有一个相同的json文件

原文:from

By mistake, I put twice the same JSON file in two different folders, which are used as a source of provisioned dashboards. And after some time I noticed, that MySQL databases were growing infinitely. After some quick check, I found, that the table "dashboard_version" was the biggest (with millions of "revisions" for "duplicated" dashboard).

bergquist提供的解决方案

在文件devenv/dashboards.yaml中增加一句:

1
2
3
4
5
6
7
// https://github.com/bergquist/grafana/commit/2ea46fa925013abbf92871c3aec17250250a9250
解决说明:
avoid infinite loop in the dashboard provisioner:
if one dashboard with an uid is refered to by two
provsioners each provsioner overwrite each other.
filling up dashboard_versions quite fast if using
default settings.

这个问题在新版本已经解决了,原因是dashboard的json配置文件中的uid有相同的,导致相互间覆盖。但我验证时,导出所有的dashboard的配置文件,没有发现有相同uid的配置,这个难道是我之前对各配置文件分组引起的?我删除了几个不常用的dashboard,把所有配置都合并到一个文件夹中,没办法证实了。

本问题解决方案

但现在的问题是,已经有400多G数据,需要先解决这个问题再使用新版本。首先想到的是迁移到一个新的服务器上,但有个问题,配置文件的导出只能一个个导出dashboard,而且还不能导出类似数据源这类数据。本来这种配置数据迁移可以通过直接迁移数据库解决,但现在本来就是解决数据库太大的问题。

简介

我正在学习Istio,正巧碰到阿里云的服务网格(Alibaba Cloud Service Mesh,简称 ASM)进入UAT环境 [1],于是报名并有幸能抢先体验一把阿里的Service Mesh。阿里这边对UAT的要求是「以真实客户视角从产品开通、控制台易用性、功能完整性和有效性以及帮助文档的完整性、准确性和易读性等维度体验评测产品,在规定时间完成产品评测后按照提交建议和评分模板完成最后的体验建议提交和评分。」UTA评分标准如下图:

UAT评分标准

操作步骤

创建 ASM 实例,参见 创建 ASM 实例。
添加集群到 ASM 实例,参见添加集群到 ASM 实例。
为 ASM 实例中的集群部署入口网关,参见添加入口网关。
将应用部署到 ASM 实例,参见部署应用到 ASM 实例。
定义虚拟服务和 Istio 网关

前提条件

已开通以下服务:
服务网格 ASM
容器服务
资源编排(ROS)服务
弹性伸缩(ESS)服务
访问控制(RAM)服务
已创建至少一个标准托管ACK集群

概要

前面两篇文章已经介绍了如何部署和如何使用。后面主要是如何写.drone.yml文件了,而.drone.yml文件,是由一个个插件执行一个个的步骤。上一篇也以一个实际的例子简单讲了一些插件的使用与作用,本篇对主要的几个插件进行稍详细的说明。

正常来说,任何一个镜像都可以作为一个插件(如上一篇用到的golang:alpine镜像,就是一个普通的golang镜像)。但在配置文件中使用了settings字段(如使用到了Secrets)或者使用drone自带的环境变量(如DRONE_BUILD_NUMBER),这时就需要对镜像进行一些特殊处理,我们在后续的篇章会专用介绍如何写Drone插件,本篇暂不详述。

配置

总框架

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
kind: pipeline
type: docker
name: <项目名>

steps:
- name: <step1名>
image: <镜像名>
commands:
- 实际执行的命令1
- 实际执行的命令2
trigger:
branch:
- pvt

说明:

1
2
3
4
5
6
7
8
9
10
1. kind: 设定为管道命令(默认值:pipeline,暂没有发现有其他可用值)
2. type: 设定管道类型
docker: docker管道
kubernetes: k8s管道,暂不稳定,有泄密风险(基本都可以由docker管道替代)
exec: Drone Server上执行的命令
ssh: 可远程登录其他远程机器
digitalocean: digitalocean云主机专用
3. name: 整个项目的名字
4. step: 执行步骤,此部分是最重要的部分
5. trigger: 触发器

step详情

实例:

1
2
3
4
5
6
- name: 编译
image: golang:alpine # 本项目是golang项目, 所以使用go镜像
environment:
CGO_ENABLED: "0" # 指定环境变量
commands:
- go build -o test-drone # 执行编译命令

语言插件(以golang为例)

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
- name: 编译Build
image: golang:1.13.4
commands:
- go test
- go build
volumes:
- name: gopath
path: /go
environment:
GOPROXY: https://goproxy.cn,direct
GOSUMDB: sum.golang.google.cn
GOPRIVATE: gitlab.zhaoweiguo.com
CGO_ENABLED: "0"

说明: