用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 使上面的配置生效。