Linux高级技巧之集群部署(七) - 详解

news/2025/9/28 8:05:09/文章来源:https://www.cnblogs.com/wzzkaifa/p/19116010

计算机原理系列

欢迎大家关注「海拉鲁知识大陆」 多交流不迷路

Linux高级技巧之集群部署(七)

看过我前面的系列文章,相信大家已经掌握了一些基础指令的使用方法,今天我们继续聊哈——用Linux指令管理一个集群。这属于Linux指令的高级技巧,高级技巧并不是我们要学习更多的指令,而是要把之前所学的指令进行排列组合融会贯通。从最初只能写几条指令、执行然后看结果,成长到具备书写一个拥有几十行、甚至上百行的bash脚本的能力时,也就意味着大家具备了解决复杂问题的能力。在性能测试过程中就是要这种能解决各种复杂问题的能力。

1. 集群环境介绍

本次只用了3台服务器作为演示示例哈,但是接下来我们要写的脚本和解决问题的思路是可以在很多台服务器之间复用的。在性能测试过程中可能要配置监控,安装监控,收集指标等等可能都是大量服务器的环境哈。所以还是有必要了解哈。
图片

2. 循环遍历IP列表

一个局域网中有很多服务器需要管理,它们彼此之间网络互通,我们通过一台主服务器对它们进行操作。

在主服务器(192.168.21.210)上我们维护一个ip地址的列表,保存成一个文件,如下图所示:
图片
目前iplist中只有两个,如果我们是大量的机器就可以在里面放成百上千个哈。接下来思考下shell如何遍历这些ip?

先尝试实现一个最简单的程序,从文件iplist中读出这些ip并尝试用for循环遍历这些ip,具体程序如下:

#!/usr/bin/env bash
readarray -t ips < iplist
for ip in "${ips[@]}"; do
echo "$ip"
done

首行的#!叫作Shebang。Linux的程序加载器会分析Shebang的内容,决定执行脚本的程序。这里我们希望用bash来执行这段程序,readarray指令是bash 4.0后才有的能力哈。

readarray指令将iplist文件中的每一行读取到变量ips中。ips是一个数组,可以用echo ips[@]打印其中全部的内容:@代表取数组中的全部内容;{ips[@]}打印其中全部的内容:@代表取数组中的全部内容;ips[@]打印其中全部的内容:@代表取数组中的全部内容;符号是一个求值符号。不带$的话,ips[@]会被认为是一个字符串,而不是表达式。

for循环遍历数组中的每个ip地址,echo把地址打印到屏幕上。

如果用shell执行上面的程序会报错,因为readarray是bash 4.0后支持的能力哈,我们用chomd为foreach.sh增加执行权限,然后直接利用shebang的能力用bash执行,如下图所示:
图片

3. 创建集群管理账户

为了方便集群管理,通常使用统一的用户名管理集群。这个账号在所有的集群中都需要保持命名一致。比如这个集群账号的名字就叫作jmeter。

接下来我们探索一下如何创建这个账户jmeter,如下图所示:
图片
上面我们创建了jmeter账号,然后把jmeter加入root分组。这样jmeter就有了成为root的能力,并且设置jmeter用户的初始化shell是bash,如下图所示:
图片
接下来,我们编辑一下/etc/sudoers文件,增加一行jmeter ALL=(ALL) NOPASSWD:ALL表示jmeter账号sudo时可以免去密码输入环节。

我们可以把上面的完整过程整理成指令文件,create_jmeter.sh:

sudo useradd -m -d /home/jmeter jmeter
sudo passwd jmeter
sudo usermod -G root jmeter
sudo usermod --shell /bin/bash jmeter
sudo cp ~/.bashrc /home/jmeter/
sudo chown jmeter.jmeter /home/jmeter/.bashrc
sudo sh -c 'echo "jmeter ALL=(ALL)  NOPASSWD:ALL">>/etc/sudoers'

可以删除用户jmeter,并清理/etc/sudoers文件最后一行。用指令userdel jmeter删除账户,然后执行create_jmeter.sh重新创建回jmeter账户。如果发现结果一致,就代表create_jmeter.sh功能没有问题啦。

最后我们想在另外2台上都执行create_jmeter.sh这个脚本。但是如果是让程序在成百上千台机器上使用,因此还需要一个脚本将create_jmeter.sh拷贝到需要执行的机器上去。

这里,可以对foreach.sh稍做修改,然后分发create_jmeter.sh文件哈。

#!/usr/bin/bash
readarray -t ips < iplist
for ip in ${ips[@]}
do
scp ~/remote/create_jmeter.sh root@$ip:~/create_jmeter.sh
done

