大数据day02 自动化部署高级文本命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36059561/article/details/82453337

一、关于crt中文乱码问题——虚拟机克隆后网卡问题

打开crt后,点击option-session option-appearance-character encoding-选择UTF-8。

虚拟机克隆:右键需要克隆的系统-管理-克隆,可以选择从当前状态或者快照克隆,根据需要选择,下一步,这里需要注意,要选择“创建完整克隆”。修改名字和位置,点击“完成”即可。克隆后的系统和之前的一模一样,所以网络方面会有问题,下面来解决一下。

使用命令“ifconfig -a”可以查看所有的参数,可以看到有一个eth1没有启用,因为ip冲突了,使用命令vim /etc/sysconfig/network-script/ifcfg-eth0编辑eth0,删除UUID和HWADDR两行,配置IPADDR为一个没有占用的静态ip。执行命令rm -rf /etc/udev/rules.d/70-persistent-net.rules,使用命令vim /etc/hosts修改主机映射,使用命令vim /etc/sysconfig/network修改hostname。再执行命令reboot重启机器,重启的时候会重新生成这个文件,因为刚刚对eth0进行了改动,所以生成的新文件中就是只有eth0的配置了,通过ifconfig可以查看克隆机器的ip是不是刚刚修改过的。

二、查看文件内容——系统访问管理——系统启动级别

cp a.txt /home/hadoop/:拷贝文件a.txt到/home/hadoop下
cat a.txt:查看a.txt的内容,一次性将文件内容全部输出到控制台
more a.txt:分页查看a.txt,下翻一页(空格),上翻一页(b),退出(q)
less a.txt:分页查看a.txt,下翻一页(空格),上翻一页(b),上翻一行(↑),下翻一行(↓),搜索关键字key(/key)退出(q)
tail -10 a.txt:查看a.txt最后的10行内容
tail -f a.txt:跟踪a.txt,如果a.txt更新了,也随之显示,跟踪文件的唯一inode编码,等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
tail -F a.txt:跟踪a.txt,如果a.txt更新了,也随之显示,跟踪文件名,等同于--follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
同理,head -10 a.txt:查看a.txt的头10行命令
service --status-all:查看所有后台服务
service network status/stop/start/restart:对network访问进行查看状态,停止,启动,重启
service --status-all | grep crond:其中的|是管道,它把|前的内容作为参数传给|后的内容,grep是一个搜索功能
chkconfig:查看自启动服务的情况,可以查看/etc/inittab文件中关于启动级别的秒杀
所以关闭防火墙自启动命令:chkconfig -iptables off,查看iptables自启动情况:chkconfig iptables --list

三、压缩解压缩——JDK安装

上传文件到服务器的几种方式:

  • 可以使用filezilla图形化界面进行上传下载
  • 使用sftp,进行文件上传和下载
  • rz和sz命令,需要安装rz和sz命令,root用户下使用yum install -y lrzsz命令安装

其中rz表示服务器接收文件,sz表示服务器发送文件,如图所示。

gzip压缩命令:gzip a.txt:将a.txt进行压缩

gzip解压缩命令:gzip -d a.txt.gz:将a.txt.gz解压缩

打包命令:tar -cvf c.tar a.txt b.txt:将a.txt和b.txt使用tar打包成c.tar,其中的参数c是创建,参数v是显示过程,参数f后跟着打包生成文件类型

tar解包命令:tar -xvf c.tar:将c.tar解压缩,其中参数x是解压缩指令

一次性完成打包和压缩的命令:tar -zcvf c.tar.gz a.txt b.txt:将a.txt和b.txt先打包,再进行压缩

一次性完成解包和解压的命令:tar -zxvf c.tar.gz:将c.tar.gz解压缩和解包

安装JDK过程,解压缩jdk安装包:tar -zxvf jdk-7u45-linux-x64.tar.gz,就可以把jdk解压到本地了

