分类 技术 下的文章

在我们前面的教程中,我们已经学习了 如何安装和配置 MariaDB,也学习了 管理 MariaDB 的一些基础命令。现在我们来学习,如何在 MariaDB 服务器上配置一个主从复制。

复制是用于为我们的数据库创建多个副本,这些副本可以在其它数据库上用于运行查询,像一些非常繁重的查询可能会影响主数据库服务器的性能,或者我们可以使用它来做数据冗余,或者兼具以上两个目的。我们可以将这个过程自动化,即主服务器到从服务器的复制过程自动进行。执行备份而不影响在主服务器上的写操作。

因此,我们现在去配置我们的主-从复制,它需要两台安装了 MariaDB 的机器。它们的 IP 地址如下:

  • 主服务器 - 192.168.1.120 主机名 - master.ltechlab.com
  • 从服务器 - 192.168.1.130 主机名 - slave.ltechlab.com

MariaDB 安装到这些机器上之后,我们继续进行本教程。如果你需要安装和配置 MariaDB 的教程,请查看这个教程

第 1 步 - 主服务器配置

我们现在进入到 MariaDB 中的一个命名为 important 的数据库,它将被复制到我们的从服务器。为开始这个过程,我们编辑名为 /etc/my.cnf 的文件,它是 MariaDB 的配置文件。

$ vi /etc/my.cnf

在这个文件中找到 [mysqld] 节,然后输入如下内容:

[mysqld]
log-bin
server_id=1
replicate-do-db=important
bind-address=192.168.1.120

保存并退出这个文件。完成之后,需要重启 MariaDB 服务。

$ systemctl restart mariadb

接下来,我们登入我们的主服务器上的 Mariadb 实例。

$ mysql -u root -p

在它上面创建一个命名为 slaveuser 的为主从复制使用的新用户,然后运行如下的命令为它分配所需要的权限:

STOP SLAVE;
GRANT REPLICATION SLAVE ON *.* TO  'slaveuser'@'%' IDENTIFIED BY 'iamslave';
FLUSH PRIVILEGES;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

注意: 我们配置主从复制需要 MASTER_LOG_FILEMASTER_LOG_POS 的值,它可以通过 show master status 来获得,因此,你一定要确保你记下了它们的值。

这些命令运行完成之后,输入 exit 退出这个会话。

第 2 步 - 创建一个数据库备份,并将它移动到从服务器上

现在,我们需要去为我们的数据库 important 创建一个备份,可以使用 mysqldump 命令去备份。

$ mysqldump -u root -p important > important_backup.sql

备份完成后,我们需要重新登录到 MariaDB 数据库,并解锁我们的表。

$ mysql -u root -p
$ UNLOCK TABLES;

然后退出这个会话。现在,我们移动我们刚才的备份到从服务器上,它的 IP 地址是:192.168.1.130。

在主服务器上的配置已经完成了,现在,我们开始配置从服务器。

第 3 步:配置从服务器

我们再次去编辑(从服务器上的) /etc/my.cnf 文件,找到配置文件中的 [mysqld] 节,然后输入如下内容:

[mysqld]
server-id = 2
replicate-do-db=important
[ …]

现在,我们恢复我们主数据库的备份到从服务器的 MariaDB 上,运行如下命令:

$ mysql -u root -p < /data/ important_backup.sql

当这个恢复过程结束之后,我们将通过登入到从服务器上的 MariaDB,为数据库 important 上的用户 'slaveuser' 授权。

$ mysql -u root -p
GRANT ALL PRIVILEGES ON important.* TO 'slaveuser'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;

接下来,为了这个变化生效,重启 MariaDB。

$ systemctl restart mariadb

第 4 步:启动复制

记住,我们需要 MASTER_LOG_FILEMASTER_LOG_POS 变量的值,它可以通过在主服务器上运行 SHOW MASTER STATUS 获得。现在登入到从服务器上的 MariaDB,然后通过运行下列命令,告诉我们的从服务器它应该去哪里找主服务器。

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST= '192.168.1.110′, MASTER_USER='slaveuser', MASTER_PASSWORD='iamslave', MASTER_LOG_FILE='mariadb-bin.000001′, MASTER_LOG_POS=460;
SLAVE START;
SHOW SLAVE STATUS\G;

注意: 请根据你的机器的具体情况来改变主服务器的配置。

第 5 步:测试复制

我们将在我们的主服务器上创建一个新表来测试主从复制是否正常工作。因此,登入到主服务器上的 MariaDB。

