Relative Content

K4NZDROID

category

「OBSERVABILITY」- 监控解决方案

监控的对象(对象)
排名不分先后:
第一部分、基础设施监控
计算、存储、网络
监控的内容(结果)
监控的目的:(1)发现端倪;(2)故障通知;(3)自动修复
综合所述,监控的深度有以下这四方面:可用性监控、性能监控、日志监控、自定义监控;
可用性监控
1)这是最简单的层面监控,比如:监控端口是否活。
性能监控
比如:虽然CPU正常运作,但CPU的占用率是否一直处在一个很高的水平?
日志监控
主要是应用日志监控,其次还有安全审计日志、系统日志等。这些日志监控可确保我们人员操作的合规性。应用日志也会为后续的全链路监控提供跟踪依据,为故障定位作为参考依据。
自定义监控
我们会有很多来自于业务方面的需求,自己定义的指标,比如过去十分钟的成交量有多少,虽然这些kpi可以通过其他方式查询到,但是如果能够直接集成在监控系统中进行查询,提供附加的自定义监控,那就能更好地满足业务监控需求,从业务的角度去了解企业业务的运行状况。
监控的方法(工具)
MRTG – Multi Router Traffic Grapher
https://oss.oetiker.ch/mrtg/ https://github.com/oetiker/mrtg https://en.wikipedia.org/wiki/Multi_Router_Traffic_Grapher
Perl 使用 SNMP 采集数据 生成 PNG 等图片,以 Web 形式展示
Cacti
https://www.cacti.net/
PHP MySQL SNMP RRDtool LDAP
SmokePing
https://oss.oetiker.ch/smokeping PING WWW DNS SSH RRDtool
Graphite
https://github.com/graphite-project/graphite-web Wikipedia/Graphite
Python Django 存储数据 按需绘图
Nagios
https://github.com/NagiosEnterprises/nagioscore https://en.wikipedia.org/wiki/Nagios
监控系统 服务可用性 网络信息 WebUI 服务可用性 告警
Zenoss Core
https://www.zenoss.com/get-started
CMDB 发现管理各类资产 监控和报告IT架构中的资源状态和性能 与CMDB关联的事件和错误管理系统 SMTP收集数据
Ganglia
http://gangl[……]

READ MORE

「OBSERVING-SYSTEM」- 需要观测的内容

计算观测
WIP
磁盘观测(Storage)
进程(应用)
以进程为单位,观察进程当前的 IO 负载;
我们需要查看进程针对磁盘的 IOPS、延迟、带宽等等参数,类似 pidstat 的输出的指标: 1)
1)kubelet cAdvisor
设备
以设备为单位,观察磁盘 IO 负载;
我们要获取块设备的整体读写情况:Node Exporter
网络观测
借助 eBPF 对网络进行观测: isovalent/cilium-grafana-observability-demo
针对 Kubernetes Service 关系进行观测: https://github.com/groundcover-com/caretta
NetWorth,借助 eBPF 及 XDP 来观察入站流量(地理位置、协议类型、) ShubhamPalriwala/networth: eBPF based Network Monitoring using Prometheus and Grafana[……]

READ MORE

「OBSERVABILITY」- 观测系统模块交互

实践经验记录
Prometheus => Grafana
通过 Promtheus Remote Write 特性,将数据长久存储到 Thanos 服务,所以 Grafana 能够从 Thanos 直接查询数据;
但在实际实践中,我们发现开源的 Grafana Dashboard 是针对单集群的。如果针对多个集群中使用同个面板,需要调整面板;
为了减小 Grafana Dashboard 改造工作,我们将各个 Prometheus 作为数据源添加到 Grafana 中。而 Thanos 仅是作为长期存储,只有特殊场景下(例如统计历史趋势),我们才会针对 Thanos 来制定面板;[……]

READ MORE

「OBSERVABILITY」- Grafana-based Observing Stack(for Cloud Native Computing)

问题描述
我们需要观测我们的容器云原生环境,包含 监控、日志、追踪 方面,以协助我们进行问题排查;
该笔记将记录:我们所使用的观测系统架构,以及部署观测系统的过程,以及常见问题的解决办法;
解决方案
监控:Exporter + Prometheus + Grafana,已是广泛使用的监控解决方案,所以我们也不再进行技术调研; 日志:我们直接使用 Grafana Loki 进行日志采集,目的是为了减少组件(直接使用 Grafana 进行日志展示); 追踪:根据研发要求,我们尝试使用 Jaeger 进行追踪,我们也将尝试引入其他性能追踪组件,来观察程序运行;
LGTM (Loki, Grafana, Tempo, Mimir) Stack
Loki for Logs Grafana for Visualization Tempo for Traces Mimir, Prometheus, and Graphite for Metrics[……]

READ MORE

「Linux」- 搭建 Prometheus 监控(单机,安装,部署,快速开始,实验环境)