打开/etc/profile文件,配置jdk环境变量,在文件末尾加上export JAVA_HOME=/usr/local/software/jdk1.7.0_45和
export PATH=$PATH:$JAVA_HOME/bin,保存退出,在控制台输入source /etc/profile命令,即加载刚才的配置文件。

四、JDK-MySQL-Tomcat-Yum本地源

将MySQL,Tomcat安装包复制到虚拟机内,进行安装。因为之前的虚拟机是最小化安装,使用rpm命令安装MySQL的时候发现需要大量的依赖,所以这里使用yum install mysql-server命令来完成安装,yum可以自动下载依赖。

rpm -qa:查询系统中的所有rpm包,-qa是query all的意思
rpm -qa | grep mysql:查询MySQL相关的包,这里的|是管道,将|前的内容当参数传递给|后的grep,用来查询

Yum有点像Maven,Yum里面有包与包的依赖,下载某一个安装包的时候,会自动去找它的依赖并将它下载安装好。

yum常用命令

yum install -y mysql-server:安装mysql-server,其中-y代表yes的意思,避免安装中频繁提示是否安装依赖
yum list:列出所有可用的package和package组
yum clean all:清除所有缓冲数据
yum deplist mysql-server:列出mysql-server所有的依赖
yum remove mysql-server:删除mysql-server

查看yum的配置,跳到/etc/yum.repos.d/目录下,可以看到有几个文件,这些文件叫源,类比于Maven中的资源库镜像。打开CentOS-Media.repo,其中baseUrl就是代表源的路径,如果是网上的资源,那么这里就是一个url链接,如果你有安装光盘,可以将光盘挂载到某个目录下,然后在baseUrl指定光盘的路径,修改enabled=1,表示启用这个源,那么就可以制作一个本地Yum仓库了。如果需要手动添加包到私有Yum中,先将包复制到repo目录下,在repo目录下执行createrepo .命令,系统会根据包,自动创建依赖关系。

安装完成MySQL后,启动mysql服务的命令是:service mysqld start,这时候一定注意提示信息,不同版本会有不同的提示信息,我的提示信息如下图。这里告诉我们,记得为root用户设置一个密码,设置的命令如下。有的MySQL版本会随机生成一个密码,告诉你密码放在哪里,需要去哪里找,如果是这种情况,而且启动的时候不注意这里的提示,那肯定是登录不上的。然后我们按照提示,给root设置一个密码。设置好之后,执行命令mysql -u root -p,输入密码,验证是否能登录进去。使用quit命令退出。

安装Tomcat,先把压缩包拷贝到虚拟机中,tar -zxvf apache-tomcat-7.0.68.tar.gz解压缩。在bin目录下有一个startup.sh和一个shutdown.sh,分别是启动和关闭Tomcat,使用命令netstat -nltp可以查看是否有Java进程,如图所示。

五、iptables的常用操作

service iptables status/start/stop:查看防火墙状态,开启防火墙,关闭防火墙
chkconfig iptables --list:查看防火墙是否开机启动
chkconfig iptables on/off:设置防火墙开机启动/不启动
iptables -A INPUT -p tcp --dport 22 -j DROP:禁止ssh登录
iptables -D INPUT -p tcp --dport 22 -j DROP:删除规则
-A, --append chain:追加到规则的最后一条
-D, --delete chain [rulenum]:Delete rule rulenum (1=first) from chain 删除rulenum这条规则
-I, --insert chain [rulenum]:Insert in chain as rulenum (default 1=first) 添加到规则的第一条
-p, --proto proto protocol:by number or name, eg. 'tcp', 常用协议有tcp,udp,icmp,all
-j, --jump target 常见行为有ACCEPT,DROP和REJECT三种,一般不用REJECT,会带来安全隐患

我们在访问Linux上的Tomcat的时候,通常会关闭防火墙,否则是访问不到的,是因为防火墙的限制原因。通过命令iptables -L -n可以看到,只有22端口是开放的,所以可以实现tcp连接,但是8080端口没有开放,故访问Tomcat自然就访问不通了。