$ mysql -u root -p

选择数据库为 important

use important;

在这个数据库上创建一个名为 test 的表:

create table test (c int);

然后在这个表中插入一些数据:

insert into test (c) value (1);

检索刚才插入的值是否存在:

select * from test;

你将会看到刚才你插入的值已经在这个新建的表中了。

现在,我们登入到从服务器的数据库中,查看主从复制是否正常工作。

$ mysql -u root -p
$ use important;
$ select * from test;

你可以看到与前面在主服务器上的命令输出是一样的。因此,说明我们的主从服务工作正常,没有发生任何问题。

我们的教程结束了,请在下面的评论框中留下你的查询/问题。


via: http://linuxtechlab.com/creating-master-slave-replication-mariadb/

作者:Shusain 译者:qhwdw 校对:wxy

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

有多种可以导致网站下线的攻击方法,比较复杂的方法要涉及数据库和编程方面的技术知识。一个更简单的方法被称为“ 拒绝服务 Denial Of Service ”(DOS)攻击。这个攻击方法的名字来源于它的意图:使普通客户或网站访问者的正常服务请求被拒绝。

一般来说,有两种形式的 DOS 攻击:

  1. OSI 模型的三、四层,即网络层攻击
  2. OSI 模型的七层,即应用层攻击

第一种类型的 DOS 攻击——网络层,发生于当大量的垃圾流量流向网页服务器时。当垃圾流量超过网络的处理能力时,网站就会宕机。

第二种类型的 DOS 攻击是在应用层,是利用合法的服务请求,而不是垃圾流量。当页面请求数量超过网页服务器能承受的容量时,即使是合法访问者也将无法使用该网站。

本文将着眼于缓解应用层攻击,因为减轻网络层攻击需要大量的可用带宽和上游提供商的合作,这通常不是通过配置网络服务器就可以做到的。

通过配置普通的网页服务器,可以保护网页免受应用层攻击,至少是适度的防护。防止这种形式的攻击是非常重要的,因为 Cloudflare 最近 报告称 网络层攻击的数量正在减少,而应用层攻击的数量则在增加。

本文将介绍如何使用 zdziarski 开发的 Apache2 的模块 mod\_evasive

另外,mod\_evasive 会阻止攻击者通过尝试数百个用户名和密码的组合来进行猜测(即暴力攻击)的企图。

mod\_evasive 会记录来自每个 IP 地址的请求的数量。当这个数字超过相应 IP 地址的几个阈值之一时,会出现一个错误页面。错误页面所需的资源要比一个能够响应合法访问的在线网站少得多。

在 Ubuntu 16.04 上安装 mod\_evasive

Ubuntu 16.04 默认的软件库中包含了 mod\_evasive,名称为 “libapache2-mod-evasive”。您可以使用 apt-get 来完成安装:

apt-get update
apt-get upgrade
apt-get install libapache2-mod-evasive

现在我们需要配置 mod\_evasive。

它的配置文件位于 /etc/apache2/mods-available/evasive.conf。默认情况下,所有模块的设置在安装后都会被注释掉。因此,在修改配置文件之前,模块不会干扰到网站流量。

<IfModule mod_evasive20.c>
   #DOSHashTableSize    3097
   #DOSPageCount        2
   #DOSSiteCount        50
   #DOSPageInterval     1
   #DOSSiteInterval     1
   #DOSBlockingPeriod   10

   #DOSEmailNotify      [email protected]
   #DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
   #DOSLogDir           "/var/log/mod_evasive"
</IfModule>

第一部分的参数的含义如下:

  • DOSHashTableSize - 正在访问网站的 IP 地址列表及其请求数的当前列表。
  • DOSPageCount - 在一定的时间间隔内,每个页面的请求次数。时间间隔由 DOSPageInterval 定义。
  • DOSPageInterval - mod\_evasive 统计页面请求次数的时间间隔。
  • DOSSiteCount - 与 DOSPageCount 相同,但统计的是来自相同 IP 地址对网站内任何页面的请求数量。
  • DOSSiteInterval - mod\_evasive 统计网站请求次数的时间间隔。
  • DOSBlockingPeriod - 某个 IP 地址被加入黑名单的时长(以秒为单位)。

如果使用上面显示的默认配置,则在如下情况下,一个 IP 地址会被加入黑名单:

  • 每秒请求同一页面超过两次。
  • 每秒请求 50 个以上不同页面。

