2019年9月

开源社区和行业趋势的每周总览。

 title=

作为我在具有开源开发模型的企业软件公司担任高级产品营销经理的角色的一部分,我为产品营销人员、经理和其他影响者定期发布有关开源社区,市场和行业趋势的定期更新。 以下是该更新中我和他们最喜欢的五篇文章。

《为什么现代 web 开发如此复杂?》

现代前端 web 开发带来了一种两极分化的体验:许多人喜欢它,而其他人则鄙视它。

我是现代Web开发的忠实拥护者,尽管我将其描述为“魔法”——而魔法也有其优点和缺点……。最近,我一直在向那些只具有粗略的原始 web 开发工作流程的人们讲解“现代 web 开发工作流程”……,但我发现需要解释的内容实在是太多了!甚至笼统的解释最终都会变得冗长。因此,在我努力写下更多解释的过程中,这里是对 web 开发演变的一个长期而笼统的解释的开始……

影响:足够具体,对前端开发人员非常有用(特别是对新开发人员),且足够简单,解释得足够好,可以帮助非开发人员更好地理解前端开发人员的一些问题。到最后,你将(有点)了解 Javascript 和 WebAPI 之间的区别,以及 2019 年的 Javascript 与 2006 年的 Javascript 有何不同。

开源 Kubernetes 安全审计

去年,云原生计算基金会(CNCF)开始为其项目执行并开源第三方安全审计,以提高我们生态系统的整体安全性。这个想法是从一些项目开始,并从 CNCF 社区收集了关于这个试点项目是否有用的反馈。第一批经历这个过程的项目是 CoreDNSEnvoyPrometheus。这些首次公开审计发现了从一般漏洞到严重漏洞的安全问题。有了这些结果,CoreDNS、Envoy 和 Prometheus 的项目维护者就能够解决已发现的漏洞,并添加文档来帮助用户。

从这些初始审计中得出的主要结论是,公开安全审计是测试开源项目的质量及其漏洞管理过程的一个很好的方法,更重要的是,测试开源项目的安全实践有多大的弹性。特别是 CNCF 的毕业项目,它们被世界上一些最大的公司广泛应用于生产中,它们必须坚持最高级别的安全最佳实践。

影响:就像 Linux 之于数据中心一样,很多公司都把云计算押宝在 Kubernetes 上。从安全的角度来看,看到其中 4 家公司以确保项目正在做应该做的事情,这激发了人们的信心。共享这项研究表明,开源远远不止是仓库中的代码;它是以一种有益于整个社区而不是少数人利益的方式获取和分享专家意见。

Quarkus——这个轻量级 Java 框架的下一步是什么?

“容器优先”是什么意思?Quarkus 有哪些优势?0.20.0 版本有什么新功能?未来我们可以期待哪些功能?1.0.0 版什么时候发布?我们对 Quarkus 有很多问题,而 Alex Soto 也很耐心地回答了所有问题。 随着 Quarkus 0.20.0 的发布,我们和 JAX 伦敦演讲者,Java 拥护者和红帽的开发人员体验总监 Alex Soto 进行了接触。他很好地回答了我们关于 Quarkus 的过去、现在和未来的所有问题。看起来我们对这个令人兴奋的轻量级框架有很多期待!

影响:最近有个聪明的人告诉我,Quarkus 有潜力使 Java “可能成为容器和无服务器环境的最佳语言之一”。不禁使我多看了一眼。尽管 Java 是最流行的编程语言之一(如果不是最流行的),但当你听到“云原生”一词时,它可能并不是第一个想到的语言。Quarkus 可以通过让开发人员将他们的经验应用到新的挑战中,从而扩展和提高他们所拥有的技能的价值。

Julia 编程语言:用户批露他们最喜欢和最讨厌它的地方

Julia 最受欢迎的技术特性是速度和性能,其次是易用性,而最受欢迎的非技术特性是使用者无需付费即可使用它。

用户还报告了他们对该语言最大的不满。排在首位的是附加功能的包不够成熟,或者维护得不够好,无法满足他们的需求。

影响:Julia 1.0 版本已经发布了一年,并且在一系列相关指标(下载、GitHub 星级等)中取得了令人瞩目的增长。它是一种直接针对我们当前和未来最大挑战(“科学计算、机器学习、数据挖掘、大规模线性代数、分布式和并行计算”)的语言,因此,了解用户对它的感受,就可以间接看到有关这些挑战的应对情况。

多云数据解读:11 个有趣的统计数据