问题描述
Prometheus 是开源的系统监控和告警工具集(官方解释)。但是我们提到 Prometheus 术语时,多半是指存储监控数据的服务。
在 Prometheus Monitoring System 中:Exporters 负责采集指标,并通过 HTTP 来暴露关键指标;Prometheus 定期请求 Exporters 以拉取指标并存储,然后评估是否达到告警阈值;Alertmanager 负责发送来自 Prometheus 的告警请求;Grafana 提供 Web 界面,读取 Prometheus 数据来展示各种指标。
该笔记将记录:在 Linux 中,如何部署 Prometheus 监控,以实验体验为目的,以及相关问题的解决思路。
解决方案
注意事项: 1)该笔记仅记录如何部署整套监控系统,但并未涵盖如何使用及如何配置,因为这涉及相当多的内容; 2)这是我们早期在刚接触云原生时记录的实验笔记。现在,我们已经在 Kubernetes 环境中部署监控;
官方提供多种部署方式(这些并非我们常用部署方式): 1)Using pre-compiled binaries 2)From source 3)Using Docker 4)Using configuration management systems 5)通过 Minikube 提供的内置部署方式;
环境信息
操作系统:Debian GNU/Linux 10 (buster) 软件版本:Node Exporter 0.17.0;Alertmanager 0.15.3;Prometheus 2.7.1;Grafana 7.5.7;
部署 Node Exporter 服务

apt-get install -y prometheus-node-exporter

systemctl enable prometheus-node-exporter.service
systemctl start prometheus-node-exporter.service

# 请求 Node Exporter 服务,以检查服务正常运行
curl http://127.0.0.1:9100/metrics

补充说明:Node Exporter 是众多 Exporter 中的某一个,还有比如 MySQL server exporter、Memcached exporter、JIRA exporter 等等,参考 Exporters and integrations 页面。
部署 Alertmanager 服务

apt-get install -y prometheus-alertmanager

systemctl en[……]

READ MORE

「Prometheus」- 高可用监控集群,集群监控(Monitoring)

问题描述
该笔记将记录:部署 Prometheus Monitoring 的方法,以及相关问题的解决办法。
解决方案
补充说明
针对应用环境,我们这里讨论的 Prometheus Monitoring 是围绕 Kubernetes 展开的。 针对非容器化环境,传统监控方案经过实践的检验,所以我们相信传统的监控方案会更好。
单集群监控
单集群监控,是指 Prometheus Monitoring 仅监控单个 Kubernetes 集群,即多个 Kubernetes Cluster 需要部署多个 Prometheus Monitoring 实例;
针对实际应用环境,通常具有多个集群需要监控,并且未来将会扩增,所以我们直接跳过单集群讨论,将重点放在 Multiple Kubernetes Cluster 的监控问题上;
多集群监控(调研、学习)
Multiple Kubernetes cluster monitoring with Prometheus | Sysrant Monitoring a Multi-Cluster Environment Using Prometheus Federation and Grafana
方案一、kubernetes_sd_config/api_server
通过 Prom 的 kubernetes_sd_config 的 api_server 选项,直接连接其他集群 1)优点:该方案简单易于部署,也无需在其他集群进行过多的配置; 2)缺点:跨集群认证需要单独配置;某些指标需要在被监集群部署组件,该方案无法满足该需求;
方案二、Prometheus Federation
通过 Prom 的联邦技术:分别在其他集群中部署 Prom 服务,在通过中心的 Prom 进行采集 1)优点:容易部署; 2)缺点:数据量较大,尤其是对于中心 Prom,其需要采集的指标更多,所需要的时间也更多(延迟);
方案三、Expose the /metric Interface
通过暴露被监集群的 /metric 接口,以供 Prom 进行爬取; 1)优点:非常容易部署; 2)缺点:仅能小规模使用;没有服务发现;也无法实现自动化;
我们最初的想法是: 1)针对每个集群,部署 Prometheus Monitoring 监控; 2)通过 Grafana Datasoruce 特性,在 Dashboard 中选择不同数据源来显示;
方案四、Prometheus + Thanos Sidecar
通过在多个集群部署 Prometheus + Sidecar 的方式,并通过 Query 进行分别查询;

还有个改进方案,本质是类似的。[……]

READ MORE

「WEB-SCRAPING」- 网络爬虫

Web Scraper
chrome web store/Web Scraper webscraper中文网 有关webscraper的问题,看这个就够了(建议收藏)
信息采集
# 万维易源 – 一个世界, 一个API http://www.showapi.com
QQBot 用 PYthon 实现的、基于腾讯 SmartQQ 协议的 QQ 机器人框架,可运行在 Linux 、 Windows 和 Mac OSX 平台下。[……]

READ MORE

「Selenium」- 基本概念及快速开始

Selenium 是用与支持浏览器自动化的系列工具和库的总体项目。即 Slenium 是个胶水,将用于浏览器自动化测试的项目及工具粘合在一起。
基本概念及常用术语
WebDriver,使用 浏览器的接口 来操作浏览器,并运行测试,就像真实的用户操作一样。工作流程:Python Lib => WebDriver => Web Browser
IDE (Integrated Development Environment),是 Selenium 提供的 Firefox 或 Chrome 插件,用于测试用例开发,简化开发流程。
Selenium Grid,用于在不同平台上运行测试用例。控制端在本地,当出发测试用例后,将在远程主机执行测试用例。
参考文献
Quick tour :: Documentation for Selenium[……]

READ MORE

「Selenium」- 搭建本地环境(Linux)

安装 Selenium 工具(快速开始)
Selenium 的工作流程:Python Lib => WebDriver => Web Browser
因此我们需要进行以下设置: 1)安装 Python Selenium 库,用于操作 WebDriver 程序的工具类库; 2)我们需要 WebDriver 程序,该工具用于操作浏览器;
注意事项: 1)除了 Python Selenum 库,其实还有 Java C# Ruby 等等库,都可以操作 WebDriver 程序。 2)由于我们使用 Python 语言,所以这里只介绍 Python 类库;
第一步、安装 Python Selenum 类库