如果某个 IP 地址超过了这些阈值,则被加入黑名单 10 秒钟。

这看起来可能不算久,但是,mod\_evasive 将一直监视页面请求,包括在黑名单中的 IP 地址,并重置其加入黑名单的起始时间。只要一个 IP 地址一直尝试使用 DOS 攻击该网站,它将始终在黑名单中。

其余的参数是:

  • DOSEmailNotify - 用于接收 DOS 攻击信息和 IP 地址黑名单的电子邮件地址。
  • DOSSystemCommand - 检测到 DOS 攻击时运行的命令。
  • DOSLogDir - 用于存放 mod\_evasive 的临时文件的目录。

配置 mod\_evasive

默认的配置是一个很好的开始,因为它不会阻塞任何合法的用户。取消配置文件中的所有参数(DOSSystemCommand 除外)的注释,如下所示:

<IfModule mod_evasive20.c>
   DOSHashTableSize   3097
   DOSPageCount       2
   DOSSiteCount       50
   DOSPageInterval    1
   DOSSiteInterval    1
   DOSBlockingPeriod  10

   DOSEmailNotify       [email protected]
   #DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
   DOSLogDir            "/var/log/mod_evasive"
</IfModule>

必须要创建日志目录并且要赋予其与 apache 进程相同的所有者。这里创建的目录是 /var/log/mod_evasive ,并且在 Ubuntu 上将该目录的所有者和组设置为 www-data ,与 Apache 服务器相同:

mkdir /var/log/mod_evasive
chown www-data:www-data /var/log/mod_evasive

在编辑了 Apache 的配置之后,特别是在正在运行的网站上,在重新启动或重新加载之前,最好检查一下语法,因为语法错误将影响 Apache 的启动从而使网站宕机。

Apache 包含一个辅助命令,是一个配置语法检查器。只需运行以下命令来检查您的语法:

apachectl configtest

如果您的配置是正确的,会得到如下结果:

Syntax OK

但是,如果出现问题,您会被告知在哪部分发生了什么错误,例如:

AH00526: Syntax error on line 6 of /etc/apache2/mods-enabled/evasive.conf:
DOSSiteInterval takes one argument, Set site interval
Action 'configtest' failed.
The Apache error log may have more information.

如果您的配置通过了 configtest 的测试,那么这个模块可以安全地被启用并且 Apache 可以重新加载:

a2enmod evasive
systemctl reload apache2.service

mod\_evasive 现在已配置好并正在运行了。

测试

为了测试 mod\_evasive,我们只需要向服务器提出足够的网页访问请求,以使其超出阈值,并记录来自 Apache 的响应代码。

一个正常并成功的页面请求将收到如下响应:

HTTP/1.1 200 OK

但是,被 mod\_evasive 拒绝的将返回以下内容:

HTTP/1.1 403 Forbidden

以下脚本会尽可能迅速地向本地主机(127.0.0.1,localhost)的 80 端口发送 HTTP 请求,并打印出每个请求的响应代码。

你所要做的就是把下面的 bash 脚本复制到一个文件中,例如 mod_evasive_test.sh

#!/bin/bash
set -e

for i in {1..50}; do
        curl -s -I 127.0.0.1 | head -n 1
done

这个脚本的部分含义如下:

  • curl - 这是一个发出网络请求的命令。

    • -s - 隐藏进度表。
    • -I - 仅显示响应头部信息。
  • head - 打印文件的第一部分。

    • -n 1 - 只显示第一行。

然后赋予其执行权限:

chmod 755 mod_evasive_test.sh

在启用 mod\_evasive 之前,脚本运行时,将会看到 50 行 “HTTP / 1.1 200 OK” 的返回值。

但是,启用 mod\_evasive 后,您将看到以下内容:

HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
...

前两个请求被允许,但是在同一秒内第三个请求发出时,mod\_evasive 拒绝了任何进一步的请求。您还将收到一封电子邮件(邮件地址在选项 DOSEmailNotify 中设置),通知您有 DOS 攻击被检测到。

mod\_evasive 现在已经在保护您的网站啦!


via: https://bash-prompt.net/guides/mod_proxy/

作者:Elliot Cooper 译者:jessie-pang 校对:wxy

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

