Mini Server问题集锦

Nextcloud

更新版本时错误,[version 22.2.x]

Step 4 is currently in process. Please reload this page later

解决方法:

nextcloud路径/data/updater-xxxxxxx文件夹

frp

运行时错误, [verion 0.33、0.37.1 、0.38]

2021/11/16 22:23:50 [E] [control.go:158] [dbf0bbaf2a7be98c] work connection closed before response StartWorkConn message: read tcp 192.168.199.111:59690->xx.xx.xx.x:443: read: connection reset by peer

当天流量太大,网络运营商切断了链接,过一天就好了。

分布式系统讲义(一、什么是分布式系统?)

同学们大家好,今天由我来同大家一起,通过大白话的方式,聊一聊分布式系统的那些事儿。

到今天为止,分布式系统已经是一种非常基础或者说非常通用的一种技术了。在互联网应用的后端服务中,分布式技术几乎无所不在,那么到底什么是分布式系统?我们为什么要用分布式系统?它到底有哪些优势?以及我们今后工作中面临的一些问题,如何通过设计分布式系统,解决这些问题呢。围绕着这些问题,我们在这门课中展开来讨论。

回到这门课的最开始的一个问题,什么是分布式系统?在给出这个定义之前,我们先来看一下一个后端服务的演化过程,拿一个外部网站来举例,最早的时候,它只部署在一台机器上,这一台机器承受的用户的数量是很有限的,一台服务器大概只能承受住300个人同时进行访问,但是用户量会慢慢的变大,从最开始的300到后来的1000人,在到后来的几万人。中国现在大概有接近10个亿的网民,这么1个数量级的用户数,我们这么一台服务器绝对是承受不住的,这个时候应该怎么办?

一般想到的它有两种方法,我们说的第一种方法升级我们的服务器,把我们的服务器从一个性能比较差的变成一个性能比较好的,它数据的存储本来是比如说只有几百g然后把它变成几个t这么一个容量的磁盘放到这个服务器里边去,这样子也能解决问题,但是它只解决了比如说用户数从300到1000这么一个问题,但是我们的用户数如果是几个亿,那个时候怎么办?

我们会有一个第二种方法,就是用几千台机器,然后让几千台机器,然后相互协作,去满足几亿用户的这么一个数量的这么一个访问,所以这个方法基本上已经给出了一个分布式系统的一个雏形了,由此我们其实是可以引出来,那么分布式系统到底是一个什么样的定义。然后出自分布式的概念与设计这么一本书,就是国外的一个经典的用来用来介绍分布式的这么一本经典巨著。

他说分布式系统是指位于联网计算机上的组件,仅通过传递信心进行通信和协调行动的系统。同时他又给了这么一句话叫分布式系统,它是一个即便是已经崩溃了部分机器,但是它仍然能够完成工作这么一个系统。除此听到这么几个定义,大家可能还是感觉比较细。

我来给大家举一个例子,我所在的智能平台部,我所负责的系统就是一个服分布式系统效果广告的预估服务,那么这个预估服务现在有多少台机器,这个事情我给大家说一下,大概是就是说大概是有3000台左右的机器,那么我们的小广告服务大概有3000台机器这么一个数量级的,而且这3000台机器各有分工,相互协作,然后能够满足我们现在广告这么一个业务。

同时它也满足这么一个定义。如果只有一部分机器宕机,那么它仍然能够满足效果广告,预估的工作,而不至于整个服务都不可用。

今天的例子,介绍什么是分布式系统,我们就是到此为止,下节课我们会去探索分布式系统它面临哪些技术挑战。谢谢大家。

算法工程团队的测试方法总结

服务于算法的工程团队的测试需求

测试的目的是为了保证在线服务的可用性、稳定性、正确性、找到并能消除系统的性能瓶颈。

后端服务的测试一般包含下面几个方面:

  • 功能测试
  • 性能测试(压力测试,测试cpu、内存、io)
  • 稳定性测试