这里,我们在循环中用scp进行文件拷贝,然后分别去每台机器上执行create_jmeter.sh。

如果你的机器非常多,上述过程还是非常烦琐。

4. 打通集群权限

接下来我们需要打通从210到211和212的权限。利用主服务器的公钥在各个服务器间登录,避免输入密码。接下来我们聊聊怎么搞哈:

首先需要在210上用ssh-keygen生成一个公私钥对,然后把公钥写入需要管理的每一台机器的authorized_keys文件中。如下图所示:我们使用ssh-keygen在主服务器210中生成公私钥对。
图片
然后使用mkdir -p创建/.ssh目录,-p的优势是当目录不存在时,才需要创建,且不会报错。代表当前家目录。 如果文件和目录名前面带有一个.,就代表该文件或目录是一个需要隐藏的文件。平时用ls的时候,并不会查看到该文件,通常这种文件拥有特别的含义,比如~/.ssh目录下是对ssh的配置。

我们用cd切换到.ssh目录,然后执行ssh-keygen(三次回车)。这样会在~/.ssh目录中生成两个文件,id_rsa.pub公钥文件和is_rsa私钥文件。 如下图所示:
图片
看到id_rsa.pub文件中是加密的字符串,我们可以把这些字符串拷贝到其他机器对应用户的~/.ssh/authorized_keys文件中,当ssh登录其他机器的时候,就不用重新输入密码了。 这个免密公钥的能力,这里可以同样用一个shell脚本执行哈。

我们修改一下foreach.sh,并写一个transfer_key.sh配合foreach.sh的工作。transfer_key.sh内容如下:
foreach.sh

#!/usr/bin/bash
readarray -t ips < iplist
for ip in ${ips[@]}
do
sh ./transfer_key.sh $ip
done

tranfer_key.sh

ip=$1
pubkey=$(cat ~/.ssh/id_rsa.pub)
echo "execute on .. $ip"
ssh jmeter@$ip "
mkdir -p ~/.ssh
echo $pubkey  >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
"

在foreach.sh中我们执行transfer_key.sh,并且将IP地址通过参数传递过去。在 transfer_key.sh中,用$1读出IP地址参数, 再将公钥写入变量pubkey,然后登录到对应的服务器,执行多行指令。用mkdir指令检查.ssh目录,如不存在就创建这个目录。最后我们将公钥追加写入目标机器的~/.ssh/authorized_keys中。

chmod 700和chmod 600是因为某些特定的linux版本需要.ssh的目录为可读写执行,authorized_keys文件的权限为只可读写。而为了保证安全性,组用户、所有用户都不可以访问这个文件。

我们执行foreach.sh还是需要输入两次密码哈。完成上述操作后,我们再登录这两台服务器就不需要输入密码啦。

接下来,我们试试免密登录:
图片
完美~,我们登录任何一台机器,都不再需要输入用户名和密码。

5. 单机安装 Java 环境

在远程部署Java环境之前,我们先单机完成以下Java环境的安装,用来收集需要执行的脚本。

安装java环境可以直接用apt下载对应版本的jdk哈。

然后执行下面的脚本确认java安装。

which java
java --version

图片
如果是产线最好还是根据最小权限原则,执行Java程序我们考虑再创建一个用户ujava。

sudo useradd -m -d /opt/ujava ujava
sudo usermod --shell /bin/bash jmeter

这个创建用户可以不设置密码,因为我们不会真的登录到这个用户下去做任何事情。接下来我们为用户配置Java环境变量。

export JAVA_HOME=/usr/local/java/jdk-11.0.26/bin/java

Linux的环境变量就好比全局可见的数据,这里我们使用export设置哈。 JAVA_HOME环境变量的指向。如果你想看所有的环境变量的指向,可以使用env指令。
图片
其中有一个环境变量比较重要,就是PATH。
图片
如上图,我们可以使用shell查看PATH的值,PATH中用:分割,每一个目录都是linux查找执行文件的目录。当用户在命令行输入一个命令,Linux 就会在PATH中寻找对应的执行文件。

我们不希望JAVA_HOME配置后重启一次电脑就消失,所以可以把这个环境变量加入ujava用户的profile中。这样只要发生用户登录,就有这个环境变量。

sudo sh -c 'echo "export JAVA_HOME=/usr/local/java/jdk-11.0.26/" >> /opt/ujava/.bash_profile'

将JAVA_HOME加入bash_profile,这样后续远程执行java指令时就可以使用JAVA_HOME环境变量了。

最后,我们再将上面所有的指令整理起来,形成一个install_java.sh。