// 留意自己使用的 Python 版本

# pip install selenium
# pip3.7 install selenium

// 我们使用 Debian 10 发行版,推荐 APT 安装

apt-get install python3-selenium

第二步、安装 WebDriver 程序
需要做两件事情: 1)下载与浏览器对应的 WebDriver 程序,比如:Chrome 需要下载 chromedriver 二进制程序;Firefox 需要下载 geckodriver 二进制程序; 2)将 WebDriver 程序放入系统路径,以便被搜索到。因为 Python Selenum 库需要执行该二进制程序,以便操作浏览器;
Chromium
我们这里以 Debian 10 的 Chromium 为例:

# chromium –version
Chromium 83.0.4103.116 built on Debian 10.4, running on Debian 10.5

// 方法一、下载安装

# wget -O /tmp/chromedriver_linux64.zip \
https://chromedriver.storage.googleapis.com/83.0.4103.39/chromedriver_linux64.zip

# unzip -x /tmp/chromedriver_linux64.zip -d /usr/local/bin

# chromedriver
Starting ChromeDriver 83.0.4103.39 (ccbf011cb2d2b19b506d844400483861342c20cd-refs/branch-heads/4103@{#416}) on port 9515
Only local connections are allowed.
Please see https://c[……]

READ MORE

「Selenium Grid 3」- 在远程主机中执行测试任务

Selenium Grid
Selenium 用于自动化测试,但是只能运行在本地环境中,即启动本地浏览器进行测试任务。而通过 Selenium Grid 集群,可以在多台远程主机中同步执行自动化测试任务。
如图所示,Client 连接 Hub 并发送任务,然后 Hub 将测试任务下发到 Node 进行执行(摘自 Selenium Grid 3 文档):
在该笔记中,我们将介绍如何搭建 Selenium Grid 3 环境,并编写最简单的演示程序。
注意事项,官方不再支持 Grid 3 版本,官方建议使用 Grid 4 版本。但是目前(08/30/2020)Grid 4 的文档并不完善,并且 Grid 3 的实践经验较多,因此我们使用 Selenium Grid 3 版本。
第一步、搭建 Seleium Grid 集群
Hub: 172.31.253.49, CentOS Linux release 7.5.1804 (Core) Node: 172.31.253.103, Ubuntu 20.04 LTS
运行 Hub 节点

yum install -y java-1.8.0-openjdk
mkdir -pv /srv/selenium-hub && cd /srv/selenium-hub
wget https://selenium-release.storage.googleapis.com/3.141/selenium-server-standalone-3.141.59.jar

# 配置 systemd 服务
cat > /etc/systemd/system/selenium-hub.service <<EOF
[Unit]
Description=Selenium Grid Hub

[Service]
Type=simple
User=root
ExecStart=/usr/bin/java -jar /srv/selenium-hub/selenium-server-standalone-3.141.59.jar -role hub -debug

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl start selenium-hub.service
systemctl enable selenium-hub.service

# 查看服务运行信息
journalctl -f -u selenium-hub.service

当服务运行成功后,在日志中将看到类似如下信息:

Started Selenium Grid Hu[……]

READ MORE

「Selenium IDE」- 针对 Web 环境,记录和回放的自动化测试工具

问题描述
在编写传统的 Selenium 自动化测试脚本时,我们需要借助编程语言并使用 Selenium 类库;
虽然能够完成测试任务,但还是具有一定的工作量:环境搭建、编写测试用例、脚本调试;
解决方案
通过 Selenium IDE 工具,我们能够快速创建 Web 自动化测试任务,并减轻编码带来的工作量;

插件安装
安装 Selenium IDE 的过程大致如下: 1)在 Chrome / Firefox 中,安装 Selenium Plugin 即可; 2)在 Selenium Plugin 中,通过图形化操作来定义自动化任务;
使用方法
创建测试任务
参考 Selenium IDE/Getting Started 文档,以获取其详细使用方法;
首先,在界面中,填写 Playback Base URL 参数,元素选择也将在该页面上进行;
然后,在界面中,添加相关补充及任务。简单示例如下:

Command | Target | Value
—————————————————————————————-
open | https://www.example.com |
execute | script return document.getElementById(“inputBox”) !== null | inputBoxExists
if | ${inputBoxExists} > 0 |
send keys | id=inputBox | 123456
end | |
click | css=.table .button |
close | |

最后,在界面中,点击 Run current test(播放按钮)按钮,开始执[……]

READ MORE

「Selenium Grid 3」- 使用 Java / Groovy 语言

我们更多的是在 Jenkins Pipeline 中使用 Selenium 框架,因此需要使用 Groovy 类库。由于没有与之对应的 Groovy 类库,因此只能使用 Java 类库。
还有另外种做法:使用 Python 实现,然后在 Groovy 中命令行调用。但是我们无法使用该方法,因为 Selenime 的自动化测试过程中需要交互、判断,而这种方法无法获取状态,只能输入执行然后等待输出。
相关链接
Maven Repository: org.seleniumhq.selenium » selenium-java(我们使用 Selenium Grid 3 版本) 下载页面:Downloads 接口文档:https://www.selenium.dev/selenium/docs/api/java/index.html
Selenium with Java: Best Practices
连接 Selenium Hub 节点