除此之外,服务于算法的工程团队有一种特有的测试需求,就是一致性测试,包含如下两项:

  • 特征一致性验证,为了保证在线服务要保证所使用的特征传入
  • 打分一致性验证,在线模型打分与离线打分进行对比,主要为了保证在线模型的准确性。(在其他因素都不变的情况下,通过md5验证一下模型文件也能验证模型文件的准确性)

当前团队的开发特点

  • 使用C++语言开发在线服务,少数服务由python编写
  • 网络框架和协议使用 grpc/brpc/tars+protobuf
  • 微服务化,没有测试工程师,由研发工程师自主把控软件质量
  • 算法工程师和架构工程师,彼此分工协作,架构工程师需要向算法工程师提供简单便捷的测试工具。

因为上面前两点原因,当前团队无法使用当前业界里优秀的开源测试工具或平台,比如JMeter、iago 、Gatling、Grinder、Locust,还有阿里云的性能测试PTS等。因为这些工具或平台仅适用于http协议,无法满足当前团队使用的网络框架和rpc协议。

那行业中有没有其他公司做过类似的工具呢?有的公司在这方面进行了尝试,比如美团技术团队自有一套针对thrift的压测工具,可惜并不开源,参考https://tech.meituan.com/2016/01/08/loading-test.html。

最终团队只能自己开发测试工具。

团队测试开发的几个发展阶段

团队在从0到1开发在线服务过程中的同时,也在搭建团队自己的开发测试工具。工具不停地被完善,其中过程包含了下面3个阶段。

  • 测试脚本、小工具
  • 工具升级,做出流量回放工具、面向模型服务的专用测试工具等
  • 通用的后端压力测试平台

测试脚本、小工具

团队初期是通过编写测试脚本,来构造测试用例。用随机数生成的方式或通过简单的参数样本集合构造请求。

压力测试则是通过编写小工具来进行模拟上游服务的大量请求。

脚本和工具虽然简陋,但满足了项目初期的测试需求。这种测试方法持续了比较长的时间,逐渐发现如下问题:

  • 随机数生成的参数与实际情况差异较大;
  • 随着业务复杂度的提高,请求参数越来越多,参数的组合越来越多,测试脚本变多,无法管理。
  • 自动化程度低,效率不高

流量回放工具

通过拷贝线上少部分流量,落地到文件,在有测试需求时,把文件中的请求发送给待测试的服务。

这种方式存在如下问题:

  • 自动化程度依然较低,效率不高,尤其测试样本的管理
  • 录制的流量容易过时。

专用测试工具

除了流量回放工具,团队也开发了专用的测试工具,比如面向运载算法模型的在线服务。

运载算法模型的在线服务是算法工程团队运维最多的服务,占用服务器达几千台,加载近百个版本的模型。模型频繁的迭代,需要最频繁的测试,测试最多的情况则为特征一致性测试和模型的一致性测试。

专用工具实现了白屏化、可视化,但缺少通用性。不能适用于其他模块,也难以推广给其他团队使用。

通用的压力测试平台

为了解决自动化、可视化、平台化的问题,通用的压力测试工具被提出。如何设计一套通用的压力测试工具呢?

整体流程

通用的压力测试工具的基本流程,即流量的录制和回放。

但除了基本的流量回放,需要满足下面几点。

自动化、白屏化

包含两方面:

  • 流程管理的自动化
  • 流量样本的存储自动化
  • 进程管理自动化

前端管理页面由html+css+js实现;流程、存储、进程的管理的实现由脚本语言,比如python来完成;进程的所需的资源交由K8S调度和管理。

可视化

压测结果通过图表展现,常见的指标有:

  • 最大响应时间、平均响应时间
  • PV、QPS
  • TP50、TP90、TP99
  • 成功数、失败数、成功率

一般由时序数据库和图表展示工具实现,时序数据库可以选择使用Prometheus/indexdb等,图型展示使用grafana等。

也可以使用公司自研的数据采集和展示系统。

平台化

