民工哥

民工哥 查看完整档案

其它编辑  |  填写毕业院校不知名互联网企业  |  不知名程序员 编辑 github.com/mingongge 编辑
编辑

民工哥,10多年职场老司机的经验分享,坚持自学一路从技术小白成长为互联网企业信息技术部门的负责人。

我的新书:《Linux系统运维指南》

微信公众号:民工哥技术之路

民工哥:知乎专栏

欢迎关注,我们一同交流,相互学习,共同成长!!

个人动态

民工哥 发布了文章 · 1月25日

配置 Linux 的时钟同步

图片

前言

Ubuntu系统默认的时钟同步服务器是ntp.ubuntu.com,Debian则是0.debian.pool.ntp.org等, 各Linux发行版都有自己的NTP官方服务器。身在中国,使用这些都会有高延迟,但对时钟同步这件事来说影响不大。

在某些环境下,比如公司内网、云上子网等,是与互联网隔绝的。这时要想做时钟同步,就只能自己配置了。

本文介绍如何自己配置时钟同步,不介绍如何自建NTP服务器。

安装

一般timesync是预装的。如果没有,可以使用以下命令手动安装。

sudo apt install systemd-timesyncd 
#它和ntp是冲突的,二者只能安装一个。

配置

修改/etc/systemd/timesyncd.conf,把NTP设为华为内绿区可达的NTP服务器。

[Time]
NTP=ntp7.aliyun.com
NTP=ntp6.aliyun.com

修改完成后,需要restart后这个配置才生效。

sudo systemctl restart systemd-timesyncd.service

如果以上systemd-timesyncd.service因为什么原因而不存在,则可通过以下命令修复:

sudo dpkg-reconfigure systemd-timesyncd

查看效果

一般查看日期与时间是使用date。使用timedatectl可以查看到更多时钟同步相关信息。

$ timedatectl status
               Local time: 二 2020-09-22 20:06:05 CST
           Universal time: 二 2020-09-22 12:06:05 UTC
                 RTC time: 二 2020-09-22 12:06:05
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

国内NTP服务器列表

以下给出一些阿里云的NTP列表,可以通过ping择优使用。

ntp1.aliyun.com
ntp2.aliyun.com
ntp3.aliyun.com
ntp4.aliyun.com
ntp5.aliyun.com
ntp6.aliyun.com
ntp7.aliyun.com
来源:https://note.qidong.name/2020...

image

查看原文

赞 0 收藏 0 评论 0

民工哥 发布了文章 · 1月25日

每天学一个 Linux 命令(28):ln

图片

昨日推荐:每天学一个 Linux 命令(27):head

命令简介

ln 命令用于创建(软/硬)链接文件。

在linux系统中,有两种链接类型:硬链接与软件,默认创建的就是硬链接,创建软链接需要-s选项来配合完成。

硬链接文件是指通过索引节点来进行链接,在Linux系统中多个文件同时指向同一个索引节点,这种情况下的文件被称为硬链接文件。

软链接文件也称做符号链接(同Windows系统中快捷方式)。实际上它是一个文本文件,文本文件里存储着指向源文件链接的位置信息。

命令格式

ln [选项] [链接文件名]
ln [OPTION] [LINKNAME]

选项说明

-b #创建备份文件
-f #强行删除任何已存在的目标文件
-i #覆盖现有文件前先询问用户
-s #给一个文件创建软链接
-v #打印每个链接文件的名称
--help     #打印帮助信息后退出
--version  #打印版本信息后退出

应用举例

#在当前目录中创建硬链接
[root@centos7 testdir]# ln test2.txt test3
[root@centos7 testdir]# ls -li test*
50342754 -rw-r--r-- 2 root root 6 Jan 16 02:47 test2.txt
50342754 -rw-r--r-- 2 root root 6 Jan 16 02:47 test3
#从结果可以看出硬链接文件与源文件的inode号一样
#在当前目录中创建软链接
[root@centos7 testdir]# ln -s test2.txt test4
[root@centos7 testdir]# ls -li test*
50342754 -rw-r--r-- 2 root root 6 Jan 16 02:47 test2.txt
50342754 -rw-r--r-- 2 root root 6 Jan 16 02:47 test3
50342753 lrwxrwxrwx 1 root root 9 Jan 16 03:57 test4 -> test2.txt
#从结果可以看出,软链接与源文件的inode号不一样
#创建源文件test2.txt的软件链接文件名为test3,如果test3存,则将其改名为test3~
[root@centos7 testdir]# ln -s -b test2.txt test3
[root@centos7 testdir]# ls -li test*
50342754 -rw-r--r-- 2 root root 6 Jan 16 02:47 test2.txt
50342767 lrwxrwxrwx 1 root root 9 Jan 16 04:06 test3 -> test2.txt
50342754 -rw-r--r-- 2 root root 6 Jan 16 02:47 test3~
50342753 lrwxrwxrwx 1 root root 9 Jan 16 03:57 test4 -> test2.txt

基础入门必备命令之一,非常简单易学,掌握这些就够了。

每天学一个 Linux 命令(25):more

每天学一个 Linux 命令(26):less

查看原文

赞 2 收藏 1 评论 0

民工哥 发布了文章 · 1月24日

高性能 Nginx HTTPS 调优!为 HTTPS 提速 30%

图片

为什么要优化 Ngin HTTPS 延迟

Nginx 常作为最常见的服务器,常被用作负载均衡 (Load Balancer)、反向代理 (Reverse Proxy),以及网关 (Gateway) 等等。一个配置得当的 Nginx 服务器单机应该可以期望承受住 50K 到 80K 左右每秒的请求,同时将 CPU 负载在可控范围内。

但在很多时候,负载并不是需要首要优化的重点。比如对于卡拉搜索来说,我们希望用户在每次击键的时候,可以体验即时搜索的感觉,也就是说,每个搜索请求必须在 100ms - 200ms 的时间内端对端地返回给用户,才能让用户搜索时没有“卡顿”和“加载”。因此,对于我们来说,优化请求延迟才是最重要的优化方向。

这篇文章中,我们先介绍 Nginx 中的 TLS 设置有哪些与请求延迟可能相关,如何调整才能最大化加速。然后我们用优化卡拉搜索Nginx 服务器的实例来分享如何调整 Nginx TLS/SSL 设置,为首次搜索的用户提速 30% 左右。我们会详细讨论每一步我们做了一些什么优化,优化的动机和效果。希望可以对其它遇到类似问题的同学提供帮助。

TLS 握手和延迟

很多时候开发者会认为:如果不是绝对在意性能,那么了解底层和更细节的优化没有必要。这句话在很多时候是恰当的,因为很多时候复杂的底层逻辑必须包起来,才能让更高层的应用开发复杂度可控。比如说,如果你就只需要开发一个 APP 或者网站,可能并没有必要关注汇编细节,关注编译器如何优化你的代码——毕竟在苹果或者安卓上很多优化在底层就做好了。

那么,了解底层的 TLS 和应用层的 Nginx 延迟优化有什么关系呢?

答案是多数情况下,优化网络延迟其实是在尝试减少用户和服务器之间的数据传输次数,也就是所谓的 roundtrip。由于物理限制,北京到云南的光速传播差不多就是要跑 20 来毫秒,如果你不小心让数据必须多次往返于北京和云南之间,那么必然延迟就上去了。

因此如果你需要优化请求延迟,那么了解一点底层网络的上下文则会大有裨益,很多时候甚至是你是否可以轻松理解一个优化的关键。本文中我们不深入讨论太多 TCP 或者 TLS 机制的细节,如果有兴趣的话请参考 High Performance Browser Networking[4] 一书,可以免费阅读。

举个例子,下图中展示了如果你的服务启用了 HTTPS,在开始传输任何数据之前的数据传输情况。

图片

可以看到,在你的用户拿到他需要的数据前,底层的数据包就已经在用户和你的服务器之间跑了 3 个来回。

假设每次来回需要 28 毫秒的话,用户已经等了 224 毫秒之后才开始接收数据。

同时这个 28 毫秒其实是非常乐观的假设,在国内电信、联通和移动以及各种复杂的网络状况下,用户与服务器之间的延迟更不可控。另一方面,通常一个网页需要数十个请求,这些请求不一定可以全部并行,因此几十乘以 224 毫秒,页面打开可能就是数秒之后了。

所以,原则上如果可能的话,我们需要尽量减少用户和服务器之间的往返程 (roundtrip),在下文的设置中,对于每个设置我们会讨论为什么这个设置有可能帮助减少往返程。

Nginx 中的 TLS 设置

那么在 Nginx 设置中,怎样调整参数会减少延迟呢?

开启 HTTP/2

HTTP/2 标准是从 Google 的 SPDY 上进行的改进,比起 HTTP 1.1 提升了不少性能,尤其是需要并行多个请求的时候可以显着减少延迟。在现在的网络上,一个网页平均需要请求几十次,而在 HTTP 1.1 时代浏览器能做的就是多开几个连接(通常是 6 个)进行并行请求,而 HTTP 2 中可以在一个连接中进行并行请求。HTTP 2 原生支持多个并行请求,因此大大减少了顺序执行的请求的往返程,可以首要考虑开启。

如果你想自己看一下 HTTP 1.1 和 HTTP 2.0 的速度差异,可以试一下:https://www.httpvshttps.com/。我的网络测试下来 HTTP/2 比 HTTP 1.1 快了 66%。

image.png

在 Nginx 中开启 HTTP 2.0 非常简单,只需要增加一个 http2 标志即可

listen 443 ssl;
# 改为
listen 443 ssl http2;

如果你担心你的用户用的是旧的客户端,比如 Python 的 requests,暂时还不支持 HTTP 2 的话,那么其实不用担心。如果用户的客户端不支持 HTTP 2,那么连接会自动降级为 HTTP 1.1,保持了后向兼容。因此,所有使用旧 Client 的用户,仍然不受影响,而新的客户端则可以享受 HTTP/2 的新特性。

如何确认你的网站或者 API 开启了 HTTP 2

在 Chrome 中打开开发者工具,点开 Protocol 之后在所有的请求中都可以看到请求用的协议了。如果 protocol 这列的值是 h2 的话,那么用的就是 HTTP 2 了

图片

当然另一个办法是直接用 curl 如果返回的 status 前有 HTTP/2 的话自然也就是 HTTP/2 开启了。

➜  ~ curl --http2 -I https://kalasearch.cn
HTTP/2 403
server: Tengine
content-type: application/xml
content-length: 264
date: Tue, 22 Dec 2020 18:38:46 GMT
x-oss-request-id: 5FE23D363ADDB93430197043
x-oss-cdn-auth: success
x-oss-server-time: 0
x-alicdn-da-ups-status: endOs,0,403
via: cache13.l2et2[148,0], cache10.l2ot7[291,0], cache4.us13[360,0]
timing-allow-origin: *
eagleid: 2ff6169816086623266688093e

调整 Cipher 优先级

尽量挑选更新更快的 Cipher,有助于减少延迟:

# 手动启用 cipher 列表
ssl_prefer_server_ciphers on;  # prefer a list of ciphers to prevent old and slow ciphers
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

启用 OCSP Stapling

在国内这可能是对使用 Let's Encrypt 证书的服务或网站影响最大的延迟优化了。如果不启用 OCSP Stapling 的话,在用户连接你的服务器的时候,有时候需要去验证证书。而因为一些不可知的原因(这个就不说穿了)Let's Encrypt 的验证服务器并不是非常通畅,因此可以造成有时候数秒甚至十几秒延迟的问题,这个问题在 iOS 设备上特别严重

解决这个问题的方法有两个:

  • 不使用 Let's Encrypt,可以尝试替换为阿里云提供的免费 DV 证书
  • 开启 OCSP Stapling

开启了 OCSP Stapling 的话,跑到证书验证这一步可以省略掉。省掉一个 roundtrip,特别是网络状况不可控的 roundtrip,可能可以将你的延迟大大减少。

在 Nginx 中启用 OCSP Stapling 也非常简单,只需要设置:

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/full_chain.pem;

如何检测 OCSP Stapling 是否已经开启?

可以通过以下命令

openssl s_client -connect test.kalasearch.cn:443 -servername kalasearch.cn -status -tlsextdebug < /dev/null 2>&1 | grep -i "OCSP response"

来测试。如果结果为

OCSP response:
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response

则表明已经开启。

调整 ssl_buffer_size

ssl_buffer_size 控制在发送数据时的 buffer 大小,默认设置是 16k。这个值越小,则延迟越小,而添加的报头之类会使 overhead 会变大,反之则延迟越大,overhead 越小。

因此如果你的服务是 REST API或者网站的话,将这个值调小可以减小延迟和 TTFB,但如果你的服务器是用来传输大文件的,那么可以维持 16k。

如果是网站或者 REST API,建议值为 4k,但是这个值的最佳取值显然会因为数据的不同而不一样,因此请尝试 2 - 16k 间不同的值。在 Nginx 中调整这个值也非常容易

ssl_buffer_size 4k;

启用 SSL Session 缓存

启用 SSL Session 缓存可以大大减少 TLS 的反复验证,减少 TLS 握手的 roundtrip。虽然 session 缓存会占用一定内存,但是用 1M 的内存就可以缓存 4000 个连接,可以说是非常非常划算的。同时,对于绝大多数网站和服务,要达到 4000 个同时连接本身就需要非常非常大的用户基数,因此可以放心开启。

#这里 ssl_session_cache 设置为使用 50M 内存,以及 4 小时的连接超时关闭时间 ssl_session_timeout
# Enable SSL cache to speed up for return visitors
ssl_session_cache   shared:SSL:50m; # speed up first time. 1m ~= 4000 connections
ssl_session_timeout 4h;

卡拉搜索如何减少 30% 的请求延迟

卡拉搜索是国内的 Algolia,致力于帮助开发者快速搭建即时搜索功能(instant search),做国内最快最易用的搜索即服务。

开发者接入后,所有搜索请求通过卡拉 API 即可直接返回给终端用户。为了让用户有即时搜索的体验,我们需要在用户每次击键后极短的时间内(通常是 100ms 到 200ms)将结果返回给用户。因此每次搜索需要可以达到 50 毫秒以内的引擎处理时间和 200 毫秒以内的端对端时间。

我们用豆瓣电影的数据做了一个电影搜索的 Demo,如果感兴趣的话欢迎体验一下即时搜索,尝试一下搜索“无间道”或者“大话西游”体验一下速度和相关度:https://movies-demo.kalasearc...

对于每个请求只有 100 到 200 毫秒的延迟预算,我们必须把每一步的延迟都考虑在内。

简化一下,每个搜索请求需要经历的延迟有

图片

总延迟 = 用户请求到达服务器(T1) + 反代处理(Nginx T2) + 数据中心延迟(T3) + 服务器处理 (卡拉引擎 T4) + 用户请求返回(T3+T1)

在上述延迟中,T1 只与用户与服务器的物理距离相关,而 T3 非常小可以忽略不计。

所以我们能控制的大致只有 T2 和 T4,即 Nginx 服务器的处理时间和卡拉的引擎处理时间。

Nginx 在这里作为反向代理,处理一些安全、流量控制和 TLS 的逻辑,而卡拉的引擎则是一个在 Lucene 基础上的倒排引擎。

我们首先考虑的第一个可能性是:延迟是不是来自卡拉引擎呢?

在下图展示的 Grafana 仪表盘中,我们看到除了几个时不时的慢查询,搜索的 95% 服务器处理延迟小于 20 毫秒。对比同样的数据集上 benchmark 的 Elastic Search 引擎的 P95 搜索延迟则在 200 毫秒左右,所以排除了引擎速度慢的可能。

image.png

而在阿里云监控中,我们设置了从全国各地向卡拉服务器发送搜索请求。我们终于发现 SSL 处理时间时常会超过 300 毫秒,也就是说在 T2 这一步,光处理 TLS 握手之类的事情,Nginx 已经用掉了我们所有的请求时间预算。