在早先的教程中,我们讨论了如何使用 ISO 镜像和在线 Yum 仓库的方式来创建自己的 Yum 仓库 。创建自己的 Yum 仓库是一个不错的想法,但若网络中只有 2-3 台 Linux 机器那就没啥必要了。不过若你的网络中有大量的 Linux 服务器,而且这些服务器还需要定时进行升级,或者你有大量服务器无法直接访问互联网,那么创建自己的 Yum 仓库就很有必要了。

当我们有大量的 Linux 服务器,而每个服务器都直接从互联网上升级系统时,数据消耗会很可观。为了节省数据量,我们可以创建个离线 Yum 源并将之分享到本地网络中。网络中的其他 Linux 机器就可以直接从本地 Yum 上获取系统更新,从而节省数据量,而且传输速度也会很好。

我们可以使用下面两种方法来分享 Yum 仓库:

  • 使用 Web 服务器(Apache)
  • 使用 FTP 服务器(VSFTPD)

在开始讲解这两个方法之前,我们需要先根据之前的教程创建一个 Yum 仓库。

使用 Web 服务器

首先在 Yum 服务器上安装 Web 服务器(Apache),我们假设服务器 IP 是 192.168.1.100。我们已经在这台系统上配置好了 Yum 仓库,现在我们来使用 yum 命令安装 Apache Web 服务器,

$ yum install httpd

下一步,拷贝所有的 rpm 包到默认的 Apache 根目录下,即 /var/www/html,由于我们已经将包都拷贝到了 /YUM 下,我们也可以创建一个软连接来从 /var/www/html 指向 /YUM

$ ln -s /var/www/html/Centos /YUM

重启 Web 服务器应用改变:

$ systemctl restart httpd

配置客户端机器

服务端的配置就完成了,现在需要配置下客户端来从我们创建的离线 Yum 中获取升级包,这里假设客户端 IP 为 192.168.1.101

/etc/yum.repos.d 目录中创建 offline-yum.repo 文件,输入如下信息,

$ vi /etc/yum.repos.d/offline-yum.repo
name=Local YUM
baseurl=http://192.168.1.100/CentOS/7
gpgcheck=0
enabled=1

客户端也配置完了。试一下用 yum 来安装/升级软件包来确认仓库是正常工作的。

使用 FTP 服务器

在 FTP 上分享 Yum,首先需要安装所需要的软件包,即 vsftpd。

$ yum install vsftpd

vsftp 的默认根目录为 /var/ftp/pub,因此你可以拷贝 rpm 包到这个目录,或者为它创建一个软连接:

$ ln -s /var/ftp/pub /YUM

重启服务应用改变:

$ systemctl restart vsftpd

配置客户端机器

像上面一样,在 /etc/yum.repos.d 中创建 offline-yum.repo 文件,并输入下面信息,

$ vi /etc/yum.repos.d/offline-yum.repo
[Offline YUM]
name=Local YUM
baseurl=ftp://192.168.1.100/pub/CentOS/7
gpgcheck=0
enabled=1

现在客户机可以通过 ftp 接收升级了。要配置 vsftpd 服务器为其他 Linux 系统分享文件,请阅读这篇指南

这两种方法都很不错,你可以任意选择其中一种方法。有任何疑问或这想说的话,欢迎在下面留言框中留言。


via: http://linuxtechlab.com/offline-yum-repository-for-lan/

作者:Shusain 译者:lujun9972 校对:wxy

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

在我刚开始学习 Kubernetes(大约是一年半以前吧?)时,我真的不明白为什么应该去关注它。

在我使用 Kubernetes 全职工作了三个多月后,我才逐渐明白了为什么我应该使用它。(我距离成为一个 Kubernetes 专家还很远!)希望这篇文章对你理解 Kubernetes 能做什么会有帮助!

我将尝试去解释我对 Kubernetes 感兴趣的一些原因,而不去使用 “ 原生云 cloud native ”、“ 编排系统 orchestration ”、“ 容器 container ”,或者任何 Kubernetes 专用的术语 :)。我去解释的这些观点主要来自一位 Kubernetes 操作者/基础设施工程师,因为,我现在的工作就是去配置 Kubernetes 和让它工作的更好。

我不会去尝试解决一些如 “你应该在你的生产系统中使用 Kubernetes 吗?”这样的问题。那是非常复杂的问题。(不仅是因为“生产系统”根据你的用途而总是有不同的要求)

Kubernetes 可以让你无需设置一台新的服务器即可在生产系统中运行代码

我首次被说教使用 Kubernetes 是与我的伙伴 Kamal 的下面的谈话:

大致是这样的:

  • Kamal: 使用 Kubernetes 你可以通过一条命令就能设置一台新的服务器。
  • Julia: 我觉得不太可能吧。
  • Kamal: 像这样,你写一个配置文件,然后应用它,这时候,你就在生产系统中运行了一个 HTTP 服务。
  • Julia: 但是,现在我需要去创建一个新的 AWS 实例,明确地写一个 Puppet 清单,设置服务发现,配置负载均衡,配置我们的部署软件,并且确保 DNS 正常工作,如果没有什么问题的话,至少在 4 小时后才能投入使用。
  • Kamal: 是的,使用 Kubernetes 你不需要做那么多事情,你可以在 5 分钟内设置一台新的 HTTP 服务,并且它将自动运行。只要你的集群中有空闲的资源它就能正常工作!
  • Julia: 这儿一定是一个“坑”。

这里有一种陷阱,设置一个生产用 Kubernetes 集群(在我的经险中)确实并不容易。(查看 Kubernetes 艰难之旅 中去开始使用时有哪些复杂的东西)但是,我们现在并不深入讨论它。

因此,Kubernetes 第一个很酷的事情是,它可能使那些想在生产系统中部署新开发的软件的方式变得更容易。那是很酷的事,而且它真的是这样,因此,一旦你使用一个运作中的 Kubernetes 集群,你真的可以仅使用一个配置文件就在生产系统中设置一台 HTTP 服务(在 5 分钟内运行这个应用程序,设置一个负载均衡,给它一个 DNS 名字,等等)。看起来真的很有趣。

对于运行在生产系统中的代码,Kubernetes 可以提供更好的可见性和可管理性

在我看来,在理解 etcd 之前,你可能不会理解 Kubernetes 的。因此,让我们先讨论 etcd!

想像一下,如果现在我这样问你,“告诉我你运行在生产系统中的每个应用程序,它运行在哪台主机上?它是否状态很好?是否为它分配了一个 DNS 名字?”我并不知道这些,但是,我可能需要到很多不同的地方去查询来回答这些问题,并且,我需要花很长的时间才能搞定。我现在可以很确定地说不需要查询,仅一个 API 就可以搞定它们。

在 Kubernetes 中,你的集群的所有状态 – 运行中的应用程序 (“pod”)、节点、DNS 名字、 cron 任务、 等等 —— 都保存在一个单一的数据库中(etcd)。每个 Kubernetes 组件是无状态的,并且基本是通过下列方式工作的:

  • 从 etcd 中读取状态(比如,“分配给节点 1 的 pod 列表”)
  • 产生变化(比如,“在节点 1 上运行 pod A”)
  • 更新 etcd 中的状态(比如,“设置 pod A 的状态为 ‘running’”)

这意味着,如果你想去回答诸如 “在那个可用区中有多少台运行着 nginx 的 pod?” 这样的问题时,你可以通过查询一个统一的 API(Kubernetes API)去回答它。并且,你可以在每个其它 Kubernetes 组件上运行那个 API 去进行同样的访问。

这也意味着,你可以很容易地去管理每个运行在 Kubernetes 中的任何东西。比如说,如果你想要:

  • 部署实现一个复杂的定制的部署策略(部署一个东西,等待 2 分钟,部署 5 个以上,等待 3.7 分钟,等等)
  • 每当推送到 github 上一个分支,自动化 启动一个新的 web 服务器
  • 监视所有你的运行的应用程序,确保它们有一个合理的内存使用限制。

这些你只需要写一个程序与 Kubernetes API(“controller”)通讯就可以了。

另一个关于 Kubernetes API 的令人激动的事情是,你不会局限于 Kubernetes 所提供的现有功能!如果对于你要部署/创建/监视的软件有你自己的方案,那么,你可以使用 Kubernetes API 去写一些代码去达到你的目的!它可以让你做到你想做的任何事情。

即便每个 Kubernetes 组件都“挂了”,你的代码将仍然保持运行

关于 Kubernetes 我(在各种博客文章中 :))承诺的一件事情是,“如果 Kubernetes API 服务和其它组件‘挂了’也没事,你的代码将一直保持运行状态”。我认为理论上这听起来很酷,但是我不确定它是否真是这样的。

到目前为止,这似乎是真的!

我已经断开了一些正在运行的 etcd,发生了这些情况:

  1. 所有的代码继续保持运行状态
  2. 不能做 新的 事情(你不能部署新的代码或者生成变更,cron 作业将停止工作)
  3. 当它恢复时,集群将赶上这期间它错过的内容