需要满足的需求多租户和组件化。

多租户是为了让压力测试平台供多人使用,也可以做到用户间测试资源进行隔离和共享。

组件化,是为了让通用的压力测试平台更简单地支持更多c++在线服务。具体的的实现方法如下:

  • 平台定义组件的统一接口,建立调用框架。
  • 不同组件依据平台的统一接口,定义自己的接口实现,并编译成为动态链接库。
  • 平台通过加载组件的动态链接库,实现面向不同服务的流量录制与回放。

当前问题总结

专用工具和通用压力测试工具的优劣对比

多个团队各有一套测试工具,统一起来有一定难度

技术随笔

此文内容为未经整理的技术工程碎片。

分布式技术已经非常普及,但是为了提高系统的qps和并发能力,我们为什么优先挖掘机器潜力(提高硬件利用率),而不是优先扩容集群。

原因:

  • 服务器运维费用比电费贵多了。提高硬件利用率,虽然不节省电费,但是省服务器。

架构思想

  • 分层 (垂直分离)
  • 分而治之 (水平分离)
  • 动静分离、冷热分离、读写分离
  • 缓冲区
  • 扩展和复用
  • 总线思想、归一
  • 保持简单

方法论

  • 代码和配置分离

HTTPS技术简介 – 团队分享

背景

苹果曾经发布新闻,到2017年1月1日为止,IOS上所有app只能支持https链接。因此几乎所有在IOS有app和业务的公司,都赶在截止时间升级自己的app和后端系统。

我们公司的广告系统也不例外,也需要升级。正巧2016年12月29号的团队每周技术分享,轮到了我,于是把HTTPS的相关知识简单整理了一下,分享了出来。

PPT 地址如下, 可直接进行下载,无需积分。仓促之作,粗陋难免,哪怕能帮助到1个人,作者心里也是高兴的。

http://www.docin.com/p-1827559135.html

分享思路

  • 团队中大多数人对HTTPS肯定都有所了解,只是可能对HTTPS的技术细节不是很清楚。
  • 分享最开始,先抛出几个问题,吊起大家的好奇心。
  • 其次分享HTTPS安全的原因是什么?如何使用?性能如何?
  • 最后再分享HTTPS的原理,把最难学习的东西放到最后面。
  • 增多听众感性的认识,比如实际抓包演示ssl链接的建立过程。
  • HTTPS 的加密涉及到密码学的内容,尤其是中间人攻击的部分,比较烧脑。又因为分享的时间有限,只能简单提及,不能详细讲解。

分享大纲

  • 抛出几个问题,比如为什么https安全?
  • HTTPS 简介
  • HTTPS 的优点和缺点
  • HTTPS 性能
  • HTTPS 小型网站部署实践
  • HTTPS 大型网站部署实践
  • HTTPS 协议和原理 — TLS 单向认证、双向认证 — TLS 链接建立、加解密过程
  • HTTPS 相关资源分享

分享的具体内容

具体内容在PPT中。

个人对HTTPS的几点认识

HTTPS会成为以后Web传输协议的主流吗?

个人认为会的,尤其是看到苹果对https热衷,https非常可能会成为web传输协议的主流。

我们自己为什么不颁布CA证书

  • 理论上可以,但是自己颁布的证书,被浏览器视为不信任的。而现有CA证书颁布机构都被现在主流浏览器视为信任。

HTTP 升级 HTTPS 会遇到哪些问题

  • 要支持HTTPS,就要全站部署,在HTTPS链接中,任何对http资源的引用都无效,比如图片、css、js等,所以要求引用的资源也要使用https链接。
  • 待补充

结合自己亲身项目,从HTTP升级到HTTPS的过程和方法?

自己负责的项目是广告投放系统,结合自己的经历,总结以下几点注意的地方。

注意时间点

苹果曾宣布2017年1月1号为截止时间。虽然之后宣布延期,但是很多app,已经发布只支持https的新版本。

对广告投放系统来说也要提前升级。

