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

释放双眼,带上耳机,听听看~!

用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,并且打开路由转发功能


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
1echo 1 > /proc/sys/net/ipv4/ip_forward
2
3yum install -y ipvsadm
4
5yum install -y keepalived
6
7mv /etc/keepalived/keepalived.conf    /etc/keepalived/keepalived.conf.bak
8
9vim /etc/keepalived/keepalived.conf
10
11vrrp_instance VI_1 {
12#备用服务器上为 BACKUP
13state MASTER
14#绑定vip的网卡为eth0
15interface eth0
16virtual_router_id 51
17#备用服务器上为90
18priority 100
19advert_int 1
20authentication {
21auth_type PASS
22auth_pass aminglinux
23}
24virtual_ipaddress {
25192.168.141.200
26}
27}
28virtual_server server_ip1 80 {
29#(每隔10秒查询realserver状态)
30delay_loop 10
31#(lvs 算法)
32lb_algo wlc
33#(DR模式)
34lb_kind DR
35#(同一IP的连接60秒内被分配到同一台realserver)
36persistence_timeout 0
37#(用TCP协议检查realserver状态)
38protocol TCP
39
40real_server server_ip2 80 {
41#(权重)
42weight 100
43TCP_CHECK {
44#(10秒无响应超时)
45connect_timeout 10
46nb_get_retry 3
47delay_before_retry 3
48connect_port 80
49}
50}
51real_server server_ip3 80 {
52weight 100
53TCP_CHECK {
54connect_timeout 10
55nb_get_retry 3
56delay_before_retry 3
57connect_port 80
58}
59}
60}
61
62
63

1.3 安装nginx

keepalived master端和backup端都需安装nginx


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1cd  /usr/local/src/
2
3wget http://nginx.org/download/nginx-1.16.0.tar.gz
4
5tar -zxvf  nginx-1.16.0.tar.gz
6
7cd nginx
8
9yum install -y pcre-devel zlib-devel
10
11./configure --prefix=/usr/local/nginx
12
13make
14
15make install
16
17

设置nginx启动脚本


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
1vim /etc/init.d/nginx
2
3#!/bin/bash
4# chkconfig: - 30 21
5# description: http service.
6# Source Function Library
7. /etc/init.d/functions
8# Nginx Settings
9NGINX_SBIN="/usr/local/nginx/sbin/nginx"
10NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
11NGINX_PID="/usr/local/nginx/logs/nginx.pid"
12RETVAL=0
13prog="Nginx"
14start()
15{
16    echo -n $"Starting $prog: "
17    mkdir -p /dev/shm/nginx_temp
18    daemon $NGINX_SBIN -c $NGINX_CONF
19    RETVAL=$?
20    echo
21    return $RETVAL
22}
23stop()
24{
25    echo -n $"Stopping $prog: "
26    killproc -p $NGINX_PID $NGINX_SBIN -TERM
27    rm -rf /dev/shm/nginx_temp
28    RETVAL=$?
29    echo
30    return $RETVAL
31}
32reload()
33{
34    echo -n $"Reloading $prog: "
35    killproc -p $NGINX_PID $NGINX_SBIN -HUP
36    RETVAL=$?
37    echo
38    return $RETVAL
39}
40restart()
41{
42    stop
43    start
44}
45configtest()
46{
47    $NGINX_SBIN -c $NGINX_CONF -t
48    return 0
49}
50case "$1" in
51  start)
52        start
53        ;;
54  stop)
55        stop
56        ;;
57  reload)
58        reload
59        ;;
60  restart)
61        restart
62        ;;
63  configtest)
64        configtest
65        ;;
66  *)
67        echo $"Usage: $0 {start|stop|reload|restart|configtest}"
68        RETVAL=1
69esac
70exit $RETVAL
71
72
73

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

编辑server配置文件


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
1vim  /usr/local/nginx/conf/vhost/zrlog.com.conf
2## 文件内容如下
3upstream zrlog_com
4{
5    ip_hash;
6    server server_ip:8080;
7   server server_ip:8080;
8   server server_ip:8080;
9}
10server
11{
12    listen 80;
13    server_name www.zrlog.com;
14    location /
15    {
16        proxy_pass      http://zrlog_com;
17        proxy_set_header Host   $host;
18        proxy_set_header X-Real-IP      $remote_addr;
19        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
20    }
21}
22
23
24

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1vim /usr/local/nginx/conf/vhost/discuz.com.conf
2## 文件内容如下
3upstream discuz.com
4{
5    ip_hash;
6    server server_ip:80;
7   server server_ip:80;
8   server server_ip:80;
9}
10server
11{
12    listen 80;
13    server_name www.discuz.com;
14    location /
15    {
16        proxy_pass      http://discuz.com;
17        proxy_set_header Host   $host;
18        proxy_set_header X-Real-IP      $remote_addr;
19        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
20    }
21}
22
23

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1vim /usr/local/nginx/conf/vhost/dedecms.com.conf
2## 文件内容如下
3upstream dedecms.com
4{
5    ip_hash;
6    server server_ip:80;
7   server server_ip:80;
8   server server_ip:80;
9}
10server
11{
12    listen 80;
13    server_name www.dedecms.com;
14    location /
15    {
16        proxy_pass      http://dedecms.com;
17        proxy_set_header Host   $host;
18        proxy_set_header X-Real-IP      $remote_addr;
19        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
20    }
21}
22
23

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
1vim /usr/local/nginx/conf/vhost/zabbix.com.conf
2## 文件内容如下
3upstream zabbix.com
4{
5    ip_hash;
6    server server_ip:80;
7}
8server
9{
10    listen 80;
11    server_name www.zabbix.com;
12    location /
13    {
14        proxy_pass      http://zabbix.com;
15        proxy_set_header Host   $host;
16        proxy_set_header X-Real-IP      $remote_addr;
17        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
18    }
19  location /zabbix/
20    {
21        proxy_pass      http://zabbix_com/zabbix;
22        proxy_set_header Host   $host;
23        proxy_set_header X-Real-IP      $remote_addr;
24        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
25    }
26}
27
28