如果说,我们更改了防火墙的规则,让防火墙允许8080端口访问,那么就可以在开启防火墙的状态下也能访问到Linux中的Tomcat了。使用命令iptables -I INPUT -p tcp --dport 8080 -j ACCEPT,再使用iptables -L -n查看,发现多了一个8080端口。这时候就可以在防火墙开启的时候访问Tomcat啦。

真正的生产环境,通常将防火墙的规则都清空掉,然后添加需要的规则,即需要开放哪些端口。这些工作都是由运维来做的,作为开发仔,简单了解下就行。

六、Shell编程的变量定义

Shell是用于与内核进行交互的一种接口,目前最流行的Shell称为bash Shell。Shell是一种解释型的编程语言,即Shell脚本。一个系统可以存在多个Shell,通过cat /etc/shells查看系统中安装的Shell,不同Shell可能支持的语法不同。

Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。自定义变量的时候有一些规范:

  1. 变量=值(如STR=abc)
  2. 等号两边不能有空格,编程中可能习惯int a = 0;这样的写法,但是在Shell中不支持
  3. 变量名一般习惯大写
  4. 双引号和单引号是有区别的,双引号中,如果有变量,会直接替换掉,单引号中的,如果有变量,会把变量名作为字符串输出出来,不会替换为变量值

如果变量定义完了不想用了,可以使用unset A撤销变量A的定义。如果有个变量是readlony B=2,那么B是不能被unset的,这个变量会一直存在。export变量名可以把变量提升为全局环境变量,可供其他Shell调用。

将命令的返回值赋给变量:A=`ls-la`或A=$(ls-la)。

七、Shell编程的基本语法

Shell中的特殊变量

$?:表示上一条命令退出的状态,即上一条命令的返回值
$$:表示当前进程编号
$0:表示当前脚本的名称
$n:表示n位置的输入参数(n代表数字,n>=1)
$#:表示参数的个数
$*和$@:表示参数列表

$*和$@的区别:当它们不被双引号包含的时候,输出都是$1,$2……,$n的形式,如果加了双引号,$*会以"$1 $2 …… $n"的形式输出,$@会以"$1""$2" …… "$n"的形式输出所有参数。

Shell的运算符:有两种,一种是expr m + n,一种是$((m+n)),注意第一种expr和表达式之间要有空格,m,n和+之间要有空格,否则就报错了,而且使用expr计算(a+b)*c的时候,是非常麻烦的,这里就不写了,建议使用第二种。

for循环,while循环,case语句类比Java语法看看就好,比较容易理解,但是写起来感觉很不顺手,就不记录了。

if命令,read命令,自定义函,脚本调试数等等内容呢,写起来的感觉很别扭,用到的时候现查吧。

八、高级文本处理命令的引入

这里有3种文本处理方式:cut,sed,awk。

九、高级文本处理命令之cut-sort-wc

cut

cut命令可以从一个文本文件或者文本流中提取文本列。

cut命令的选项与参数:

-d:后面跟分隔符。与-f一起使用
-f:依据-d的分隔字符将一段信息分割成为数段,用-f取出第几段的意思,从1开始数。比如取第3个就是-f 3,取第3和第5就是-f 3,5,取第3个到最后就是-f 3-,取第1个到第3个是-f 1-3,用法还是蛮灵活的
-c:以字符的单位取出固定字符区间
echo $PATH | cut -d ':' -f 5:的意思是用冒号分隔$PATH变量,取出第5段

sort

sort命令对File参数指定的文件中的行排序,将结果写到标准输出,如果File参数指定多个文件,sort命令将这些文件连接起来,并当做一个文件进行排序。sort默认使用第一个数据来排序,默认以字符串形式排序。

sort命令的选项与参数:

-f:忽略大小写差异,例如A与a视为相同编码
-b:忽略最前面的空格符部分
-M:以月份的名字进行排序
-n:使用纯数字进行排序,默认是以文字形态来排序的
-r:反向排序
-u:相同数据中,仅出现一行代表,unique的意思
-t:分隔符,默认使用tab来分隔的
-k:以哪个区间(field)进行排序
cat /ect/passwd | sort -t ':' -k 3n:对/etc/passwd文件进行排序,以冒号分隔,以第三列为排序依据进行排序,n是以数字形式排序的意思,如果不加n,那么是以字符串进行排序的。

uniq

uniq命令可以去除排序过文件中重复的行,uniq成功的前提是必须要sort过,才能去重,所以uniq通常和sort一起使用。

uniq命令的选项与参数:

-i:忽略大小写字符不同
-c:进行计数
-u:只显示唯一的行

wc

统计文件里面有多少单词,多少行,多少字符。

wc命令的选项与参数:

-l:仅列出行
-w:仅列出多少字(英文单词的个数)
-m:多少字符

十、高级文本处理命令之sed

用法太多了,这里不罗列了,而且不要去记住,因为规则挺麻烦的,有需要的根据需要查一下吧。

十一、高级文本处理命令之awk

同上,awk已经成为了一种编程语言,编写起来更加的复杂,自然功能也更丰富,想学习的可以找一些例子,对比着命令和结果,这样来学习,这里也不赘述了,内容太多了。

十二、高并发网站架构

一个Tomcat能支撑的用户数是有限的,当用户量比较大的时候,最先想到的就是多加几台Tomcat,并用Nginx负责分发请求,负载均衡等。大型网站的首页通常是做了静态化的,有的人访问网站的时候,只访问了首页,也就是只访问了静态资源,所以不必要进入到Tomcat中,可以在刚刚的Nginx中对请求做一下处理,也可以在刚刚Nginx下再接Nginx服务器负责处理静态资源,据说淘宝网的首页就用了非常多的服务器来扛这么大的用户量。Tomcat是处理动态资源的,里面是action层和service层,但是,当我们修改了service逻辑的时候,需要对每个Tomcat重新部署,是非常麻烦的,所以要把service层拿出来,同时要把service并列出来很多台,因为数量少了扛不住高并发啊,而且有时候服务器是动态添加的。service的服务器多了,问题又来了,action访问哪一台service服务器,可以在action和service中间用dubbo,当action请求dubbo的时候,dubbo给action返回service的地址,action再去根据返回的结果请求service,dubbo可以做一个负载均衡的作用。service最终还是会查询数据库 的,但是一个数据库实例肯定是不行的,需要多个库,并且实现分库分表,比较麻烦,Mycat是一个实现分库分表的中间件。所以service只需要请求Mycat就可以了,Mycat根据id取哈希值来确定存放到哪个数据库中,这里的哈希不是普通的哈希,而是一种一致性哈希算法,假设原来有3个库,有一条1111的数据原来在第一个库,当数据量非常大,需要添加新的数据库的时候,必须要保证,添加完新数据库后,原来的1111还要在原来的库中,这就叫一致性哈希。数据库层面还有一个优化方法是读写分离,因为读比写要快,读写分离需要保证数据的一致性。在Mycat上层,还可以添加Redis做缓存,当请求的数据在缓存中有的话,就不需要去数据库查询了。在用户和Nginx之间,还可以配置多台CDN服务器,比如大型的视频网站,不可能在Nginx里面存放大量的视频信息,这会占用太多太多的硬盘资源,所以要用CDN,CDN在全国各地都有,全国各地用户访问的时候,就可以拿到最近的资源。最前端的Nginx需要做高可用,也就是多放几台Nginx服务器,多台Nginx服务器中,每个Nginx服务器的前面还需要有一个KeepAlived来支撑,保证它们都是alive的嘛。多台Keepalived之间会进行通信,互相发送心跳请求,看看是否还有反应。通常Keepalived一主一备,当主挂掉之后,可以立刻切换为备用的。Keepalived还可以监控它绑定到Nginx是否还活着,如果检测到自己的Nginx服务器挂掉了,那么会通知另一台服务器,让另一台服务器继续处理请求。