这样做意味着如果 etcd 宕掉,并且你的应用程序的其中之一崩溃或者发生其它事情,在 etcd 恢复之前,它不能够恢复。

Kubernetes 的设计对 bug 很有弹性

与任何软件一样,Kubernetes 也会有 bug。例如,到目前为止,我们的集群控制管理器有内存泄漏,并且,调度器经常崩溃。bug 当然不好,但是,我发现 Kubernetes 的设计可以帮助减轻它的许多核心组件中的错误的影响。

如果你重启动任何组件,将会发生:

  • 从 etcd 中读取所有的与它相关的状态
  • 基于那些状态(调度 pod、回收完成的 pod、调度 cron 作业、按需部署等等),它会去做那些它认为必须要做的事情

因为,所有的组件并不会在内存中保持状态,你在任何时候都可以重启它们,这可以帮助你减轻各种 bug 的影响。

例如,如果在你的控制管理器中有内存泄露。因为,控制管理器是无状态的,你可以每小时定期去重启它,或者,在感觉到可能导致任何不一致的问题发生时重启它。又或者,在调度器中遇到了一个 bug,它有时忘记了某个 pod,从来不去调度它们。你可以每隔 10 分钟来重启调度器来缓减这种情况。(我们并不会这么做,而是去修复这个 bug,但是,你可以这样做 :))

因此,我觉得即使在它的核心组件中有 bug,我仍然可以信任 Kubernetes 的设计可以让我确保集群状态的一致性。并且,总在来说,随着时间的推移软件质量会提高。唯一你必须去操作的有状态的东西就是 etcd。

不用过多地讨论“状态”这个东西 —— 而我认为在 Kubernetes 中很酷的一件事情是,唯一需要去做备份/恢复计划的东西是 etcd (除非为你的 pod 使用了持久化存储的卷)。我认为这样可以使 Kubernetes 运维比你想的更容易一些。

在 Kubernetes 之上实现新的分布式系统是非常容易的

假设你想去实现一个分布式 cron 作业调度系统!从零开始做工作量非常大。但是,在 Kubernetes 里面实现一个分布式 cron 作业调度系统是非常容易的!(仍然没那么简单,毕竟它是一个分布式系统)

我第一次读到 Kubernetes 的 cron 作业控制器的代码时,我对它是如此的简单感到由衷高兴。去读读看,其主要的逻辑大约是 400 行的 Go 代码。去读它吧! => cronjob\_controller.go <=

cron 作业控制器基本上做的是:

  • 每 10 秒钟:

    • 列出所有已存在的 cron 作业
    • 检查是否有需要现在去运行的任务
    • 如果有,创建一个新的作业对象去调度,并通过其它的 Kubernetes 控制器实际运行它
    • 清理已完成的作业
    • 重复以上工作

Kubernetes 模型是很受限制的(它有定义在 etcd 中的资源模式,控制器读取这个资源并更新 etcd),我认为这种相关的固有的/受限制的模型,可以使它更容易地在 Kubernetes 框架中开发你自己的分布式系统。

Kamal 给我说的是 “Kubernetes 是一个写你自己的分布式系统的很好的平台” ,而不是“ Kubernetes 是一个你可以使用的分布式系统”,并且,我觉得它真的很有意思。他做了一个 为你推送到 GitHub 的每个分支运行一个 HTTP 服务的系统 的原型。这花了他一个周末的时间,大约 800 行 Go 代码,我认为它真不可思议!

Kubernetes 可以使你做一些非常神奇的事情(但并不容易)

我一开始就说 “kubernetes 可以让你做一些很神奇的事情,你可以用一个配置文件来做这么多的基础设施,它太神奇了”。这是真的!

为什么说 “Kubernetes 并不容易”呢?是因为 Kubernetes 有很多部分,学习怎么去成功地运营一个高可用的 Kubernetes 集群要做很多的工作。就像我发现它给我了许多抽象的东西,我需要去理解这些抽象的东西才能调试问题和正确地配置它们。我喜欢学习新东西,因此,它并不会使我发狂或者生气,但是我认为了解这一点很重要 :)

对于 “我不能仅依靠抽象概念” 的一个具体的例子是,我努力学习了许多 Linux 上网络是如何工作的,才让我对设置 Kubernetes 网络稍有信心,这比我以前学过的关于网络的知识要多很多。这种方式很有意思但是非常费时间。在以后的某个时间,我或许写更多的关于设置 Kubernetes 网络的困难/有趣的事情。

