1、服务器集群环境搭建
2、了解shell编程
#linux集群环境搭建集群、分布式---->多台机器虚拟机克隆服务器基础环境准备1、防火墙关闭2、主机名hostname修改3、hosts主机名 IP映射4、ssh免密登录5、扩展:跳板机、堡垒机6、集群时间同步7、scp 跨集群复制文件
#Linux软件安装rpm包yum安装软件
#软件安装JDK
# shell编程
分布式:多台不同的服务器中部署不同的服务模块,通过远程调用协同工作,对外提供服务。
集群:多台不同的服务器中部署相同应用或服务模块,构成一个集群,通过负载均衡设备对外提供服务。
分布式、集群
共同点:多台机器。 相对的概念叫做单机系统。
注意:在口语中经常混淆分布式和集群的概念的。都是汲取两者的共同点。
比如:搭建一个分布式hadoop集群。背后意思:不要搭建单机版本的 搭建多台机器版本的。
集群架构
主从架构
主角色:master leader 大哥
从角色:slave follower 小弟主从角色各司其职,需要共同配合对外提供服务。
常见的是一主多从 也就是一个大哥带着一群小弟共同干活。
主备架构
主角色:active
备角色:standby主备架构主要是解决单点故障问题的 保证业务的持续可用。
常见的是一主一备 也可以一主多备。
前提:是虚拟机处于关闭状态。
分类:链接克隆 、完整克隆
链接克隆:表层是互相独立 底层存储是交织在一起;
完整克隆:完全互相独立的两台虚拟机
修改克隆机器属性。
完整克隆意味着两台机器一模一样。在局域网网络中,有些属性是决定不能一样的。
比如:IP、MAC、主机名hostname
3台虚拟机硬件分配 16G
node1 2*2cpu 4G内存
node2 1*1cpu 2G内存
node3 1*1cpu 2G内存
vim /etc/hostnamenode2.itcast.cn
#修改IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE="Ethernet" #网卡类型 以太网
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none" #ip等信息是如何决定的? dhcp动态分配、 static|node 手动静态分配
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33" #网卡名称
UUID="62982d98-441d-43ef-8e56-73aa36ab6f07"
DEVICE="ens33"
ONBOOT="yes" #是否开机启动网卡服务
IPADDR="192.168.88.152" #IP地址
PREFIX="24" #子网掩码 等效: NETMASK=255.255.255.0
GATEWAY="192.168.88.1" #网关服务
DNS1="192.168.88.1" #网关DNS解析
DOMAIN="114.114.114.114" #公网DNS解析 114.114.114.114 谷歌:8.8.8.8 阿里百度DNS
IPV6_PRIVACY="no#修改主机名hostname
node2.itcast.cn
背景
在网络中,很少直接通过IP访问机器,原因难记。
通常使用主机名或者域名访问。
此时就会涉及到主机名域名和IP之间的解析
实现
本地hosts文件 进行本地查找解析
localhost 127.0.0.1
寻找DNS服务器 域名解析服务
配置本地hosts文件实现
linux上
vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.88.151 node1.itcast.cn node1
192.168.88.152 node2.itcast.cn node2
192.168.88.153 node3.itcast.cn node3
windows上
C:\Windows\System32\drivers\etc\hosts192.168.88.151 node1.itcast.cn node1
192.168.88.152 node2.itcast.cn node2
192.168.88.153 node3.itcast.cn node3
firewalld
#查看防火墙状态
systemctl status firewalld#关闭防火墙
systemctl stop firewalld#关闭防火墙开机自启动
systemctl disable firewalld#centos服务开启关闭命令
centos6:(某些可以在centos7下使用)service 服务名 start|stop|status|restartchkconfig on|off 服务名centos7: systemctl start|stop|status|restart 服务名systemctl disable|enable 服务名 #开机自启动 关闭自启
selinux
vim /etc/selinux/config# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
背景
#在进行集群操作的时候 需要从一台机器ssh登录到其他机器进行操作 默认情况下需要密码[root@node1 ~]# ssh node2
The authenticity of host 'node2 (192.168.88.152)' can't be established.
ECDSA key fingerprint is SHA256:kTth0zkiMakFp9O0B8v0GHnpQy86+YfpHqAX4Cxb/hk.
ECDSA key fingerprint is MD5:b2:74:4f:b3:a0:b4:7e:a1:3d:50:c4:55:8b:3b:78:cb.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'node2,192.168.88.152' (ECDSA) to the list of known hosts.
root@node2's password:
Last login: Sun Jan 29 17:00:02 2023 from 192.168.88.8
[root@node2 ~]# exit
logout
Connection to node2 closed.
需求:能否实现免密ssh登录。
实现
#实现node1----->node2#step1
在node1生成公钥私钥
ssh-keygen 一顿回车 在当前用户的home下生成公钥私钥 隐藏文件[root@node1 .ssh]# pwd
/root/.ssh
[root@node1 .ssh]# ll
total 12
-rw------- 1 root root 1679 Jan 29 17:12 id_rsa
-rw-r--r-- 1 root root 402 Jan 29 17:12 id_rsa.pub
-rw-r--r-- 1 root root 182 Jan 29 17:05 known_hosts#step2
copy公钥给node2
ssh-copy-id node2
注意第一次需要密码#step3
[root@node1 .ssh]# ssh node2
Last login: Sun Jan 29 17:06:00 2023 from node1.itcast.cn
[root@node2 ~]# exit
logout
Connection to node2 closed.
要求
#至少打通node1---->node1 node2 node3 这三个免密登录 #至于所有机器之间要不要互相免密登录 看你心情
扩展:跳板机、堡垒机
作为局域网连接外网的机子,同时也承载着全部的防护压力像堡垒一样。
背景:linux上copy文件 cp
命令:scp 基于ssh协议跨网络cp动作
注意事项,没有配置ssh免密登录也可以进行scp远程复制 只不过在复制的时候需要输入密码。
例子
#本地copy其他机器
scp test.txt root@node2:/root/scp -r linux02/ root@node2:$PWD #copy文件夹 -r参数 $PWD copy至和本机相同当前路径#为什么不需要输入密码
因为配置了机器之间的免密登录 如果没有配置 scp的时候就需要输入密码#copy其他机器文件到本地
scp root@node2:/root/test2.txt ./
背景:分布式软件主从角色之间通常基于心跳时间差来判断角色工作是否正常。
国家授时中心 北京时间
linux
ntp 网络时间协议 实现基于网络授时同步时间。
date
查看当前的系统时间 也可以手动指定设置时间 不精准[root@node1 ~]# date
Sun Jan 29 18:28:44 CST 2023
ntpdate
#ntpdate 授时服务器ntpdate ntp5.aliyun.com[root@node1 ~]# ntpdate ntp5.aliyun.com
29 Jan 18:29:09 ntpdate[2016]: adjust time server 203.107.6.88 offset -0.030927 sec#企业中运维往往不喜欢ntpdate 原因是这个命令同步时间是立即的。不是平滑过渡的。
ntp软件
通过配置 平滑的和授时服务器进行时间的同步(运维)
指的是RH系列的包管理器(Red-Hat Package Manager),也是RH安装的软件包后缀名。当下已经扩大了行业标准。
RPM指的是使用rpm命令进行软件的查看、安装、卸载。
弊端
命令
#查询
[root@node1 ~]# rpm -qa | grep ssh
openssh-clients-7.4p1-21.el7.x86_64
libssh2-1.8.0-4.el7.x86_64
openssh-server-7.4p1-21.el7.x86_64
openssh-7.4p1-21.el7.x86_64[root@node1 ~]# rpm -qi openssh-server-7.4p1-21.el7.x86_64
Name : openssh-server
Version : 7.4p1
Release : 21.el7
Architecture: x86_64
Install Date: Sat 28 Jan 2023 10:24:55 PM CST
Group : System Environment/Daemons
Size : 993586
License : BSD
Signature : RSA/SHA256, Fri 23 Aug 2019 05:37:29 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : openssh-7.4p1-21.el7.src.rpm
Build Date : Fri 09 Aug 2019 09:40:49 AM CST
Build Host : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager : CentOS BuildSystem
Vendor : CentOS
URL : http://www.openssh.com/portable.html
Summary : An open source SSH server daemon
Description :
OpenSSH is a free version of SSH (Secure SHell), a program for logging
into and executing commands on a remote machine. This package contains
the secure shell daemon (sshd). The sshd daemon allows SSH clients to
securely connect to your SSH server.#rpm安装软件
rpm -ivh rpm 包的全路径#rpm卸载软件 注意 通常采用忽略依赖的方式进行卸载
rpm -e --nodeps 软件包名称因为在卸载的时候 默认会将软件连同其依赖一起卸载 为了避免影响其他软件的正常使用 通常建议使用--nodeps参数忽略依赖的存在 只卸载程序自己
我的软件安装目录规范
/export/server #软件安装目录
/export/software #安装包的目录
/export/data #软件运行数据保存的目录
/export/logs #软件运行日志mkdir -p /export/server
mkdir -p /export/software
mkdir -p /export/data
mkdir -p /export/logs
介绍
Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
特点
原理
#yum之所以强大原因在于有yum源。里面有很多rpm包和包之间的依赖。
yum源分为网络yum源和本地yum源。#其中网络yum源在centos默认集成了镜像地址 只要联网就可以自动寻找到可用的yum源。 前提联网
#也可以自己搭建本地yum源。实现从本地下载安装。
命令
#列出当前机器可用的yum源信息
yum repolist all#清楚yum源缓存信息
yum clean all#查找软件
rpm list | grep 软件包名称#yum安装软件 -y表示自动确认 否则在安装的时候需要手动输入y确认下载安装
yum install -y xx软件名
yum install -y mysql-*#yum卸载软件
yum -y remove 要卸载的软件包名
简单:解压即可使用 但是通常配置环境变量,以便于在各个路径下之间使用java。
要求:JDK1.8版本。
步骤
#上传安装包到/export/server下
jdk-8u65-linux-x64.tar.gz#解压到当前目录
tar zxvf jdk-8u65-linux-x64.tar.gz#删除红色安装包(可选)
rm -rf jdk-8u65-linux-x64.tar.gz #配置环境变量
vim /etc/profile #G + oexport JAVA_HOME=/export/server/jdk1.8.0_65
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar#重新价值环境变量文件 让配置生效
source /etc/profile[root@node1 ~]# java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
将node1的JDK安装包scp给其他机器
#scp安装包cd /export/server/scp -r jdk1.8.0_65/ root@node2:$PWD#scp环境变量文件scp /etc/profile node2:/etc/#别忘了 其他机器source哦source /etc/profile
在哪里编写?
只要能进行文本编辑的地方都可以写 linux上常使用vim编辑器开发
需要编译?
不需要编译
如何执行?
需要语法解释器 不需要安装
Linux系统中集成了很多个同种类的shell解释器[root@node1 linux02]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
默认shell解释器 bash shell = shell
因为很多linux发行版都以bash作为默认的解释器 所以说市面上大多数shell编程都是基于bash开展的bash shell免费的。
shell的快速入门
shell脚本文件 后缀名没有要求 通常以.sh结尾
格式
#!/bin/bash
echo 'hello shell'#第一行 指定解释器的路径
给脚本授予执行权限
chmod a+x hello.sh
执行shell脚本
绝对路径指定shell脚本
[root@node1 linux02]# /root/linux02/hello.sh
hello shell
相对路径
[root@node1 linux02]# hello.sh #默认去系统环境变量中寻找 错误
-bash: hello.sh: command not found
[root@node1 linux02]# ./hello.sh #从当前目录下找
hello shell
把shell脚本交给其他shell程序执行 比如sh
[root@node1 linux02]# sh hello.sh
hello shell
探讨:后缀名 解释器 执行权限是必须的吗? 不是必须的
[root@node1 linux02]# vim bye.hs
echo "bye bye"[root@node1 linux02]# sh bye.hs
bye bye#文件不是sh结尾 没有授权 没有指定bash解释器路径 但是却可以执行
#此时这个文件是作为参数传递给sh来执行的 此时解释器是sh 只要保证文件中语法正确就可以执行
shell 命令、shell 脚本
#编写shell脚本 执行脚本
[root@node1 linux02]# cat hello.sh
#!/bin/bash
echo 'hello shell'
[root@node1 linux02]# sh hello.sh
hello shell#以shell命令执行
[root@node1 linux02]# echo 'hello shell'
hello shell
shell变量
语法格式
变量=值 #注意等号两边不能有空格[root@node1 linux02]# name = allen
-bash: name: command not found
[root@node1 linux02]# name=allen
变量的使用
[root@node1 linux02]# name=allen
[root@node1 linux02]# echo name
name
[root@node1 linux02]# echo $name
allen
[root@node1 linux02]# echo ${name}
allen
[root@node1 linux02]# echo $namewoon[root@node1 linux02]# echo ${name}woon
allenwoon#建议提取变量的时候 使用{}标识变量的边界范围#unset 删除变量
#readonly 只读变量 不能修改 相当于java中final修饰的[root@node1 linux02]# name=allen
[root@node1 linux02]# echo ${name}
allen
[root@node1 linux02]# name=james
[root@node1 linux02]# echo ${name}
james
[root@node1 linux02]# readonly name=allen
[root@node1 linux02]# echo ${name}
allen
[root@node1 linux02]# name=james
-bash: name: readonly variable
[root@node1 linux02]# unset name
-bash: unset: name: cannot unset: readonly variable#只读变量不能够进行删除 只会随着生命周期结束而结束
#对应shell命令来说 生命周期就是窗口关闭
#对应shell脚本来说 生命周期就是shell执行结束
shell字符串使用
定义字符串
[root@node1 linux02]# name=allen
[root@node1 linux02]# echo $name
allen
[root@node1 linux02]# name1='allen1'
[root@node1 linux02]# echo $name1
allen1
[root@node1 linux02]# name2="allen2"
[root@node1 linux02]# echo $name2
allen2[root@node1 linux02]# echo my name is ${name}
my name is allen
[root@node1 linux02]# echo 'my name is ${name}'
my name is ${name}
[root@node1 linux02]# echo "my name is ${name}"
my name is allen
反引号
#需求:把date命令执行的结果赋值给nowtime变量
[root@node1 linux02]# date
Sun Jan 29 20:14:15 CST 2023
[root@node1 linux02]# nowtime=date #如果没有反引号 理解为字符串
[root@node1 linux02]# echo $nowtime
date
[root@node1 linux02]# nowtime=`date` #使用反引号 理解为执行命令 把命令的结果进行赋值
[root@node1 linux02]# echo $nowtime
Sun Jan 29 20:14:49 CST 2023
上一篇:元宇宙与数字孪生有区别