Tool 杂谈——高效配置 Centos 集群环境

449 阅读12分钟

公众号:技术小厨师

关注小厨师,烹饪美味的技术餐

⚠ 本文较长,请分期食用,注意实践与理论结合

本文的核心内容是 4、5、6 节

1. 前言

在刚拿到服务器的时候,第一个问题就是环境配置。作为一个 Javaer,给新机器配置 JDK 和搭建中间件集群已经是家常便饭的事情了。配置工作是机械的,但是往往因为网络等因素而变得耗时,那有没有一劳永逸的办法呢?本文将为你揭晓答案。

2. 环境与前提条件

本文将会带读者快速实现对三台机器的基础环境配置,并且留下一个手脚架和实践方法以供读者配置其他环境使用。

  • Windows 11
  • VMware Workstation 16

在这里需要读者准备好 Centos 镜像和 JDK linux 压缩包

我的习惯是更加偏向使用压缩包来进行安装,因为压缩包的好处就是安装位置由自己选择,方便统一管理

3. 配置 Centos 集群

这里我们将选择搭建 3 台虚拟机来模拟真实的服务器集群环境,读者可以选择自己搭建然后直接跳到第 4 节,也可以选择跟着我的节奏来搭建 centos 集群。最终本节搭建成功的效果如图所示,

3.1 创建一个 centos 虚拟机

如果你已经创建好了,那么你可以选择跳过本节

  1. 打开新建虚拟机向导,这里我们选择自定义

    image-20220320151931689
  2. 点击两次下一步后,这里我们选择创建一个空白的虚拟硬盘,下一步

    image-20220320160448877
  3. 这里因为我下载的是 Centos 7 x64 的镜像,所以我的配置如下所示,下一步

  4. 配置虚拟机名和存放位置,下一步

  5. 虚拟机配置(处理器和内存配置),如果你不需要使用可视化操作界面的话,可以调低一点。当然,这些配置之后可以修改,所以不用太担心。

    image-20220320153030516 image-20220320153129741
  6. 选择 NAT 网络,这对我们之后配置虚拟网络的非常关键,下一步

    image-20220320153313087
  7. IO 控制器和磁盘类型我们不需要做变动,直接下一步就行

  8. 磁盘配置,大家可以参考我的配置

    image-20220320153454705 image-20220320160713489
  9. 后面的配置都无关紧要了,如果没有什么需要自定义的地方读者可以选择一直下一步到完成

  10. 配置操作系统镜像 到刚创建好的虚拟机,为其配置操作系统镜像,如图所示,

  11. 启动虚拟机,完成操作系统设置 如果读者使用的镜像也是 centos 7 的话,接下来的步骤基本相同。选择好语言和键盘后将会跳转到当前界面,

    我们接下来要在这个界面完成几项设置,

    • SOFTWARE SELECTION:软件设置,我的习惯是只安装一个最小的,只有命令交互界面的 centos,如果读者有使用 GUI 界面的习惯可以选择另外一个选项。

    • NETWORK & HOST NAME:配置网络,我们要让 centos 能够连接上网络

      将如图所示开关打开

    上述配置完成后我们选择 Begin Installation,之后会跳转到如图界面,

    按照它的指引配置 Root 密码和用户即可,这里作者配置 root 账号密码为 123456

  12. 安装完进行一波重启,应该就能进入如图所示的命令交互界面了

    image-20220320170832373

3.2 配置虚拟网络

下面我们需要配置虚拟网络,配置的目的主要是为了模拟真实的网络环境,让虚拟机在宿主机上拥有自己的静态 ip,并且虚拟机之间能够成功访问彼此。

如果读者计划使用服务器,而不是本地虚拟机来实践的话,可以选择跳过这一节和后面的 3.4 节,在这两节我们主要做了这些工作,

  • 配置 NAT 网关
  • 通过克隆创建了三台虚拟机
  1. 点开 Vmware Workstation 的虚拟网络编辑器
  1. 点击更改设置通过 UAC 管理员设置后将会显示如图界面
image-20220322221749684
  1. 下面我们添加一个虚拟网络 Vmnet8

    点击添加网络,选择 Vmnet8,

    image-20220322222445596

    创建成功后,将会如图显示,我们要做几个配置,

    image-20220322223213216

    修改后长这样,

    image-20220322223532826

    现在我们点进去 NAT 设置,看看网关地址,

    image-20220322223640034

    一般来说如果你和我使用的是相同的配置,我们的网关地址都是 192.168.100.2,至此虚拟网络就配置好了,别忘了确定保存噢~

3.3 配置模板虚拟机网络