或者,为了成功设置我的 Kubernetes CA,我写了一篇 2000 字的博客文章,述及了我不得不学习 Kubernetes 不同方式的 CA 的各种细节。

我觉得,像 GKE (Google 的 Kubernetes 产品) 这样的一些监管的 Kubernetes 的系统可能更简单,因为,他们为你做了许多的决定,但是,我没有尝试过它们。


via: https://jvns.ca/blog/2017/10/05/reasons-kubernetes-is-cool/

作者:Julia Evans 译者:qhwdw 校对:wxy

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

嗨,伙计们,今天我们再次带来一系列可以多方面帮助到你的复杂的命令。 通过操作命令,可以帮助您计数当前目录中的文件和目录、递归计数,统计特定用户创建的文件列表等。

在本教程中,我们将向您展示如何使用多个命令,并使用 lsegrepwcfind 命令执行一些高级操作。 下面的命令将可用在多个方面。

为了实验,我打算总共创建 7 个文件和 2 个文件夹(5 个常规文件和 2 个隐藏文件)。 下面的 tree 命令的输出清楚的展示了文件和文件夹列表。

# tree -a /opt
/opt
├── magi
│   └── 2g
│   ├── test5.txt
│   └── .test6.txt
├── test1.txt
├── test2.txt
├── test3.txt
├── .test4.txt
└── test.txt

2 directories, 7 files

示例-1

统计当前目录的文件(不包括隐藏文件)。 运行以下命令以确定当前目录中有多少个文件,并且不计算点文件(LCTT 译注:点文件即以“.” 开头的文件,它们在 Linux 默认是隐藏的)。

# ls -l . | egrep -c '^-'
4

细节:

  • ls : 列出目录内容
  • -l : 使用长列表格式
  • . : 列出有关文件的信息(默认为当前目录)
  • | : 将一个程序的输出发送到另一个程序进行进一步处理的控制操作符
  • egrep : 打印符合模式的行
  • -c : 通用输出控制
  • '^-' : 以“-”开头的行(ls -l 列出长列表时,行首的 “-” 代表普通文件)

示例-2

统计当前目录包含隐藏文件在内的文件。 包括当前目录中的点文件。

# ls -la . | egrep -c '^-'
5

示例-3

运行以下命令来计数当前目录的文件和文件夹。 它会计算所有的文件和目录。

# ls -l | wc -l
5

细节:

  • ls : 列出目录内容
  • -l : 使用长列表格式
  • | : 将一个程序的输出发送到另一个程序进行进一步处理的控制操作符
  • wc : 这是一个统计每个文件的换行符、单词和字节数的命令
  • -l : 输出换行符的数量

示例-4

统计当前目录包含隐藏文件和目录在内的文件和文件夹。

# ls -la | wc -l
8

示例-5

递归计算当前目录的文件,包括隐藏文件。

# find . -type f | wc -l
7

细节 :

  • find : 搜索目录结构中的文件
  • -type : 文件类型
  • f : 常规文件
  • wc : 这是一个统计每个文件的换行符、单词和字节数的命令
  • -l : 输出换行符的数量

示例-6

使用 tree 命令输出目录和文件数(不包括隐藏文件)。

# tree | tail -1
2 directories, 5 files

示例-7

使用包含隐藏文件的 tree 命令输出目录和文件计数。

# tree -a | tail -1
2 directories, 7 files

示例-8

运行下面的命令递归计算包含隐藏目录在内的目录数。

# find . -type d | wc -l
3

示例-9

根据文件扩展名计数文件数量。 这里我们要计算 .txt 文件。

# find . -name "*.txt" | wc -l
7

示例-10

组合使用 echo 命令和 wc 命令统计当前目录中的所有文件。 4 表示当前目录中的文件数量。

# echo *.* | wc
1       4      39

示例-11

组合使用 echo 命令和 wc 命令来统计当前目录中的所有目录。 第二个 1 表示当前目录中的目录数量。

# echo */ | wc
1       1       6

示例-12

组合使用 echo 命令和 wc 命令来统计当前目录中的所有文件和目录。 5 表示当前目录中的目录和文件的数量。

# echo * | wc
1 5 44

示例-13

统计系统(整个系统)中的文件数。

# find / -type f | wc -l
69769

示例-14

统计系统(整个系统)中的文件夹数。