十三、Nginx和Keepalived部署安装的流程解析

这节课的目的不是为了熟悉怎么使用Nginx,Keepalived,而是让我们熟悉Linux系统的一系列操作,因为后面会大量使用Linux操作系统,所以一定要熟悉基本的操作。

安装Nginx

  1. 将下载好的Nginx上传到虚拟机中,使用命令tar -zxvf nginx-1.8.1.tar.gz解压Nginx。
  2. 进入nginx-1.8.1中,有一个configure文件,使用命令./configure --prefix=/usr/local/nginx编译nginx,提示缺少包,使用yum -y install gcc pcre-devel openssl openssl-devel命令安装需要的包。
  3. 使用命令./configure --prefix=/usr/local/nginx编译Nginx。
  4. 使用命令make && make install进行编译安装。
  5. 安装完成后,使用命令./usr/loca/nginx/sbin/nginx启动Nginx。
  6. 使用命令netstat -ntlp | grep 80查看Nginx是否启动成功,如果有Nginx说明启动成功了。

配置Nginx

首先把Tomcat复制出来一份,一个叫Tomcat8080,一个叫Tomcat8081,使用命令vim /usr/local/software/tomcat8081/conf/server.xml修改tomcat8081的端口号等信息,如下图所示。

<!--第一行8085改为8086-->
<Server port="8006" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<!--第一行8080改为8081-->
 <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
<!--第一行8009改为8010-->
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

再分别修改两个Tomcat下/webapp/ROOT/index.jsp中的一行代码,以示区分,注意修改的是倒数第2行的内容。

<body>
        <div id="wrapper">
            <div id="navigation" class="curved container">
                <span id="nav-home"><a href="${tomcatUrl}">Home</a></span>
                <span id="nav-hosts"><a href="${tomcatDocUrl}">Documentation</a></span>
                <span id="nav-config"><a href="${tomcatDocUrl}config/">Configuration</a></span>
                <span id="nav-examples"><a href="${tomcatExamplesUrl}">Examples</a></span>
                <span id="nav-wiki"><a href="http://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
                <span id="nav-lists"><a href="${tomcatUrl}lists.html">Mailing Lists</a></span>
                <span id="nav-help"><a href="${tomcatUrl}findhelp.html">Find Help</a></span>
                <br class="separator" />
            </div>
            <div id="asf-box">
                <h1>${pageContext.servletContext.serverInfo}</h1>
            </div>
            <div id="upper" class="curved container">
                <div id="congrats" class="curved container">
                    <h2>If you're seeing 8080, you've successfully installed Tomcat. Congratulations!</h2>
                </div>
  1. 查看下Nginx的配置文件,cd到nginx下的conf文件夹下,打开nginx.conf配置文件。
  2. 找到server结点,其中listen是监听的端口号,这里不需要改动,server_name是Nginx服务器所在的主机名。
  3. 找到location,后面跟的/代表Nginx会拦截所有的请求。
  4. 当我们什么都不修改的时候,启动Tomcat8080和Tomcat8081和Nginx,物理机访问虚拟机ip,会跳转到Nginx的首页,带上端口号就会跳到对应的Tomcat。

下面做Nginx的配置之反向代理和负载均衡

反向代理

修改nginx.conf的内容,需要添加下面的这段代码:

upstream tomcat8080 {
   server 192.168.156.50:8080;             # Tomcat1运行在的ip和port
}

upstream tomcat8081 {
   server 192.168.156.50:8081;             # Tomcat2运行在的ip和port
}

server {
   listen      80;                         # Nginx监听的端口号
   server_name www.test8080.com;           # Nginx所在的主机名,也就是用户请求www.test.com的时候,就找到了Nginx这里
   location / {                            # /是拦截所有请求的意思,也就是所有的请求都被发送到proxy_pass处理
       proxy_pass  http://tomcat8080;      # 代表Tomcat的位置,tomcat8080对应上面的upstream tomcat8080,就找到了server的值
       index       index.html index.htm;   # 默认访问的首页
   }
}