同时检查之后我们发现,在苹果设备上搜索速度格外慢,特别是第一次访问的设备。因此我们大致判断应该是因为我们使用的 Let's Encrypt 证书的问题。

我们按照上文中的步骤对 Nginx 设置进行了调整,并将步骤总结出来写了这篇文章。在调整了 Nginx TLS 的设置后,SSL 时间从平均的 140ms 降低到了 110ms 左右(全国所有省份联通和移动测试点),同时苹果设备上首次访问慢的问题也消失了。

图片

在调整过后,全国范围内测试的搜索延迟降低到了 150 毫秒左右。

总结

调整 Nginx 中的 TLS 设置对于使用 HTTPS 的服务和网站延迟有非常大的影响。本文中总结了 Nginx 中与 TLS 相关的设置,详细讨论各个设置可能对延迟的影响,并给出了调整建议。

来源:https://kalasearch.cn/blog/hi...

image

查看原文

赞 17 收藏 10 评论 1

民工哥 发布了文章 · 1月24日

再见 CentOS! Rocky Linux 要来了

图片

大家都知道,在前不久官方宣布:CentOS 已死!"免费"的 RHEL 没了...,消息称:Centos 8将于2021年结束。说明在这之后不会出现CentOS 9系统了,取而代之是CentOS Stream这个叫滚动发行版本,至此 Centos 8 可能是 CentOS 中的最短命版本。

但是,此消息一出,多数人表示对这个 CentOS Stream 系统并不感兴趣,大多数用户对红帽官方的这个决定,都表现出了强烈不满。

随后,CentOS 的创始人 Gregory Kurtzer 宣布,其创建的 CentOS Linux 的替代产品 Rocky Linux 将于 2021 年第二季度发布。

图片

Rocky Linux 项目刚刚创建 Star 数就已经突破 2000+。Gregory M. Kurtzer 在新项目中写道:“Rocky Linux 是一个社区企业操作系统,该操作系统与 Red Hat Enterprise Linux 100% 兼容。”

日前,Rocky Linux 官方网站发布了相关的更新消息,预计 Rocky Linux 首个 RC 版本将于2021年3月底发布:

图片

官方地址:https://rockylinux.org/posts/...

目前 Rocky Linux 大部分工作都放在了构建基础架构方面。此外,还有新成立的 Rocky Linux 基金会所涉及的各种管理任务,能够接受赞助/捐赠等。在设定今年第 2 季度目标之后,团队计划在本月底完成系统和基础设施的构建工作,在 2 月底前建立测试仓库,同时开始测试他们的安装程序;在 3 月底发布候选版本,并推进更广泛的社区测试。

图片

也有不少的开源爱好者表示有兴趣为 Rocky Linux 的开发做出贡献,相信不久将来等 Rocky Linux 系统真正面世之时,应该来说肯定也不会亚于目前大家在用的 CentOS 系统。

所以,如果你目前对于 CentOS 8 停止更新之后不知如何选择?或者说你也正在苦于寻找一种可替代的方案,那么, Rocky Linux 肯定是一个非常不错的选择。

image

查看原文

赞 0 收藏 0 评论 0

民工哥 发布了文章 · 1月24日

每天学一个 Linux 命令(27):head

图片

昨日推荐:每天学一个 Linux 命令(26):less

命令简介

head 显示文件内容的头部。在系统默认情况下,head 命令只显示文件的头10 行内容。

命令格式

head [选项] [文件名]
head [OPTION] [FILE]

选项说明

-n<数字>  #按指定行数显示(从文件开头位置计算)
-c<字符数>  #按指定的字符数显示(从文件的第一个字符开始计算)
-v  #显示文件名信息
-q  #不显示文件名信息
--help     #打印帮助信息后退出
--version  #打印版本信息后退出

应用举例

#显示文件mingongge.txt前150行内容(如果没有其它参数,可以不需要-n)
head -150 mingongge.txt 
#显示文件mingongge1.txt 和mingongge2.txt的前100行内容
head -100 mingongge1.txt mingongge2.txt
 
[root@centos7 testdir]# head -100 mingongge1.txt mingongge2.txt
==> mingongge1.txt <==
11111111111111111111
22222222222222222222222
33333333333333333333333333
444444444444444444444444
....
==> mingongge2.txt <==
head1
head2
head3
head4
....
#注意:默认情况,一次显示多个文件的话,默认是显示文件名信息的,可以不加-v参数。
[root@centos7 testdir]# head -q -n 3 mingongge1.txt mingongge2.txt
11111111111111111111
22222222222222222222222
33333333333333333333333333
head1
head2
head3

常用的用法基本就这些,与moreless命令一样,都属于比较常用且简单的命令。

每天学一个 Linux 命令(24):chattr/lsattr

每天学一个 Linux 命令(25):more

查看原文

赞 0 收藏 0 评论 0

民工哥 发布了文章 · 1月22日

Linux 的安全合规性检查和加固

图片

本文旨在指导系统管理人员或安全检查人员进行Linux操作系统的安全合规性检查和加固。14个Linux系统安全小妙招,总有一招用的上!

1. 账号和口令

1.1 禁用或删除无用账号

减少系统无用账号,降低安全风险。

操作步骤

  • 使用命令 userdel <用户名> 删除不必要的账号。
  • 使用命令 passwd -l <用户名> 锁定不必要的账号。
  • 使用命令 passwd -u <用户名> 解锁必要的账号。

1.2 检查特殊账号

检查是否存在空口令和root权限的账号。

操作步骤

  1. 查看空口令和root权限账号,确认是否存在异常账号:
  • 使用命令 awk -F: '($2=="")' /etc/shadow 查看空口令账号。
  • 使用命令 awk -F: '($3==0)' /etc/passwd 查看UID为零的账号。
  1. 加固空口令账号:
  • 使用命令 passwd <用户名> 为空口令账号设定密码。
  • 确认UID为零的账号只有root账号。

1.3 添加口令策略

加强口令的复杂度等,降低被猜解的可能性。

操作步骤

  1. 使用命令 vi /etc/login.defs 修改配置文件。
  • PASS_MAX_DAYS 90 #新建用户的密码最长使用天数
  • PASS_MIN_DAYS 0 #新建用户的密码最短使用天数
  • PASS_WARN_AGE 7 #新建用户的密码到期提前提醒天数
  1. 使用chage命令修改用户设置。
    例如,chage -m 0 -M 30 -E 2000-01-01 -W 7 <用户名>表示将此用户的密码最长使用天数设为30,最短使用天数设为0,密码2000年1月1日过期,过期前七天警告用户。
  2. 设置连续输错三次密码,账号锁定五分钟。使用命令 vi /etc/pam.d/common-auth修改配置文件,在配置文件中添加 auth required pam_tally.so onerr=fail deny=3 unlock_time=300

1.4 限制用户su

限制能su到root的用户。

操作步骤

使用命令 vi /etc/pam.d/su修改配置文件,在配置文件中添加行。例如,只允许test组用户su到root,则添加 auth required pam_wheel.so group=test

1.5 禁止root用户直接登录

限制root用户直接登录。

操作步骤

  1. 创建普通权限账号并配置密码,防止无法远程登录;
  2. 使用命令 vi /etc/ssh/sshd_config修改配置文件将PermitRootLogin的值改成no,并保存,然后使用service sshd restart重启服务。

2. 服务

2.1 关闭不必要的服务

关闭不必要的服务(如普通服务和xinetd服务),降低风险。

操作步骤

使用命令systemctl disable <服务名>设置服务在开机时不自动启动。

说明:对于部分老版本的Linux操作系统(如CentOS 6),可以使用命令chkconfig --level <init级别> <服务名> off设置服务在指定init级别下开机时不自动启动。

2.2 SSH服务安全

对SSH服务进行安全加固,防止暴力破解成功。

操作步骤

使用命令 vim /etc/ssh/sshd_config 编辑配置文件。

  • 不允许root账号直接登录系统。
    设置 PermitRootLogin 的值为 no。
  • 修改SSH使用的协议版本。
    设置 Protocol 的版本为 2。
  • 修改允许密码错误次数(默认6次)。
    设置 MaxAuthTries 的值为 3。

配置文件修改完成后,重启sshd服务生效。

3. 文件系统

3.1 设置umask值

设置默认的umask值,增强安全性。

操作步骤

使用命令 vi /etc/profile 修改配置文件,添加行 umask 027, 即新创建的文件属主拥有读写执行权限,同组用户拥有读和执行权限,其他用户无权限。

3.2 设置登录超时

设置系统登录后,连接超时时间,增强安全性。

操作步骤

使用命令 vi /etc/profile 修改配置文件,将以 TMOUT= 开头的行注释,设置为TMOUT=180,即超时时间为三分钟。

4. 日志

4.1 syslogd日志

启用日志功能,并配置日志记录。

操作步骤

Linux系统默认启用以下类型日志:

  • 系统日志(默认)/var/log/messages
  • cron日志(默认)/var/log/cron
  • 安全日志(默认)/var/log/secure

注意:部分系统可能使用syslog-ng日志,配置文件为:/etc/syslog-ng/syslog-ng.conf。

您可以根据需求配置详细日志。

4.2 记录所有用户的登录和操作日志

通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查。

操作步骤

1.打开配置文件

[root@xxx /]# vim /etc/profile

2.在配置文件中输入以下内容:

history
USER=`whoami`
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]; then
USER_IP=`hostname`
fi
if [ ! -d /var/log/history ]; then
mkdir /var/log/history
chmod 777 /var/log/history
fi
if [ ! -d /var/log/history/${LOGNAME} ]; then
mkdir /var/log/history/${LOGNAME}
chmod 300 /var/log/history/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date +"%Y%m%d_%H:%M:%S"`
export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT"
chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null
  1. 运行加载配置生效。
[root@xxx /]# source /etc/profile

注意:/var/log/history 是记录日志的存放位置,可以自定义。

通过上述步骤,可以在 /var/log/history 目录下以每个用户为名新建一个文件夹,每次用户退出后都会产生以用户名、登录IP、时间的日志文件,包含此用户本次的所有操作(root用户除外)。

作者:William92
链接:https://www.jianshu.com/p/7f6...

image

查看原文

赞 2 收藏 0 评论 0

民工哥 发布了文章 · 1月22日

每天学一个 Linux 命令(25):more

图片

昨日推荐:每天学一个 Linux 命令(24):chattr/lsattr

命令简介

more 分页显示文件内容。

以全屏的方式来显示文件的内容,每次显示一页,可按键向下翻页。more 命令中自带了很多快捷键,H(获得帮助信息),Enter(向下翻一行),空格(向下滚一屏),Q(退出)。

当你打开一个文件时,可以使用下面的快捷键进行相关的操作:

Space(空格)键  #向下翻动一页
Enter(回车)键  #显示文本的下一行
 |    #输入一个模式,可以在当前文本内容查找一个相匹配的模式
H 键  #显示帮助信息
B 键  #向上翻一页
Q 键  #退出

命令格式

more [选项] [文件名]
more [option] [file ...]

选项说明

-<数字>  #指定每页显示的行数
-c  #不进行滚屏操作
-s  #将多个空行压缩成一行显示
-u  #去除下划线
+<数字>  #从指定的行开始显示

应用举例

#查看文件mingongge的内容,在显示之前先清屏并且显示当前页数的百分比
more -dc mingongge
#显示文件mingongge的内容,每100行显示一次,显示之前清屏
more -c -100 mingongge
#从第十行开始显示mingongge.txt文件内容
more +10 mingongge.txt
#从包含字符串 "mingonggee" 行开始显示mingongge.txt文件内容
more +/"mingonggee" mingonggee.txt
#用ls打印当前目录列表,配合more分页显示
ls | more

常用的用法基本就这些,也属于比较常用且简单的命令。

每天学一个 Linux 命令(22):pwd

每天学一个 Linux 命令(23):file

查看原文

赞 1 收藏 0 评论 0

民工哥 发布了文章 · 1月21日

ELK Stack 日志平台性能优化实践

性能分析

  • 服务器硬件Linux:1cpu4GRAM
  • 假设每条日志250Byte。

分析:

①logstash-Linux:1cpu 4GRAM

  • 每秒500条日志;
  • 去掉ruby每秒660条日志;
  • 去掉grok后每秒1000条数据。

②filebeat-Linux:1cpu 4GRAM

  • 每秒2500-3500条数据;
  • 每天每台机器可处理:
24h*60min*60sec* 3000*250Byte=64,800,000,000Bytes,约64G。

③瓶颈在logstash从Redis中取数据存入ES,开启一个logstash,每秒约处理6000条数据;开启两个logstash,每秒约处理10000条数据(cpu已基本跑满);

④logstash的启动过程占用大量系统资源,因为脚本中要检查java、ruby以及其他环境变量,启动后资源占用会恢复到正常状态。

2、关于收集日志的选择:logstash/filter

没有原则要求使用filebeat或logstash,两者作为shipper的功能是一样的。区别在于:

  • logstash由于集成了众多插件,如grok、ruby,所以相比beat是重量级的;
  • logstash启动后占用资源更多,如果硬件资源足够则无需考虑二者差异;
  • logstash基于JVM,支持跨平台;而beat使用golang编写,AIX不支持;
  • AIX 64bit平台上需要安装jdk(jre) 1.7 32bit,64bit的不支持;
  • filebeat可以直接输入到ES,但是系统中存在logstash直接输入到ES的情况,这将造成不同的索引类型造成检索复杂,最好统一输入到els 的源。

总结:logstash/filter总之各有千秋,但是我推荐选择:在每个需要收集的日志服务器上配置filebeat,因为轻量级,用于收集日志;再统一输出给logstash,做对日志的处理;最后统一由logstash输出给es。

3、logstash的优化相关配置

可以优化的参数,可根据自己的硬件进行优化配置:

①pipeline线程数,官方建议是等于CPU内核数

  • 默认配置 ---> pipeline.workers: 2;
  • 可优化为 ---> pipeline.workers: CPU内核数(或几倍CPU内核数)。

②实际output时的线程数

  • 默认配置 ---> pipeline.output.workers: 1;
  • 可优化为 ---> pipeline.output.workers: 不超过pipeline线程数。

③每次发送的事件数

  • 默认配置 ---> pipeline.batch.size: 125;
  • 可优化为 ---> pipeline.batch.size: 1000。

④发送延时

  • 默认配置 ---> pipeline.batch.delay: 5;
  • 可优化为 ---> pipeline.batch.size: 10。

总结:

  • 通过设置-w参数指定pipeline worker数量,也可直接修改配置文件logstash.yml。这会提高filter和output的线程数,如果需要的话,将其设置为cpu核心数的几倍是安全的,线程在I/O上是空闲的。
  • 默认每个输出在一个pipeline worker线程上活动,可以在输出output中设置workers设置,不要将该值设置大于pipeline worker数。
  • 还可以设置输出的batch_size数,例如ES输出与batch size一致。
  • filter设置multiline后,pipline worker会自动将为1,如果使用filebeat,建议在beat中就使用multiline,如果使用logstash作为shipper,建议在input中设置multiline,不要在filter中设置multiline。

Logstash中的JVM配置文件:

Logstash是一个基于Java开发的程序,需要运行在JVM中,可以通过配置jvm.options来针对JVM进行设定。比如内存的最大最小、垃圾清理机制等等。JVM的内存分配不能太大不能太小,太大会拖慢操作系统。太小导致无法启动。默认如下:

  • Xms256m#最小使用内存;
  • Xmx1g#最大使用内存。

4、引入Redis的相关问题

filebeat可以直接输入到logstash(indexer),但logstash没有存储功能,如果需要重启需要先停所有连入的beat,再停logstash,造成运维麻烦;另外如果logstash发生异常则会丢失数据;引入Redis作为数据缓冲池,当logstash异常停止后可以从Redis的客户端看到数据缓存在Redis中;

Redis可以使用list(最长支持4,294,967,295条)或发布订阅存储模式;

Redis做ELK缓冲队列的优化:

  • bind 0.0.0.0 #不要监听本地端口;
  • requirepass ilinux.io #加密码,为了安全运行;
  • 只做队列,没必要持久存储,把所有持久化功能关掉:
  • 快照(RDB文件)和追加式文件(AOF文件),性能更好;
  • save "" 禁用快照;
  • appendonly no 关闭RDB。
  • 把内存的淘汰策略关掉,把内存空间最大
maxmemory 0 #maxmemory为0的时候表示我们对Redis的内存使用没有限制。

5、Elasticsearch节点优化配置

服务器硬件配置,OS参数:

1)/etc/sysctl.conf 配置

# vim /etc/sysctl.conf
vm.swappiness = 1   #ES 推荐将此参数设置为 1,大幅降低 swap 分区的大小,强制最大程度的使用内存,注意,这里不要设置为 0, 这会很可能会造成 OOM
net.core.somaxconn = 65535     #定义了每个端口最大的监听队列的长度
vm.max_map_count= 262144    #限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。当VMA 的数量超过这个值,OOM
fs.file-max = 518144    #设置 Linux 内核分配的文件句柄的最大数量
# sysctl -p    #生效一下

2)limits.conf 配置

# vim /etc/security/limits.conf
elasticsearch    soft    nofile          65535
elasticsearch    hard    nofile          65535
elasticsearch    soft    memlock         unlimited
elasticsearch    hard    memlock         unlimited

3)为了使以上参数永久生效,还要设置两个地方:

# vim /etc/pam.d/common-session-noninteractive
# vim /etc/pam.d/common-session
添加如下属性:
session required pam_limits.so

可能需重启后生效。

Elasticsearch中的JVM配置文件:

-Xms2g
-Xmx2g
  • 将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等。
  • Elasticsearch可用的堆越多,可用于缓存的内存就越多。但请注意,太多的堆可能会使您长时间垃圾收集暂停。
  • 设置Xmx为不超过物理RAM的50%,以确保有足够的物理内存留给内核文件系统缓存。
  • 不要设置Xmx为JVM用于压缩对象指针的临界值以上;确切的截止值有所不同,但接近32 GB。不要超过32G,如果空间大,多跑几个实例,不要让一个实例太大内存。

Elasticsearch配置文件优化参数

1)主配置文件

# vim elasticsearch.yml
bootstrap.memory_lock: true  #锁住内存,不使用swap
#缓存、线程等优化如下
bootstrap.mlockall: true
transport.tcp.compress: true
indices.fielddata.cache.size: 40%
indices.cache.filter.size: 30%
indices.cache.filter.terms.size: 1024mb
threadpool:
    search:
        type: cached
        size: 100
        queue_size: 2000

2)设置环境变量

# vim /etc/profile.d/elasticsearch.sh 
export ES_HE AP _SIZE=2g #Heap Size不超过物理内存的一半,且小于32G。

集群的优化(我未使用集群):

  • ES是分布式存储,当设置同样的cluster.name后会自动发现并加入集群;
  • 集群会自动选举一个master,当master宕机后重新选举;
  • 为防止"脑裂",集群中个数最好为奇数个;
  • 为有效管理节点,可关闭广播discovery. zen.ping.multicast.enabled: false,并设置单播节点组discovery.zen.ping.unicast.hosts: ["ip1", "ip2", "ip3"]。

6、性能的检查

检查输入和输出的性能:Logstash和其连接的服务运行速度一致,它可以和输入、输出的速度一样快。

检查系统参数:

  • 1)CPU
  • 注意CPU是否过载。在Linux/Unix系统中可以使用top-H查看进程参数以及总计。
  • 如果CPU使用过高,直接跳到检查JVM堆的章节并检查Logstash worker设置。
  • 2)Memory
  • 注意Logstash是运行在Java虚拟机中的,所以它只会用到你分配给它的最大内存。
  • 检查其他应用使用大量内存的情况,这将造成Logstash使用硬盘swap,这种情况会在应用占用内存超出物理内存范围时。
  • 3)I/O监控磁盘I/O检查磁盘饱和度
  • 使用Logstash plugin(例如使用文件输出)磁盘会发生饱和。
  • 当发生大量错误,Logstash生成大量错误日志时磁盘也会发生饱和。
  • 在Linux中,可使用iostat,dstat或者其他命令监控磁盘I/O。
  • 4)监控网络I/O
  • 当使用大量网络操作的input、output时,会导致网络饱和。
  • 在Linux中可使用dstat或iftop监控网络情况。

检查JVM heap:

  • heap设置太小会导致CPU使用率过高,这是因为JVM的垃圾回收机制导致的。
  • 一个快速检查该设置的方法是将heap设置为两倍大小然后检测性能改进。不要将heap设置超过物理内存大小,保留至少1G内存给操作系统和其他进程。
  • 你可以使用类似jmap命令行或VisualVM更加精确的计算JVM heap。
来源:https://www.cnblogs.com/along...

image

查看原文

赞 2 收藏 2 评论 0

民工哥 发布了文章 · 1月21日

企业级监控工具应用实战-zabbix操作进阶

一、User parameters 用户参数

1、介绍和用法

① 介绍

自定义用户参数,也就是自定义key

有时,你可能想要运行一个代理检查,而不是Zabbix的预定义

你可以编写一个命令检索需要的数据,并将其包含在代理配置文件("UserParameter"配置参数)的用户参数

② 用法格式 syntax

UserParameter=<key>,<command>
  A user parameter also contains a key  一个用户参数也包含一个键
  The key will be necessary when configuring an item   在配置监控项时,key是必需的
  Note: Need to restart the agent   注意:需要重新启动agent 服务

2、用法展示

(1)修改agent 端的配置,设置用户参数

① free | awk '/^Mem/{print $3}' 自己需要查找的参数的命令

② 修改配置文件,把查找参数的命令设为用户参数

cd /etc/zabbix/zabbix_agentd.d/
vim memory_usage.conf
UserParameter=memory.used,free | awk '/^Mem/{print $3}'

③ systemctl restart zabbix-agent.service 重启agent 服务

(2)在zabbix-server 端,查询

zabbix_get -s 192.168.30.7 -p 10050 -k "memory.used"

(3)在监控上,设置一个item监控项,使用这个用户参数

(4)查询graph 图形

3、用法升级

(1)修改agent 端的配置,设置用户参数

① 命令行查询参数的命令

② 修改配置文件,把查找参数的命令设为用户参数

UserParameter=memory.stats[*],cat /proc/meminfo | awk '/^$1/{print $$2}'

分析:$$2:表示不是前边调位置参数的$2 ,而是awk 的参数$2

注意:$1是调用前边的[*],位置参数,第一个参数

(2)在zabbix-server 端,查询使用这个用户参数的key

(3)在监控上,设置一个item监控项,使用这个用户参数

① 添加Memory Total 的item监控项,使用memory.stats[MemTotal] 的用户参数

在进程中定义倍数,规定单位

② clone 克隆Memory Total 创建Memory Free 的监控项

memory.stats[MemFree] 用户参数

③ 创建Memory Buffers 的item 监控项,使用 memory.stats[Buffers] 的key

(4)上面3个监控项的graph 图形

① memory total

② memory free

③ buffers

4、使用用户参数监控php-fpm 服务的状态

在agent 端:

(1)下载,设置php-fpm

① yum -y install php-fpm

② vim /etc/php-fpm.d/www.conf 打开php-fpm的状态页面

user = nginx 
group = nginx 
pm.status_path = /php-fpm-status   
#php-fpm 的状态监测页面 
ping.path = /ping     
#ping 接口,存活状态是否ok 
ping.response = pong   
#响应内容pong

③ systemctl start php-fpm 开启服务

(2)设置nginx ,设置代理php,和php-fpm的状态页面匹配

 vim /etc/nginx/nginx.conf
location ~ .php$ {    
         fastcgi_pass   127.0.0.1:9000;             
fastcgi_index  index.php;             
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;            
 include        fastcgi_params; 
} 
location ~* /(php-fpm-status|ping) {   
          fastcgi_pass   127.0.0.1:9000;            
 fastcgi_index  index.php;             
fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;             
include        fastcgi_params;            
  allow 127.0.0.1;   #因为这个页面很重要,所有需加访问控制        
     deny all;           
   access_log off;   #访问这个页面就不用记录日志了
 }

② systemctl start nginx 开启nginx服务

(3)在agent 端,设置用户参数

① 查询 curl 192.168.30.7/php-fpm-status

② 设置

cd /etc/zabbix/zabbix_agentd.d/
vim php_status.conf
UserParameter=php-fpm.stats[*],curl -s http://127.0.0.1/php-fpm-status | awk '/^$1/{print $$NF}'

分析:设置用户参数为php-fpm.stats[*],$1为第一个参数;$$NF为awk中的参数,倒数第一列

③ 重启服务

systemctl restart zabbix-agent

(4)在zabbix-server 端,查询使用这个用户参数的key

zabbix_get -s 192.168.30.7 -p 10050 -k "php-fpm.stats[idle]"
zabbix_get -s 192.168.30.7 -p 10050 -k "php-fpm.stats[active]"
zabbix_get -s 192.168.30.7 -p 10050 -k "php-fpm.stats[max active]"

(5)创建一个模板,在模板上创建4个item监控项,使用定义的用户参数

① 创建一个模板

② 在模板上配置items 监控项,使用刚定义的用户参数

fpm.stats[total processes]

③ 再clone克隆几个items监控项

fpm.stats[active processes]

fpm.stats[max active processes]

fpm.stats[idle processes]

(6)host主机链接模板

(7)查看graph 图形

① php-fpm total processes

② php-fpm active processes

③ php-fpm max active processes

④ php-fpm idle processes

(8)把模板导出,可以给别人使用

① 导出模板

最下面有导出

② 自己定义用户参数的文件,也不要忘记导出

/etc/zabbix/zabbix_agentd.d/php_status.conf

二、Network discovery 网络发现

1、介绍

(1)介绍

网络发现:zabbix server扫描指定网络范围内的主机

网络发现是zabbix 最具特色的功能之一,它能够根据用户事先定义的规则自动添加监控的主机或服务

优点:

  加快Zabbix部署

  简化管理

在快速变化的环境中使用Zabbix,而不需要过度管理

(2)发现方式:

ip地址范围;

  可用服务(ftp, ssh, http, ...)

  zabbix_agent的响应;

snmp_agent的响应;

(3)网络发现通常包含两个阶段:discovery发现 和actions动作

① discovery:

Zabbix定期扫描网络发现规则中定义的IP范围;检查的频率对于每个规则都是可配置的

每个规则都有一组用于为IP范围执行的服务检查

由网络发现模块执行的服务和主机(IP)的每个检查都会生成一个发现事件

8种响应事件

② actions:网络发现中的事件可以触发action,从而自动执行指定的操作,把discvery events当作前提条件;

  Sending notifications 发送通知

  Adding/removing hosts 添加/删除主机

  Enabling/disabling hosts 启用/禁用host

  Adding hosts to a group 向组中添加主机

  Removing hosts from a group 移除组中的主机

  Linking hosts to/unlinking from a template 从模板链接主机或取消链接

  Executing remote scripts 执行远程脚本

这些事件的配置还可以基于设备的类型、IP 、状态、上线/ 离线等进行配置

(4)网络发现:接口添加

网络发现中添加主机时会自动创建interface 接口

例如:

  如果基于SNMP 检测成功,则会创建SNMP 接口

  如果某服务同时响应给了agent 和SNMP ,则两种接口都会创建

  如果同一种发现机制( 如agent) 返回了非惟一数据,则第一个接口被识别为默认,其它的为额外接口

  即便是某主机开始时只有agent 接口,后来又通过snmp 发现了它,同样会为其添加额外的snmp 接口

  不同的主机如果返回了相同的数据,则第一个主机将被添加,余下的主机会被当作第一个主机的额外接口

2、配置网络发现Network discovery

(1)准备一台可被扫描发现的主机

① 安装agent 段的包

yum -y install zabbix-agent zabbix-sender

② 设置agent 配置,可以把之前设置好的node1的配置传过来

vim /etc/zabbix/zabbix_agentd.conf

Hostname=http://node2.along.com #只需修改hostname

③ visudo 修改sudo的配置

Defaults !visiblepw

zabbix ALL=(ALL) NOPASSWD: ALL

④ 开启服务

systemctl start zabbix-agent

(2)设置自动发现规则discovery

注释:

① key:zabbix_get -s 192.168.30.2 -p 10050 -k "system.hostname"

② 更新间隔:1h就好,不要扫描太过频繁,扫描整个网段,太废资源;这里为了实验,设为1m

(3)自动发现成功

(4)设置自动发现discovery 的动作action

a) 创建

b) 设置action动作

① 设置A条件,自动发现规则=http://test.net

② 设置B条件,自动发现状态=up

③ 要做什么操作

添加主机到监控

自动链接Template OS Linux 到此host

c) 配置action 完成,默认是disabled 停用的

d) 启用动作,查看效果

确实已经生效,添加主机成功,模板链接成功

(5)如果自己需要添加的主机已经扫描添加完成,就可以关闭网络扫描了,因为太耗资源

三、web监控

1、介绍

(1)介绍

① Web监控:监控指定的站点的资源下载速度,及页面响应时间,还有响应代码

② 术语:

  web Scenario: web场景(站点)

  web page :web页面,一个场景有多个页面

  內建key:要测一个页面,要测三个步骤(下边3个內建key)

③ 内建key:

   http://web.test.in[Scenario,Step,bps]:传输速率

   web.test.time[Scenario,Step]: 响应时长

   web.test.rspcode[Scenario,Step]:响应码

2、创建设置web场景

(1)创建

(2)配置web 监测

① 点击步骤,设置web page web页面

a) 设置名为home page,URL为http://192.168.30.7/index.html 的web页面

b) 设置名为fpm status,URL为http://192.168.30.7/fpm-status 的web页面

c) 设置2个web页面成功

② 如果有特殊认证,也可以添加

3、查看测试

四、主动/被动 监控

1、介绍

(1)主动/被动介绍

  被动检测:相对于agent而言;agent, server向agent请求获取配置的各监控项相关的数据,agent接收请求、获取数据并响应给server;

  主动检测:相对于agent而言;agent(active),agent向server请求与自己相关监控项配置,主动地将server配置的监控项相关的数据发送给server;

  主动监控能极大节约监控server 的资源。

(2)zabbix_sender发送数据:实现人工生成数据,发给server端

① zabbix server上的某主机上,直接定义Item时随便定义一个不与其它已有key冲突的key即可,即item type为"zabbix trapper";

② 用法选项:

zabbix_sender

  -z zabbix_server_ip

  -p zabbix_server_port

  -s zabbix_agent_hostname

  -k key

  -o value 值

2、设置一个通过內建key发送数据的主动监控

(1)agent端所需要基本配置:

ServerActive=192.168.30.107 给哪个监控server 发送数据 Hostname=http://node1.along.com 自己的主机名,假设主机定死了,不设置下一项 #HostnameItem= 如果自己的主机名易变动,这一项相当于key一样去匹配

注意:若后两项同时启用,下边一个选择生效

(2)设置一个主动监测

① 选择进程,每秒更改,

因为key:system.cpu.switches :上下文的数量进行切换,它返回一个整数值。为了监控效果,选择下一秒减上一秒的值作为监控

(3)已经有啦graph图形

3、设置一个通过命令zabbix_sender发送数据的主动监控

(1)配置一个zabbix traper(采集器) 的item 监控项

(2)agent 端手动发送数据

(3)监控到数据的变化

五、基于SNMP监控(了解)

1、介绍

(1)介绍

SNMP:简单网络管理协议;(非常古老的协议)

三种通信方式:读(get, getnext)、写(set)、trap(陷阱);

端口:

  161/udp

  162/udp

SNMP协议:年代久远

  v1: 1989

v2c: 1993

  v3: 1998

监控网络设备:交换机、路由器

MIB:Management Information Base 信息管理基础

OID:Object ID 对象ID

(2)Linux启用snmp的方法:

yum install net-snmp net-snmp-utils

配置文件:定义ACL

  /etc/snmp/snmpd.conf

启动服务:

  systemctl start snmpd 被监控端开启的服务

   systemctl start snmptrapd 监控端开启的服务(如果允许被监控端启动主动监控时启用)

(3)配置文件的介绍

开放数据:4步

① 定义认证符,将社区名称"public"映射为"安全名称"

② 将安全名称映射到一个组名

③ 为我们创建一个视图,让我们的团队有权利

掩码:我列出一些注释,有很多,可以再网上查询

.1.3.6.1.2.1.

   1.1.0:系统描述信息,SysDesc

   1.3.0:监控时间, SysUptime

   1.5.0:主机名,SysName

   1.7.0:主机提供的服务,SysService

.1.3.6.1.2.2.

   2.1.0:网络接口数目

   2.2.1.2:网络接口的描述信息

   2.2.1.3:网络接口类型

   ……

④ 授予对systemview视图的只读访问权

(4)测试工具:

snmpget -v 2c -c public HOST OID

snmpwalk -v 2c -c public HOST OID 通过这个端口查询到的数据,全列出了

2、配置SNMP监控

(1)下载,修改配置文件

vim /etc/snmp/snmpd.conf

view systemview included .1.3.6.1.2.1.1 view systemview included .1.3.6.1.2.1.2 # 网络接口的相关数据 view systemview included .1.3.6.1.4.1.2021 # 系统资源负载,memory, disk io, cpu load view systemview included .1.3.6.1.2.1.25

(2)在agent 上测试

snmpget -v 2c -c public 192.168.30.2 .1.3.6.1.2.1.1.3.0

snmpget -v 2c -c public 192.168.30.2 .1.3.6.1.2.1.1.5.0

(3)在监控页面,给node2加一个snmp的接口

(4)在node2上加一个 Template OS Linux SNMPv2 模板

模板添加成功,生成一系列东西

点开一个item 看一下

(5)生成一些最新数据的图形graph了

3、设置入站出站packets 的SNMP监控

(1)监控网络设备:交换机、路由器的步骤:

① 把交换机、路由器的SNMP 把对应的OID的分支启用起来

② 了解这些分支下有哪些OID,他们分别表示什么意义

③ 我们要监控的某一数据:如交换机的某一个接口流量、报文,发送、传入传出的报文数有多少个;传入传出的字节数有多少个,把OID取出来,保存

(2)定义入站出站的item监控项

interface traffic packets(in)

interface traffic packets(out)

六、JMX接口

1、介绍

(1)介绍

Java虚拟机(JVM)具有内置的插装,使您能够使用JMX监视和管理它。您还可以使用JMX监视工具化的应用程序。

(2)配置设置介绍

① zabbix-java-gateway主机设置:

  安装 zabbix-java-gateway程序包,启动服务;

yum -y install zabbix-java-gateway

② zabbix-server端设置(需要重启服务):

JavaGateway=172.16.0.70

JavaGatewayPort=10052

StartJavaPollers=5 #监控项

③ tomcat主机设置:

   监控tomcat:

     /etc/sysconfig/tomcat,添加

 CATALINA_OPTS="-Djava.rmi.server.hostname=TOMCAT_SERVER_IP -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"   #启用JVM接口,默认没有启用

  添加监控项:

    jmx[object_name,attribute_name]

      object name - 它代表MBean的对象名称

      attribute name - 一个MBean属性名称,可选的复合数据字段名称以点分隔

    示例:

       jmx["java.lang:type=Memory","HeapMemoryUsage.used"]

④ jmx的详细文档:https://docs.oracle.com/javase/1.5.0/docs/guide/management/agent.html

2、配置JVM接口监控

(1)安装配置tomcat

① 下载安装tomcat,主要是用JVM

yum -y install java-1.8.0-openjdk-devel tomcat-admin-webapps tomcat-docs-webapp

② 加CATALINA_OPTS= #启用JVM接口,默认没有启用

vim /etc/sysconfig/tomcat
CATALINA_OPTS="-Djava.rmi.server.hostname=192.168.30.2 -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true   -Dcom.sun.management.jmxremote.port=12345  -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false"

③ 开启服务

systemctl start tomcat

(2)在zabbix-server 端,安装配置java-gateway

① 安装配置java-gateway

yum -y install zabbix-java-gateway

/etc/zabbix/zabbix_java_gateway.conf 安装完后,会生成一个java_gateway 的配置文件

systemctl start zabbix-java-gateway.service 不用修改,直接开启服务

② 修改server 配置,开启java-gateway的配置

vim /etc/zabbix/zabbix_server.conf

JavaGateway=192.168.30.107 JavaGatewayPort=10052 StartJavaPollers=5 #打开5个监控项

③ systemctl restart zabbix-server 重启zabbix-server 服务

(3)在node2 主机上添加JMX接口,实验模板

① 添加JMX接口

② 在node2 上连接tomcat JMX 模板

③ 随便查看一个监控项item

(4)自己定义一个堆内存使用的监控项,基于JVM接口(没必要,使用模板就好)

七、分布式监控

1、介绍

(1)介绍

分布式监控概述

  proxy and node

Zabbix 的三种架构

  Server-agent

  Server-Node-agent

  Server-Proxy-agent

监控Zabbix

(2)配置介绍

Zabbix Proxy的配置:

  server-node-agent

  server-proxy-agent

a) 配置proxy主机:

(1) 安装程序包

zabbix-proxy-mysql zabbix-get

zabbix-agent zabbix-sender

(2) 准备数据库

  创建、授权用户、导入schema.sql;

(3) 修改配置文件

  Server=

    zabbix server主机地址;

  Hostname=

    当前代理服务器的名称;在server添加proxy时,必须使用此处指定的名称;

    =需要事先确保server能解析此名称;

  DBHost=

  DBName=

  DBUser=

  DBPassword=

  ConfigFrequency=10

  DataSenderFrequency=1

b) 在server端添加此Porxy

Administration --> Proxies

c) 在Server端配置通过此Proxy监控的主机;

注意:zabbix agent端要允许zabbix proxy主机执行数据采集操作:

2、实现分布式zabbix proxy监控

实验前准备:

① ntpdate 172.168.30.1 同步时间

② 关闭防火墙,selinux

③ 设置主机名 hostnamectl set-hostname http://zbproxy.along.com

④ vim /etc/hosts 每个机器都设置hosts,以解析主机名;DNS也行

192.168.30.107 http://server.along.com

192.168.30.7 http://node1.along.com

192.168.30.2 http://node2.along.com

192.168.30.3 http://node3.along.comhttp://zbproxy.along.com

(1)环境配置(4台主机)

机器名称

IP配置

服务角色

zabbix-server

192.168.30.107

监控

agent-node1

192.168.30.7

被监控端

agent-node2

192.168.30.2

被监控端

node3

192.168.30.3

代理proxy

zabbix-server 直接监控一台主机node1

zabbix-server 通过代理node3 监控node2

(2)在node3 上配置mysql

① 创建配置mysql

vim /etc/my.cnf.d/server.cnf

[server] skip_name_resolve = on innodb_file_per_table = on innodb_buffer_pool_size = 256M max_connections = 2000 log-bin = master-log

② systemctl start mariadb 开启服务

③ 创建数据库 和 授权用户

MariaDB [(none)]> create database zbxproxydb character set 'utf8'; MariaDB [(none)]> grant all on zbxproxydb.* to 'zbxproxyuser'@'192.168.30.%' identified by 'zbxproxypass'; MariaDB [(none)]> flush privileges;

(3)在node3 上下载zabbix 相关的包,主要是代理proxy的包

yum -y install zabbix-proxy-mysql zabbix-get zabbix-agent zabbix-sender

a) 初始化数据库

zabbix-proxy-mysql 包里带有,导入数据的文件

cp /usr/share/doc/zabbix-proxy-mysql-3.4.4/schema.sql.gz ./ 复制

gzip -d schema.sql.gz 解包

mysql -root -p zbxproxydb < schema.sql 导入数据

b) 查看数据已经生成

(4)配置proxy端

① vim /etc/zabbix/zabbix_proxy.conf

Server=192.168.30.107 #server 的IP ServerPort=10051 #server 的端口 Hostname=http://zbxproxy.along.com #主机名 ListenPort=10051 #proxy自己的监听端口 EnableRemoteCommands=1 #允许远程命令 LogRemoteCommands=1 #记录远程命令的日志 数据的配置 DBHost=192.168.30.3 DBName=zbxproxydb DBUser=zbxproxyuser DBPassword=zbxproxypass ConfigFrequency=30 #多长时间,去服务端拖一次有自己监控的操作配置;为了实验更快的生效,这里设置30秒,默认3600s DataSenderFrequency=1 #每一秒向server 端发一次数据,发送频度

② systemctl start zabbix-proxy 开启服务

(5)配置node2端,允许proxy代理监控

vim /etc/zabbix/zabbix_agentd.conf

Server=192.168.30.107,192.168.30.3 ServerActive=192.168.30.107,192.168.30.3

systemctl restart zabbix-agent 启动服务

(6)把代理加入监控server,创建配置agent 代理

① 创建agent 代理

② 配置

(7)创建node2 主机,并采用代理监控

设置代理成功

(8)创建item监控项

① 为了实验,随便创一个监控项 CPU Switches

② 进程里设置每秒更改

③ 成功,graph 图形生成

八、查询使用网上模板监控

1、找官方的share 分享网站

https://cn.bing.com/ 搜索 zabbix share

例如:我们要实现监控Nginx ,我们查找一个模板

就以这个模板为例

2、在node1 上使用此模板

(1)安装配置 nginx

① yum -y install nginx

vim /etc/nginx/nginx.conf 按照网页的操作指示

location /stub_status { stub_status on; access_log off; # allow 127.0.0.1; #为了操作方便,我取消的访问控制 # deny all; }

② 启动服务

systemctl restart nginx

(2)下载模板所依赖的脚本

mkdir -p /srv/zabbix/libexec/

cd /srv/zabbix/libexec/

wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/nginx.sh 从网页上获取脚本

chmod +x nginx.sh 加执行权限

(3)配置agent 的用户参数UserParameter

cd /etc/zabbix/zabbix_agentd.d/

wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/userparameter_nginx.conf 很短,自己写也行

(4)在windows 上下载模板,并导入这server 的模板中

wget https://raw.githubusercontent.com/oscm/zabbix/master/nginx/zbx_export_templates.xml 可以现在linux上下载,再sz 导出到windows上

① 导入下载的模板

② 主机node1 链接这个模板

③ 模板生效

九、zabbix-server 监控自己,数据库,nginx

1、下载安装,配置agent

vim /etc/zabbix/zabbix_agentd.conf 配置agent

EnableRemoteCommands=1 允许远程命令 LogRemoteCommands=1 记录远程命令 Server=127.0.0.1 ServerActive=127.0.0.1 Hostname=http://server.along.com

2、自动生成Zabbix server 的主机

3、在主机中添加模板

4、启用Zabbix server

5、监控到数据

十、调优

1、调优

① Database:

  历史数据不要保存太长时长;

  尽量让数据缓存在数据库服务器的内存中;

② 触发器表达式:减少使用聚合函数 min(), max(), avg();尽量使用last(),nodata();

  因为聚合函数,要运算

③ 数据收集:polling较慢(减少使用SNMP/agentless/agent);尽量使用trapping(agent(active)主动监控);

④ 数据类型:文本型数据处理速度较慢;尽量少收集类型为文本 text或string类型的数据;多使用类型为numeric 数值型数据 的;

2、zabbix服务器的进程

(1) 服务器组件的数量;

  alerter, discoverer, escalator, http poller, hourekeeper, icmp pinger, ipmi polller, poller, trapper, configration syncer, ...

  StartPollers=60

  StartPingers=10

  ...

  StartDBSyncer=5

  ...

(2) 设定合理的缓存大小

   CacheSize=8M

   HistoryCacheSize=16M

   HistoryIndexCacheSize=4M

   TrendCacheSize=4M

   ValueCacheSize=4M

(3) 数据库优化

  分表:

    history_*

    trends*

    events*

来源:https://www.cnblogs.com/along...

image

查看原文

赞 1 收藏 0 评论 0

民工哥 发布了文章 · 1月21日

每天学一个 Linux 命令(24):chattr/lsattr

图片

昨日推荐:每天学一个 Linux 命令(23):file

命令简介

chattr 用来改变文件(扩展)属性。通常我们叫这个属性为特殊属性。

lsattr 查看文件扩展属性。

这种特殊属性有以下8种模式:

a #限定文件具有某种功能。这个对于日志文件非常有作用,比如,不允许删除,只允许向里面追加内容。
b #不更新或修改文件或目录的最后存储时间
c #将文件或目录压缩后存储
d #将文件或目录排除在倾倒操作之外
i #锁定文件或目录,不被更改
s #秘密删除文件或目录
S #动态实时更新文件或目录
u #防止文件或目录被意外删除

如果文件或目录被配置了上述8种之一的扩展属性,通过lsattr命令可以查看到:

[root@centos7 testdir]# lsattr
----i----------- ./dir
#结果说明这个目录被配置扩展属性
[root@centos7 testdir]# chattr -i dir
[root@centos7 testdir]# lsattr
---------------- ./dir

语法格式

chattr [选项] mode file
lsattr [选项] file

选项说明

chattr选项说明

-R  #递归处理,将目录下的所有文件及子目录都加上此扩展属性
-v<版本编号> #设置文件或目录版本号
-V  #显示指令执行过程;
+ <属性> #添加文件或目录的某个扩展属性
- <属性> #解除文件或目录的某个扩展属性
= <属性> #指定某个扩展性至指定的文件或目录

lsattr选项说明

-E  #显示属性的当前值
-D  #显示扩展属性的名称
-R  #递归
-V  #显示版本信息
-a  #列出目录下所有文件,包括隐藏文件
#注意-E -D -R三个选项是不可以一起使用的,它们是相互排斥的。

应用举例

#防止误删除的作用
[root@centos7 testdir]# chattr +a test2.txt
[root@centos7 testdir]# lsattr test2.txt
-----a---------- test2.txt
#不允许直接替换,只允许追加内容
[root@centos7 testdir]# echo "12345">test2.txt
-bash: test2.txt: Operation not permitted  
#查看文件或目录有没有扩展属性
[root@centos7 testdir]# echo "12345">>test2.txt
[root@centos7 testdir]# lsattr
---------------- ./dir
---------------- ./test2.txt~
-----a---------- ./test2.txt
lsattr: Operation not supported While reading flags on ./cp

这两个命令在日常工作也会常用到,锁定文件,或者当文件或系统出现故障时用于排查。

[root@centos7 testdir]# lsattr
---------------- ./dir
---------------- ./test2.txt~
----i----------- ./test2.txt
lsattr: Operation not supported While reading flags on ./cp
[root@centos7 testdir]# echo "12345">>test2.txt
-bash: test2.txt: Permission denied

比如上述情况,如果此文件是一个要实时存储数据的文件,被锁定了,那么就可能会引发应用运行故障,所以,这时就可以通过lsattr命令来查看与排查。

每天学一个 Linux 命令(22):pwd

每天学一个 Linux 命令(21):tree

查看原文

赞 0 收藏 0 评论 0

民工哥 发布了文章 · 1月20日

Bash 脚本进阶,经典用法及其案例

前言

在linux中,Bash脚本是很基础的知识,大家可能一听脚本感觉很高大上,像小编当初刚开始学一样,感觉会写脚本的都是大神。虽然复杂的脚本是很烧脑,但是,当我们熟练的掌握了其中的用法与技巧,再多加练习,总有一天也会成为得心应手的脚本大神。脚本在生产中的作用,想必小编我不说,大家也都知道,脚本写的6,可以省下很多复杂的操作,减轻自己的工作压力。好了,废话不多说,接下来,就是Bash脚本的用法展示。

一、条件选择、判断

1、条件选择if

(1)用法格式

if 判断条件 1 ; then

  条件为真的分支代码

elif 判断条件 2 ; then

  条件为真的分支代码

elif 判断条件 3 ; then

  条件为真的分支代码

else

  以上条件都为假的分支代码

fi

逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if。

(2)经典案例:

① 判断年纪

#!/bin/bash
read -p "Please input your age: " age
if [[ $age =~ [^0-9] ]] ;then
    echo "please input a int"
    exit 10
elif [ $age -ge 150 ];then
    echo "your age is wrong"
    exit 20
elif [ $age -gt 18 ];then
    echo "good good work,day day up"
else
    echo "good good study,day day up"
fi

分析:请输入年纪,先判断输入的是否含有除数字以外的字符,有,就报错;没有,继续判断是否小于150,是否大于18。

② 判断分数

#!/bin/bash
read -p "Please input your score: " score
if [[ $score =~ [^0-9] ]] ;then
    echo "please input a int"
    exit 10
elif [ $score -gt 100 ];then
    echo "Your score is wrong"
    exit 20
elif [ $score -ge 85 ];then
    echo "Your score is very good"
elif [ $score -ge 60 ];then
    echo "Your score is soso"
else
    echo "You are loser"
fi

分析:请输入成绩,先判断输入的是否含有除数字以外的字符,有,就报错;没有,继续判断是否大于100,是否大于85,是否大于60。

2、条件判断case

(1)用法格式

case $name in;

PART1)

  cmd

;;

PART2)

  cmd

;;

*)

  cmd

;;

esac

注意:case 支持glob 风格的通配符:

  *: 任意长度任意字符

  ?: 任意单个字符

  [] :指定范围内的任意单个字符

  a|b: a 或b

(2)案例:

判断yes or no

#!/bin/bash
read -p "Please input yes or no: " anw
case $anw in
[yY][eE][sS]|[yY])
    echo yes
    ;;
[nN][oO]|[nN])
    echo no
    ;;
*)
    echo false
    ;;
esac

分析:请输入yes or no,回答Y/y、yes各种大小写组合为yes;回答N/n、No各种大小写组合为no。

二、四个循环

1、for

(1)用法格式

① forname in 列表 ;do

  循环体

done

for (( exp1; exp2; exp3 )) ;do

  cmd

done

exp1只执行一次,相当于在for里嵌了while

③ 执行机制:依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束

列表的表示方法,可以glob 通配符,如{1..10} 、*.sh ;也可以变量引用,如: seq 1 $name

(2)案例

① 求出(1+2+...+n)的总和

sum=0
read -p "Please input a positive integer: " num
if [[ $num =~ [^0-9] ]] ;then
    echo "input error"
elif [[ $num -eq 0 ]] ;then
    echo "input error"
else
    for i in `seq 1 $num` ;do
        sum=$[$sum+$i]
    done
    echo $sum
fi
unset zhi 

分析:sum初始值为0,请输入一个数,先判断输入的是否含有除数字以外的字符,有,就报错;没有判断是否为0,不为0进入for循环,i的范围为1~输入的数,每次的循环为sum=sum+i,循环结束,最后输出sum的值。

② 求出(1+2+...+100)的总和

for (( i=1,num=0;i<=100;i++ ));do
        [ $[i%2] -eq 1 ] && let sum+=i
done
echo sum=$sum

分析:i=1,num=0;当i<=100,进入循环,若i÷2取余=1,则sum=sum+i,i=i+1。
2、while

(1)用法格式

while 循环控制条件 ;do

  循环

done

循环控制条件;进入循环之前,先做一次判断;每一次循环之后会再次做判断;条件为“true” ,则执行一次循环;直到条件测试状态为“false” 终止循环

(2)特殊用法(遍历文件的每一行):while read line; do控制变量初始化
  循环体
done < /PATH/FROM/SOMEFILE
cat /PATH/FROM/SOMEFILE | while read line; do
  循环体
done
依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

(3)案例:

① 100以内所有正奇数之和

sum=0
i=1
while [ $i -le 100 ] ;do
if [ $[$i%2] -ne 0 ];then
    let sum+=i
    let i++
else
    let i++
fi
done
echo "sum is $sum"

分析:sum初始值为0,i的初始值为1;请输入一个数,先判断输入的是否含有除数字以外的字符,有,就报错;没有当i<100时,进入循环,判断 i÷2取余 是否不为0,不为0时为奇数,sum=sum+i,i+1,为0,i+1;循环结束,最后输出sum的值。

3、until循环

(1)用法

unitl 循环条件 ;do

  循环

done

进入条件:循环条件为true ;退出条件:循环条件为false;刚好和while相反,所以不常用,用while就行。

(2)案例

监控xiaoming用户,登录就杀死

until pgrep -u xiaoming &> /dev/null ;do 
sleep 0.5 
done 
pkill -9 -u xiaoming

分析:每隔0.5秒扫描,直到发现xiaoming用户登录,杀死这个进程,退出脚本,用于监控用户登录。

4、select循环与菜单
(1)用法
select variable in list
do
  循环体命令
done
① select 循环主要用于创建菜单,按数字顺序排列的示菜单项将显示在标准错误上,并显示PS3 提示符,等待用户输入
② 用户输入菜单列表中的某个数字,执行相应的命令
③ 用户输入被保存在内置变量 REPLY 中
④ select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 按 命令终止脚本。也可以按 ctrl+c退出循环
⑤ select 和 经常和 case 联合使用
⑥ 与for循环类似,可以省略 in list, 此时使用位置参量
(2)案例:
生成菜单,并显示选中的价钱

PS3="Please choose the menu: "
select menu in mifan huimian jiaozi babaozhou quit
do
        case $REPLY in
        1|4)
                echo "the price is 15"
                ;;
        2|3)
                echo "the price is 20"
                ;;
        5)
                break
                ;;
        *)
                echo "no the option"
        esac
done

分析:PS3是select的提示符,自动生成菜单,选择5break退出循环。

三、循环里的一些用法

1、循环控制语句

(1)语法

continue [N]:提前结束第N层的本轮循环,而直接进入下一轮判断;最内层为第1层

break [N]:提前结束第N层循环,最内侧为第1层

例:while CONDTITON1; do  CMD1
if CONDITION2; then
  continue / break
fi
  CMD2
done
(2)案例:

① 求(1+3+...+49+53+...+100)的和

#!/bin/bash
sum=0
for i in {1..100} ;do
        [ $i -eq 51 ] && continue
        [ $[$i%2] -eq 1 ] && { let sum+=i;let i++; }
done
echo sum=$sum

分析:做1+2+...+100的循环,当i=51时,跳过这次循环,但是继续整个循环,结果为:sum=2449

② 求(1+3+...+49)的和

#!/bin/bash
sum=0
for i in {1..100} ;do
        [ $i -eq 51 ] && break
        [ $[$i%2] -eq 1 ] && { let sum+=i;let i++; }
done
echo sum=$sum

分析:做1+2+...+100的循环,当i=51时,跳出整个循环,结果为:sum=625

2、循环控制shift命令

(1)作用
用于将参数列表list左移指定次数,最左端的那个参数就从列表中删除,其后边的参数继续进入循环
(2)案例:

① 创建指定的多个用户

#!/binbash
if [ $# -eq 0 ] ;then
        echo "Please input a arg(eg:`basename $0` arg1)"
        exit 1
else
        while [ -n "$1" ];do
                useradd $1 &> /dev/null
                shift
        done
fi

分析:如果没有输入参数(参数的总数为0),提示错误并退出;反之,进入循环;若第一个参数不为空字符,则创建以第一个参数为名的用户,并移除第一个参数,将紧跟的参数左移作为第一个参数,直到没有第一个参数,退出。

② 打印直角三角形的字符

#!/binbash
while (( $# > 0 ))
do
        echo "$*"
        shift
done

3、返回值结果
true 永远返回成功结果
: null command ,什么也不干,返回成功结果
false 永远返回错误结果
创建无限循环
while true ;do
  循环体
done

4、循环中可并行执行,使脚本运行更快

(1)用法
for name in 列表 ;do
{
  循环体
}&
done
wait
(2)实例:
搜寻自己指定ip(子网掩码为24的)的网段中,UP的ip地址

read -p "Please input network (eg:192.168.0.0): " net
echo $net |egrep -o "<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"
[ $? -eq 0 ] || ( echo "input error";exit 10 )
IP=`echo $net |egrep -o "^([0-9]{1,3}.){3}"`
for i in {1..254};do
        {
        ping -c 1 -w 1 $IP$i &> /dev/null && 
        echo "$IP$i is up" 
        }&

done
wait

分析:请输入一个IP地址例192.168.37.234,如果格式不是0.0.0.0 则报错退出;正确则进入循环,IP变量的值为192.168.37. i的范围为1-254,并行ping 192.168.37.1-154,ping通就输出此IP为UP。直到循环结束。

四、信号捕获trap

1、用法格式

trap ' 触发指令' 信号,自定义进程收到系统发出的指定信号后,将执行触发指令,而不会执行原操作

trap '' 信号,忽略信号的操作

trap '-' 信号,恢复原信号的操作

trap -p,列出自定义信号操作

信号可以3种表达方法:信号的数字2、全名SIGINT、缩写INT

2、常用信号

1) SIGHUP: 无须关闭进程而让其重读配置文件

2) SIGINT: 中止正在运行的进程;相当于Ctrl+c

3) SIGQUIT: 相当于ctrl+

9) SIGKILL: 强制杀死正在运行的进程

15) SIGTERM :终止正在运行的进程(默认为15)

18) SIGCONT :继续运行

19) SIGSTOP :后台休眠

9 信号,强制杀死,捕获不住

3、案例

① 打印0-9,ctrl+c不能终止

#!/bin/bash
trap 'echo press ctrl+c' 2
for ((i=0;i<10;i++));do
        sleep 1
        echo $i
done

分析:i=0,当i<10,每休眠1秒,i+1,捕获2信号,并执行echo press ctrl+c

② 打印0-3,ctrl+c不能终止,3之后恢复,能终止

#!/bin/bash
trap '' 2
trap -p
for ((i=0;i<3;i++));do
        sleep 1
        echo $i
done
trap '-' SIGINT
for ((i=3;i<10;i++));do
        sleep 1
        echo $i
done

分析:i=0,当i<3,每休眠1秒,i+1,捕获2信号;i>3时,解除捕获2信号。

五、脚本小知识(持续更新)
1、生成随机字符 cat /dev/urandom
  生成8个随机大小写字母或数字 cat /dev/urandom |tr -dc [:alnum:] |head -c 8
2、生成随机数 echo $RANDOM
  确定范围 echo $[RANDOM%7] 随机7个数(0-6)
       echo $[$[RANDOM%7]+31] 随机7个数(31-37)
3、echo打印颜色字
echo -e "033[31malong033[0m" 显示红色along
echo -e "033[1;31malong033[0m" 高亮显示红色along
echo -e "033[41malong033[0m" 显示背景色为红色的along
echo -e "033[31;5malong033[0m" 显示闪烁的红色along
color=$[$[RANDOM%7]+31]
echo -ne "033[1;${color};5m*033[0m" 显示闪烁的随机色along
六、分享几个有意思的小脚本

1、9x9乘法表

#!/bin/bash
for a in {1..9};do
        for b in `seq 1 $a`;do
                let c=$a*$b ;echo -e "${a}x${b}=$ctc"
        done
        echo    
done 

2、彩色等腰三角形

#!/bin/bash
read -p "Please input a num: " num
if [[ $num =~ [^0-9] ]];then
        echo "input error" 
else
        for i in `seq 1 $num` ;do
                xing=$[2*$i-1]
                for j in `seq 1 $[$num-$i]`;do
                        echo -ne " "
                done
                for k in `seq 1 $xing`;do
                        color=$[$[RANDOM%7]+31]
                        echo -ne "033[1;${color};5m*033[0m"
                done
                echo
        done
fi 

3、国际象棋棋盘

#!/bin/bash
red="033[1;41m  033[0m"
yellow="033[1;43m  033[0m"

for i in {1..8};do
        if [ $[i%2] -eq 0 ];then
                for i in {1..4};do
                        echo -e -n "$red$yellow";
                done
                echo
        else
                for i in {1..4};do
                        echo -e -n "$yellow$red";
                done
                echo 
        fi
done

好了,今天的内容就到这里了,其实小编的脚本功底也是小白级别的,大家一起努力,争取进阶为脚本大神!!!

来源:https://www.cnblogs.com/along...

image

查看原文

赞 8 收藏 6 评论 0

民工哥 发布了文章 · 1月20日

一文详解负载均衡和反向代理的真实区别

图片

一、SLB 产生背景

SLB(服务器负载均衡):在多个提供相同服务的服务器的情况下,负载均衡设备存在虚拟服务地址,当大量客户端从外部访问虚拟服务IP地址时,负载均衡设备将这些报文请求根据负载均衡算法,将流量均衡的分配给后台服务器以平衡各个服务器的负载压力,避免在还有服务器压力较小情况下其他服务达到性能临界点出现运行缓慢甚至宕机情况,从而提高服务效率和质量。

因此对客户端而言,RS(real server 实际服务器)的IP地址即是负载均衡设备VIP(虚拟服务地址IP)地址,真正的RS服务器IP地址对于客户端是不可见的。

二、SLB 的三种传输模式

七层SLB和四层SLB的区别:

四层SLB:配置负载均衡设备上服务类型为tcp/udp,负载均衡设备将只解析到4层,负载均衡设备与client三次握手之后就会和RS建立连接;

七层SLB:配置负载均衡设备服务类型为 http/ftp/https 等,负载均衡设备将解析报文到7层,在负载均衡设备与client三次握手之后,只有收到对应七层报文,才会跟RS建立连接。

在负载均衡设备中,SLB主要工作在以下的三种传输模式中:

  • 反向代理模式
  • 透传模式
  • 三角模式

根据不同的模式,负载均衡设备的工作方式也不尽相同,但无论在哪种模式下,客户端发起的请求报文总是需要先到达负载均衡设备进行处理,这是负载均衡设备正常工作的前提。模拟网络拓扑环境:

  • Client:10.8.21.40
  • 负载均衡设备:172.16.75.83
  • VIP:172.16.75.84
  • RS1IP:172.16.75.82
  • RS2IP:172.16.75.85

在整个报文交互过程中,采用 Tcpdump 和 Wireshark 分别在 RS 和 Client 处抓包,然后使用 Wireshark 进行报文解析。

三、 反向代理模式

反向代理:普通的代理设备是内网用户通过代理设备出外网进行访问,而工作在这种模式下的负载均衡设备,则是外网用户通过代理设备访问内网,因此称之为反向代理。

在反向代理模式下:

当负载均衡设备收到客户端请求后,会记录下此报文( 源IP地址、目的IP地址、协议号、源端口、目的端口,服务类型以及接口索引),将报文目的地址更改为优选后的RS设备的IP地址,目的端口号不变,源地址修改为负载均衡设备下行与对应RS设备接口的IP地址,源端口号随机发送给RS;

当RS收到报文后,会以源为RS接口IP地址,目的IP设备地址回复给负载均衡设备,负载均衡设备将源修改为VIP,目的端口号修改为客户端的源端口号,目的IP修改为Client的源IP回复报文。

查看报文解析结果:

配置完成后,Client 访问 RS 服务器,返回成功,整个报文交互过程如下 :

图片

Client和负载均衡设备之间的报文交互过程

图片

RS和负载均衡设备之间报文交互过程

结果分析

分析整个报文交互过程:

TCP握手过程:首先Client向负载均衡设备发送TCP SYN报文请求建立连接,源IP为Client的IP 10.8.21.40,源端口号50894,目的IP为VIP地址172.16.75.84,目的端口号80;

收到请求报文后,负载均衡设备会以源IP为VIP地址172.16.75.84,端口号80,目的IP 10.8.21.40,目的端口号50894回应SYN ACK报文;

Client收到报文后回复ACK报文,TCP三次握手成功。

HTTP报文交互过程:

当负载均衡设备与client完成三次握手后,因为配置的七层SLB,如果收到HTTP请求,就会根据负载均衡算法和服务器健康状态优选出对应的RS(在这次过程中选择的RS设备为172.16.75.82),然后与RS建立TCP连接:

负载均衡设备发送 TCP SYN 报文请求连接,源IP为负载均衡设备与RS相连接口IP 172.16.75.83,源端口号随机4574,目的IP为RS的IP 172.16.75.82,目的端口号80;

RS 收到报文后,以源 IP 172.16.75.82,端口号80,目的IP 172.16.75.83,目的端口号4574回复SYN ACK报文,负载均衡设备回复ACK报文建立三次握手;

之后,负载均衡设备再将收到的HTTP报文源IP修改为与RS相连下行接口IP地址172.16.75.83,源端口号为随机端口号,将报文发送给RS;当RS收到报文后,使用源为本地IP 172.16.75.82,目的IP为172.16.75.83进行回复,所以报文直接回复给负载均衡设备;

当负载均衡设备收到RS的回应报文后,将报文的源修改为VIP地址172.16.75.84,目的IP为10.8.21.40发送回 Client,再将目的端口号修改为HTTP请求报文中的源端口号,服务器访问成功。

图片

由上述的过程可以看出,在RS端上,client的真实IP地址被负载设备修改成与RS相连接口的IP地址,所以RS无法记录到Client的访问记录,为了解决这个问题,可以采用在HTTP报文头中添加X-Forwarded-For字段,本文不做赘述,可以自行查询。

四、透传模式

当负载均衡设备工作在透传模式中时,RS无法感知到负载均衡设备的存在,对于Client来说,RS的IP地址就是负载均衡设备的VIP地址。

在这种模式下,当负载均衡设备收到源为 Client 的 IP,目的 IP 为本地 VIP 地址的报文时,会将报文根据负载均衡策略和健康状况发送给最优的 RS 设备上,继而RS设备会收到目的为本地IP,源为Client实际IP的请求报文;

然后RS将会直接回应此请求,报文的目的 IP 地址为 Client 的 IP 地址,当负载均衡设备收到此报文后,将源 IP 地址修改为 VIP 地址,然后将报文发送给 Client。

报文解析结果:

同样在 RS 端和 Client 端抓取交互报文:

Client 和负载均衡设备之间的报文交互过程

图片

RS和负载均衡设备之间的报文交互过程

结果分析:

TCP握手过程:同反向代理模式交互过程

HTTP报文交互过程:

Client向负载均衡设备的VIP地址172.16.75.84以源IP 10.8.21.40发送HTTP请求,当负载均衡设备收到报文后,与优选后的RS进行TCP三次握手,过程同反向代理模式,然后将收到的HTTP报文,不改变报文的源IP地址和源/目的端口号,只修改目的IP修改为优选后的RS地址172.16.75.82;

当RS收到源来自IP 10.8.21.40的报文后,回复报文给IP地址10.8.21.40,此时要注意,必须在RS上配置回复报文经过负载均衡设备,负载均衡设备会将源IP修改为VIP地址172.16.75.84,然后转发给Client,否则Client将会收到源IP为172.16.75.82的HTTP报文,服务器访问失败。

图片

五、 三角模式

在三角模式下,当客户端发送请求到负载设备上时,负载均衡设备会计算出最优RS,然后直接根据MAC地址将报文转发给RS,在RS上配置报文的源IP为VIP地址(一般配置在loopback口上),因此在这种情况下,RS会直接将报文发送给Client,即使回复报文经过负载均衡设备,此设备不做任何处理。由于报文在整个过程中传输途径类似于三角形,因此称之为三角模式。

报文解析结果

分别在Client端和RS端抓包,内容如下:

图片

Client和负载均衡设备之间的报文交互过程

图片

RS 和负载均衡设备之间的报文交互过程

结果分析

TCP握手过程:

由于采用了4层SLB,所以在TCP握手过程中与上述的7层SLB有些不同,当Client和RS完成三次握手之后,此时负载均衡设备会直接选择RS,然后跟RS建立TCP三次握手;

在三角模式环境中,由于RS的Loopback口和负载均衡设备上都存在着VIP地址172.16.75.84,当负载均衡设备经过负载均衡算法选择出对应的RS后,会根据实际配置的RS的IP地址对应的mac地址,将报文以目的mac为RS,目的IP为VIP的方式建立TCP连接。

HTTP报文交互过程:

图片

首先Client向负载均衡设备的VIP发送HTTP请求,源为10.8.21.40,当负载均衡设备收到报文后,将报文直接转发给RS,当RS收到源IP为10.8.21.40,目的IP为本地Loopback口IP地址172.16.75.84的报文后,直接将报文回复给10.8.21.40,同样源为IP地址172.16.75.84,由此访问服务器成功。

在三角模式中,由于回复报文负载均衡设备不做任何处理,所以非常适合于RS到Client方向流量较大或者连接数目较多的组网环境。

采用三角模式时,必须注意RS有路由可以到达Client,并且在RS的Loopback接口上必须有负载均衡设备的VIP地址,否则即使RS设备收到Client的请求报文也会直接丢弃报文,不作回应。

六、总结

由于反向代理模式中在RS侧只能收到源为负载均衡设备IP的报文,因此可以使用防火墙增加安全性,只允许源IP为负载均衡设备的IP地址的报文通过,同时增加X-Forwarded-For字段也可以让RS只允许有此字段的报文进行访问,因此安全性相对较高。

图片

_作者:蹦蹦啪
链接:https://www.zhihu.com/questio...

image

查看原文

赞 2 收藏 1 评论 0

民工哥 发布了文章 · 1月20日

每天学一个 Linux 命令(23):file

图片

昨日推荐:每天学一个 Linux 命令(22):pwd

命令简介

file 命令用于查看指定文件的类型。

在Linux系统中,一切皆文件。这里就不得不提一下Linux系统中的文件类型:

普通文件 #属性信息表示为 - 
目录文件 #属性信息表示为 d
链接文件 #属性信息表示为 l
套接字文件 #属性信息表示为 s
字符设备文件 #属性信息表示为 b
块设备文件 #属性信息表示为 c
管道文件 #属性信息表示为 p

文件的属性信息在之前的文章: 每天学一个 Linux 命令(17):chmod 中有介绍,文件类型信息一般都是位于文件权限信息之首的位置。

[root@centos7 testdir]# ll
total 0
lrwxrwxrwx 1 root root 11 Jan 15 22:50 cp -> /usr/bin/cp
drwxr-xr-x 2 root root 62 Jan  2 09:15 dir
-rw-r--r-- 1 root root  0 Jan  2 09:03 test2.txt
-rw-r--r-- 1 root root  0 Jan  2 08:57 test2.txt~

语法格式

file [选项] [文件名或目录名]

选项说明

-b:#列出结果,但不显示文件名称
-c:#详细显示指令执行过程
-L:#显示链接文件的源文件类型
-m<魔法数字文件>:#指定魔法数字文件
-v:#打印出版本信息
-z:#查看压缩文件的内容

应用举例

#查看文件类型
[root@centos7 testdir]# file cp
cp: symbolic link to `/usr/bin/cp`
[root@centos7 testdir]# file dir
dir: directory
[root@centos7 testdir]# file test2.txt
test2.txt: empty
[root@centos7 testdir]# file test2.txt~
test2.txt~: empty
#直接显示结果,不显示文件名
[root@centos7 testdir]# file -b dir
directory
#解读压缩文件的内容
[root@centos7 ~]# file -z httpd-2.4.46.tar.gz
httpd-2.4.46.tar.gz: POSIX tar archive (GNU) (gzip compressed data, was "httpd-2.4.46.tar", from Unix, last modified: Sat Aug  1 10:12:01 2020, max compression)

每天学一个 Linux 命令(20):find

每天学一个 Linux 命令(21):tree

查看原文

赞 3 收藏 2 评论 0

民工哥 发布了文章 · 1月19日

7款小“神器”火了!让 Windows 效率起飞

图片

无论是Windows还是macOS,都少不了各种小工具的加持。作为操作系统中必不可少的组成部分,小工具的吸引力绝对不亚于系统本身。临近年底,你是不是还有很多工作没有完成?接下来要推荐的这7款小工具,绝对能让你的Windows焕然一新。

1. MouseInc——把鼠标玩出花

MouseInc:https://shuax.com/project/mou...

在见到MouseInc之前,你绝对不会想到它能把一个鼠标玩出多少花样!这是一款体积仅500KB的鼠标增强软件,但实现的功能却足以令人瞠目结舌。

比方说,你可以建立一个全局鼠标手势,无论是浏览器还是桌面,划划鼠标就能实现某项功能。

或者,为滚轮添加一个边缘触发,只要将鼠标移至屏幕的某一边,滚动滚轮即可完成特定任务。

此外还有屏幕边角,每一个边角都能做为不同命令的“触发键”,调节亮度、整整音量啥的,反正要比控制面板方便多了。

甚至你还可以实现滚轮穿透(Win10已经内置)、Caps打开提示、快速复制粘贴、自动关闭大写锁定这样的小功能,大幅提高你的Win10操作效率!

2. Geek Uninstaller——真正的卸载工

Geek Uninstaller:https://geekuninstaller.com/

尽管Windows已经内置了卸载功能,但有时……真的卸不干净。特别是一些破解过的软件,再次安装总会遇到各种各样的小问题。Geek Uninstaller是一款功能强大的专业卸载软件,打开后即是软件清单,除了能对软件体积、安装时间进行排序外,你也可以通过底部搜索栏,快速找到所需要的软件。

除了常规的“卸载”功能外,Geek Uninstaller还在右键菜单中提供了“安装文件夹”、“注册表条目”两个特殊条目,用以对无法删干净的内容手工处理。很多破解软件在卸载时出现问题,其实都可以利用它搞定。当然最关键的,还是Geek Uninstaller本身就是一款绿色软件,在帮你清理系统的同时,也不会再为系统增加更多垃圾。

图片

3. LiceCAP——史上最好用GIF录屏软件

LiceCAP:https://www.cockos.com/licecap/

LiceCAP是一款功能强大的GIF录屏软件,整个界面就是一个录制框。

当你要录制动画时,只要将选框覆盖到要录制的区域上,然后点击右下角的“Record”便开始了。

除了操作简单外,LiceCAP生成的画质体积也很OK,既能满足日常需要,也不至于体积太大难以传递,用来和同事做一些工作交流,那是再方便不过了。

4. HandShaker——文件跨平台传输神器

HandShaker:https://www.smartisan.com/app...

如果你对macOS的多端同步情有独钟,就一定要试试这款名叫HandShaker的跨平台文件传输神器。

HandShaker来自于著名的锤子科技,只要将PC端与手机端连通,你就可以在电脑上直接预览和处理手机上的文件。

无论传输速度还是使用体验,HandShaker无不体现着锤子这个牛X公司的独有调性。虽然目前HandShaker已经停止开发,在新版Android系统上会看到“此应用专为旧版Android打造”的提示,但好在并不影响使用。

图片

5. Snipaste——被Windows遗忘的截屏神器

Snipaste:https://www.microsoft.com/zh-...

截屏在Windows里并不算新鲜话题,特别是Win10自带的截屏在经过若干次升级后本身也已不俗。但如果你需要更高级的截图任务,就一定要试试这款Snipaste了。

首先,Snipaste可以实现像素级截取,在进入截取画面时,Snipaste会自动放大待截取区域,这样的特性对于很多高分屏用户,简直就是绝配。

其次,很多人都遇到过对照输入的场景,而Snipaste的“贴到屏幕上(Ctrl+T)”恰好可以满足这一要求,将要对照的区域截取下来,贴到屏幕上,就可以很方便地在字编辑软件中对照录入。

此外它还有区域标注、马塞克、箭头、文字标注、屏幕取色等功能,总之是一款十分出色的屏幕截取软件。

图片

6. 嗨格式录屏大师

嗨格式录屏大师:https://luping.hgs.cn/

嗨格式录屏大师也是一款非常好用的屏幕录像软件,和很多同类软件都有着繁复的界面设计不同,嗨格式录屏大师的UI非常简洁,即便第一次使用,也能很快上手。

软件支持全屏、区域、游戏、摄像头四种录制方式,每种方式都有一个更详细的调节面板。

录制选项也是它的特色之一,无论是MP4、AVI这样的视频格式,还是帧率、清晰度、麦克风、是否打开摄像头这些细节选项,嗨格式录屏大师都允许你自由搭配,甚至最高可以实现4K级录制。此外它的“试音”功能,也是我特别喜欢的,录制之前提前试好声音,就能避免很多尴尬。

嗨格式录屏大师内置还有一个视频编辑功能,可以在录制结束后,对素材进行一些基本的编辑(比如去掉正式录制前的一些准备画面),免去了再导入其他编辑软件的麻烦。

7. smmvslitter portable

地址:https://www.solveigmm.com/en/...

传统的视频剪接,不可避免都会涉及到一个重新编码问题,即便只是将视频中的某些片断剪除,也需要对整段视频重新渲染。smmvslitter portable是一款功能强大的视频剪辑软件,它的最大亮点,就是可以无损地完成视频的编辑与合并。

smmvslitter portable的界面与常见的非线编辑相同,我们可以很方便地在时间轴上进行素材的裁剪、拼接、合并。但和传统非线(例如PR)不同的是,smmvslitter portable在整个操作中并不会对全部视频进行编码,而是无损地完成各项操作。也就是说原有视频是1080P的,那么最终剪辑完成的也将是1080P,连码率都不会变。这不仅能够加快视频处理速度,最关键的是解决了传统软件重新编码后的画质下降,体积变大等弊端。

图片

写在最后

以上几款软件,算是小编2021年的第一次推荐了。为的就是让还在岗位上辛苦工作的小伙伴们,早日完成工作!那么这些Windows效率小工具,有没有给你带来一些帮助呢?

来源:https://www.pconline.com.cn/w...

image

查看原文

赞 26 收藏 19 评论 1

民工哥 发布了文章 · 1月19日

每天学一个 Linux 命令(22):pwd

图片

昨日推荐:每天学一个 Linux 命令(21):tree

命令简介

pwd (print working directory)显示用户当前工作目录的绝对路径。

pwd 命令将当前用户的工作目录的全路径名称(从根目录)以绝对路径的方式标准输出在屏幕上。

语法格式

tree [选项] [.....]
pwd  [OPTION]...

选项说明

-P  #打印当前目录的完整路径信息
--help  #显示帮助信息
--version #显示版本信息

应用举例

#打印当前工作目录路径
[root@centos7 dir]# pwd
/root/testdir/dir
#下面就是有链接文件
[root@centos7 var]# ll mail
lrwxrwxrwx. 1 root root 10 Aug 20 10:31 mail -> spool/mail
[root@centos7 mail]# pwd
/var/mail
[root@centos7 mail]# pwd -P
/var/spool/mail

pwd命令非常简单,基本上只会用到打印当前工作目录的功能,所以掌握起来很容易,同cd/ls/shutdown等一些命令一样,属于入门的最基础命令。

每天学一个 Linux 命令(20):find

每天学一个 Linux 命令(19):rm

查看原文

赞 2 收藏 0 评论 0

民工哥 发布了文章 · 1月18日

干货!Linux 上 OS、CPU、内存、硬盘信息查询

图片

前言

当我们接手了一台或者几台服务器的时候,首先我们有必要对服务器的基本配置有所认识,这样才可以对症下药,对以后的软件部署,系统运维会有事半功倍的效果。

查询服务器的基本配置一般查询操作系统,CPU,内存,硬盘,下面进行逐一讲解。

操作系统基本配置查询

1、查看操作系统版本

#cat /etc/redhat-release这个命令主要是查看红帽发行的操作系统的版本号
[root@node5 ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core) 
#cat /etc/issue这个命令适用于大多数linux发行版
[root@node5 ~]# cat /etc/issue
S
Kernel r on an m

2、查看操作系统内核版本

[root@node5 ~]# uname -r
3.10.0-693.el7.x86_64

3、查看操作系统详细信息

[root@node5 ~]# uname -a
Linux node5 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
#从上面这段输出可以看出,该服务器主机名是node5,linux内核版本是3.10.0-693.el7.x86_64,CPU是x86架构
#该命令可以查看更多信息
[root@node5 ~]# more /etc/*release 
::::::::::::::
/etc/centos-release
::::::::::::::
CentOS Linux release 7.4.1708 (Core) 
::::::::::::::
/etc/os-release
::::::::::::::
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
::::::::::::::
/etc/redhat-release
::::::::::::::
CentOS Linux release 7.4.1708 (Core) 
::::::::::::::
/etc/system-release
::::::::::::::
CentOS Linux release 7.4.1708 (Core)

CPU基本配置查询

1、名词解释

[root@node5 ~]# grep 'physical id' /proc/cpuinfo | sort -u | wc -l
1

2、查看 CPU 核心数量

[root@node5 ~]# grep 'core id' /proc/cpuinfo | sort -u | wc -l
4

3、查看 CPU 线程数

#逻辑cpu数:一般情况下,逻辑cpu=物理CPU个数×每颗核数,如果不相等的话,则表示服务器的CPU支持超线程技术(HT:简单来说,它可使处理#器中的1 颗内核如2 颗内核那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻#辑cpu=物理CPU个数×每颗核数x2)
[root@node5 ~]# cat /proc/cpuinfo| grep "processor"|wc -l
4
[root@node5 ~]# grep 'processor' /proc/cpuinfo | sort -u | wc -l
4

4、查看 CPU 型号

[root@node5 ~]# cat /proc/cpuinfo | grep name | sort | uniq
model name  : Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
[root@node5 ~]# dmidecode -s processor-version | uniq   #使用uniq进行去重
Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz

5、查看 CPU 的详细信息

#CPU有几个核,就会输出几个重复的信息
[root@node5 ~]# cat /proc/cpuinfo
processor  : 0
vendor_id  : GenuineIntel
cpu family  : 6
model    : 142
model name  : Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
stepping  : 10
microcode  : 0x96
cpu MHz    : 2000.921
cache size  : 8192 KB
physical id  : 0
siblings  : 4
core id    : 0
cpu cores  : 4
apicid    : 0
initial apicid  : 0
fpu    : yes
fpu_exception  : yes
cpuid level  : 22
wp    : yes
flags    : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat
bogomips  : 4002.00
clflush size  : 64
cache_alignment  : 64
address sizes  : 43 bits physical, 48 bits virtual
power management:

6、查看CPU的详细信息

[root@node5 ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 142
Model name:            Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz
Stepping:              10
CPU MHz:               2000.921
BogoMIPS:              4002.00
Virtualization:        VT-x
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-3
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec arat
#CPU配置总结
通过以上的查询,我们可以知道该服务器是1路4核的CPU ,CPU型号是Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz,该CPU没有超线程。

内存基本配置查询

查询服务器内存

[root@node5 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3941         286        3446          19         208        3407
Swap:          2047           0        2047
#注释
#linux的内存管理机制的思想包括(不敢说就是)内存利用率最大化。内核会把剩余的内存申请为cached,而cached不属于free范畴。当系统运#行时间较久,会发现cached很大,对于有频繁文件读写操作的系统,这种现象会更加明显。直观的看,此时free的内存会非常小,但并不代表可##用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。所以#对于linux系统,可用于分配的内存不只是free的内存,还包括cached的内存(其实还包括buffers)。
#对于操作系统:
#MemFree=total-used
#MemUsed  = MemTotal - MemFree
#对于应用程序:
#MemFree=buffers+cached+free

每隔3秒查询一下内存

[root@node5 ~]# free -s 3
              total        used        free      shared  buff/cache   available
Mem:        4036316      361144     3458272       19536      216900     3419776
Swap:       2097148           0     2097148
              total        used        free      shared  buff/cache   available
Mem:        4036316      361144     3458272       19536      216900     3419776
Swap:       2097148           0     2097148
              total        used        free      shared  buff/cache   available
Mem:        4036316      361144     3458272       19536      216900     3419776
Swap:       2097148           0     2097148

硬盘基本配置查询

1、查询磁盘整体使用情况

[root@node5 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   17G  4.1G   13G  24% /
devtmpfs                 2.0G     0  2.0G   0% /dev
tmpfs                    2.0G  8.0K  2.0G   1% /dev/shm
tmpfs                    2.0G  8.7M  2.0G   1% /run
tmpfs                    2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda1               1014M  125M  890M  13% /boot
tmpfs                    395M     0  395M   0% /run/user/0
#命令拓展
#df -a 显示全部的文件系统的使用情况
#df -i显示inode信息
#df -k 已字节数显示区块占用情况
#df -T 显示文件系统的类型

2、查询某个目录磁盘占用情况

#命令拓展
#du -s 指定目录大小汇总
#du -h带计量单位
#du -a 含文件
#du --max-depth=1 子目录深度
#du -c 列出明细的同时,增加汇总值
[root@node5 ~]# du -sh /home/
1.7G  /home/
[root@node5 ~]# du -ach --max-depth=2 /home/
4.0K  /home/www/.bash_logout
4.0K  /home/www/.bash_profile
4.0K  /home/www/.bashrc
4.0K  /home/www/web
16K  /home/www
4.0K  /home/nginx/.bash_logout
4.0K  /home/nginx/.bash_profile
4.0K  /home/nginx/.bashrc
12K  /home/nginx
4.0K  /home/esnode/.bash_logout
4.0K  /home/esnode/.bash_profile
4.0K  /home/esnode/.bashrc
4.0K  /home/esnode/.oracle_jre_usage
4.3M  /home/esnode/elasticsearch-analysis-ik-6.2.2.zip
80M  /home/esnode/kibana-6.2.2-linux-x86_64.tar.gz
300M  /home/esnode/x-pack-6.2.2.zip
28M  /home/esnode/elasticsearch-6.2.2.tar.gz
4.0K  /home/esnode/.bash_history
294M  /home/esnode/elasticsearch-6.2.2
4.0K  /home/esnode/.ssh
4.0K  /home/esnode/x-pack生成的秘钥.txt
1014M  /home/esnode/kibana-6.2.2-linux-x86_64
8.0K  /home/esnode/.viminfo
1.7G  /home/esnode
1.7G  /home/
1.7G  total

3、查看目录结构

#tree命令默认没有安装,需要手动安装一下
[root@node5 ~]# yum -y install tree
#-L指定目录深度
[root@node5 ~]# tree -L 2 /home/
/home/
├── esnode
│   ├── elasticsearch-6.2.2
│   ├── elasticsearch-6.2.2.tar.gz
│   ├── elasticsearch-analysis-ik-6.2.2.zip
│   ├── kibana-6.2.2-linux-x86_64
│   ├── kibana-6.2.2-linux-x86_64.tar.gz
│   ├── x-pack-6.2.2.zip
│   └── x-pack347224237346210220347232204347247230351222245.txt
├── nginx
└── www
    └── web
6 directories, 5 files

4、以树状的格式显示所有可用的块设备信息

[root@node5 ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0    1G  0 part /boot
└─sda2            8:2    0   19G  0 part 
  ├─centos-root 253:0    0   17G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0    1G  0 disk 
└─sdb1            8:17   0  200M  0 part 
sr0              11:0    1 1024M  0 rom
#注释
#NAME —— 设备的名称
#MAJ:MIN —— Linux 操作系统中的每个设备都以一个文件表示,对块(磁盘)设备来说,这里用主次设备编号来描述设备。
#RM —— 可移动设备。如果这是一个可移动设备将显示 1,否则显示 0。
#TYPE —— 设备的类型
#MOUNTPOINT —— 设备挂载的位置
#RO —— 对于只读文件系统,这里会显示 1,否则显示 0。
#SIZE —— 设备的容量

列出所有可用的设备、通用唯一识别码(UUID)、文件系统类型以及卷标

[root@node5 ~]# blkid
/dev/sda1: UUID="6503b4ad-2975-4152-a824-feb7bea1b622" TYPE="xfs" 
/dev/sda2: UUID="nqZ4uJ-ksnN-KzYS-N42b-00m3-Ohc2-BJXunP" TYPE="LVM2_member" 
/dev/sdb1: UUID="94396e17-4821-4957-aa76-d41f33958ff5" TYPE="xfs" 
/dev/mapper/centos-root: UUID="c1d38b37-821d-48e7-8727-3937ccc657a4" TYPE="xfs" 
/dev/mapper/centos-swap: UUID="c2fcaf11-42d8-4e4c-bf9e-6464f0777198" TYPE="swap"
转自:人生的哲理
来源:https://www.cnblogs.com/rensh...

图片

图片

查看原文

赞 7 收藏 5 评论 0

民工哥 发布了文章 · 1月18日

字节跳动的无奈!20 亿打水漂。。。

图片

字节跳动的无奈!20亿打水漂了。。。

日前,字节宣布:旗下悟空问答APP将于2021年1月20日0:00起从各大应用商店平台下架,之后将不再提供下载。

2021年2月3日停止运营,关闭服务。之后将不再提供注册、登录、发布内容、查看自己或他人已经发布的内容等相关服务,一句话:悟空问答凉了。。。

图片

悟空APP是今日头条平台旗下的问答社区,经常刷头条的读者应该是非常熟悉,和知乎的问答很类似。前身是头条问答,2017年6月由其升级而成,改名:悟空问答,关闭之前是拥有独立APP端与PC端。

据了解,在问答上线之前,头条就在花大价钱从各大平台挖大V过来,2017年8月,知乎用户“恶魔奶爸Sam”称“今日头条今年一口气签约了300多个知乎大V,而且还是给钱的,年收入比普通白领还高。

也许是为了在问答领域快速抢占市场,收罗用户,头条对悟空问答投入了大量资金,其势头直逼知乎。

2017 年头条创作者大会上,头条副总裁赵添表示:今后会重点发力“微头条”和“悟空问答”两个产品,计划在 2018 年投入 10亿元的补贴于问答版块,签约至少5000名博主大V。至此,悟空问答的“抢‘V’大战”也因此拉开序幕。图片砸钱补贴答主的模式,让不少内容创作者赚的盆满钵满,也让不少做号党也薅了不少的羊毛。

图片但是,之后好景不长,对标知乎的悟空问答出现明显的下降趋势。

根据 QuestMobile数据显示,2018年4月到7月,知乎的MAU(月活跃用户)从3019万增长至3476万,但悟空问答却从93.4万下降至67.9万

相比知乎,悟空问答的运作模式完全是烧钱式的,不断的烧钱抢人,来补充平台的内容与提升整体活跃度,看似用户与内容增长一片繁荣,但真相却并非如此。这种问答社区如果缺少了内容沉淀与一定社区氛围的支撑,光靠一时的用户活跃度(而这种活跃还是一种假象)是无法持续维持社区流量的,终究会衰败下去。

2018年8月低,据报道称,字节跳动要放弃悟空问答业务,并入微头条,团队100多人已转岗。字节跳动则对此回复称,没有放弃问答业务,而是优先级发生了调整。

如今,悟空平台的落幕下线,可能也是早有征兆的事。

这种靠烧钱补贴来刺激作者而形成的短暂繁荣,终究只会是昙花一现,迟早会枯萎。

无论是哪个行业,靠烧钱是不可能维持长久、稳定的发展,钱烧完了,留下的只会是一地鸡毛!!!

查看原文

赞 3 收藏 0 评论 3

民工哥 发布了文章 · 1月18日

每天学一个 Linux 命令(21):tree

图片

昨日推荐:每天学一个 Linux 命令(20):find

命令简介

tree 命令的作用是以树形结构显示目录下的内容。

常用的Linux发行版系统中默认没有这个命令,你需要通过安装才可以使用:

#Centos
yum install tree -y
#Ubuntu
sudo apt-get install tree

安装完成之后就可以正常使用这个tree命令了。

语法格式

tree [选项] [目录]

选项说明

-a   #显示所有文件
-d   #只显示目录(名称)
-l   #显示链接文件的原始文件
-f   #显示所列出的文件或目录的完整目录路径
-i   #不以阶梯的形式显示文件或目录名称
-q   #将控制字符以?字符代替,显示文件和目录名称
-N   #直接显示文件或目录的名称
-p   #显示每个文件的权限信息
-u   #显示文件所有者或者uid
-g   #显示文件所属组或者gid
-s   #显示每个文件的大小信息
-h   #以可读的方式显示文件的大小信息
-D   #显示最后修改日期
-v   #按字母数字正序显示文件
-r   #按字母数字倒序显示文件
-t   #按最后时间排序显示文件
-C   #在文件和目录列表上加上色彩,便于区分文件类型
-P pattern    #只显示匹配正则表式的文件或目录名称
-I pattern    #与上结果相反

应用举例

#树形显示当前目录及其子目录下的文件及目录名称
[root@centos7 testdir]# tree
.
├── dir
│   ├── test2.txt~
│   ├── test3.txt
│   └── test3.txt.bak
├── test2.txt
└── test2.txt~
1 directory, 5 files
#只显示目录名称
[root@centos7 testdir]# tree -d
.
└── dir
1 directory
#显示目录及文件的权限信息
[root@centos7 testdir]# tree -p
.
├── [drwxr-xr-x]  dir
│   ├── [-rw-r--r--]  test2.txt~
│   ├── [-rw-r--r--]  test3.txt
│   └── [-rw-r--r--]  test3.txt.bak
├── [-rw-r--r--]  test2.txt
└── [-rw-r--r--]  test2.txt~
1 directory, 5 files
#显示几层信息2代表2层(向下)
[root@centos7 testdir]# tree -L 2
.
├── dir
│   ├── test2.txt~
│   ├── test3.txt
│   └── test3.txt.bak
├── test2.txt
└── test2.txt~
1 directory, 5 files
[root@centos7 testdir]# tree -L 1
.
├── dir
├── test2.txt
└── test2.txt~
1 directory, 2 files

-C 显示各种文件类型,以颜色区分图片

#显示文件和目录的所有者
[root@centos7 testdir]# tree -u
.
├── [root    ]  cp -> /usr/bin/cp
├── [root    ]  dir
│?? ├── [root    ]  test2.txt~
│?? ├── [root    ]  test3.txt
│?? └── [root    ]  test3.txt.bak
├── [root    ]  test2.txt
└── [root    ]  test2.txt~
1 directory, 6 files
#显示文件和目录的所属组
[root@centos7 testdir]# tree -g
.
├── [root    ]  cp -> /usr/bin/cp
├── [root    ]  dir
│?? ├── [root    ]  test2.txt~
│?? ├── [root    ]  test3.txt
│?? └── [root    ]  test3.txt.bak
├── [root    ]  test2.txt
└── [root    ]  test2.txt~
1 directory, 6 files
#不按树形形式显示文件和目录
[root@centos7 testdir]# tree -i
.
cp -> /usr/bin/cp
dir
test2.txt~
test3.txt
test3.txt.bak
test2.txt
test2.txt~
1 directory, 6 files
[root@centos7 testdir]# tree
.
├── cp -> /usr/bin/cp
├── dir
│   ├── test2.txt~
│   ├── test3.txt
│   └── test3.txt.bak
├── test2.txt
└── test2.txt~
1 directory, 6 files
#显示文件和目录的完整路径
[root@centos7 testdir]# pwd
/root/testdir
[root@centos7 testdir]# tree -f
.
├── ./cp -> /usr/bin/cp
├── ./dir
│   ├── ./dir/test2.txt~
│   ├── ./dir/test3.txt
│   └── ./dir/test3.txt.bak
├── ./test2.txt
└── ./test2.txt~
1 directory, 6 files
[root@centos7 ~]# tree -f ./testdir/
./testdir
├── ./testdir/cp -> /usr/bin/cp
├── ./testdir/dir
│   ├── ./testdir/dir/test2.txt~
│   ├── ./testdir/dir/test3.txt
│   └── ./testdir/dir/test3.txt.bak
├── ./testdir/test2.txt
└── ./testdir/test2.txt~
1 directory, 6 files

tree 命令不难掌握,常用的选项不多,掌握上面的例子中的常见用法之后,在日常工作中应该是够用了。

每天学一个 Linux 命令(19):rm

每天学一个 Linux 命令(18):mv

每天学一个 Linux 命令(17):chmod

查看原文

赞 0 收藏 0 评论 0

民工哥 发布了文章 · 1月17日

为啥这么多公司用 ZooKeeper?它到底解决了什么问题?

图片

目标

ZooKeeper 很流行,有个基本的疑问:

  • ZooKeeper 是用来做什么的?
  • 之前没有ZK,为什么会诞生 ZK?

OK,解答一下上面的疑问:(下面是凭直觉说的)

  • ZooKeeper 是用于简化分布式应用开发的,对开发者屏蔽一些分布式应用开发过程中的底层细节
  • ZooKeeper 对外暴露简单的 API,用于支持分布式应用开发
  • ZooKeeper 在提供上述功能的同时,其还是一个 高性能、高可用、高可靠的分布式集群

上面说这么多,总结一下,ZK 能解决分布式应用开发的问题,ZK 能很好的解决问题。到这一步,疑问就更多了:

  • 分布式应用开发,有哪些常见问题?ZK 是如何屏蔽这些底层细节的?
  • ZooKeeper 对外暴露了那些 API?这些 API 如何支持分布式应用开发的?这些 API 还-能简化吗?API 的语义性怎么样?
  • ZooKeeper 自身是一个高性能、高可用、高可靠的分布式集群,那有个简单的问题:
  • 高性能是指什么?ZooKeeper 为了达到高性能,做了哪些工作?
  • 高可用同上
  • 高可靠同上

为什么有ZooKeeper

一个应用程序,涉及多个进程协作时,业务逻辑代码中混杂有大量复杂的进程协作逻辑。图片上述多进程协作逻辑,有 2 个特点:

  • 处理复杂
  • 处理逻辑可重用

因此,考虑将多进程协作的共性问题拎出,作为基础设施,让 RD 更加专注业务逻辑开发,即:图片ZooKeeper 就是上述多进程协作基础服务的一种。

ZooKeeper的特点

ZooKeeper 有几个简单特点:
  • ZooKeeper 的 API:从 文件系统 API 得到的启发,提供简单的 API
  • ZooKeeper 运行在专用服务器上,跟业务逻辑分离,保证了高容错性和可扩展性

ZooKeeper 是存储设施,但特别注意

  • ZK上存储的数据聚焦为:协作数据(元数据),而不是应用数据,应用数据有自己的存储方案,例如 HDFS 等
  • ZK 本质上,可以看作一种特殊的 FS

特别说明:应用数据和元数据,由于使用场景不同,对一致性和持久性的要求有差异, 因此,架构设计、数据治理过程中,应将 2 类数据独立看待、独立存储。

ZooKeeper的使命

ZK 要解决的核心问题:

ZK 目标:简化分布式应用开发中,多进程协作问题。为分布式应用,提供高效、可靠的分布式协调服务(基础服务),例如:

  • 统一的命名服务
  • 分布式锁
  • 进程崩溃检测
  • Leader 选举

配置管理:配置变更时,及时下发到各个 Client。

一个简单的问题:多进程的协作是什么?尼玛呀,有完没完,啥问题你都有,面对这个掉咋天的脑壳,还是回答一下。

多进程协作,整体分为 2 类:

  • 协作:多进程需要一同处理某些事情,一些进程采取行动是的其他进程能够正常工作,例如:主从结构,M 向 S 分配任务,S 才会执行,否则 S 就保持空闲状态
  • 竞争:两个进程不能同时工作,一个进程必须等待另个进程执行完毕,例如:主从结构,M 节点失效后,很多 S 都想成为 M,这时,就需要互斥锁,只有第一个获得锁的 S 成为 M

特别说明:

  • 不跨网络协作:多进程,可以在同一台物理主机上,同步原语很方便(比如?管道、共享内存、消息队列、信号量)
  • 跨网络协作:多进程,分布在不同的物理主机上,ZK 关注这一类

跨网络多进程协作,进程通信,基本思路有 2 个:

  • 消息机制:通过网络,直接信息交换,多消息传递算法,实现同步原语
  • 共享存储:利用外部共享存储,实现多进程协作,要求共享存储提供有序访问,ZK 采用这种方式

真实系统中,跨网络通信,有几个共性问题:

  • 消息延迟:由于网络原因,后发送先到达
  • 处理器性能:由于系统调度原因,消息到达后,延迟处理
  • 时钟偏移:不同物理主机,时钟发生偏移

ZK 精心设计用于屏蔽上述 3 个共性问题,使得这些问题在应用服务层面完全透明化。

ZooKeeper 特性

ZooKeeper 解决的本质问题

分布式系统的一致性问题:

  • 消息传递:延迟性,先发送的消息,不一定先到达;
  • 消息传递:丢失性,发送的消息,可能丢失;
  • 节点崩溃:分布式系统内,任何一个节点都可能崩溃;

在这种情况下,如何保证数据的一致性?

  • 提案投票:基于投票策略,2PC
  • 选举投票:基于投票策略,投出优先级最高的节点(包含最新数据的节点)

Paxos 目标:解决分布式一致性问题,提高分布式系统容错性的一致性算法。

Paxos 本质:基于消息传递的高度容错的一致性算法

ZooKeeper 定位

ZooKeeper 是:
  • 分布式协调服务
  • 高效、可靠
  • 方便应用程序,聚焦业务逻辑开发,而不需要过多关注分布式进程间协作细节

ZooKeeper 不直接暴露原语,而是,暴露一部分调用方法组成的 API,类似文件系统的 API,支持应用程序实现自己的原语。

ZooKeeper 特性

ZooKeeper 可以保证如下分布式一致性特性:

  • 顺序一致性:同一个 Client 发起的事务请求,严格按照发起顺序执行
  • 原子性:事务请求,要么应用到所有节点,要么一个节点都没有应用
  • 单一视图:Client 无论连接到哪个节点,看到的服务端数据都是一致的(Note:不准确,其实是最终一致性)
  • 可靠性:事务一旦执行成功,状态永久保留
  • 实时性:事务一旦执行成功,Client 并不能立即看到最新数据,但 ZooKeeper 保证最终一致性
ZooKeeper 设计目标

ZooKeeper 致力于提供高性能、高可用、顺序一致性的分布式协调服务,保证数据最终一致性。

目标一:高性能(简单的数据模型)

  • 采用树形结构组织数据节点;
  • 全量数据节点,都存储在内存中;
  • Follower 和 Observer 直接处理非事务请求;

目标二:高可用(构建集群)

  • 半数以上机器存活,服务就能正常运行
  • 自动进行 Leader 选举

目标三:顺序一致性(事务操作的顺序)

  • 每个事务请求,都会转发给 Leader 处理
  • 每个事务,会分配全局唯一的递增id(zxid,64位:epoch + 自增 id)

目标四:最终一致性

  • 通过提议投票方式,保证事务提交的可靠性
  • 提议投票方式,只能保证 Client 收到事务提交成功后,半数以上节点能够看到最新数据

ZooKeeper 出现之前

ZK 出现之前,分布式系统常用两种方式,实现多进程协作:

  • 分布式锁管理器
  • 分布式数据库

ZK 更专注于进程协作,而不提供任何锁接口和通用的存储数据接口。(疑问:ZK 也可以提供啊,我们不使用就行了)

应用服务器,常见的 2 种需求:

  • Master-Slave Leader 选举:要求提供Master节点选举功能
  • 进程响应跟踪崩溃检测:要求提供进程存活状态的跟踪
  • 分布式锁:互斥排它锁

ZK 为上述 2 种策略提供了基础 API。

ZooKeeper 不适用的场景:

海量数据存储:ZK 本质是特殊的 FS,但 ZK 用于存储元数据,需要单独存储应用数据

专业术语介绍图片

文章来源:http://ningg.top/zookeeper-po...

image

查看原文

赞 5 收藏 3 评论 1

民工哥 发布了文章 · 1月17日

每天学一个 Linux 命令(20):find

图片

昨日推荐:每天学一个 Linux 命令(19):rm

命令简介

find 命令在文件系统中搜索文件和目录。

find 命令用来在指定目录下查找文件,在参数之前的任何字符串都会当作是目录名。使用 find 命令时,如何不设置任何参数,则 find 命令将在当前目录下查找子目录与文件,并且将查找到的子目录和文件全部显示出来。

find 还是一个功能非常强大的用于处理 Linux 系统上文件的工具,它可以单独查找文件,也可以与其他程序(命令)结合对需要处理的文件进行操作。

补充说明

Linux文件类型:

f #普通文件
l #符号连接
d #目录
c #字符设备
b #块设备
s #套接字
p #Fifo

UNIX/Linux文件系统中的每个文件都有三种时间戳:

  • 访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。
  • 修改时间 (-mtime/天,-mmin/分钟):文件最后一次被修改的时间。
  • 变化时间 (-ctime/天,-cmin/分钟):文件元数据(例如权限等)

语法格式

find [目录路径] [选项] [文件名]
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

选项说明

-amin<分钟>:#查找在指定时间内被存取过的文件或目录,单位分钟
-mmin<分钟>:#查找在指定时间内被更改过的文件或目录,单位分钟
-mtime<24小时数>:#查找在指定时间内被更改过的文件或目录,单位24小时
-atime<24小时数>:#查找在指定时间被写入过的文件或目录,单位24小时
-cmin<分钟>:#查找在指定时间之内被更改过的文件或目录
-ctime<24小时数>:#查找在指定时间之时被更改的文件或目录,单位以24小时计算
-daystart:#从今天开始计算时间
-depth:#从指定目录下最深层的子目录开始查找
-exec<执行指令>:#如果find命令返回值为True,就执行该指令
-false:#将find命令返回值都设为False
-fstype<文件系统类型>:#只查找此指定文件系统类型下的文件或目录
-gid<群组识别码>:#查找匹配此群组识别码的文件或目录
-group<群组名称>:#查找匹配此群组名称的文件或目录
-help或——help:#帮助信息
-links<连接数目>:#查找匹配指定的硬连接数目的文件或目录
-maxdepth<目录层级>:#设置查找的最大目录层级
-mindepth<目录层级>:#设置查找的最小目录层级
-name<范本样式>:#指定字符串作为寻找文件或目录的范本
-path<范本样式>:#指定字符串作为寻找目录的范本样式
-perm<权限数值>:#查找符合指定的权限数值的文件或目录
-size<文件大小>:#查找符合指定的文件大小的文件
-true: #将find命令返回值都设为True
-type<文件类型>:#只查找匹配指定的文件类型的文件
-uid<用户识别码>:#只查找匹配指定的用户识别码的文件或目录
-user<拥有者名称>:#只查找匹配指定的拥有者名称的文件或目录
-version:#显示版本信息

应用举例

当前目录搜索所有文件,文件内容包含 “192.168.1.111” 的内容

find . -type f -name "*" | xargs grep "192.168.1.111"

根据文件或者正则表达式进行匹配,查找需要的文件或目录

#列出当前目录及子目录下所有文件和文件夹
[root@centos7 ~]# find .
 
#在/mingongge目录下查找包含mingongge开头的文件名
[root@centos7 ~]# find /mingongge -name "mingongge*.log"
/mingongge/mingongge_errors.log
/mingongge/mingongge.log
/mingongge/mingongge_test.log
 
#当前目录及子目录下查找所有以.txt和.log结尾的文件
[root@centos7 ~]# find . ( -name "*.txt" -o -name "*.log" ) 
或
[root@centos7 ~]# find . -name "*.txt" -o -name "*.log"
 
#匹配文件路径或者文件
[root@centos7 ~]# find /usr/ -path "*txt*"
 
#基于正则表达式匹配文件路径
[root@centos7 ~]# find . -regex ".*(.txt|.log)$"
 
#忽略大小写
[root@centos7 ~]# find . -iregex ".*(.txt|.log)$"

find 否定参数用法举例

#找出/mingongge下不是以.log结尾的文件
[root@centos7 ~]# find /mingongge ! -name "*.log"

基于目录深度搜索

#向下最大深度限制为5
[root@centos7 ~]# find . -maxdepth 5 -type f
 
#搜索出深度距离当前目录至少3个子目录的所有文件
[root@centos7 ~]# find . -mindepth 3 -type f

根据文件时间戳进行查找

#查找最近10天内被访问过的所有文件
[root@centos7 ~]# find . -type f -atime -10
 
#查找超过10天内被访问过的所有文件
[root@centos7 ~]# find . -type f -atime +10
 
#查找访问时间超过20分钟的所有文件
[root@centos7 ~]# find . -type f -amin +20
 
#找出比mingongge修改时间更长的所有文件
[root@centos7 ~]# find . -type f -newer mingongge

删除查找到的匹配文件

#删除当前目录下所有.txt文件
[root@centos7 ~]# find . -type f -name "*.txt" -delete

根据文件权限/所有权进行匹配:

#当前目录下找出权限为777的文件
[root@centos7 ~]# find . -type f -perm 777#找出当前目录下所有者是mingongge的所有文件
[root@centos7 ~]# find . -type f -user mingongge
 
#找出当前目录下用户组为mingongge的所有文件
[root@centos7 ~]# find . -type f -group mingongge #找出当前目录下权限不是644的.log文件
[root@centos7 ~]# find . -type f -name "*.log" ! -perm 644

find 和 -exec 选项结合使用

#找出当前目录下所有者为root的文件,并把所有者更改为mingongge这个用户
[root@centos7 ~]# find .-type f -user root -exec chown mingongge {} ;
 
#找出当前用户家目录下所有的.log文件并执行删除动作
[root@centos7 ~]# find $HOME/. -name "*.log" -exec rm {} ;
 
#查找当前目录下所有.log文件并将他们拼接起来然后写入到mingongge.txt这个文件中
[root@centos7 ~]# find . -type f -name "*.log" -exec cat {} ;> /mingongge.txt
 
#查找出10天前的.log文件,然后全部移动到mingongge目录下
[root@centos7 ~]# find . -type f -mtime +10 -name "*.log" -exec cp {} mingongge ;
 
#找出当前目录下所有.log文件,然后以“File:文件名”的格式打印输出到屏幕上
[root@centos7 ~]# find . -type f -name "*.log" -exec printf "File: %sn" {} ;

根据文件大小来查找目标文件

#查找当前目录下文件大小超过500M的文件
[root@centos7 ~]# find . -type f -size +500M 
./mingongge/backup_file.tar.gz
./mingongge/upload.tar.gz
 
#查找当前目录超过500M的文件,并打印出文件的详细属性信息
[root@centos7 ~]# find . -type f -size +800M  -print0 | xargs -0 ls -l 
-rw-r--r-- 1 root root  4250099200 Apr 15  2019 ./mingongge/backup_file.tar.gz
-rw-r--r-- 1 root root 6832225765 Oct 14 12:57 ./mingongge/upload.tar.gz
 
#查找当前目录超过500M的文件,并打印出文件的具体大小
[root@centos7 ~]# find . -type f -size +500M  -print0 | xargs -0 du -h|sort -nr
6.8G    ./mingongge/upload.tar.gz
4G     ./mingongge/backup_file.tar.gz

查找系统中前5的大文件

# find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 5
1.1G    /download/ubuntu-17.04-desktop-amd64.iso
377M    /download/app_backup.tar.gz
100M    /usr/lib/x86_64-linux-gnu/libOxideQtCore.so.0
93M /usr/lib/firefox/libxul.so
84M /var/lib/snapd/snaps/core_3604.snap

方法有很多种,都需要与其它命令配合使用,才能查找出来。

find 命令在文件查找及其它的应用方面具有强大的功能,学习系统命令,find 命令是需要重点掌握的,不管是平时的学习,还是日后工作中,这个命令都有着非常重要的作用。
image

查看原文

赞 6 收藏 2 评论 0