sudo apt -y install jdk-11.0.26
sudo useradd -m -d /opt/ujava ujava
sudo usermod --shell /bin/bash ujava
sudo sh -c 'echo "export JAVA_HOME=/usr/local/java/jdk-11.0.26/" >> /opt/ujava/.bash_profile'

apt后面增了一个-y是为了让执行过程不弹出确认提示了。

6. 远程安装 Java 环境

最后到了远程安装Java环境这一步,我们又需要用到foreach.sh。为了避免每次修改,你可以考虑允许foreach.sh带一个文件参数,指定需要远程执行的脚本。
foreach.sh

#!/usr/bin/bash
readarray -t ips < iplist
script=$1
for ip in ${ips[@]}
do
ssh $ip 'bash -s' < $script
done

改写后的foreach会读取第一个执行参数作为远程执行的脚本文件。 而bash -s会提示使用标准输入流作为命令的输入;< $script负责将脚本文件内容重定向到远程bash的标准输入流。

然后我们执行foreach.sh install_java.sh,机器等待几分钟左右,在执行结束后,可以用下面这个脚本检测两个机器中的安装情况。
check.sh

sudo -u ujava -i /bin/bash -c 'echo $JAVA_HOME'
sudo -u ujava -i java --version

check.sh中我们切换到ujava用户去检查JAVA_HOME环境变量和Java版本。

7. 总结

这次我们聊的东西算是运维层面的一点皮毛吧。用脚本文件构建一个又一个小工具的过程中,可以发现复用很重要。在工作中,优秀的性能工程师是擅于积累和复用哈,如果你第一次安装java环境,可以把今天的安装脚本保存在自己的小本本中,以后就能自动化完成了。其实工具和脚本并没有那么重要,只是一种手段罢了,除了积累和总结,更重要的就是我们思维,擅于自己去查资料,自己解决问题的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/920343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用指南:python+springboot+uniapp基于微信小程序的停车场管理系统 弹窗提示和车牌识别

实用指南:python+springboot+uniapp基于微信小程序的停车场管理系统 弹窗提示和车牌识别2025-09-28 08:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important…

设计感强的网站同一网站能否同时运行php和asp

原文:C#设计模式(19)——状态者模式&#xff08;State Pattern&#xff09;一、引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题&#xff0c;在本文中将首先通过一个银行账户的例子来解释状态者模式&#xff0c;通过这个例子使大家可以对状态…

什么是门户网站?民治营销网站

学习面向对象好几年了&#xff0c;但一直没有深刻的理解面向对象&#xff0c;直到最近开始做自动化测试平台开发过程中&#xff0c;才发现面向对象的魅力。因而决定好好把设计模式学习下。首先先了解下设计模式相关的定义以及主意事项&#xff1a; 1.  什么是设计模式&#x…

游戏网站开发难度免费好用wordpress主题

如何在学校里讲创新, 这是一个老问题。 但是天朝的教育体制总有办法&#xff0c;请看: http://news.163.com/10/1125/03/6MABIS4H00014AED.html 武汉一高校设"创新学分" 不搞创新不能毕业 去年秋季&#xff0c;武汉科技大学中南分校出台《学籍管理规定》&#xff0c;…

违法人员都是怎么建设网站的爱趣网

一 流量控制 说明&#xff1a; 本文只是原理铺垫,没有用tcpdumpwiresahrk鲜活的案例讲解,后续补充 ① 基本概念 流量控制: TCP 通过接受方实际能接收的数据量来控制发送方的窗口大小 ② 正常传输过程 背景:1、客户端是接收方,服务端是发送方 --> 下载2、假设接收窗…

泰州企业网站模板建站苍山县建设银行网站

1.树的表示 typedef int DadaType; struct Node{struct Node* firstChild;struct Node* pnextBrotherDataType data; };//树的表示 2.二叉树的简介 二叉树是一种树形数据结构&#xff0c;每个节点最多有两个子节点&#xff0c;分别称为左子节点和右子节点。二叉树具有以下特…

千锋教育培训多少钱费用徐州网站优化推广

题干&#xff1a; 在N*N的方格棋盘放置了N个皇后&#xff0c;使得它们不相互攻击&#xff08;即任意2个皇后不允许处在同一排&#xff0c;同一列&#xff0c;也不允许处在与棋盘边框成45角的斜线上。 你的任务是&#xff0c;对于给定的N&#xff0c;求出有多少种合法的放置方…

又一通信芯片厂商完成数亿元融资!

微信视频号:sph0RgSyDYV47z6快手号:4874645212抖音号:dy0so323fq2w小红书号:95619019828B站1:UID:3546863642871878B站2:UID: 3546955410049087近日,杭州必博半导体有限公司(简称:必博半导体)正式宣布完成数…

