搭建一个高可用负载均衡的集群架构(一)

2020-11-24 10:21:21 浏览数 (1)

用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下。 1 设计你认为合理的架构,用visio把架构图画出来 2 搭建lnmp、tomcat jdk环境 3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客 4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip 5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录) 6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root) 7 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo 8 给所有服务器做一个简单的命令审计功能 9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月 10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月 11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据 13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性, 14 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警 15 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警 16 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数 17 利用jmx,在zabbix上监控tomcat 18 给三个站点的后台访问做二次认证,增加安全性 19 用shell脚本实现文件、代码同步上线(参考分发系统)

如上需求拆分成以下几部分:

一、系统流程

1 设计你认为合理的架构,用visio把架构图画出来 2所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo 8 给所有服务器做一个简单的命令审计功能

二、lnmp tomcat环境搭建

2 搭建lnmp、tomcat jdk环境 3 三个站点分别为:discuz论坛、dedecms企业网站以及zrlog博客 4 由于机器有限,尽可能地把三个站点放到同一台服务器上,然后做负载均衡集群,要求所有站点域名解析到一个ip上,也就是说只有一个出口ip 5 需要共享静态文件,比如discuz需要共享的目录是 data/attachment,dedecms需要共享upload(具体目录,你可以先上传一个图片,查看图片所在目录) 6 设计合理的目录、文件权限,比如discuz的data目录需要给php-fpm进程用户可写权限,其他目录不用写的就不要给写权限(目录755,文件644,属主属组root) 9 php-fpm服务要求设置慢执行日志,超时时间为2s,并做日志切割,日志保留一月 10 所有站点都需要配置访问日志,并做日志切割,要求静态文件日志不做记录,日志保留一月 18 给三个站点的后台做二次认证,增加安全性

三、数据备份

11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 制定代码、静态文件的备份方案,并写备份脚本,要求把备份数据传输到备份服务器 12 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据 19 用shell脚本实现文件、代码同步上线(参考分发系统)

四、zabbix监控搭建

13 搭建zabbix监控告警系统,要求监控各个基础指标(cpu、内存、硬盘),网卡流量需要成图,还需要监控web站点的可用性, 14 定制自定义监控脚本,监控web服务器的并发连接数,接入zabbix,成图,设置触发器,超过100告警 15 定制自定义监控脚本,监控mysql的队列,接入zabbix,成图,设置触发器,队列超过300告警 16 定制自定义监控脚本,监控mysql的慢查询日志,接入zabbix,成图,设置触发器,每分钟超过60条日志需要告警,需要仔细分析慢查询日志的规律,确定日志条数 17 利用jmx,在zabbix上监控tomcat

一、系统流程

1. 设计你认为合理的架构,用visio把架构图画出来

1.1 服务器分组:

负载均衡服务器2台 分别安装keepalived lvs 分别安装nginx

后端服务器 其中一台安装 LNMP TOMCAT zabbix-server NFS(共享3个站点的程序目录,如/data/wwwroot/) 其余服务器安装 LNMP TOMCAT zabbix-agent NFS(挂载3个站点的程序目录,)

数据库服务器 设置主从架构 主服务器设置数据库备份脚本,设置crontab定时任务

备份服务器 接收mysql数据库的备份文件 接受站点程序的数据备份

1.2 负载均衡master端和backup端安装

安装keepalived 和 ipvsadm,并且打开路由转发功能

代码语言:javascript复制
echo 1 > /proc/sys/net/ipv4/ip_forward

yum install -y ipvsadm

yum install -y keepalived

mv /etc/keepalived/keepalived.conf    /etc/keepalived/keepalived.conf.bak

vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
#备用服务器上为 BACKUP
state MASTER
#绑定vip的网卡为eth0
interface eth0
virtual_router_id 51
#备用服务器上为90
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass aminglinux
}
virtual_ipaddress {
192.168.141.200
}
}
virtual_server server_ip1 80 {
#(每隔10秒查询realserver状态)
delay_loop 10
#(lvs 算法)
lb_algo wlc
#(DR模式)
lb_kind DR
#(同一IP的连接60秒内被分配到同一台realserver)
persistence_timeout 0
#(用TCP协议检查realserver状态)
protocol TCP

real_server server_ip2 80 {
#(权重)
weight 100
TCP_CHECK {
#(10秒无响应超时)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server server_ip3 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

1.3 安装nginx

keepalived master端和backup端都需安装nginx

代码语言:javascript复制
cd  /usr/local/src/

wget http://nginx.org/download/nginx-1.16.0.tar.gz

tar -zxvf  nginx-1.16.0.tar.gz

cd nginx

yum install -y pcre-devel zlib-devel

./configure --prefix=/usr/local/nginx

make 

make install

设置nginx启动脚本

代码语言:javascript复制
vim /etc/init.d/nginx

#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start() 
{
    echo -n $"Starting $prog: "
    mkdir -p /dev/shm/nginx_temp
    daemon $NGINX_SBIN -c $NGINX_CONF
    RETVAL=$?
    echo
    return $RETVAL
}
stop() 
{
    echo -n $"Stopping $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -TERM
    rm -rf /dev/shm/nginx_temp
    RETVAL=$?
    echo
    return $RETVAL
}
reload()
{
    echo -n $"Reloading $prog: "
    killproc -p $NGINX_PID $NGINX_SBIN -HUP
    RETVAL=$?
    echo
    return $RETVAL
}
restart()
{
    stop
    start
}
configtest()
{
    $NGINX_SBIN -c $NGINX_CONF -t
    return 0
}
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  reload)
        reload
        ;;
  restart)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo $"Usage: $0 {start|stop|reload|restart|configtest}"
        RETVAL=1
esac
exit $RETVAL

编辑nginx配置,在配置文件中httpd段添加 include /usr/local/nginx/conf/vhost/*.conf;

编辑server配置文件

代码语言:javascript复制
vim  /usr/local/nginx/conf/vhost/zrlog.com.conf
## 文件内容如下
upstream zrlog_com
{
    ip_hash;
    server server_ip:8080;
	server server_ip:8080;
	server server_ip:8080;
}
server
{
    listen 80;
    server_name www.zrlog.com;
    location /
    {
        proxy_pass      http://zrlog_com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
代码语言:javascript复制
vim /usr/local/nginx/conf/vhost/discuz.com.conf
## 文件内容如下
upstream discuz.com
{
    ip_hash;
    server server_ip:80;
	server server_ip:80;
	server server_ip:80;
}
server
{
    listen 80;
    server_name www.discuz.com;
    location /
    {
        proxy_pass      http://discuz.com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
代码语言:javascript复制
vim /usr/local/nginx/conf/vhost/dedecms.com.conf
## 文件内容如下
upstream dedecms.com
{
    ip_hash;
    server server_ip:80;
	server server_ip:80;
	server server_ip:80;
}
server
{
    listen 80;
    server_name www.dedecms.com;
    location /
    {
        proxy_pass      http://dedecms.com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
代码语言:javascript复制
vim /usr/local/nginx/conf/vhost/zabbix.com.conf
## 文件内容如下
upstream zabbix.com
{
    ip_hash;
    server server_ip:80;
}
server
{
    listen 80;
    server_name www.zabbix.com;
    location /
    {
        proxy_pass      http://zabbix.com;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
	location /zabbix/
    {
        proxy_pass      http://zabbix_com/zabbix;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

1.4 启动keepalived和nginx

keepalived两台和nginx两台都启动

代码语言:javascript复制
systemctl start keepalived 
/etc/init.d/nginx  start

1.4 在web服务器上设置

代码语言:javascript复制
vim /usr/local/sbin/lvs_rs.sh

#/bin/bash
vip=192.168.141.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdonw lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


sh /usr/local/sbin/lvs_rs.sh

1.5 搭建mysql主从

1.5.1 设置myslq 主服务器

代码语言:javascript复制
cd /usr/local/src/

wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz

tar -zxvf mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz 
 
yum install -y perl-Data-Dumper.x86_64 libaio

mkdir /data/mysql/

mkdir -p  /data/mysql

useradd  -M mysql

mv mysql-5.6.43-linux-glibc2.12-x86_64  /usr/local/mysql

./scripts/mysql_install_db  --user=mysql --datadir=/data/mysql

cp /usr/local/mysql/support-files/mysql.server   /etc/init.d/mysqld

cp /usr/local/mysql/my.cnf  /etc/my.cnf

chmod 755 /etc/init.d/mysqld

修改mysql配置文件 server-id= // id号可以设置成机器ip地址的末为数字 log_bin= // 给binlog文件设置个名字

代码语言:javascript复制
vim /etc/my.cnf

[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=222
log_bin=master-bin

key_buffer=16K
table_open_cache=4
query_cache_limit=256K
query_cache_size=4M
max_allowed_packet=1M
sort_buffer_size=64K
read_buffer_size=256K
thread_stack=64K
innodb_buffer_pool_size = 56M


[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/var/run/mysql/mysql.pid

修改启动mysql启动脚本 /etc/init.d/mysqld

代码语言:javascript复制
basedir=/usr/local/mysql
datadir=/data/mysql

配置环境变量 /etc/profile 修改完成记得 source /etc/profile

代码语言:javascript复制
export PATH=$PATH:/usr/local/mysql/bin/

进入mysql,设置root密码

代码语言:javascript复制
mysql -uroot


mysql> set password=password('123456');
mysql> quit

1.5.2 设置myslq 从服务器

设置流程如 1.5.1,从服务器的my.cnf设置需要添加

代码语言:javascript复制
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
server-id=223

key_buffer=16K
table_open_cache=4
query_cache_limit=256K
query_cache_size=4M
max_allowed_packet=1M
sort_buffer_size=64K
read_buffer_size=256K
thread_stack=64K
innodb_buffer_pool_size = 56M

[mysqld_safe]
log-error=/var/log/mysql/mysql.log
pid-file=/var/run/mysql/mysql.pid

以上操作设置完成之后,两台服务器,重启mysql服务器

1.5.3 配置同步

在mysql主上进行以下设置:

创建用作同步数据的用户

代码语言:javascript复制
 grant replication slave on *.* to 'repl'@slave_ip identified by 'password';
 flush tables with read lock;
 show master status;

在mysql从上进行以下设置,设置完成还要到主上执行 unlock tables;

代码语言:javascript复制
stop slave;
 change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
 start slave;

查看两台slave的主从状态是否正常,Slave_IO_Running和 Slave_SQL_Running要为yes:

2 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo

使用visudo命令编辑配置文件,设置用户的alias: User_Alias ADMINS = user1, user2, user3

然后批量执行useradd命令在全部服务器上添加user1、user2、user3用户

找到Allow root to run any commands anywhere,在这行下面添加以下内容:

ADMINS ALL=(ALL) NOPASSWD: /usr/bin/su, /usr/bin/ls, /usr/bin/cat, /usr/bin/mkdir

sshd.config配置文件,修改以下内容:

vim /etc/ssh/sshd_config PermitRootLogin no PubkeyAuthentication yes PasswordAuthentication no

重启服务:systemctl restart sshd.service

服务器A生成公钥 ssh-keygen 查看公钥内容 cat .ssh/id_rsa.pub

登录服务器B,设置权限 .ssh/authorized_keys chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

3 给所有服务器做一个简单的命令审计功能

在/etc/profile文件后面写入以下内容

代码语言:javascript复制
export PS1='[u@h w]# '
history
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ "$USER_IP" = "" ]
then
USER_IP=`hostname`
fi
if [ ! -d /root/history ]
then
mkdir /root/history
chmod 777 /root/history
fi
if [ ! -d /root/history/${LOGNAME} ]
then
mkdir /root/history/${LOGNAME}
chmod 300 /root/history/${LOGNAME}
fi
export HISTSIZE=4096
DT=`date  "%Y%m%d_%H%M%S"`
export HISTFILE="/root/history/${LOGNAME}/${USER_IP} history.$DT"
chmod 600 /root/history/${LOGNAME}/*history* 2>/dev/null

记得使用source /etc/profile 使上面的配置生效。

0 人点赞