现在让我们进入之前创建的那台 centos 虚拟机,

  1. 修改网络配置文件

    vim /etc/sysconfig/network-scripts/ifcfg-ens33
    

    如果这时候提示 vim command not found,则读者需要通过以下命令安装 vim

    yum install -y vim
    

    我们需要修改配置文件中的几项,

    # 修改为 static
    BOOTPROTO=static
    ### 如果没有以下几项则添加 ###
    # 指定静态 ip
    IPADDR=192.168.100.100 
    # 指定前缀长度
    PREFIX=24 
    # 指定网关
    GATEWAY=192.168.100.2 
    # 指定 DNS
    DNS1=192.168.100.2 
    

    保存后重启虚拟机

  2. 测试是否已经成功配置网络

    我们在宿主机尝试 ping 配置好的虚拟机 192.168.100.100,如下图所示,可以看到结果如下所示。

    image-20220322225737162

3.4 克隆虚拟机

上面我们创建了一个模板虚拟机,现在我们要用它来创建两个 ip 分别为 192.168.100.101 和 192.168.100.102 的虚拟机

  1. 选择克隆菜单

  2. 接下来的步骤通过图示演示

    image-20220322232010039

    下面配置虚拟机名称和存储位置点击完成即可。

    1. 通过上面的步骤克隆两个虚拟机后,我们只需要将之前的网络配置文件中的静态 IP 地址分别修改即可。这里我们分别修改为 192.168.100.101 和 192.168.100.102

      ...
      # 指定静态 ip
      IPADDR=192.168.100.101 
      ...
      
      ...
      # 指定静态 ip
      IPADDR=192.168.100.102
      ...
      
    2. 配置完成后,重启虚拟机,这时候应该有三台虚拟机正在运行,现在我们要验证三台虚拟机是否能够互通

      这里读者使用了 XShell 来作为 SSH 工具,当然实际上直接使用虚拟机的 Terminal 也是没有问题的

      image-20220323141303356

      让虚拟机之间互相 ping 一下,看看是否能够联通

4. 配置 JDK 环境

本节我们首先会配置其中一台虚拟机的环境,这里我们配置 192.168.100.100 的 JDK 环境

按照作者习惯,一般软件压缩包会放置在 /opt/software 目录下,而其安装位置选择在 /opt/module,

mkdir /opt/software /opt/module

进入 software,然后将 JDK 压缩包上传上去,上传成功后我们通过 ll 查看,

image-20220323145427597

进行解压,

tar -zxvf /opt/software/jdk-8u321-linux-x64.tar.gz -C /opt/module/

进入解压好的 jdk 目录,

cd /opt/module/jdk1.8.0_321/

pwd,然后复制一下路径,配置环境变量时会用到。

现在我们进入环境变量目录,

cd /etc/profile.d/

创建一个自定义的脚本,

vim my_env.sh

将下面的内容输入到文件中进行保存,

export JAVA_HOME=/opt/module/jdk1.8.0_321/
export PATH=$PATH:$JAVA_HOME/bin

使得环境变量生效,

source /etc/profile

检查 Java 环境是否生效,

java -version

image-20220323154040251

这里可能有读者有疑问,为什么不直接修改 /etc/profile 文件?而是通过在 profile.d 目录下创建一个自己的配置文件。首先,是不推荐大家修改 profile,相较于创建一个专门的文件来管理自定义环境变量,追加式地修改 profile 不容易维护,并且容易修改错误,导致其他系统变量出现问题。

5. Linux 集群分发介绍

5.1 SCP 命令介绍

scp 是 secure copy 的简写,用于 linux 下远程文件拷贝的命令,功能和 cp 是类似的,只不过强制使用 SSH 连接加密的方式。通常来说如果不配置服务器之间的免密登录,那么每次使用命令都将需要输入目标服务器的账户密码。

scp 的命令的简单使用格式如下所示:

scp -r local_path remote_username@remote_ip:remote_path
  • local_path:本地文件路径
  • remote_username:远程服务器的用户名
  • remote_ip:远程服务器 ip 地址
  • remote_path:要拷贝到的远程路径

下面我们简单使用一下,我们尝试使用这条命令从 192.168.100.100 拷贝 JDK 安装目录到 192.168.100.101,

scp -r /opt/module/ root@192.168.100.101:/opt/module/

这时候会提示你非对称加密指纹的警告,我们输入 yes 再继续,

接下来会提示你需要输入密码才能继续,输入密码回车后,你将会看到一大段输入,和 cp 命令的输出是一个道理的,

image-20220323225328417

重新执行 scp 命令之后还是需要重新输入密码的,这很麻烦,在第六节,作者将会介绍如何配置免密登录

我们到 192.168.100.101 的目录下验证是否已经拷贝成功,

image-20220323230539273

细心的读者再重复执行一次拷贝命令,会发现 scp 命令会重复完整地拷贝整个 module 并以覆盖的形式传送到指定服务器,我们将会看到和第一次执行 scp 命令一样的输出。换言之,scp 命令无论远程服务器指定目录下是否已经存在相同的文件,scp 都会重复地拷贝,这样带来许多无用的拷贝工作,造成了很多额外的耗时。

事实上,我们希望找到一种类似 SVN 或者 Git 版本控制工具的同步方式,而不需要每一次都进行完整的拷贝,那么接下来介绍的命令将会以一种镜像同步的方式解决集群分发问题。