server {
    listen      80;                         # Nginx监听的端口号
    server_name www.test8081.com;           # Nginx所在的主机名,也就是用户请求www.test.com的时候,就找到了Nginx这里
    location / {                            # /是拦截所有请求的意思,也就是所有的请求都被发送到proxy_pass处理
        proxy_pass  http://tomcat8081;      # 代表Tomcat的位置,tomcat8081对应上面的upstream tomcat8081,就找到了server的值
        index       index.html index.htm;   # 默认访问的首页
    }
}
  1. 修改完配置后,在sbin目录下,执行命令./nginx -t检查是否配置正确,正确后,启动Tomcat8080和Tomcat8081,启动Nginx,如果刚刚Nginx没有关掉,应该使用命令./nginx -s reload重启Nginx。
  2. 打开物理机,配置hosts文件,把192.168.156.50 www.test8080.com和192.168.156.50 www.test8081.com配置进去,当浏览器访问www.test8080.com和www.test8081.com的时候,都会去请求192.168.156.50这个ip地址,只不过nginx收到请求后,根据请求的url不同,作了分发工作,如果能跳转到Tomcat8080和Tomcat8081的欢迎页,那么反向代理即配置成功。
  3. 说一下我遇到的两点问题,首先修改nginx.conf文件,一定别修改错了,因为安装完成nginx后有两个nginx.conf,一个是当初压缩包解压出来的文件夹中的,另一个是使用命令./configure指定的,这里需要改的nginx.conf是./configure指定的那个位置下的nginx.conf,还有一个问题就是,我修改物理机hosts不生效,最后用SwitchHosts软件解决的,原因不详,我猜测有可能是特殊字符影响的,不确定,所以在物理机上修改了hosts文件,一定要用cmd来ping一下是否是修改后的ip地址。

成功界面:

负载均衡

修改nginx.conf文件即可,为了方便起见,只做了简单的修改,如下所示:

upstream tomcat8080 {
   server 192.168.156.50:8080 weight=2;            # Tomcat1运行在的ip和port
   server 192.168.156.50:8081 weight=1;            # 用于测试负载均衡
}

重启nginx后,再去访问www.tomcat8080.com,会发现8080出现的次数和8081出现的次数是2:1,说明负载均衡配置正确,就不截图了,多刷新几次就可以看到效果了。

安装Keepalived

  1. 将下载好的Keepalived拷贝到虚拟机中。
  2. 使用命令tar -zxvf keepalived-1.2.19解压。
  3. 进入keepalived目录下,开始配置,执行命令./configure --prefix=/usr/local/keepalived。
  4. 编译并安装,执行命令make && make install。

下面将keepalived添加到系统服务中:

  1. 执行命令cp /usr/local/keepalived/sbin/keepalived /usr/sbin/拷贝执行文件。
  2. 执行命令cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived将init.d文件拷贝到ETC下,加入开机启动项。
  3. 执行命令cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/将keepalived文件拷贝到etc下。
  4. 执行命令mkdir -p /etc/keepalived创建keepalived文件夹。
  5. 执行命令cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf将keepalived配置文件拷贝到etc下。
  6. 执行命令chmod +x /etc/init.d/keepalived添加可执行权限。
  7. 执行命令chkconfig --add keepalived和chkconfig keepalived on添加keepalived到开机启动中。

配置keepalived

因为玩耍keepalived需要两台虚拟机,所以我们克隆出来一台,之后按照本篇章开头说的处理网卡的方式处理一下克隆后的机器,这里我把克隆后的ip设置为192.168.156.51,假设这里我们将50看做master,将51看做backup,使用命令vim /etc/keepalived/keepalived.conf编辑keepalived的配置文件,修改后如下所示,尤其注意加了注释的行:

! Configuration File for keepalived

global_defs {
   router_id bigdata    # 主机名
}