链接的替换

  • 只能在IOS上投放的广告资源中使用https,android不需要。因为运行在android比较旧版本sdk上的app,并不支持https。
  • 链接的替换有两种情况: 1, 直接将http:// 转换为https:// ;2,对于直接转换无效的url,则需要域名映射后进行再进行转换。

后端服务器对HTTPS的支持

  • 广告投放后的打点请求,或者落地页请求,需要回到后端Server,这些后端Server也要支持https。
  • 后端不同服务之间交互可以不使用https链接。

使用Mini PC搭建个人用的NAS/服务器/离线下载

软硬件准备

硬件

  • Mini-ITX机箱
  • Mini-ITX 主板
  • 笔记本内存条 4G
  • Msata 固态硬盘 60G
  • 机械硬盘 500G
  • 拥有公网独立IP的服务器

软件

  • Windows 7
  • Ubuntu Server
  • VirtualBox
  • open-sshd
  • autossh

系统搭建

组装硬件

安装系统

Windows 7

  • 安装windows7是,出现提示框windows安装程序无法将windows配置为在此计算机的硬件上运行

不要关闭对话框,按下shift和f10键。弹出一个cmd,输入cd oobe 回车,再输入msoobe.exe回车,会弹出另一个界面,按照提示进行即可,完成后回到错误弹窗界面单击确定,系统重启。

穿透内网

SSH 反向代理

  • 建立 MiniPC 机器到 Server 的反向代理【MiniPC 机器上操作】

ssh -fCNR 10022:localhost:22 work@server.zuocheng.net

10022 为 server.zuocheng.net 机器上端口,用来与 MiniPC 机器上的22端口绑定。

  • 建立 server.zuocheng.net 机器上的正向代理,用作本地转发。做这一步是因为绑定后的 端口只支持本地访问【server.zuocheng.net 机器上操作】

ssh -fCNL "*:8022:localhost:10022' localhost

20022 为本地转发端口,用以和外网通信,并将数据转发到 10022,实现可以从其他机器访问。其中的*表示接受来自任意机器的访问。

  • 现在在 C 机器上可以通过 B 机器 ssh 到 A 机器

ssh -p 8022 work@server.zuocheng.net

SSH 反向代理经常掉线问题解决

  • Mini Server 上生成RSA公私密钥

ssh-keygen

  • 把公钥推送到 远程主机上

ssh-copy-id -i ~/.ssh/id_rsa.pub work@server.zuocheng.net

  • 创建代理通道,并且自动监控通道链接

autossh -M 20021 -NR 20022:localhost:22 work@server.zuocheng.net

  • 设置为开机启动

/bin/su -c '/usr/bin/autossh -M 20021 -NR 20022:localhost:22 work@server.zuocheng.net' - work 放入 /etc/inid.d/autossh

本博客搭建和定制方法

搭建环境

硬件

  • 阿里云服务器

软件

  • LNMP 环境(Linux + PHP + Nginx + Mysql)
  • WordPress

定制本博客的Wordpress 功能

博客主题

Twenty Eleven, 简约风格

博客文本编辑器

使用了WP-Markdown 插件,可惜不支持GitHub 扩展的特性

HTML h3 标题又小又不明显 怎么办?

在主题目录 wp-content/themes/twentyeleven/style.css 中,h3 元素样式添加 font-weight: bold;更改front-size为12px。

添加缓存,提高博客响应速度

WP Super Cache 插件

让列表页只显示文章标题,而不把文章标题页显示出来

修改主题中文件,在 content.php 中,把调用the_content函数的语句注释掉

在文章末尾添加文章签名,如果文章被别的网站扒去,也可以把来源显示出来。

修改主题中文件,content-single.php,

在content-entry 里添加如下代码