1.4 启动keepalived和nginx

keepalived两台和nginx两台都启动


1
2
3
4
1systemctl start keepalived
2/etc/init.d/nginx  start
3
4

1.4 在web服务器上设置


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

1.5 搭建mysql主从

1.5.1 设置myslq 主服务器


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1cd /usr/local/src/
2
3wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz
4
5tar -zxvf mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz
6
7yum install -y perl-Data-Dumper.x86_64 libaio
8
9mkdir /data/mysql/
10
11mkdir -p  /data/mysql
12
13useradd  -M mysql
14
15mv mysql-5.6.43-linux-glibc2.12-x86_64  /usr/local/mysql
16
17./scripts/mysql_install_db  --user=mysql --datadir=/data/mysql
18
19cp /usr/local/mysql/support-files/mysql.server   /etc/init.d/mysqld
20
21cp /usr/local/mysql/my.cnf  /etc/my.cnf
22
23chmod 755 /etc/init.d/mysqld
24
25

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1vim /etc/my.cnf
2
3[mysqld]
4datadir=/data/mysql
5socket=/tmp/mysql.sock
6server-id=222
7log_bin=master-bin
8
9key_buffer=16K
10table_open_cache=4
11query_cache_limit=256K
12query_cache_size=4M
13max_allowed_packet=1M
14sort_buffer_size=64K
15read_buffer_size=256K
16thread_stack=64K
17innodb_buffer_pool_size = 56M
18
19
20[mysqld_safe]
21log-error=/var/log/mysql/mysql.log
22pid-file=/var/run/mysql/mysql.pid
23
24
25
26

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


1
2
3
4
1basedir=/usr/local/mysql
2datadir=/data/mysql
3
4

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


1
2
3
1export PATH=$PATH:/usr/local/mysql/bin/
2
3

进入mysql,设置root密码


1
2
3
4
5
6
7
8
1mysql -uroot
2
3
4mysql> set password=password('123456');
5mysql> quit
6
7
8

1.5.2 设置myslq 从服务器

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1[mysqld]
2datadir=/data/mysql
3socket=/tmp/mysql.sock
4server-id=223
5
6key_buffer=16K
7table_open_cache=4
8query_cache_limit=256K
9query_cache_size=4M
10max_allowed_packet=1M
11sort_buffer_size=64K
12read_buffer_size=256K
13thread_stack=64K
14innodb_buffer_pool_size = 56M
15
16[mysqld_safe]
17log-error=/var/log/mysql/mysql.log
18pid-file=/var/run/mysql/mysql.pid
19
20
21

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

1.5.3 配置同步

在mysql主上进行以下设置:

创建用作同步数据的用户


1
2
3
4
5
6
1
2 grant replication slave on *.* to 'repl'@slave_ip identified by 'password';
3 flush tables with read lock;
4 show master status;
5
6

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


1
2
3
4
5
6
1
2stop slave;
3 change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
4 start slave;
5
6

查看两台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文件后面写入以下内容


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1export PS1='[\u@\h \w]# '
2history
3USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
4if [ "$USER_IP" = "" ]
5then
6USER_IP=`hostname`
7fi
8if [ ! -d /root/history ]
9then
10mkdir /root/history
11chmod 777 /root/history
12fi
13if [ ! -d /root/history/${LOGNAME} ]
14then
15mkdir /root/history/${LOGNAME}
16chmod 300 /root/history/${LOGNAME}
17fi
18export HISTSIZE=4096
19DT=`date +"%Y%m%d_%H%M%S"`
20export HISTFILE="/root/history/${LOGNAME}/${USER_IP} history.$DT"
21chmod 600 /root/history/${LOGNAME}/*history* 2>/dev/null
22
23

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

给TA打赏
共{{data.count}}人
人已打赏
安全经验

Google Adsense的技巧、诀窍和秘密

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索