做题总结

P3891 [GDOI2014] 采集资源 题目链接 一句话题意:给定初始资源 \(M\) 和目标资源 \(T\),有 \(N\) 种苦工,每种苦工消耗 \(A\) 资源生产,每秒产生 \(B\) 资源.求达到或超过 \(T\) 资源的最短时间. 我们设 \(f_{i,j}\) 为…

本地网站建设信息大全网站模板优势

备忘录模式&#xff08;Memento Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在不破坏封装性的前提下&#xff0c;捕获并保存对象的内部状态&#xff0c;以便在将来的某个时刻可以恢复到之前的状态。备忘录模式的核心是状态的保存和恢复&#xff0c;常用于实现撤销…

如何查看网站ftp地址视频广告联盟平台

前提&#xff1a;依旧以前面发的node.js服务器动态资源处理代码 具体见 http://t.csdnimg.cn/TSNW9为模板&#xff0c;在这基础上进行修改。与动态资源处理代码不同的是&#xff0c;这次的用户信息我们借用表单来实现。post请求解析来获取和展示用户表单填写信息 1》代码难点&…

google登录洛阳网站seo

目录 方案一&#xff1a;使用Samba共享服务Ubuntu 18 端配置Windows 10 端访问 方案二&#xff1a;使用 SSHFS&#xff08;需在 Windows 上安装 SSH 客户端&#xff09;Ubuntu 18 端配置Windows 10 端配置 方案三&#xff1a;使用 FTP 服务Ubuntu 18 端配置Windows 10 端访问 方…

网站备案编号推广公司的新产品英文

在Android平台上&#xff0c;集成了一个嵌入式关系型数据库—SQLite&#xff0c;SQLite3支持 NULL、INTEGER、REAL&#xff08;浮点数字&#xff09;、TEXT(字符串文本)和BLOB(二进制对象)数据类型&#xff0c;虽然它支持的类型只有五种&#xff0c;但实际上sqlite3也接受varch…

【前言】从重复劳动的奴隶到自动化大师

【前言】从重复劳动的奴隶到自动化大师如果你正在读这篇文章,我相信我们有一个共同的痛点:那些永远处理不完的重复性工作。 也许你和我一样,曾经在这些场景中挣扎过:每周一要手动整理几十个部门的报表,复制、粘贴…

网站开发毕业设计中期汇报表什么是网络营销?网络营销的常用方法有哪些?

1037 在霍格沃茨找零钱 (20 分) 如果你是哈利波特迷&#xff0c;你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的&#xff1a;“十七个银西可(Sickle)兑一个加隆(Galleon)&#xff0c;二十九个纳特(Knut)兑一个西可&#xff0c;很容易。”现在&#xff0c;给定哈利…

想做网站制作运营注册什么公司核实使用asp.net做购物网站

在计算机技术日新月异的今天, Docker 在国内发展的如火如荼。特别是在一线互联网公司 Docker 的使用是十分普遍的,甚至成为了一些企业面试的加分项&#xff0c;那么今天我们继续关于Docker 的精华问答。1Q&#xff1a;Consul是什么&#xff1f;A&#xff1a;Consul是一个分布式…

网站开发需求书打码兔怎么和网站做接口

二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树&#xff0c;按照数据的排列方式可以分为两种&#xff1a;最大堆和最小堆。 最大堆&#xff1a;父结点的键值总是大于或等于任何一个子节点的键值&#xff1b; 最小堆&#xff1a;父结点的键值总是小于或等于任何一个子…

谷歌浏览器网页版入口手机版东莞网站seo推广

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 PDFMathTranslate是一个开源项目&#xff0c;旨在为用户提供便捷的PDF科学论文翻译解决方案。它不仅能够翻译文本&#xff0c;还能保留公式、图表、目…

代做机械设计的网站开发公司网签过期

Math中定义了许多的方法&#xff0c;通过Math类就能直接调用&#xff0c;均为static类型。 1、 调用形式:Math.方法名2、三角函数方法&#xff1a; static double sin(double a ) &#xff1a; 返回角的三角正弦static double cos(double a) &#xff1a; 返回角的三角余弦s…

copyright技术支持 东莞网站建设郑州同济医院收费高吗

zipkin 自定义采样率在第一篇文章的后续部分&#xff0c;这一次我们将编写一些更有用的自定义收集器&#xff1a;用于按给定的标准进行分组&#xff0c;采样输入&#xff0c;批量处理以及在固定大小的窗口上滑动。 分组&#xff08;计数事件&#xff0c;直方图&#xff09; 假…