import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.Platform;

import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.WebDriver;
import java.net.URL;

DesiredCapabilities desiredCapabilities = DesiredCapabilities.chrome();
desiredCapabilities.setBrowserName(“chrome”);
desiredCapabilities.setPlatform(Platform.LINUX);

String seleniumHubUrl = “http://ip-address:port-number/wd/hub”;
WebDriver webDriver = new RemoteWebDriver(new URL(seleniumHubUrl), desiredCapabilities);

设置窗口大小及位置
python – How do I set browser width and height in Selenium WebDriver? – Stack Overflow Selenium Waits: Implicit, Explicit, Fluent And Sleep

import org.openqa.selenium.Dimension;
import org.openqa.selenium[……]

READ MORE

「Selenium」- 在页面中,点击按钮(或元素)

问题描述
该笔记将记录:在 Selenium 中,如何使用代码点击按钮,以及常见问题处理。
解决方案
使用 click() 点击
通常点击元素使用 click() 方法即可:

// 选择元素并进行点击
webDriver.findElement(By.id(“buttoncheck”)).click()

// 等待元素可以点击
new WebDriverWait(webDriver, 10).until(ExpectedConditions.elementToBeClickable(By.xpath(“xpath-query”))).click()

使用 JavaScript 点击
或者,当找到元素后,使用 JavaScript 点击:

((JavascriptExecutor) webDriver).executeScript(“arguments[0].click();”, button);

该方法可以我们遇到的解决如下问题:

org.openqa.selenium.ElementClickInterceptedException: element click intercepted:
Element xxxxxxxx is not clickable at point (1154, 91). Other element would receive the click: xxxxxxx

更多点击动作
复杂的点击操作(长按、右键、双击),参考 Test Automation With Selenium Click Button Method(Examples) 页面
关于点击需要注意的事项
现实世界是复杂的,我们将在该部分中记录我们遇到的问题(与点击相关)。
# 10/03/2020 某些元素,当在浏览器窗口(viewport)中可见时,才会被绑定点击事件。因此,如果没有滚动到该元素使其可见,点击动作是无效的。在 Firefox 80.0.1 (64-bit) 中,滚动至元素可见,会发现在 Inspector 中该元素的后面后显示 event 标签。使用如下代码进行滚动及滚动完成的检查:

// 下面是与滚动至元素可见的代码的参考文献
// https://www.guru99.com/scroll-up-down-selenium-webdriver.html
// https://stackoverflow.com/questions/42982950/how-to-scroll-down-the-page-till-bottomend-page-in-the-selenium-webdriver

/[……]

READ MORE

「Selenium」- 正确的休眠(等待)方法

问题描述
当我们加载页面后,可能需要等待页面渲染,等待某个 HTML 元素加载完成。我们经常使用 Thread.sleep() 进行等待,但是具有以下缺点: 1)等待时间过长,而页面已经加载完成;等待时间过短,而页面还未加载完成; 2)我们无法确定要等待的具体时间。如果使用 while 循环检查,程序会显得“不整洁”; 3)每个查找元素的地方都需要等待; 4)必须等待特定时间后,即 Thread.sleep() 设置的时间,才能继续执行后续程序;
解决方案
我们可以使用 Selenium 提供的等待方法: 1)Implicit wait – Provided by Selenium WebDriver 2)Explicit wait (WebDriverWait & FluentWait) Provided by Selenium WebDriver 3)Fluent Wait
Implicit Wait
如下是演示代码(只包含关键部分),我们通过演示代码进行讲解:

WebDriver driver=new ChromeDriver();

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

driver.get(“https://www.easemytrip.com/”);
driver.findElement(By.id(“FromSector_show”)).sendKeys(“Delhi”, Keys.ENTER);
driver.findElement(By.id(“Editbox13_show”)).sendKeys(“Mumbai”, Keys.ENTER);

如上示例,使用 implicitlyWait 最多 30s 等待,具有以下优势: 1)在 findElement 时,最多 30s 等待,只要找元素就立即向下执行; 2)如果在 30s 内没有找到,则返回 ElementNotVisibleException 异常; 3)全局设置(只需要设置一次,无需在每次查找元素时进行设置);
但是我们会遇到另外场景,比如:虽然 HTML 元素已经找到,但是在页面元素是否可见、是否可以点击,这些会影响自动化测试的进行。针对这个问题,我们可以使用 Explicit wait 等待。
Explicit wait
如下是演示代码(只包含关键部分),我们通过演示代码进行讲解:

WebDriver driver = new ChromeDriver();
driver.get(“https://www.rentomojo.com/”);

// 等待页面元素可见
WebDriverWa[……]

READ MORE

「Selenium」- 文件上传

问题描述
我们需要使用 Selenium 进行文件上传,以完成功能测试任务。
但是,在尝试多种方法后,都会遇到如下错误:

org.openqa.selenium.InvalidArgumentException: invalid argument: File not found : xxxxxxx

该笔记将记录:在 Selenium 中,如何实现文件上传,以及相关问题处理。
解决方案
方法一、使用 FirefoxDriver 上传
我们没有使用 FirefoxDriver 上传的方法,这里只是记录这种做法:

import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;

public class PG9 {
public static void main(String[] args) {
System.setProperty(“webdriver.gecko.driver”,”C:\\geckodriver.exe”);
String baseUrl = “http://demo.guru99.com/test/upload/”;

WebDriver driver = new FirefoxDriver();
driver.get(baseUrl);

WebElement uploadElement = driver.findElement(By.id(“uploadfile_0”));
uploadElement.sendKeys(“C:\\newhtml.html”);

driver.findElement(By.id(“terms”)).click();
driver.findElement(By.name(“send”)).click();
}
}

方法二、使用 ChromeDriver 上传
为了简单演示,这里之粘贴关键代码的两行代码:

public void uploadFile(){

webDriver.setFileDetector(new LocalFileDetector());

input.sendKeys(filePath);

}

Q:使用 Chrome 或 Chromium 浏览器遇到 File not found 错误, A:可能是因为 Chromium 是通过 snap 安装,其文件系统隔[……]

READ MORE

「Selenium」- Can not connect to the Service /path/to/chromedriver

问题描述

# python3.7 /tmp/demo.py
Traceback (most recent call last):
File “/tmp/demo.py”, line 4, in <module>
driver = webdriver.Chrome(‘/srv/sharing/packages/chromedriver_linux64/chromedriver’) # Optional argument, if not specified will search path.
File “/usr/local/lib/python3.7/dist-packages/selenium/webdriver/chrome/webdriver.py”, line 73, in __init__
self.service.start()
File “/usr/local/lib/python3.7/dist-packages/selenium/webdriver/common/service.py”, line 104, in start
raise WebDriverException(“Can not connect to the Service %s” % self.path)
selenium.common.exceptions.WebDriverException: Message: Can not connect to the Service /srv/sharing/packages/chromedriver_linux64/chromedriver

问题原因
Selenium python: Can not connect to the Service %s” % self.path selenium.common.exceptions.WebDriverException: Message: Can not connect to the Service geckodriver
解决办法
添加 127.0.1.1 localhost 到 /etc/hosts 文件。
参考文献
Selenium python: Can not connect to the Service %s” % self.path selenium.common.exceptions.WebDriverException: Message: Can not connect to the Service geckodriver[……]

READ MORE

「Selemium」- ChromeDriver only supports characters in the BMP

问题描述
在 Selenium 中,执行自动化测试任务,产生如下错误:

Caught: org.openqa.selenium.WebDriverException: unknown error: ChromeDriver only supports characters in the BMP
(Session info: chrome=87.0.4280.66)
Build info: version: ‘3.141.59’, revision: ‘e82be7d358’, time: ‘2018-11-14T08:17:03’
System info: host: ‘laptop-k53sd’, ip: ‘127.0.1.1’, os.name: ‘Linux’, os.arch: ‘amd64’, os.version: ‘5.4.0-47-generic’, java.version: ‘1.8.0_265’
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 87.0.4280.66, chrome: {chromedriverVersion: 87.0.4280.66 (fd98a29dd59b3…, userDataDir: /tmp/.org.chromium.Chromium…}, goog:chromeOptions: {debuggerAddress: localhost:42727}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:virtualAuthenticators: true, webdriver.remote.sessionid: 7569ceb732eda9f22ba68994b0e…}
Session ID: 7569ceb732eda9f22ba68994b0ed1ee4
org.openqa.selenium.W[……]

READ MORE

「Selenium」- Element XXX is not clickable at point (672, 582)

问题描述
在使用 Selenium 进行自动化测试时,产生如下错误:

Caught: org.openqa.selenium.ElementClickInterceptedException: element click intercepted: Element <span style=”display: inline-block;”>…</span> is not clickable at point (672, 582). Other element would receive the click: <div class=”garr-footer-publish-content publish-footer-content”>…</div>
(Session info: chrome=87.0.4280.66)
Build info: version: ‘3.141.59’, revision: ‘e82be7d358’, time: ‘2018-11-14T08:17:03’
System info: host: ‘laptop-k53sd’, ip: ‘127.0.1.1’, os.name: ‘Linux’, os.arch: ‘amd64’, os.version: ‘5.4.0-47-generic’, java.version: ‘1.8.0_265’
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities {acceptInsecureCerts: false, browserName: chrome, browserVersion: 87.0.4280.66, chrome: {chromedriverVersion: 87.0.4280.66 (fd98a29dd59b3…, userDataDir: /tmp/.org.chromium.Chromium…}, goog:chromeOptions: {debuggerAddress: localhost:45673}, javascriptEnabled: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: LINUX, platformName: LINUX, proxy: Proxy(), setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000[……]

READ MORE

「Selenium Grid 3」- Node xxxxx has no free slots(close() vs quit())

问题描述
在使用 Selenium Grid 3 进行自动化测试的过程中,出现“启动停滞”问题(在经过漫长等待后,Selenium Node 才能启动浏览器,开始自动化测试)。
查看 Selenium Hub 日志,发现如下信息:

Sep 28 04:25:41 selenium-hub java[4609]: 04:25:41.020 DEBUG [ProxySet.getNewSession] – Available nodes: [http://172.31.253.104:24663]
Sep 28 04:25:41 selenium-hub java[4609]: 04:25:41.020 DEBUG [BaseRemoteProxy.getNewSession] – Trying to create a new session on node http://172.31.253.104:24663
Sep 28 04:25:41 selenium-hub java[4609]: 04:25:41.021 DEBUG [BaseRemoteProxy.getNewSession] – Node http://172.31.253.104:24663 has no free slots

问题原因
在自动化测试代码中,我们没有正确的退出浏览器(WebDriver),占用 Selenium Node 资源,长此以往导致 Selenium Node 无法分配资源进行新的测试。
应该使用 webDriver.quit() 关闭浏览器,而不是使用 webDriver.close() 关闭浏览器。
webDriver.close()
close() is a webdriver command which closes the browser window which is currently in focus.During the automation process, if there are more than one browser window opened, then the close() command will close only the current browser window which is having focus at that time. The remaining browser windows will not be closed.
webDriver.quit()
quit() is a webdriver command which calls the driver.dispose method, which in turn closes a[……]

READ MORE

「STORAGE」- 对象存储

Object-based Storage
《Ceph企业级分布式存储: 原理与工程实践》
对象存储是一种解决和处理离散单元的方法。离散后的数据称为对象,因此数据会离散出很多对象。与传统的文件系统中的文件不同,对象存储不像文件系统那样通过目录树或者子目录树对文件进行组织。
原理简述
在一个平坦的命名空间中(称之为桶),通过使用对象的 Object ID(有时称为对象密钥),来检索离散后的所有数据对象。 然后,应用程序通过 Web API 来访问对象,这与文件系统的访问方式不同。
对象(像文件一样)包含二进制数据流,并且大小无限制。对象还包含描述数据的元数据。文件也同样有元数据,包括文件权限、修改时间等。对象本身支持扩展元数据信息,通常以K/V形式管理元数据——将有关对象中数据的信息存储在键–值对中。
特性特征
权限隔离:使用一个账户可以访问同一存储集群上的多个桶。这些桶可能具有不同的访问权限,并且可能用于不同的对象存储。
抽象文件检索:对象存储的优点是简单易用、易于扩展。每个对象的唯一 ID 允许被存储或检索,无须最终用户知道该对象所在的确切位置。对象存储消除传统文件系统中的目录层次结构,因此可以简化对象之间的关系。
通过 Web 访问:对象存储不能像文件系统的磁盘那样被操作系统直接访问,相反,它只能通过 Web API 从应用层面被访问;
应用场景
通常,有两种访问对象API的方式:Amazon S3和OpenStack Swift(OpenStack对象存储)。Amazon S3将对象的扁平命名空间称为桶(Bucket),OpenStackSwift将其称为容器(Container)。Bucket不能嵌套。[……]

READ MORE

「S3」- 概念术语

Amazon S3 提供了一个简单的 Web 服务接口,可随时在 Web 上的任何位置存储和检索任何数量的数据。同时提供了丰富的 SDK,支持 Java、Python、Ruby 和 PHP 等多种程序开发语言;
特性特征
安全与访问管理:S3 可以针对每个对象存储桶或者对象设置独立的访问控制策略,可以允许某些 S3 或者访问,或者全部对外开放等。另外,S3 还支持对对象的限时访问,提供一个仅在规定时间内有效的 URL;
支持各种语言的 SDK 进行编程访问:亚马逊提供的 SDK 支持 C++、C#、Java、PHP、Python 和 Ruby 等常见的语言,使应用的开发能够更加灵活简单;
多元化使用 S3 服务:现在可以通过 3 种方式使用 S3 服务。通过 S3 SDK 编程访问。通过 REST API 进行访问。通过命令行 CLI 进行访问;
存储对象的版本控制:对于 S3 存储桶中的每个对象,可以使用版本控制功能来保存各个版本,可以用于数据恢复
概念术语
AccessKey、SecretKey
使用 S3 需要 S3 颁发的 AccessKey(长度为 20 个字符的 ASCII 字符串)和 SecretKey(长度为 40 个字符的 ASCII 字符串)。AccessKey 用于标识客户的身份,SecretKey 作为私钥形式存放于客户服务器,不在网络中传递。SecretKey 通常用作计算请求签名的密钥,用以保证该请求是来自指定的客户的。使用 AccessKey 进行身份识别,加上 SecretKey 进行数字签名,即可完成应用接入与认证授权;
Region(区域)
创建 Bucket 时需要选择 Region,Region 一般用于标识资源存储的物理位置,比如中国区、欧洲区等;
Region 的外网域名
比如 s3.cn.ceph.work,表示中国区的 S3 服务对外接入地址;
Service(服务)
S3 提供给用户的虚拟存储空间,在这个虚拟空间中,每个用户可拥有一个到多个 Bucket;
Bucket(存储空间)
Bucket 是存放 Object 的容器,所有的 Object 都必须存放在特定的 Bucket 中。在 RGW 中默认每个用户最多可以创建 1000 个 Bucket,每个 Bucket 中可以存放无限多个 Object。Bucket 不能嵌套,每个 Bucket 中只能存放 Object,不能再存放 Bucket,Bucket 下的 Object 是一个平级的结构。Bucket 的名称全局唯一且命名规则与 DNS 命名规则相同;
关于 Bucket 的命名规范如下: 1)仅包含小写英文字母(a~z)、数字(0~9)、中[……]

READ MORE

「STORAGE」- 软件定义存储(Software-defined Storage)

问题描述
传统的存储是一体化方案,将硬件(通常是行业专有硬件)和专有软件捆绑销售。如果部署专有存储,无论是硬件还是软件都将被某供应商锁定。
假设多个x86服务器有不同容量的存储单元,且都需要借助不同种类的存储软件才能使用这些存储单元,那么存储和运维管理将是一件非常痛苦的事情。
解决方案
软件定义存储是指存储软件与硬件分开的存储体系结构。
软件定义存储允许将这些硬件上的存储单元重新规划,并将其全部变成灵活且可扩展的存储单元。
原理简述
所有软件与硬件解耦,通过软件来替代硬件,以增加灵活性; 采用通用的x86架构服务器即可完成存储软件的安装和运行。
特性特征
1)避免技术锁定:与传统的NAS或SAN存储系统不同,软件定义存储能在任何行业标准的x86架构服务器上部署和运行,消除了软件对专有硬件的依赖。 2)易扩展:用户可以根据需要扩展存储容量,不必费力地添加其他专有硬件(节省成本)。 3)高灵活:允许用户在需要时升级或降级硬件。 4)借助软件定义存储,我们几乎可以随时按需对存储容量进行调整,从而使成本效益达到最佳;
最明显的缺点: 1)与传统硬件存储方案相比,软件定义存储的性能损失相对较多;
应用场景
WIP
Ceph
Software, Distributed Object Store, Object Storage, Filesystem, Block Storage
MINIO (Multi-Cloud Object Storage)
MinIO | High Performance, Kubernetes Native Object Storage
GlusterFS, Gluster File System
Red Hat is the major vendor of a commercially supported version of GlusterFS.
FastDFS
百度百科/fastdfs FastDFS特性及问题思考
OpenIO
Object Storage,
Lustre (Distributed File System)
Parallel distributed file system designed for high-performance computing environments.
Cinder (OpenStack Block Storage)
Manila (OpenStackShared File System)
Swift (OpenStack Object Storage)
相关链接
Ceph,TFS,FastDFS,MogileFS,Moos[……]