5.2 RSYNC 命令介绍

rsync 主要用于备份和镜像同步。相较于 scp,它具备速度更快、避免复制相同内容等优点。

rsync 的命令的简单使用格式如下所示:

rsync -av local_path remote_username@remote_ip:remote_path

现在我们尝试使用 rsync 来将 JDK 同步到 192.168.100.102,

rsync -av /opt/module/ root@192.168.100.102:/opt/module/

读者可能需要先安装一下 rsync

yum install -y rsync

第一次执行的前两步和前面的 scp 一样,都是要保存远程服务器的密钥指纹和输入密码,后续执行就只需要输入密码了。

输入密码回车执行后,由于是第一次同步 module 路径,那么第一次肯定是全量同步的,也就是和拷贝是没有什么去别的。当我们重复执行这条命令后,你会发现和 scp 有所不同,

命令会很快执行完毕,因为 rsync 使用的是增量同步的方式,由于文件没有经过修改,那么 rsync 不会产生任何文件拷贝操作。

现在我们尝试同步 /etc/profile.d/my_env.sh 配置文件到其他服务器中,

rsync -av /etc/profile.d/my_env.sh root@192.168.100.101:/etc/profile.d/
rsync -av /etc/profile.d/my_env.sh root@192.168.100.102:/etc/profile.d/

读者将会看到以下输出,

现在我们往配置文件中添加一些注释,

# Java Home
export JAVA_HOME=/opt/module/jdk1.8.0_321/
# add to path
export PATH=$PATH:$JAVA_HOME/bin

再次执行 rsync,只不过这时候我们选择同步整个 profile.d 路径,

rsync -av /etc/profile.d/ root@192.168.100.101:/etc/profile.d/

读者会发现 rsync 只同步了被修改的 my_env.sh 文件,我们也就验证了 rsync 增量同步的特性。这个特性非常有用,加入我们在 /opt/module 和 /etc/profile.d 目录下分别放置着非常多的软件目录和配置文件,rsync 能够帮助我们实现修改一处然后同步到多处的需求

5.3 集群分发脚本

通过上面我们介绍了 rsync 命令的使用,在使用中我们发现一个问题,如果需要同步一个路径到多个服务器时,我们需要执行下面的多条命令,并且如果需要同步的服务器越多,命令执行的次数就越多,

rsync -av local_path root@192.168.100.101:remote_path
rsync -av local_path root@192.168.100.102:remote_path
...

我们能不能有一种一劳永逸的办法,我只需要给命令提供路径,它就自动帮我同步到所有节点呢?那这就是 shell 脚本的命令了,下面提供一个脚本供读者使用,

#!/bin/bash

# 判断参数是否足够
if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi

# 遍历集群所有 ip
for host in 192.168.100.100 192.168.100.101 192.168.100.102
do
    echo ====================  $host  ====================
    
    # 遍历所有目录
    for file in $@
    do
        # 判断文件是否存在
        if [ -e $file ]
            then
                # 获取父目录
                pdir=$(cd -P $(dirname $file); pwd)
                # 获取当前文件的名称
                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                # 循环执行 rsync 命令
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done

如果读者使用了不同的 ip 地址,则只需要修改脚本这一处为你的 ip 列表,

...
for host in ip1 ip2 ip3 ... ipn
...

下面我们来使用这个脚本,

cd
vim syncall

然后将上面的脚本写入文件中并保存。

修改脚本执行权限,使其能够被执行,

chmod +x syncall

验证脚本是否能够被执行,

./syncall /etc/profile.d/
image-20220324001525055

可以看到除了要处理密钥指纹和输入多次密码之外,脚本是正常执行的。

拷贝到 bin 目录以便全局可用,

cp syncall /bin

至此你已经能够在任何地方使用这个集群分发脚本了。

6. SSH 免密登录

因为篇幅问题,我们不在本文介绍 SSH 免密登录原理,直接提供步骤给大家。

  1. 生成本机的公私钥

    cd .ssh/
    ssh-keygen -t rsa
    

    然后直接敲回车,让它做默认选择

    image-20220324002139567
  2. 拷贝公钥到指定服务器

    ssh-copy-id 192.168.100.100
    ssh-copy-id 192.168.100.101
    ssh-copy-id 192.168.100.102
    

    期间会需要输入指定服务器的 root 密码

    注意,如果读者希望其他服务器也能互相无密登录,则需要到 101 和 102 的服务器上重复执行上面的步骤。如果读者希望不适用 root 账号来做无密登录,则需要切换到其他用户账户,并重复上面步骤即可。

  3. 使用集群分发来验证是否配置成功

    image-20220324002801484

    一路畅通~

7. 总结经验

本文核心的内容是 SCPRSYNC 的使用与集群分发脚本。经验之谈,如果想要快速配置一台新购买的服务器,那么我建议本地保存有一些常用的模板机,然后通过在远程服务器安装 rsync ,并通过启动模板机做集群分发即可快速完成模板配置。