如果你把我们最近对 Kubernetes 的有趣数据的深入研究归结最基本的一条,它看起来是这样的:Kubernetes 的受欢迎程度在可预见的未来将持续下去。

剧透警报:当你挖掘有关多云使用情况的最新数据时,他们告诉你一个类似的描述:使用率正在飙升。

这种一致性是有道理的。也许不是每个组织都将使用 Kubernetes 来管理其多云和/或混合云基础架构,但是两者越来越紧密地联系在一起。即使不这样做,它们都反映了向更分散和异构 IT 环境的普遍转变,以及云原生开发和其他重叠趋势。

影响:越来越多地采用“多云战略”的另一种解释是,它们将组织中单独部分未经协商而作出的决策追溯为“战略”,从而使决策合法化。“等等,所以你从谁那里买了几个小时?又从另一个人那里买了几个小时?为什么在会议纪要中没有呢?我想我们现在是一家多云公司!”。当然,我在开玩笑,我敢肯定大多数大公司的协调能力远胜于此,对吗?

我希望你喜欢这张上周让我印象深刻的列表,并在下周一回来了解更多的开放源码社区、市场和行业趋势。


via: https://opensource.com/article/19/8/cloud-native-java-and-more

作者:Tim Hildred 选题:lujun9972 译者:laingke 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

chgrp 和 newgrp 命令可帮助你管理需要维护组所有权的文件。

在最近的一篇文章中,我介绍了 chown 命令,它用于修改系统上的文件所有权。回想一下,所有权是分配给一个对象的用户和组的组合。chgrpnewgrp 命令为管理需要维护组所有权的文件提供了帮助。

使用 chgrp

chgrp 只是更改文件的组所有权。这与 chown :<group> 命令相同。你可以使用:

$chown :alan mynotes

或者:

$chgrp alan mynotes

递归

chgrp 和它的一些参数可以用在命令行和脚本中。就像许多其他 Linux 命令一样,chgrp 有一个递归参数 -R。如下所示,你需要它来对文件夹及其内容进行递归操作。我加了 -v(详细)参数,因此 chgrp 会告诉我它在做什么:

$ ls -l . conf
.:
drwxrwxr-x 2 alan alan 4096 Aug  5 15:33 conf

conf:
-rw-rw-r-- 1 alan alan 0 Aug  5 15:33 conf.xml
# chgrp -vR delta conf
changed group of 'conf/conf.xml' from alan to delta
changed group of 'conf' from alan to delta

参考

当你要更改文件的组以匹配特定的配置,或者当你不知道具体的组时(比如你运行一个脚本时),可使用参考文件 (--reference=RFILE)。你可以复制另外一个作为参考的文件(RFILE)的组。比如,为了撤销上面的更改 (请注意,点 . 代表当前工作目录):

$ chgrp -vR --reference=. conf

报告更改

大多数命令都有用于控制其输出的参数。最常见的是 -v 来启用详细信息,而且 chgrp 命令也拥有详细模式。它还具有 -c--changes)参数,指示 chgrp 仅在进行了更改时报告。chgrp 还会报告其他内容,例如是操作不被允许时。

参数 -f--silent--quiet)用于禁止显示大部分错误消息。我将在下一节中使用此参数和 -c 来显示实际更改。

保持根目录

Linux 文件系统的根目录(/)应该受到高度重视。如果命令在此层级犯了一个错误,那么后果可能是可怕的,并会让系统无法使用。尤其是在运行一个会递归修改甚至删除的命令时。chgrp 命令有一个可用于保护和保持根目录的参数。它是 --preserve-root。如果在根目录中将此参数和递归一起使用,那么什么也不会发生,而是会出现一条消息:

[root@localhost /]# chgrp -cfR --preserve-root a+w /
chgrp: it is dangerous to operate recursively on '/'
chgrp: use --no-preserve-root to override this failsafe

不与递归(-R)结合使用时,该选项无效。但是,如果该命令由 root 用户运行,那么 / 的权限将会更改,但其下的其他文件或目录的权限则不会被更改:

[alan@localhost /]$ chgrp -c --preserve-root alan /
chgrp: changing group of '/': Operation not permitted
[root@localhost /]# chgrp -c --preserve-root alan /
changed group of '/' from root to alan

令人惊讶的是,它似乎不是默认参数。而选项 --no-preserve-root 是默认的。如果你在不带“保持”选项的情况下运行上述命令,那么它将默认为“无保持”模式,并可能会更改不应更改的文件的权限:

[alan@localhost /]$ chgrp -cfR alan /
changed group of '/dev/pts/0' from tty to alan
changed group of '/dev/tty2' from tty to alan
changed group of '/var/spool/mail/alan' from mail to alan

