• 119046

    文章

  • 803

    评论

  • 12

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

一个简单的集群环境搭建

撸了今年阿里、腾讯和美团的面试,我有一个重要发现.......>>

一、服务器和软件环境:

1、两台服务器,ip分别是192.168.1.250和192.168.1.251,都安装的是centos7操作系统;

2、要求:应用程序做集群,数据库做双主热备,附件存储在文档服务器;看起来大概像这样的结构:

3、说明:刚开始开发的时候,没有这些要求,只要一个单机版的应用程序。因为没有准备附件上传到ftp的代码,为了不改动代码,才选择了磁盘挂载的方案。

二、环境搭建

1、拿到手里的是两台裸机,用之前刻录好的CentOS7.6的系统盘做了系统。因为是core版本的iso镜像,很多工具没有,给后边的环境搭建带来不少麻烦(在服务器不能联网的情况下);

2、开始的时候,服务器不能上外网,用路由器组建一个局域网,把本地的安装包通过FileZilla上传到服务器。jdk版本是1.8(下载地址: https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html ),mysql版本是5.6(下载地址: https://dev.mysql.com/downloads/mysql/5.6.html ),nginx版本是1.18(下载地址: http://nginx.org/en/download.html )。

3、安装JDK。进入 jdk安装包所在路径,通过命令:

    tar -zxvf XXX.gz

把压缩包解压,然后通过命令:

    vi /etc/profile

把jdk的安装路径添加到PATH环境变量。保存退出后,执行命令:

    source /etc/profile 

使环境变量生效,命令运行java -version能看到jdk版本信息,则jdk安装就完成了。

4、安装mysql。安装mysql之前,先要把系统自带的数据库卸载,由于我安装的centos是core版,没有自带的mariadb,则略过卸载的步骤。

提前说一下,在连通网络的情况先执行(根据提示,少什么模块就安装什么模块)

yum -y install gcc zlib openssl pcre pcre-devel openssl-devel autoconf

如果上来就执行mysql_install_db命令,会跳出一大堆的错误信息,基本都是缺少依赖的工具包。比如出现如下错误:

FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql/scripts/mysql_install_db:
Data::Dumper

其实缺少的是autoconf模块。具体安装mysql的过程,就不细说了,网上教程非常详细。

5、安装nginx。这里提两点:一是在执行./configure命令的时候,一定要把--with-stream加上,后边要用到;二是centos7.6安装nginx后,没有自动做成系统服务,如果想通过service nginx start这样的命令来启动nginx,需要手动写一些配置文件,具体过程自行查找。

6、应用系统负载配置,nginx在251服务器上。

所有的负载都通过nginx来实现,同时文档服务器也是用nginx做代理。springboot开发的项目,server的端口是8080,将项目jar包分别上传到两台服务器。像这样:

192.168.1.250:8080,192.168.1.251:8080

直接上nginx的负载配置:

#user  nobody;
worker_processes  1;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}

http {
    autoindex  off;
    sendfile        on;
    keepalive_timeout  65;
 
    upstream lvsTest{
        ip_hash;
        server 192.168.1.250:8080;
        server 192.168.1.251:8080;
    }
	   server {
	    	listen       8088;
	    	server_name  192.168.1.251;
	             location / {
		        proxy_pass         http://lvsTest;
		        proxy_set_header   Host                 $host;
		        proxy_set_header   X-Real-IP            $remote_addr;
	             }

		    error_page   500 502 503 504  /50x.html;
		    location = /50x.html {
		        root   /usr/share/nginx/html;
		    }

		   location /fserver {
			alias /usr/upload;
		    }
	              
	}
}

负载策略是ip_hash,防止出现session相关问题;上边一个location是用作应用程序负载,下边一个location是用作文档服务器,注意是alias。

7、数据库负载,nginx在250服务器上。配置文件:

#user  nobody;
worker_processes  1;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}

stream{
	upstream cloudsocket { 
		 hash $remote_addr consistent;
      		# $binary_remote_addr;
       		server 192.168.1.250:3306 weight=5 max_fails=3 fail_timeout=300s;
		server 192.168.1.251:3306 weight=5 max_fails=3 fail_timeout=300s;
	}
	server {
	       listen 13306;
	       proxy_connect_timeout 10s;
	       proxy_timeout 3000s;
	       proxy_pass cloudsocket;
	}
}

代理msyql数据库,用的是stream模块,不是http了。前期如果没有安装stream模块的话,这会在stream这一行报错。

8、磁盘挂载。

程序原本是把附件存储在应用程序所在服务器本地,然后通过nginx代理来查看附件。现在做了集群后,就会出现部分文件找不到的情况。在不修改代码的前提下,决定通过nfs服务和mount操作来实现磁盘挂载。这样的话,在250服务器上运行的程序,执行附件上传后,代码里是把文件保存在本地,但是通过挂载,会把这个文件拷贝到251服务器上挂载的目录下。251服务器是被挂载服务器,250服务器是挂载服务器,那么就需要在251服务器上配置/etc/exports文件,例如:

/usr/upload 192.168.1.250(insecure,rw,sync,no_root_squash)

如果挂载过程中出现access denied错误,则需要把insecure权限加上,否则可以不加。

挂载服务器和被挂载服务器都要安装rpcbind模块和nfs模块并都需要启动。

到这里,就实现了开头部分那个结构图的要求了。

以上就是全部内容。


695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

0条评论

Loading...


自定义皮肤 主体内容背景
打开支付宝扫码付款购买视频教程
遇到问题联系客服QQ:419400980
注册梁钟霖个人博客