READ MORE

「CEPH」- 概念术语:Manager,ceph-mgr,Ceph Manager,Ceph Mgr,Ceph MGR

功能作用
Ceph Mgr 从整个集群中收集状态信息;
Ceph Mgr 与 Ceph Mon 进程一起运行,提供附加的监控功能,并与外部监控系统和管理系统连接。建议将 Ceph Mgr 和 Ceph Mon 放在同个节点上运行,但并非强制要求;
Ceph Mgr 还提供其他服务(如 Ceph Dashboard WebUI)、跟踪运行时指标,并通过基于 Web 浏览器的仪表板和 RESTful API 公开集群信息。参考 Ceph Documentation/Ceph Manager Daemon 文档,获取 Ceph Mgr 提供的模块信息;
高可用性
WIP
Ceph Orchestrator
Introduction to the Ceph Orchestrator Red Hat Ceph Storage 5 ceph-mgr orchestrator modules — Ceph Documentation
Ceph Storage Orchestrators are manager modules that primarily act as a bridge between a Red Hat Ceph Storage cluster and deployment tools like Rook and Cephadm for a unified experience. They also integrate with the Ceph command line interface and Ceph Dashboard.

Orchestrator CLI : These are common APIs used in Orchestrators and include a set of commands that can be implemented. These APIs also provide a common command line interface (CLI) to orchestrate ceph-mgr modules with external orchestration services.
Cephadm Orchestrator – This is a Ceph Orchestrator module that does not rely on an external tool such as Rook or Ansible, but rather manages nodes in a cluster by establishing an SSH connection and issuing explicit management comma[……]