# find / -type d | wc -l
8819

示例-15

运行以下命令来计算系统(整个系统)中的文件、文件夹、硬链接和符号链接数。

# find / -type d -exec echo dirs \; -o -type l -exec echo symlinks \; -o -type f -links +1 -exec echo hardlinks \; -o -type f -exec echo files \; | sort | uniq -c
   8779 dirs
  69343 files
     20 hardlinks
  11646 symlinks

via: https://www.2daygeek.com/how-to-count-the-number-of-files-and-folders-directories-in-linux/

作者:Magesh Maruthamuthu 译者:Flowsnow 校对:wxy

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

之前我们学过了在 Centos/RHEL 7 上安装 MariaDB 服务器并保证其安全,使之成为了 RHEL/CentOS 7 的默认数据库。现在我们再来看看一些有用的 MariaDB 管理命令。这些都是使用 MariaDB 最基础的命令,而且它们对 MySQL 也同样适合,因为 MariaDB 就是 MySQL 的一个分支而已。

(推荐阅读:在 RHEL/CentOS 上安装并配置 MongoDB

MariaDB 管理命令

1、查看 MariaDB 安装的版本

要查看所安装数据库的当前版本,在终端中输入下面命令:

$ mysql -version

该命令会告诉你数据库的当前版本。此外你也可以运行下面命令来查看版本的详细信息:

$ mysqladmin -u root -p version

2、登录 MariaDB

要登录 MariaDB 服务器,运行:

$ mysql -u root -p

然后输入密码登录。

3、列出所有的数据库

要列出 MariaDB 当前拥有的所有数据库,在你登录到 MariaDB 中后运行:

> show databases;

(LCTT 译注:$ 这里代表 shell 的提示符,> 这里代表 MariaDB shell 的提示符。)

4、创建新数据库

在 MariaDB 中创建新数据库,登录 MariaDB 后运行:

> create database dan;

若想直接在终端创建数据库,则运行:

$ mysqladmin -u user -p create dan

这里,dan 就是新数据库的名称。

5、删除数据库

要删除数据库,在已登录的 MariaDB 会话中运行:

> drop database dan;

此外你也可以运行,

$ mysqladmin -u root -p drop dan

注意: 若在运行 mysqladmin 命令时提示 “access denied” 错误,这应该是由于我们没有给 root 授权。要对 root 授权,请参照第 7 点方法,只是要将用户改成 root。

6、创建新用户

为数据库创建新用户,运行:

> CREATE USER 'dan'@'localhost' IDENTIFIED BY 'password';

7、授权用户访问某个数据库

授权用户访问某个数据库,运行:

> GRANT ALL PRIVILEGES ON test.* to 'dan'@'localhost';

这会赋予用户 dan 对名为 test 的数据库完全操作的权限。我们也可以限定为用户只赋予 SELECTINSERTDELETE 权限。

要赋予访问所有数据库的权限,将 test 替换成 * 。像这样:

> GRANT ALL PRIVILEGES ON *.* to 'dan'@'localhost';

8、备份/导出数据库

要创建单个数据库的备份,在终端窗口中运行下列命令,

$ mysqldump -u root -p database_name>db_backup.sql

若要一次性创建多个数据库的备份则运行:

$ mysqldump -u root -p --databases db1 db2 > db12_backup.sql

要一次性导出多个数据库,则运行:

$ mysqldump -u root -p --all-databases > all_dbs.sql

9、从备份中恢复数据库

要从备份中恢复数据库,运行:

$ mysql -u root -p database_name < db_backup.sql

但这条命令成功的前提是预先没有存在同名的数据库。如果想要恢复数据库数据到已经存在的数据库中,则需要用到 mysqlimport 命令:

$ mysqlimport -u root -p database_name < db_backup.sql

10、更改 MariaDB 用户的密码

本例中我们会修改 root 的密码,但修改其他用户的密码也是一样的过程。

登录 MariaDB 并切换到 'mysql' 数据库:

$ mysql -u root -p
> use mysql;

然后运行下面命令:

> update user set password=PASSWORD('your_new_password_here') where User='root';

下一步,重新加载权限:

> flush privileges;

然后退出会话。

我们的教程至此就结束了,在本教程中我们学习了一些有用的 MariaDB 管理命令。欢迎您的留言。


via: http://linuxtechlab.com/mariadb-administration-commands-beginners/

作者:Shusain 译者:lujun9972 校对:wxy

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