关于 newgrp

newgrp 命令允许用户覆盖当前的主要组。当你在所有文件必须有相同的组所有权的目录中操作时,newgrp 会很方便。假设你的内网服务器上有一个名为 share 的目录,不同的团队在其中存储市场活动照片。组名为 share。当不同的用户将文件放入目录时,文件的主要组可能会变得混乱。每当添加新文件时,你都可以运行 chgrp 将错乱的组纠正为 share

$ cd share
ls -l
-rw-r--r--. 1 alan share 0 Aug  7 15:35 pic13
-rw-r--r--. 1 alan alan 0 Aug  7 15:35 pic1
-rw-r--r--. 1 susan delta 0 Aug  7 15:35 pic2
-rw-r--r--. 1 james gamma 0 Aug  7 15:35 pic3
-rw-rw-r--. 1 bill contract  0 Aug  7 15:36 pic4

我在 chmod 命令的文章中介绍了 setgid 模式。它是解决此问题的一种方法。但是,假设由于某种原因未设置 setgid 位。newgrp 命令在此时很有用。在任何用户将文件放入 share 目录之前,他们可以运行命令 newgrp share。这会将其主要组切换为 share,因此他们放入目录中的所有文件都将有 share 组,而不是用户自己的主要组。完成后,用户可以使用以下命令切换回常规主要组(举例):

newgrp alan

总结

了解如何管理用户、组和权限非常重要。最好知道一些替代方法来解决可能遇到的问题,因为并非所有环境都以相同的方式设置。


via: https://opensource.com/article/19/9/linux-chgrp-and-newgrp-commands

作者:Alan Formy-Duval 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

了解 .NET 开发平台启动和运行的基础知识。

.NET 框架由 Microsoft 于 2000 年发布。该平台的开源实现 Mono 在 21 世纪初成为了争议的焦点,因为微软拥有 .NET 技术的多项专利,并且可能使用这些专利来终止 Mono 项目。幸运的是,在 2014 年,微软宣布 .NET 开发平台从此成为 MIT 许可下的开源平台,并在 2016 年收购了开发 Mono 的 Xamarin 公司。

.NET 和 Mono 已经同时可用于 C#、F#、GTK+、Visual Basic、Vala 等的跨平台编程环境。使用 .NET 和 Mono 创建的程序已经应用于 Linux、BSD、Windows、MacOS、Android,甚至一些游戏机。你可以使用 .NET 或 Mono 来开发 .NET 应用。这两个都是开源的,并且都有活跃和充满活力的社区。本文重点介绍微软的 .NET 环境。

如何安装 .NET

.NET 下载被分为多个包:一个仅包含 .NET 运行时,另一个 .NET SDK 包含了 .NET Core 和运行时。根据架构和操作系统版本,这些包可能有多个版本。要开始使用 .NET 进行开发,你必须安装该 SDK。它为你提供了 dotnet 终端或 PowerShell 命令,你可以使用它们来创建和生成项目。

Linux

要在 Linux 上安装 .NET,首先将微软 Linux 软件仓库添加到你的计算机。

在 Fedora 上:

$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
$ sudo wget -q -O /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/27/prod.repo

在 Ubuntu 上:

$ wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb

接下来,使用包管理器安装 SDK,将 <X.Y> 替换为当前版本的 .NET 版本:

在 Fedora 上:

$ sudo dnf install dotnet-sdk-<X.Y>

在 Ubuntu 上:

$ sudo apt install apt-transport-https
$ sudo apt update
$ sudo apt install dotnet-sdk-<X.Y>

下载并安装所有包后,打开终端并输入下面命令确认安装:

$ dotnet --version
X.Y.Z

Windows

如果你使用的是微软 Windows,那么你可能已经安装了 .NET 运行时。但是,要开发 .NET 应用,你还必须安装 .NET Core SDK。

首先,下载安装程序。请认准下载 .NET Core 进行跨平台开发(.NET Framework 仅适用于 Windows)。下载 .exe 文件后,双击该文件启动安装向导,然后单击两下进行安装:接受许可证并允许安装继续。

 title=

然后,从左下角的“应用程序”菜单中打开 PowerShell。在 PowerShell 中,输入测试命令:

PS C:\Users\osdc> dotnet

如果你看到有关 dotnet 安装的信息,那么说明 .NET 已正确安装。

MacOS

如果你使用的是 Apple Mac,请下载 .pkg 形式的 Mac 安装程序。下载并双击该 .pkg 文件,然后单击安装程序。你可能需要授予安装程序权限,因为该软件包并非来自 App Store。