READ MORE

「CEPH」- CephFS(文件系统)

解决方案
CephFS,基于 RADOS 服务,是个高性能分布式并行文件系统,是个符合 POSIX 标准的文件系统,是一个高可用、可扩展的文件系统。

(注:该图示的含义是 CephFS 能够直接挂载使用,并且 CephFS 能够向 Client 提供 NFS、CIFS 等等多种文件系统)
原理简述
CephFS 将文件元数据与文件内容数据进行分离存储,以降低复杂性并提高稳定性;

Metadata Server(MDS)
元数据管理: CephFS 依赖运行 MDS 来协调对 RADOS Cluster 的访问,并管理与其文件相关的元数据。 Ceph MDS 用于处理文件元数据信息,最终还是以对象存储在 Ceph Cluster 中; Ceph MDS 管理存储在 CephFS 中与文件相关的元数据,并协调对共享Ceph存储集群的访问。
Metadata(元数据)主要负责记录数据的属性,如文件存储位置、文件大小和存储时间等,负责资源查找、文件记录、存储位置记录、访问授权等功能。CephFS,既然是文件系统,其也需要进行 Metadata 的处理;
CephFS 使用 Metadata Server(MDS),来管理文件系统的命名空间,以及客户端如何访问到后端 OSD 数据存储中;
MDS(Metadata Server)以一个 Daemon 进程运行一个服务,即元数据服务器,主要负责 CephFS 集群中文件和目录的管理,确保它们的一致性,MDS 也可以像 MON 或 OSD 一样多节点部署实现冗余;
在使用 CephFS 前首先要安装和启动 ceph-mds 服务;
CephFS 主要依赖 MDS 提供服务,MDS 提供了一个包含智能缓存层的一致性文件系统,MDS 不会直接向客户端提供任何数据,所有的数据都只由后端 OSD 提供,这样的好处就是极大地降低了自身读写次数。除此之外,它还具备动态子树划分的特点,MDS 守护进程可以加入和退出,快速地接管故障节点。MDS 守护进程可以被配置为活跃或被动状态,活跃的 MDS 被称为主 MDS,其他的 MDS 进入 Standby 状态,当主 MDS 节点发生故障时,第二 MDS 节点将接管其工作并被提升为主节点;
Metadata 信息采用在内存中缓存的方式响应外部访问请求
Cllient
libcephfs,对多客户端支持扮演重要的角色。Ceph 允许客户端通过 libcephfs 直接与 CephFS 进行交互; CephFS 支持原生 Linux 内核驱动,所以能够在 Linux 中使用 mount 挂载 CephFS;
文件内容数据: Ceph Cluster 用于存储文件内容数据,用[……]

