Keepalived+Nginx+Tomcat 配置高可用负载均衡系统示例
前言
目前生产环境的配置越来越多的使用云服务了,同时负载均衡也基本转向了云厂商提供的服务,但对于绝大多数应用来说,自建集群可能在费用上要更便宜一些,这篇文章也是之前整理的,再次新瓶装旧酒分享给各位。此示例演示在不使用 docker 的情况下配置负载均衡,内容 keepalived+nginx+tomcat 的基础配置示例,某些特定配置此例中不会出现,在示例中会用到三个虚拟机:两个纯命令行用于模拟服务端配置,一个带桌面环境的用于模拟客户端访问,这样三台虚拟机使用 NAT 模式连接的时候是在同一个虚拟网络中,更符合服务器的实际使用场景,虚拟机软件为 VMPlayer,这个对于个人可以免费使用,用起来来不错,推荐一下。
本实例中是模拟使用场景,机器性能有限,所有 nginx 和 Tomcat 就放到一个机器上了,实际场景中如果可以尽量分开,防止 nginx 所在服务器出问题时跟着宕掉一个或多个 Tomcat。
创建虚拟机
此部分是为了照顾对于虚拟机安装不熟悉的同学,如果已经熟悉了虚拟机的安装或有实体机环境等,可以跳过此步骤。
创建服务器虚拟机(mini 安装)
打开 VMPlayer,然后界面如下,点击创建新虚拟机
弹出页面后选择最后一项,稍后安装操作系统,这里一定要选择这个,因为如果选择其他直接安装的话会使用简易安装,默认安装完是带桌面的
下一步,然后选择 Centos 64 位的操作系统,这个需要针对镜像来选择,我这里选这个是因为我有现成的 64 位镜像。
下一步,这里设置下虚拟机的名字和安装地址,便于区分。
下一步,然后需要设置硬盘,大小随意(虚拟机创建之后硬盘大小只能增大不能减小了,所以这里可以设置的小一点,亲测配置完成后也就才 2G,这里设置 5G 应该就足够了),下边两项也是二选一随意。
下一步,界面如下,这里我们需要点击“自定义硬件”来配置系统的光驱,如果实体机的配置低的话可以在这里降低下虚拟机的 CPU 和内存等,命令行模式下的 CentOS 并不需要多高的配置(单核 512M 可以无压力运行)
在打开的界面中选择光驱,然后选择使用 ISO 镜像,点击浏览选择镜像即可,这个镜像可以从 CentOS 官网下载。
之后点击关闭,再点击完成即可,此时的界面如下:
此时虚拟机的硬件已经准备完毕,接下来我们点击播放虚拟机配置系统,点击后界面如下,选择第一项 Install。
接下来稍等片刻会进入图形化界面,这里不用担心,这个只是安装的图形界面,与之后系统没关系,如下:
因为是要最小化安装,所以语言默认英文即可,点击 Continue,跳转后的界面为配置界面,我们仅需要修改下图中红框的部分,其他的默认即可。
第一项是配置系统的硬盘,这里我们不需要进行任何配置,点击进入之后直接点击左上角的 Done 按钮即可。
第二项是配置系统的网络,默认不连接,所以我们需要点击进入配置页面,然后将右上角的 OFF 置成 ON,然后点击 DONE,之后会跳转回一开始的设置页,我们就可以开始系统的安装了,点击 Begin Installation,接下来需要设置用户。
ROOT 用户的密码是必须要创建的,其他用户可以根据需要进行创建,这里我只设置了 ROOT 用户的密码,方便后续的操作,不用考虑权限问题,实际应用中是要用其他用户操作的,后续的操作可视情况赋予权限即可。还有需要注意的是如果用户的密码强度很低,需要点击两次 DONE 来确定。
接下来就是等待结束重启即可,至此 CentOS 就安装完成了。
创建客户端虚拟机(简易安装安装)
在这个实例中客户端有两个用处,一是通过浏览器测试服务端的服务是否好用;二是通过 FTP 向服务端上传几个源码包。其实上传源码包这个功能大部分情况下实体机也是可以操作的,但在 NAT 网络下实体机的浏览器在默认是无法访问服务端的服务的。
客户端虚拟机对操作系统无限制,只要可以运行浏览器即可,其实命令行模式下的 linux 也是可以访问的,不过不太直观,如果想用实体机进行访问的话也可以,不过需要将虚拟机的网络连接模式改为桥接模式,而且对网络有要求,需要支持 DHCP 才可以。
安装过程和服务端的很类似,只有第二部有所区别,服务器需要选择稍后安装操作系统,但客户端的虚拟机使用第二项选择镜像即可,之后会提示设置系统的用户名和密码,之后的步骤就一样了,而且自定义硬件的时候不再需要设置光驱。
配置基础环境
这里以 Server01 为示例,其实我们需要配置两台的,我使用的用户是 root 用户,实际应用中可能需要在其他用户下进行,视情况赋予权限即可。
因为我们需要向虚拟机上传一些用到的软件(当然可以使用 wget 来下载,只不过有点麻烦),所以这里我们实体机或者客户端使用 FTP 客户端进行连接(工具有很多,挑选自己顺手的使用,这里推荐 Xftp 和 FileZilla,对于个人使用都是免费的),虚拟机的 IP 地址可以通过 ip addr 进行查看,红框中就是当前虚拟机的 IP 地址
接下来在 FTP 客户端中输入主机地址,需要注意的是 CentOS 使用的是 SFTP,所以我们输入的地址应该是 sftp://192.168.59.130,输入账户密码之后点击快速连接,如果看到如下界面则表示连接成功了
现在系统是配置完成了,不过 IP 是随机分配的,如果有需要可以将服务器的地址改为静态 IP,不过这个 IP 一般不会发生变化,这里我就先不改了,但是服务器的话是一定会设置固定 IP 的。
安装 JDK
我们常用的 SUN JDK 不支持 yum 安装,所以需要从 JDK 官网下载合适的 JDK,这里我使用的是 JDK-8u111-linux-x64.rpm,通过 ftp 上传到/usr/local/download 下(这个位置随意),然后分别执行以下命令进行安装,JDK 的默认安装地址为/usr/java
安装后即可运行 java -version 查看安装的版本信息
安装 Tomcat
Tomcat 是可以通过 yum 进行安装的,不过示例中我们需要两个 Tomcat,单独下载更方便,我这里下载的是 tomcat 7.0.72。通过 FTP 将 tomcat 上传到/usr/local/download 下,然后分别运行以下命令解压并移动到/usr/local 下,因为后续要使用两个 Tomcat,所以我们执行两次操作
此时我们的 Tomcat 已经解压完成了,接下来是修改端口号,防止两个 Tomcat 端口冲突,Tomcat 默认会占用三个端口:8005,8080 和 8009,这里我们修改成如下,文件为/usr/local/Tomcat01/conf/server.xml 和/usr/local/Tomcat02/conf/server.xml(这里如果不熟悉 vi 编辑器的小伙伴可以将配置文件下载到本地然后修改完成后再上传回服务器)
修改完成以后我们进入/usr/local/Tomcat01/bin 目录下运行 ./start.sh,会提示 Tomcat Started,此时实体机依然是无法访问的,因为防火墙没有开放端口,执行以下命令开放端口,以下命令仅当前会话有效,增加--permanent 可以永久保留端口开放状态,不过我们是要做的负载均衡中 nginx 只会访问本机的 Tomcat,所以 Tomcat 的端口没有必要一直开放,现在测试下就够了
此时我们在客户端虚拟机中访问 http://192.168.59.130:8081 即可看到 Tomcat 的欢迎页了,此时还有一个问题,两个 Tomcat 的首页是一样的,负载均衡成功后无法分辨来自哪个 Tomcat,所以我们要加点东西区分一下,我是在每个欢迎页的 body 中增加了一行标识如下,文件位于/usr/local/Tomcat01/webapps/ROOT/index.jsp
安装 Nginx
nginx 可以通过修改源的方式进行 yum 安装,有需要的同学可以自行搜索下,本例中使用源码安装
从官网下载源码包后通过 FTP 将 nginx 的源码上传到/usr/local/download 下,然后执行以下命令解压,我这里使用的是 1.10.2
之后我们就要用到 gcc 来编译 nginx 的源码了,需要先安装 gcc
之后分别执行以下命令,--prefix 是指定软件的安装位置
执行之后我们会的到以下错误,我们需要去下载 PCRE 的源码,然后通过 FTP 上传到/usr/local/download 下,我这里用的是 8.39
解压缩 pcre 的源码,命令和以前的一样,解压后不需要进行其他操作
然后我们再次编译 nginx,根据上次的提示我们追加上 pcre 的源码位置
恭喜,又报错了,这次提示换成了这个,所以我们又需要下载 zlib 的源码,老办法上传到老地方,然后解压,这里命令就不详细说了,跟之前一样,我下载的版本是 1.2.8
解压完成后,我们根据提示追加 zlib 命令,是的,就追加这两个,不需要再追加了
编译完成了,执行安装,命令如下
本来以为可以愉快的结束了的,结果。。。。。。
好吧,只能继续安装了
现在执行前一步的 make 命令安装就可以了,接下来进入/usr/local/nginx/sbin 目录下执行./nginx 启动 nginx,然后分别执行以下命令开放 80 端口(永久开放的端口在设置后必须执行 reload,本次有效的不需要执行,执行 reload 后本次有效的端口也将失效)
之后我们可以在客户端的浏览器中输入 http://192.168.59.130 进行测试,如果出现如下页面表示 nginx 启动成功了
nginx 是可以做成系统服务的,实际应用中大多也是这么做的,不过这里只是个示例,就不做成服务了,如果有需要的可以自行百度,当然如果使用 yum 安装的话安装完成就已经注册服务了。
配置负载均衡
之前 Tomcat 我们已经做好了配置,接下来只需要在 nginx 中配置即可,配置文件为/usr/local/nginx/conf/nginx.conf,如下图添加 upstream 部分,将 localtion 部分更改为图中部分即可,server 可以是其他服务器上的服务,weight 越高越容易被分发请求,这里我暂时写本机的,另外实际使用中 upstream 第一行要加入 ip_hash 来保证同一用户一次只能访问同一台服务器,解决 session 跨服务器丢失的问题,如果系统内使用其他方法处理了 session 的共享问题就不要加了,这个实例中我们就不加入了,因为加入了以后刷新浏览器页面不会变化。
接下来就可以进行负载均衡的测试了,因为修改过 nginx 的配置文件所以我们需要重启一下 nginx,然后开启两个 Tomcat,命令如下:
接下来可以在实体机的浏览器进行测试了,连续访问虚拟机的 nginx,这时 Tomcat 欢迎页就会在 01 和 02 之间来回切换,至此负载均衡配置结束,然后大家可以回过头去再创建一个 Server02 重新配置一遍了,因为 keepalived 就需要根据机器分主次了,配置文件是不一样的,配置完成的话 server01 的 nginx 也可以设置将请求分发到 server02 的 tomcat 上,不过这里为了演示就不添加了,后续好区分请求由哪台机器响应。
配置 keepalived
keepalived 推荐使用 yum 安装,源码安装之后的配置挺复杂的
安装完成后需要配置 keepalived 的配置文件,文件位于/etc/keepalived/keepalived.conf,下图中为需要修改的部分,默认的配置文件中在其后还有很多内容,本实例只是简单的 DEMO,所以那些内容暂时用不上,可以全部删除,核心配置说明如下:
配置完此文件后保存退出,然后重启 keepalived 服务,此时通过 ip addr 查看发现主从服务器上都有 192.168.59.100 的虚拟 IP,原因是防火墙阻止了服务器之间的 vrrp 通信,分别执行以下命令,需要针对自己电脑进行修改的只有 interface 后的网卡,其他的照抄即可
至此 Keepalived 的配置也完成了,通过 ip addr 查看可发现主服务上带有 192.168.59.100 的虚拟 IP 而从服务器上没有,关闭主服务器的 keepalived,虚拟 IP 则会转移到从服务器上来,测试服务器通过浏览器访问 http://192.168.59.100 可看到虚拟 IP 转移的效果,页面会从主服务器的页面转换为从服务器的页面,这里就不上图片了
完成上述步骤之后 keepalived 已经可以实现虚拟 IP 转移了,但是实际应用当中我们需要的是自动进行虚拟 IP 的转移,所以我们还需要配置 keepalived 的脚本,使其能够在某一个 nginx 无法提供服务的时候自动将虚拟 IP 转移到备用服务器,以下脚本来自于上边提供的链接,原理是通过 curl 访问某一个链接,如果连续两次三秒没有响应则降低服务器的优先级,我们在/etc/keepalived 目录下创建一个名为 check_status.sh 的文件,然后键入以下内容
因为脚本后续是需要执行的,所以我们需要赋予可执行的权限,此脚本是我们自定义的,没有什么安全问题,此项操作需要在 root 用户下执行,代码如下(这里感谢 程序人生 0407 的提醒)
之后我们在 keepalived.conf 中配置脚本,配置内容如下
配置完成后重启 keepavlied 即可,此时如果关闭本机的 nginx 的话可以看到在 5 秒后虚拟 IP 会漂移到备用服务器上去,这里因为演示的话图片太多了,就不上图片了,nginx 退出可以执行 nginx -s stop 命令,如果是使用 yum 安装的 nginx 可以通过 systemctl 来停止 nginx 服务
实际使用当中经常使用到的还有在切换服务器时发送邮件用以提醒运维人员主服务器异常,方法有很多种,此例中就不再赘述,有兴趣的可以自行查找相关资料
本示例到此结束,如果各位有什么意见或建议,欢迎留言指教,转载请注明源地址另说明,markdown 文档中的代码由于未知原因传上来以后格式有点混乱,大家使用的时候注意下格式,不要少个括号之类的。
版权声明: 本文为 InfoQ 作者【小明同学的学长】的原创文章。
原文链接:【http://xie.infoq.cn/article/3c614fade13dbdb347cfddd71】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论