下载并安装所有软件包后,请打开终端并输入以下命令来确认安装:

$ dotnet --version
X.Y.Z

Hello .NET

dotnet 命令提供了一个用 .NET 编写的 “hello world” 示例程序。或者,更准确地说,该命令提供了示例应用。

首先,使用 dotnet 命令以及 newconsole 参数创建一个控制台应用的项目目录及所需的代码基础结构。使用 -o 选项指定项目名称:

$ dotnet new console -o hellodotnet

这将在当前目录中创建一个名为 hellodotnet 的目录。进入你的项目目录并看一下:

$ cd hellodotnet
$ dir
hellodotnet.csproj  obj  Program.cs

Program.cs 是一个空的 C# 文件,它包含了一个简单的 Hello World 程序。在文本编辑器中打开查看它。微软的 Visual Studio Code 是一个使用 dotnet 编写的跨平台的开源应用,虽然它不是一个糟糕的文本编辑器,但它会收集用户的大量数据(在它的二进制发行版的许可证中授予了自己权限)。如果要尝试使用 Visual Studio Code,请考虑使用 VSCodium,它是使用 Visual Studio Code 的 MIT 许可的源码构建的版本,而没有远程收集(请阅读此文档来禁止此构建中的其他形式追踪)。或者,只需使用现有的你最喜欢的文本编辑器或 IDE。

新控制台应用中的样板代码为:

using System;

namespace hellodotnet
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

要运行该程序,请使用 dotnet run 命令:

$ dotnet run
Hello World!

这是 .NET 和 dotnet 命令的基本工作流程。这里有完整的 .NET C# 指南,并且都是与 .NET 相关的内容。关于 .NET 实战示例,请关注 Alex Bunardzic 在 opensource.com 中的变异测试文章。


via: https://opensource.com/article/19/9/getting-started-net

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助,我们才可以与朋友畅聊无忌。Facebook MessengerWhatsAppSkype 就是其中的几个例子。正如你所看到的那样,这些应用允许我们发送图片、传输视频、录制音频、以及和一大帮子人聊天等等。当然,我们的教程应用将会尽量保持简单,只在两个用户之间发送文本消息。

我们将会用 CockroachDB 作为 SQL 数据库,用 Go 作为后端语言,并且用 JavaScript 来制作 web 应用。

这是第一篇帖子,我们将会讲述数据库的设计。

CREATE TABLE users (
    id SERIAL NOT NULL PRIMARY KEY,
    username STRING NOT NULL UNIQUE,
    avatar_url STRING,
    github_id INT NOT NULL UNIQUE
);

显然,这个应用需要一些用户。我们这里采用社交登录的形式。由于我选用了 GitHub,所以这里需要保存一个对 GitHub 用户 ID 的引用。

CREATE TABLE conversations (
    id SERIAL NOT NULL PRIMARY KEY,
    last_message_id INT,
    INDEX (last_message_id DESC)
);

每个对话都会引用最近一条消息。每当我们输入一条新消息时,我们都会更新这个字段。我会在后面添加外键约束。

… 你可能会想,我们可以先对对话进行分组,然后再通过这样的方式获取最近一条消息。但这样做会使查询变得更加复杂。

CREATE TABLE participants (
    user_id INT NOT NULL REFERENCES users ON DELETE CASCADE,
    conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE,
    messages_read_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    PRIMARY KEY (user_id, conversation_id)
);

尽管之前我提到过对话只会在两个用户之间进行,但我们还是采用了允许向对话中添加多个参与者的设计。因此,在对话和用户之间有一个参与者表。

为了知道用户是否有未读消息,我们在消息表中添加了“读取时间”(messages_read_at)字段。每当用户在对话中读取消息时,我们都会更新它的值,这样一来,我们就可以将它与对话中最后一条消息的“创建时间”(created_at)字段进行比较。

CREATE TABLE messages (
    id SERIAL NOT NULL PRIMARY KEY,
    content STRING NOT NULL,
    user_id INT NOT NULL REFERENCES users ON DELETE CASCADE,
    conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
    INDEX(created_at DESC)
);

尽管我们将消息表放在最后,但它在应用中相当重要。我们用它来保存对创建它的用户以及它所出现的对话的引用。而且还可以根据“创建时间”(created_at)来创建索引以完成对消息的排序。

ALTER TABLE conversations
ADD CONSTRAINT fk_last_message_id_ref_messages
FOREIGN KEY (last_message_id) REFERENCES messages ON DELETE SET NULL;