READ MORE

「Ceph」- Metadata Server(MDS)

原理简述
首先看一下客户端访问CephFS的过程。在CephFS中,客户端是使用CephFS的所有操作请求的入口。客户端将元数据读写请求发送到活跃的MDS,从中获取文件元数据,并且安全地缓存元数据和文件数据。
MDS将元数据提供给客户端,缓存热的元数据是为了减少对后端元数据池的请求,管理客户端的缓存是为了保证缓存一致性。CephFS工作过程是,在活跃的MDS之间复制热的元数据,并将元数据变化信息合并到日志,定期刷新到后端元数据池中,使数据在集群间实时同步,具体如图2-4所示。
详细交互过程

当 Client 打开文件时,客户端向 MDS 发送请求,实际上就是 MDS 向 OSD 定位该文件所在的文件索引节点(File Inode),该索引节点包含一个唯一的数字、文件所有者、大小和权限等其他元数据;
MDS 会赋予 Client 读和缓存文件内容的权限,访问被授权后返回给客户端 File Inode 值、Layout(Layout 可以定义文件内容如何被映射到 Object)、文件大小,
Client 根据 MDS 返回的信息定位到要访问的文件,然后直接与 OSD 执行 File IO 交互;
同样,当客户端对文件执行写操作时,MDS 赋予 Client 带有缓冲区的写权限,Client 对文件写操作后提交给 MDS,MDS 会将该新文件的信息重新写入到 OSD 中的 Object 中;
树状结构

图是个 MDS 树状结构,MDS 集群为了适应分布式缓存元数据的特点,采用了一种叫作动态子树分区(Subtree Partitioning)的策略,Subtree 可以理解为横跨多个 MDS 节点的目录层级结构,MDS 统计一个目录中元数据信息被访问的频繁程度并计数,MDS 还维护了一个称作权重的树,其记录的是最近元数据的负载情况,MDS 会定期的加载并比较前后权重值的大小,然后根据权重值适当地迁移子树以实现工作流分散在每个 MDS 中。访问程度频繁被称为热点的目录还可以进行 Hash 算法后存在多个 MDS 上;
客户端挂载

客户端访问 Ceph FS 主要有分为 Kernel 内核驱动和 Ceph FS FUSE 两种方式,Linux Kernel 2.6.34 开始加入了对 Ceph FS 的原生支持,如果客户端使用的内核版本较低或者一些应用程序依赖问题,也可以通过 FUSE(Filesystem in Userspace)客户端来挂载 Ceph 文件系统;
MDS 需要使用两个 Pool,一个 Pool 用来存储数据,一个 Pool 用来存储元数据。所以,创建 fs_data 和 fs_metadata 两个存储池,一个用来存储数据,另一个存储元数[……]

READ MORE

「CEPH」- iSCSI Gateway

解决方案
作为存储管理员,你可以为 Ceph Cluster 安装和配置 iSCSI Gateway。借助 iSCSI Gateway,你可以有效地对 Ceph RBD 进行功能接口适配,采用熟悉和常用的iSCSI来访问Ceph。
iSCSI Gateway 将 Ceph 与 iSCSI 标准集成在一起,以提供将 RBD Image 导出为 SCSI 磁盘的高可用iSCSI启动器。iSCSI协议允许启动器通过 TCP/IP 网络将SCSI命令发送到iSCSI目标器,以此提供在异构客户端访问 Ceph Cluster 的能力。
简单来说, Ceph Cluster 实现了iSCSI启动器的多点(多机头)集群,保证了访问的高可用性,为Windows等系统提供数据存储能力。因此,部署 iSCSI Gateway时,我们需要指定多节点。[……]

READ MORE

「SYNOLOGY」- DSM 洗白

顾名思义,“洗白”就是让黑群晖接近正版白群晖的过程。洗白比较繁琐且无法保证长期使用的安全和稳定。
解决方案
第一步、购买 SN / MAC 口令

亲!购买的订单编号:1855042647569410686
SN: xxxx MAC1: xxxx MAC2: xxxx
单网口请使用mac1,如果引导文件有mac2请删除,并将netif_num改为1
群晖安装及洗白教程
https://www.ainas.cc:88/?page_id=8
引导文件及常用工具下载
https://www.ainas.cc:88/?page_id=2
查看黑群晖洗白是否成功
https://www.ainas.cc:88/?p=304
一年内SN出现问题可免费更换2次,
当天确认収货并且好坪的赠送一次。
感谢您的惠顾,欢迎下次光临!

第二步、按照教程进行激活
通过 SSH 登录,通过 mount 挂载,修改 grub.cfg 配置完成激活; https://www.ainas.cc:88/?p=1302
我们使用 PVE 环境部署,所以要在 PVE 中修改虚拟机的 MAC 地址;
第三步、检查洗白成功
https://www.ainas.cc:88/?p=304[……]

READ MORE