唯's Blog

笔者是一个热爱编程的 Java 程序员。

0%

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
GET /report_synchronizer_*/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"reportTimestamp": {
"gte": 1679707762960
}
}
},
{
"range": {
"speed": {
"gt": 0
}
}
}
]
}
},
"aggs": {
"stat": {
"histogram": {
"field": "reportTimestamp",
"interval": "3600000"
},
"aggs":{
"speed":{
"sum":{
"field":"speed"
}
},
"speedByteSize":{
"sum":{
"field":"speedByteSize"
}
}
}
}
}
}

字符串根据时区转时间戳

1
moment.tz('2023-05-01 12:00:00', 'America/Los_Angeles').toDate().getTime()

  • 任何软件工具都应该遵循一个原则:做对的操作应该很容易,做错的操作应该很难。

《论平台工程》

  • 人生是一个长板问题:人生不必在乎那些不重要的事情,没必要为了挫折和拒绝而沮丧,都会过去的。你要做的是向前看,拼命争取一次大的成功,让它足够大、更大,只要一次就够了。

https://github.com/ruanyf/weekly/blob/master/docs/issue-254.md

  • 变化才是世界永远的主题,能够在新变化中找出共性与关键,是优秀工程师的必备能力。

创建一个 GGR 容器实例

1
docker run -d --name ggr -p 8088:4444 -e TZ=America/Los_Angeles -v /etc/grid-router/:/etc/grid-router/akamai/:ro aerokube/ggr:1.5.4

如何更新 GGR 配置文件?

如上面命令文件目录的影射,配置文件的根目录:/etc/grid-router/

配置文件所在目录地址

hubLink: http://test:123456@10.1.49.12:8083/wd/hub

/etc/grid-router/quota/test.xml

文件名 test,便是用户名 。

/etc/grid-router/users.htpasswd

用于指定用户名-密码。

配置文件各个节点说明

对应浏览器的信息,新增浏览器则新增该节点。

对应浏览器的版本,新增浏览器版本则新增该节点。

每个 Host 节点 name 指定 selenoid IP 地址,port 指定 selenoid 服务端口,count 指定轮询权重。

具体文件内容:

1
<qa:browsers xmlns:qa="urn:config.gridrouter.qatools.ru"> <browser name="chrome" defaultVersion="latest">    <version number="latest">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version>     <version number="98.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version>    <version number="90.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version>    <version number="83.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version>    <version number="80.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version>    <version number="70.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version>    <version number="65.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version> </browser> <browser name="MicrosoftEdge" defaultVersion="108.0">    <version number="108.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version> </browser> <browser name="firefox" defaultVersion="107.0">    <version number="107.0">        <region name="1">                        <host name="172.16.139.28" port="8081" count="1"/>                        <host name="172.16.139.29" port="8081" count="1"/>                        <host name="172.16.139.26" port="8081" count="1"/>                        <host name="172.16.139.27" port="8081" count="1"/>                        <host name="172.16.139.25" port="8081" count="1"/>                        <host name="172.16.139.37" port="8081" count="1"/>        </region>    </version> </browser> </qa:browsers> 

GGR 配置如何不停机更新?

在平常新增浏览器,或者在某个 selenoid 新增浏览器版本,则需要更新配置文件新增 节点,这种操作相对来说是频繁的。如果是冷更新配置,修改后配置文件重启 GGR 则会影响线上正在运行的 Job。

1
// 修改配置文件 vim /etc/grid-router/quota/test.xml // 发送更新配置指令(官方提供的方法) docker kill -s HUP ggr

如何画出好的架构图

4R原则

  1. Rank(顶层架构)
  2. Role
  3. Rule
  4. Relation

HPA(Horizontal Pod Autoscaling) 水平自动伸缩

为了保证 HPA 稳定,需要确保程序能够快速启动:

  1. 微服务化,一方面是方便给核心功能提供精准的资源支持、另一方面是服务更小更轻量。
  2. 减少启动依赖项
  3. 使用轻量语言、框架

伸缩带来的联动影响也需要注意一下:

  1. 对 DB 、ZK 等下游服务的连接数增多
  2. 在 Max HPA Triggerd 情况下整个 Namespace 的资源上限是否会超额

在相应的场景,提出合适的架构

不是提出一些假大空的架构,所谓的高大上流行的架构:

  1. 当前业务体量不需要
  2. 很难落地(公司、团队的技术能力、人员配比)

要根据业务场景、体量提出适合的架构。

1
2
3
4
5
6
7
// JDK 原生 API
System.setProperty("java.vm.name", "Java HotSpot(TM) ");
System.out.println(ObjectSizeCalculator.getObjectSize(onlineChangeReportDetails));

// org.apache.lucene.
System.out.println("value is " + RamUsageEstimator.sizeOf(onlineChangeReportDetails));
System.out.println(" value is " + RamUsageEstimator.humanSizeOf(onlineChangeReportDetails));

记录一些开发中常用的 docker 命令

清除没用使用的数据,包括镜像数据、已经停止的容器

docker system prune -a

查询日志

docker logs --since="2021-10-07T23:35:00Z" --until="2021-10-07T23:36:00Z"

ES 原理

ES全称ElasticSearch,是一个分布式搜索引擎,同时也是一个Nosql数据库,存放的数据格式类似JSON,跟MongoDB有些类似,
MongoDB事务型应用层面适用于OLTP,ElasticSearch更偏向于OLAP,本身不支持事务。

实现特点

  1. 存储数据有序存储
  2. 将数据与索引分离
  3. 压缩数据

主要解决问题

  1. 检索相关数据
  2. 分布式存储
  3. 返回统计结果
  4. 速度快

读写底层原理

协调节点

负责读写请求的路由,例如查询的文档不在当前机器上,则需要路由到其他 ES 机器上。

四个核心操作

  1. flush
  2. refresh
  3. translog
  4. merge

海量数据下 ES 的性能优化

  1. 系统文件缓存(File System Cache),保证写入的数据量等于或者略大于系统内存(剩余)

  2. 避免在 ES 联表查询,写入 ES 时,应该就聚合数据。

  3. 只存储与搜索相关的字段,减少文档大小

  4. 冷热数据

  5. 深分页,改为使用 Scroll

  6. 存储数据有序存储

  7. 将数据与索引分离

  8. 压缩数据

主要解决问题

  1. 检索相关数据

  2. 分布式存储

  3. 返回统计结果

  4. 速度快