vrrp_script chk_nginx {
   script "/etc/keepalived/nginx_check.sh"      # 要执行的脚本文件,用于检测Nginx是否还活着
   interval 2   # 时间间隔是2秒,也就是每隔两秒执行一次上一行的脚本,从开始一直执行
   weight -20   # 脚本执行成功后,此节点的优先级减低20
}

vrrp_instance VI_1 {
    state MASTER        # 表明此节点是master节点
    interface eth0      # 表明虚拟机的网卡是eth0
    virtual_router_id 50        # 虚拟路由id,50和51这两台机器必须设置成一样的
    mcast_src_ip 192.168.156.50 # 指定当前节点的真实ip
    priority 100        # 优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
       chk_nginx        # chk_nginx要与vrrp_script check_nginx中的名称一样
    }

    virtual_ipaddress { # 对外提供的虚拟ip,可以是多个,也可以是一个,保证在同一个网段,否则一会儿请求的时候请求不到
        192.168.156.16
        192.168.156.17
        192.168.156.18
    }
}

再来看一下定时检查Nginx的脚本nginx_check.sh文件,需要确保脚本格式的unix格式,在vim编辑模式下,输入:set ff即可看到格式,输入命令vim /etc/keepalived/nginx_check.sh,打开是一个空的文件,那么我们输入命令,如图所示:

#!/bin/sh
A=`ps -C nginx --no-header |wc -l`      # 检查当前Nginx的进程数量并把查询到的进程数量赋值给A
if [ $A -eq 0 ];then    # 如果查到的进程数量是0的话
        /usr/local/nginx/sbin/nginx     # 尝试启动Nginx
        sleep 2 # 启动Nginx后休眠两秒
        if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then      # 如果此时Nginx的进程数还是0的话,那么Nginx就是挂掉了
                killall keepalived      # 杀掉这个节点上所有的keepalived进程
        fi
fi

以上便是192.168.156.50的配置文件了,192.168.156.51上也需要这两个文件,需要做一些改动。对于51,需要修改的是router_id和mcast_src_ip和priority,virtual_router_id一定要和50的一致。

目前nginx_check.sh脚本只有读权限,我们需要使用命令chmod 777 /etc/keepalived/nginx_check.sh把这两个节点的权限放开。下面启动nginx,前提是保证这两个nginx的配置文件是一样的,这里先把之前配置的反向代理和负载均衡先注释掉,使用最原始的配置文件。为了便于区分,使用命令vim /usr/local/nginx/html/index.html修改nginx的欢迎页,如下所示,修改的倒数第3行,对于51,把ip改成51即可。

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx. My IP Address is 192.168.156.50.</em></p>
</body>
</html>

下面我们启动两个Nginx。分别访问192.168.156.50和192.168.156.51可以看到刚刚我们修改过后的index.html。

下面我们使用命令service keepalived start来启动keepalived,使用命令ip a查看发现两个这两个节点上都有刚刚配置的虚拟地址,这是不合理的,应该只有master上有才对,主要原因是防火墙的问题,使用命令service iptables stop关闭防火墙,使用命令chkconfig iptables off设置开机不启动,再次使用命令ip a查看ip信息,现在只有master节点上有虚拟地址,如下所示。

因为配置了虚拟地址,所以现在我们使用虚拟地址来访问下。发现反问到的IP是192.168.156.50。下面我们把50上的keepalived关掉,再次访问,发现请求已经切换到了51上。当我们再次把50上的keepalived启动之后,再次访问,发现请求又切换回了50,此时说明我们的配置是正确的,实现了高可用。

假设,50上的Nginx配置是有错误的,我们重启两台虚拟机,因为设置的keepalived是开机自启,查看50机器上的keepalived的状态的时候,会发现“keepalived 已死,但是 subsys 被锁”这样的语句,说明nginx_check.sh起作用了。

猜你喜欢

转载自blog.csdn.net/qq_36059561/article/details/82453337
今日推荐