<p style="border:1px dashed white; padding:10px; margin:10px 0;line-height:26px;border-radius: 3px;" >
        <b>转载请注明来源,原地址保持永久更新。</b>
        <br /><b>博客首页:</b><a target=_blank href=//it.zuocheng.net>作程的技术博客</a>
        <br /><b>文章标题:</b><a target=_blank href=<?php the_permalink() ?>>《<?php the_title(); ?>》</a>
        <br /><b>本文链接:</b><a target=_blank href=<?php the_permalink() ?>><?php the_permalink(); ?></a>
</p>

访问 http://it.zuocheng.net/sitemap.xml 提示错误

把xml 注释去掉,修改aioseop_sitemap.php

//$this->comment_string = __( Sitemap %s generated by All in One SEO Pack %s by Michael Torbert of Semper Fi Web Design on %s, 'all_in_one_seo_pack' );

添加链接 (书签、友情链接等)

在数据库中,把wp_options.link_manager_enabled项设置为1

支持HTTPS

使用了 let’s encrypt 的证书

所使用的插件列表

  • All In One SEO Pack //用于SEO
  • Disable Google Fonts //禁止调用google字体,国内请求慢,不然会降低网站响应速度
  • Google XML Sitemaps //生成xml,SEO
  • Query Monitor //监控,一般情况下禁用
  • Table of Contents Plus //显示文章结构
  • Wordfence Security
  • WP Clean Up
  • WP Super Cache
  • WP-Markdown
  • WP-PostViews
  • WPtouch Mobile Plugin //让博客对移动端友好
  • 多说 //社会化登陆
  • 百度sitemap //百度搜索SEO
  • WP-Statistics //统计,包括来访、IP、展示数等等

更新、安装 直接下载,不使用FTP

修改wp-config.php,添加命令:

define("FS_METHOD","direct"); 
define("FS_CHMOD_DIR", 0777); 
define("FS_CHMOD_FILE", 0777); 

系统优化

使用 Unix domain socket,减小 LAMP 通信代价

Nginx 和 PHP ,PHP 和 Mysql 通信都使用Unix domain socket,并且把套接字文件放到内存文件系统/dev/shm下面

mysqld 有大量sleep进程,占用过多内存。

添加mysqld配置

[mysqld] wait_timeout=120 interactive_timeout=120

统计过滤机器人列表

服务器迁移

数据迁移

把数据表导出
[admin@src]mysqldump -uroot -password BLOG > /tmp/DB.sql
scp 到目标机 scp /tmp/DB.sql target:/tmp
在目标机导入数据库
mysql>use DB; souce /tmp/DB.sql;
配置权限
grant all privileges on DB to user@'%' identified by 'password';
grant all privileges on DB.* to user@'%' identified by 'password';
flush privileges;

BAE Website 配置 app.conf 实现单入口

        Baidu Application Engin 中搭建网站时,如果要使用MVC框架,往往需要设置单入口。然而BAE的web服务程序(apache或者lighthttp)对用户是透明的。开发者不能通过修改配置文件,也不能通过修改.htaccess文件来实现单入口。但BAE在应用的根目录提供了app.conf这个配置文件,通过修改它可以实现重写、设置缓存时间的功能。 下面的这个app.conf,将所有,除文本文件和图片、视频文件等所有请求,都重定向到index.php。 欢迎大家补充~

handlers:
expire : .jpg modify 10 years
expire : .swf modify 10 years
expire : .png modify 10 years
expire : .gif modify 10 years
expire : .JPG modify 10 years
expire : .ico modify 10 years
 url : ^(.*\.js)$
script : /$1
 url : ^(.*\.css)$
script : /$1
 url : ^(.*\.jpg)$
script : /$1
 url : ^(.*\.gif)$
script : /$1
 url : ^(.*\.jpeg)$
script : /$1
 url : ^(.*\.png)$
script : /$1
 url : ^(.*\.bmp)$
script : /$1
 url : ^(.*\.swf)$
script : /$1
 url : ^(.*\.ico)$
script : /$1
 url : ^(.*\.JPG)$
script : /$1
 url : ^(.*\.txt)$
script : /$1
 url : ^(.*)$
script : /index.php