我在前面已经提到过这个外键约束了,不是吗:D

有这四张表就足够了。你也可以将这些查询保存到一个文件中,并将其通过管道传送到 Cockroach CLI。

首先,我们需要启动一个新节点:

cockroach start --insecure --host 127.0.0.1

然后创建数据库和这些表:

cockroach sql --insecure -e "CREATE DATABASE messenger"
cat schema.sql | cockroach sql --insecure -d messenger

这篇帖子就到这里。在接下来的部分中,我们将会介绍「登录」,敬请期待。


via: https://nicolasparada.netlify.com/posts/go-messenger-schema/

作者:Nicolás Parada 选题:lujun9972 译者:PsiACE 校对:wxy

本文由 LCTT 原创编译,Linux 中国 荣誉推出

Elastic stack 俗称 ELK stack,是一组包括 Elasticsearch、Logstash 和 Kibana 在内的开源产品。Elastic Stack 由 Elastic 公司开发和维护。使用 Elastic stack,可以将系统日志发送到 Logstash,它是一个数据收集引擎,接受来自可能任何来源的日志或数据,并对日志进行归一化,然后将日志转发到 Elasticsearch,用于分析、索引、搜索和存储,最后使用 Kibana 表示为可视化数据,使用 Kibana,我们还可以基于用户的查询创建交互式图表。

在本文中,我们将演示如何在 RHEL 8 / CentOS 8 服务器上设置多节点 elastic stack 集群。以下是我的 Elastic Stack 集群的详细信息:

Elasticsearch:

  • 三台服务器,最小化安装 RHEL 8 / CentOS 8
  • IP & 主机名 – 192.168.56.40(elasticsearch1.linuxtechi.local)、192.168.56.50 (elasticsearch2.linuxtechi.local)、192.168.56.60(elasticsearch3.linuxtechi.local`)

Logstash:**

  • 两台服务器,最小化安装 RHEL 8 / CentOS 8
  • IP & 主机 – 192.168.56.20(logstash1.linuxtechi.local)、192.168.56.30(logstash2.linuxtechi.local

Kibana:

  • 一台服务器,最小化安装 RHEL 8 / CentOS 8
  • IP & 主机名 – 192.168.56.10(kibana.linuxtechi.local

Filebeat:

  • 一台服务器,最小化安装 CentOS 7
  • IP & 主机名 – 192.168.56.70(web-server

让我们从设置 Elasticsearch 集群开始,

设置3个节点 Elasticsearch 集群

正如我已经说过的,设置 Elasticsearch 集群的节点,登录到每个节点,设置主机名并配置 yum/dnf 库。

使用命令 hostnamectl 设置各个节点上的主机名:

[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch1.linuxtechi. local"
[root@linuxtechi ~]# exec bash
[root@linuxtechi ~]#
[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch2.linuxtechi. local"
[root@linuxtechi ~]# exec bash
[root@linuxtechi ~]#
[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch3.linuxtechi. local"
[root@linuxtechi ~]# exec bash
[root@linuxtechi ~]#

对于 CentOS 8 系统,我们不需要配置任何操作系统包库,对于 RHEL 8 服务器,如果你有有效订阅,那么用红帽订阅以获得包存储库就可以了。如果你想为操作系统包配置本地 yum/dnf 存储库,请参考以下网址:

在所有节点上配置 Elasticsearch 包存储库,在 /etc/yum.repo.d/ 文件夹下创建一个包含以下内容的 elastic.repo 文件:

~]# vi /etc/yum.repos.d/elastic.repo

[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

保存文件并退出。

在所有三个节点上使用 rpm 命令导入 Elastic 公共签名密钥。

~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

在所有三个节点的 /etc/hosts 文件中添加以下行:

192.168.56.40             elasticsearch1.linuxtechi.local
192.168.56.50             elasticsearch2.linuxtechi.local
192.168.56.60             elasticsearch3.linuxtechi.local

使用 yum/dnf 命令在所有三个节点上安装 Java:

[root@linuxtechi ~]# dnf install java-openjdk -y
[root@linuxtechi ~]# dnf install java-openjdk -y
[root@linuxtechi ~]# dnf install java-openjdk -y

使用 yum/dnf 命令在所有三个节点上安装 Elasticsearch:

[root@linuxtechi ~]# dnf install elasticsearch -y
[root@linuxtechi ~]# dnf install elasticsearch -y
[root@linuxtechi ~]# dnf install elasticsearch -y

注意: 如果操作系统防火墙已启用并在每个 Elasticsearch 节点中运行,则使用 firewall-cmd 命令允许以下端口开放:

~]# firewall-cmd --permanent --add-port=9300/tcp
~]# firewall-cmd --permanent --add-port=9200/tcp
~]# firewall-cmd --reload

配置 Elasticsearch, 在所有节点上编辑文件 /etc/elasticsearch/elasticsearch.yml 并加入以下内容:

~]# vim /etc/elasticsearch/elasticsearch.yml

cluster.name: opn-cluster
node.name: elasticsearch1.linuxtechi.local
network.host: 192.168.56.40
http.port: 9200
discovery.seed_hosts: ["elasticsearch1.linuxtechi.local", "elasticsearch2.linuxtechi.local", "elasticsearch3.linuxtechi.local"]
cluster.initial_master_nodes: ["elasticsearch1.linuxtechi.local", "elasticsearch2.linuxtechi.local", "elasticsearch3.linuxtechi.local"]

注意: 在每个节点上,在 node.name 中填写正确的主机名,在 network.host 中填写正确的 IP 地址,其他参数保持不变。

现在使用 systemctl 命令在所有三个节点上启动并启用 Elasticsearch 服务:

~]# systemctl daemon-reload
~]# systemctl enable elasticsearch.service
~]# systemctl start elasticsearch.service

使用下面 ss 命令验证 elasticsearch 节点是否开始监听 9200 端口:

[root@linuxtechi ~]# ss -tunlp | grep 9200
tcp   LISTEN  0       128       [::ffff:192.168.56.40]:9200              *:*     users:(("java",pid=2734,fd=256))
[root@linuxtechi ~]#

使用以下 curl 命令验证 Elasticsearch 群集状态:

[root@linuxtechi ~]# curl  http://elasticsearch1.linuxtechi.local:9200
[root@linuxtechi ~]# curl -X GET  http://elasticsearch2.linuxtechi.local:9200/_cluster/health?pretty

命令的输出如下所示:

Elasticsearch-cluster-status-rhel8

以上输出表明我们已经成功创建了 3 节点的 Elasticsearch 集群,集群的状态也是绿色的。

注意: 如果你想修改 JVM 堆大小,那么你可以编辑了文件 /etc/elasticsearch/jvm.options,并根据你的环境更改以下参数:

  • -Xms1g
  • -Xmx1g

现在让我们转到 Logstash 节点。

安装和配置 Logstash

在两个 Logstash 节点上执行以下步骤。

登录到两个节点使用 hostnamectl 命令设置主机名:

[root@linuxtechi ~]# hostnamectl set-hostname "logstash1.linuxtechi.local"
[root@linuxtechi ~]# exec bash
[root@linuxtechi ~]#
[root@linuxtechi ~]# hostnamectl set-hostname "logstash2.linuxtechi.local"
[root@linuxtechi ~]# exec bash
[root@linuxtechi ~]#

在两个 logstash 节点的 /etc/hosts 文件中添加以下条目:

~]# vi /etc/hosts
192.168.56.40             elasticsearch1.linuxtechi.local
192.168.56.50             elasticsearch2.linuxtechi.local
192.168.56.60             elasticsearch3.linuxtechi.local

保存文件并退出。

在两个节点上配置 Logstash 存储库,在文件夹 /ete/yum.repo.d/ 下创建一个包含以下内容的文件 logstash.repo

~]# vi /etc/yum.repos.d/logstash.repo

[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

保存并退出文件,运行 rpm 命令导入签名密钥:

~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

使用 yum/dnf 命令在两个节点上安装 Java OpenJDK:

~]# dnf install java-openjdk -y

从两个节点运行 yum/dnf 命令来安装 logstash:

[root@linuxtechi ~]# dnf install logstash -y
[root@linuxtechi ~]# dnf install logstash -y

现在配置 logstash,在两个 logstash 节点上执行以下步骤,创建一个 logstash 配置文件,首先我们在 /etc/logstash/conf.d/ 下复制 logstash 示例文件:

# cd /etc/logstash/
# cp logstash-sample.conf conf.d/logstash.conf

编辑配置文件并更新以下内容:

# vi conf.d/logstash.conf

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch1.linuxtechi.local:9200", "http://elasticsearch2.linuxtechi.local:9200", "http://elasticsearch3.linuxtechi.local:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

output 部分之下,在 hosts 参数中指定所有三个 Elasticsearch 节点的 FQDN,其他参数保持不变。

使用 firewall-cmd 命令在操作系统防火墙中允许 logstash 端口 “5044”:

~ # firewall-cmd --permanent --add-port=5044/tcp
~ # firewall-cmd –reload

现在,在每个节点上运行以下 systemctl 命令,启动并启用 Logstash 服务:

~]# systemctl start logstash
~]# systemctl eanble logstash

使用 ss 命令验证 logstash 服务是否开始监听 5044 端口:

[root@linuxtechi ~]# ss -tunlp | grep 5044
tcp   LISTEN  0       128                         *:5044                *:*      users:(("java",pid=2416,fd=96))
[root@linuxtechi ~]#

以上输出表明 logstash 已成功安装和配置。让我们转到 Kibana 安装。

安装和配置 Kibana

登录 Kibana 节点,使用 hostnamectl 命令设置主机名:

[root@linuxtechi ~]# hostnamectl set-hostname "kibana.linuxtechi.local"
[root@linuxtechi ~]# exec bash
[root@linuxtechi ~]#

编辑 /etc/hosts 文件并添加以下行:

192.168.56.40             elasticsearch1.linuxtechi.local
192.168.56.50             elasticsearch2.linuxtechi.local
192.168.56.60             elasticsearch3.linuxtechi.local

使用以下命令设置 Kibana 存储库:

[root@linuxtechi ~]# vi /etc/yum.repos.d/kibana.repo
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

[root@linuxtechi ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

执行 yum/dnf 命令安装 kibana:

[root@linuxtechi ~]# yum install kibana -y

通过编辑 /etc/kibana/kibana.yml 文件,配置 Kibana:

[root@linuxtechi ~]# vim /etc/kibana/kibana.yml
…………
server.host: "kibana.linuxtechi.local"
server.name: "kibana.linuxtechi.local"
elasticsearch.hosts: ["http://elasticsearch1.linuxtechi.local:9200", "http://elasticsearch2.linuxtechi.local:9200", "http://elasticsearch3.linuxtechi.local:9200"]
…………

启用并启动 kibana 服务:

[root@linuxtechi ~]# systemctl start kibana
[root@linuxtechi ~]# systemctl enable kibana

在系统防火墙上允许 Kibana 端口 “5601”:

[root@linuxtechi ~]# firewall-cmd --permanent --add-port=5601/tcp
success
[root@linuxtechi ~]# firewall-cmd --reload
success
[root@linuxtechi ~]#

使用以下 URL 访问 Kibana 界面:http://kibana.linuxtechi.local:5601

Kibana-Dashboard-rhel8

从面板上,我们可以检查 Elastic Stack 集群的状态。

Stack-Monitoring-Overview-RHEL8

这证明我们已经在 RHEL 8 /CentOS 8 上成功地安装并设置了多节点 Elastic Stack 集群。

现在让我们通过 filebeat 从其他 Linux 服务器发送一些日志到 logstash 节点中,在我的例子中,我有一个 CentOS 7服务器,我将通过 filebeat 将该服务器的所有重要日志推送到 logstash。

登录到 CentOS 7 服务器使用 yum/rpm 命令安装 filebeat 包:

[root@linuxtechi ~]# rpm -ivh https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
Retrieving https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:filebeat-7.3.1-1                 ################################# [100%]
[root@linuxtechi ~]#

编辑 /etc/hosts 文件并添加以下内容:

192.168.56.20             logstash1.linuxtechi.local
192.168.56.30             logstash2.linuxtechi.local

现在配置 filebeat,以便它可以使用负载平衡技术向 logstash 节点发送日志,编辑文件 /etc/filebeat/filebeat.yml,并添加以下参数:

filebeat.inputs: 部分将 enabled: false 更改为 enabled: true,并在 paths 参数下指定我们可以发送到 logstash 的日志文件的位置;注释掉 output.elasticsearchhost 参数;删除 output.logstash:hosts: 的注释,并在 hosts 参数添加两个 logstash 节点,以及设置 loadbalance: true

[root@linuxtechi ~]# vi /etc/filebeat/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/messages
    - /var/log/dmesg
    - /var/log/maillog
    - /var/log/boot.log
#output.elasticsearch:
  #  hosts: ["localhost:9200"]

output.logstash:
    hosts: ["logstash1.linuxtechi.local:5044", "logstash2.linuxtechi.local:5044"]
    loadbalance: true

使用下面的 2 个 systemctl 命令 启动并启用 filebeat 服务:

[root@linuxtechi ~]# systemctl start filebeat
[root@linuxtechi ~]# systemctl enable filebeat

现在转到 Kibana 用户界面,验证新索引是否可见。

从左侧栏中选择管理选项,然后单击 Elasticsearch 下的索引管理:

Elasticsearch-index-management-Kibana

正如我们上面看到的,索引现在是可见的,让我们现在创建索引模型。

点击 Kibana 部分的 “Index Patterns”,它将提示我们创建一个新模型,点击 “Create Index Pattern” ,并将模式名称指定为 “filebeat”:

Define-Index-Pattern-Kibana-RHEL8

点击下一步。

选择 “Timestamp” 作为索引模型的时间过滤器,然后单击 “Create index pattern”:

Time-Filter-Index-Pattern-Kibana-RHEL8

filebeat-index-pattern-overview-Kibana

现在单击查看实时 filebeat 索引模型:

Discover-Kibana-REHL8

这表明 Filebeat 代理已配置成功,我们能够在 Kibana 仪表盘上看到实时日志。

以上就是本文的全部内容,对这些帮助你在 RHEL 8 / CentOS 8 系统上设置 Elastic Stack 集群的步骤,请不要犹豫分享你的反馈和意见。


via: https://www.linuxtechi.com/setup-multinode-elastic-stack-cluster-rhel8-centos8/

作者:Pradeep Kumar 选题:lujun9972 译者:heguangzhi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

每个来到这里的人都会对许多系统中默认 Bash shell 有所了解(无论多少)。过去这些年已经有一些新的 shell 出现来解决 Bash 中的一些缺点。Elvish 就是其中之一,我们将在今天讨论它。

什么是 Elvish Shell?

Pipelines In Elvish

Elvish 不仅仅是一个 shell。它也是“一种表达性编程语言”。它有许多有趣的特性,包括:

  • 它是由 Go 语言编写的
  • 内置文件管理器,灵感来自 Ranger 文件管理器Ctrl + N
  • 可搜索的命令历史记录(Ctrl + R
  • 访问的目录的历史记录(Ctrl + L
  • 支持结构化数据,例如列表、字典和函数的强大的管道
  • 包含“一组标准的控制结构:有 if 条件控制、forwhile 循环,还有 try 的异常处理”
  • 通过包管理器支持第三方模块扩展 Elvish
  • BSD 两句版许可证

你肯定在喊,“为什么叫 Elvish?”。好吧,根据他们的网站,他们之所以选择当前的名字,是因为:

在 Roguelike 游戏中,精灵制造的物品质量很高。它们通常被称为“精灵物品”。但是之所以选择 “elvish” 是因为它以 “sh” 结尾,这是 Unix shell 的久远传统。这个与 fish 押韵,它是影响 Elvish 哲学的 shell 之一。

如何安装 Elvish Shell

Elvish 在几种主流发行版中都有。

请注意,该软件还很年轻。最新版本是 0.12。根据该项目的 GitHub 页面:“尽管还处在 1.0 之前,但它已经适合大多数日常交互使用。”

Elvish Control Structures

Debian 和 Ubuntu

Elvish 包已引入 Debian Buster 和 Ubuntu 17.10。不幸的是,这些包已经过时,你需要使用 PPA 安装最新版本。你需要使用以下命令:

sudo add-apt-repository ppa:zhsj/elvish
sudo apt update
sudo apt install elvish

Fedora

Elvish 在 Fedora 的主仓库中没有。你需要添加 FZUG 仓库安装 Evlish。为此,你需要使用以下命令:

sudo dnf config-manager --add-repo=http://repo.fdzh.org/FZUG/FZUG.repol
sudo dnf install elvish

Arch

Elvish 在 Arch 用户仓库中可用。

我相信你知道该如何在 Linux 中更改 Shell,因此安装后可以切换到 Elvish 来使用它。

对 Elvish Shell 的想法

就个人而言,我没有理由在任何系统上安装 Elvish。我可以通过安装几个小的命令行程序或使用已经安装的程序来获得它的大多数功能。

例如,Bash 中已经存在“搜索历史命令”功能,并且效果很好。如果要提高历史命令的能力,我建议安装 fzffzf 使用模糊搜索,因此你无需记住要查找的确切命令。fzf 还允许你预览和打开文件。

我认为 Elvish 作为一种编程语言是不错的,但是我会坚持使用 Bash shell 脚本,直到 Elvish 变得更成熟。

你们都有用过 Elvish 么?你认为安装 Elvish 是否值得?你最喜欢的 Bash 替代品是什么?请在下面的评论中告诉我们。

如果你发现这篇文章有趣,请花一点时间在社交媒体、Hacker News 或 Reddit 上分享它。


via: https://itsfoss.com/elvish-shell/

作者:John Paul 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出