天天看点

大型网站架构之——百万 PV 大型网站架构部署

名词解释:pv是什么?

PV(Page View,页面浏览量)即点击量,通常意义上说PV的多少是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标。pv的解释是这样的:一个访问者在24小时(0点-23点)内到底看了网站的几个页面。需要注意的是:同一个人浏览网站的同一个页面,不重复计算pv量,点击100次页只算1次。

查询网站的pv量可以通过访问——网站 PV 查询

案例概述

  • > 本案例设计采用四层模式来实现,主要分为前端反向代理、web层、数据库缓存层、数据库层。前端反向代理层采用主备模式,Web层采用群集模式,数据库缓存层采用主备模式,数据库层采用主备模式。

架构拓扑:

大型网站架构之——百万 PV 大型网站架构部署
  • 说明:实线是正常情况下的数据走向,虚线代表服务器宕机的情况下,备用服务器顶上的数据流向!

环境表格说明:

主机名 IP 地址 系统版本 用途
master 192.168.154.128 CenOS 7.4 (64位) 前端Nginx 反向代理主机、redis 缓存主机、MySQL 数据主库
backup 192.168.154.136 前端Nginx法相代理备机、redis缓存备机、MySQL数据备库
tomcat-node1 192.168.154.130 Web 服务器
tomcat-node2 192.168.154.131

环境文字说明:

  • 因为要安装一些软件,所以反向代理服务器要求保持在线状态。这里前端使用 Keepalived 作为高可用软件,虚拟 IP :192.168.154.188 和 223.202.10.188,这里设置一个虚拟的内网IP是为了内部各个系统之间的进行通信。
  • 这里由于是搭建的测试环境,所以以上服务器都关闭了防火墙和Selinux。如果是生产环境建议开启防火墙。所有服务器都是默认配置,没有进行优化,需要扛起更多的访问量必须进行优化。
  • 另外,生产环境建议将MySQL的分区设置位 xfs 类型,因为再大多数场景下,整体 IOPS 表现还是要比ext4来的更高、更稳定,延迟也更小。

文章中所需源码包:

tomcat 源码包 密码:p94u

实施步骤

1·所有服务器都关闭防火墙、Selinux。

[root@master ~]# systemctl stop firewalld.service
[root@master ~]# systemctl disable firewalld.service
[root@master ~]# setenforce 0           

2·前端两台反向代理服务器安装带有nginx的rpm软件包的源

[root@master ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

3·前端两台反向代理服务器都安装 keepalived 和 nginx

[root@master ~]# yum install keepalived nginx -y

4·前端两台反向代理服务器都需要修改 keepalived 配置文件

[root@master ~]# vim /etc/keepalived/keepalived.conf
修改后内容如下:
! Configuration File for keepalived

vrrp_script nginx {                                   //启用触发式脚本程序,这里的脚本需要在
        script "/opt/shell/nginx.sh"               //配置文件外面写一个shell脚本。它的作用是
        interval 2                                         //当 keepalived 启动时,自动启动 Nginx 服务
}

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_HA
}

vrrp_instance VI_1 {
    state MASTER              //状态是 master ,从服务器 这里需要修改为 BACKUP
    interface ens33             //你的网卡名称
    virtual_router_id 51       // router id 从服务器需要修改为不一样的就行
    priority 100                   //优先级,从服务器的优先级需要低于 100
    advert_int 1
    authentication {             //主从之间启动口令,这里如果要修改主从服务器必须保持
        auth_type PASS        //一致,否则宕机的时候,不能VIP 不能漂移
        auth_pass 1111
    }

        track_script {          //这里是调用触发式脚本,调用的是自己写的shell脚本!
                nginx
        }

    virtual_ipaddress {
        192.168.154.188      //内网虚拟 IP 
        223.202.10.188        //外网虚拟 IP
    }
}           

5·编写触发式脚本,以上配置在 从服务器上需要做相同修改,不同的地方在主服务器上已经做了说明,所以从服务器的配置将不再演示。

[root@master ~]# mkdir /opt/shell      //这里创建的必须和keepalived配置文件的路径一致,否则 nginx 不会启动的!
[root@master ~]# cd /opt/shell/
[root@master shell]# vim nginx.sh
**编写内容如下:**
#!/bin/bash
k=`ps -ef | grep keepalived | grep -v grep | wc -l`     
if [ $k -gt 0 ];then
        /bin/systemctl start nginx.service
else
        /bin/systemctl stop nginx.service
fi

-----

[root@master shell]# chmod +x nginx.sh      //给与脚本执行权限           

6·把 keepalived 配置文件发送给从服务器(BACKUP)。

[root@master shell]# cd /etc/keepalived
[root@master keepalived]# scp keepalived.conf [email protected]:/etc/keepalived           

7·在 从服务器上(BACKUP)上创建 /opt/shell 目录,并把 触发式脚本从主服务器拷贝过来!

[root@backup ~]# mkdir /opt/shell
[root@backup ~]# scp [email protected]:/opt/shell/nginx.sh /opt/shell           

8·修改Nginx 配置文件,并发送给从服务器。

[root@master ~]# vim /etc/nginx/nginx.conf
添加内容如下:
http {
            upstream tomcat_pool {
                server 192.168.154.130:8080;      //第一台 tomcat 服务器 IP地址 
                server 192.168.154.131:8080;     //第二胎 tomcat 服务器 IP 地址
                ip_hash;                                      //hash 算法
        }
        server{
                listen 80;               //监听端口位80
                server_name 192.168.154.188;             //虚拟IP地址
                location /{
                        proxy_pass http://tomcat_pool;
                        proxy_set_header X-Real-IP $remote_addr;
                }
        }

[root@master ~]# scp /etc/nginx/nginx.conf [email protected]:/etc/nginx  //发送给从服务器           

9·主 、从 服务器都启动 keepadlived ,并查看nginx是否启动成功!

[root@master shell]# systemctl start keepalived.service 
[root@master shell]# ps aux | grep keepalived
root       2404  0.0  0.1 118608  1384 ?        Ss   14:04   0:00 /usr/sbin/keepalived -D
root       2405  0.0  0.2 122804  2380 ?        S    14:04   0:00 /usr/sbin/keepalived -D
root       2406  0.0  0.2 124888  2448 ?        S    14:04   0:00 /usr/sbin/keepalived -D
root       2413  0.0  0.0 112676   988 pts/0    R+   14:04   0:00 grep --color=auto keepalived         //启动 keepalived 成功
[root@master shell]# netstat -antp | grep nginx    //启动 nginx 成功
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2425/nginx: master           

启动失败解决思路:

  1. 查看 keepalived 配置文件,仔细检查是否有语法错误,是否有格式错误!
  2. 查看 keepalived 配置文件中的触发式脚本的路径和名称是否一致!
  3. 检查 nginx.sh 的执行权限是否给与!
  4. 检查 nginx,sh 的脚本是否正确,可以把里面的语句单独拿出来执行,看看是不是shell的语句有语法错误。

    如果重启不成功,大多数问题就是进程占用,kill 掉进程就好,或者找到 pid 文件位子 删除 pid 文件。

10·安装 tomcat web服务器,因为两台web 服务器配置都一样,这里只演示安装一台的过程。

[root@master pv]# tar -zxvf apache-tomcat-8.5.23.tar.gz -C /usr/local   //这里的安装包需要下载好再解压,需要的朋友可以在文章开头点击链接下载。
[root@tomcat-node1r pv]# tar zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local
[root@tomcat-node1r pv]# cd /usr/local
[root@tomcat-node1 local]# mv apache-tomcat-8.5.23 tomcat8
[root@tomcat-node1 local]# mv jdk1.8.0_144 java           

11·添加环境变量。

[root@tomcat-node1 ~]# vim /etc/profile
**添加内容如下:**
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib

[root@tomcat-node1 ~]# source /etc/profile     //刷新环境变量配置文件,使其立即生效
[root@tomcat-node1 ~]# java -version             //查看 tomcat 版本信息           

12·对 tomcat 进行操作优化。

[root@tomcat-node1 local]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup
[root@tomcat-node1 local]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown

[root@tomcat-node1r ~]# cd /usr/local/tomcat8/webapps/ROOT
[root@tomcat-node1 ROOT]# mv index.jsp index.jsp.bak
[root@tomcat-node1 ROOT]# vim index.jsp               //编辑测试页面
编写内容如下:
Server 130 !!           

13·修改祝福其tomcat配置文件、启动 tomcat 。

[root@tomcat-node1 ~]# vim /usr/local/tomcat8/conf/server.xml
 在150行左右添加内容如下:
 <Context path="" docBase="SLSaleSystem" reloadable="true" ddebug="0"></Context>               //#添加需要上线服务的位子变量

[root@tomcat-node1 local]# tomcatup
[root@tomcat-node1 local]# netstat -antp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      46918/java           
大型网站架构之——百万 PV 大型网站架构部署

14·在第二台 tomcat 服务器上修改配置文件

[root@tomcat-node1 ~]# vim /usr/local/tomcat8/conf/server.xml

在150行左右添加内容如下:

<Context path="" docBase="SLSaleSystem" reloadable="true" ddebug="0"></Context> //#添加需要上线服务的位子变量

15·在主 从服务器上部署 MySQL ,这里是用mariadb 和MySQL是一样的。

[root@master ~]# yum install -y mariadb-server mariadb
[root@master ~]# systemctl start mariadb.service
[root@master ~]# systemctl enable mariadb.service
[root@master ~]# netstat -antp | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      64226/mysqld           

16·数据的的一些常规设置

[root@master ~]# mysql_secure_installation
这里常规设置流程:回车--Y---设置MySQL登陆密码---确认登陆密码---N--N--N--Y           

17·导入需要上线服务的数据文件,这个数据文件不再单独提供,因为这里只用作测试!

[root@master pv]# mysql -u root -p &lt; slsaledb-2014-4-10.sql

18· 给这个导入的这个数据库授权,让root有权限管理

MariaDB [(none)]> grant all on slsaledb.* to 'root'@'%' identified by '123123';
MariaDB [(none)]> flush privileges;           

19·安装 redis 并且修改配置文件

[root@master ~]# yum install epel-release redis -y
修改如下内容:
bind 0.0.0.0

在从服务器上多如下一行:
265行下添加:slaveof 192.168.175.128 6379    //主 redis 的IP与端口

[root@master ~]# redis-cli -h 192.168.154.128 -p 6379    //连接测试           

20·把项目服务在 tomcat 服务器上线。

[root@tomcat-node1 pv]# tar zxvf SLSaleSystem.tar.gz -C /usr/local/tomcat8/webapps
[root@tomcat-node1 pv]# cd /usr/local/tomcat8/webapps/SLSaleSystem/WEB-INF/classes
[root@tomcat-node1 classes]# vim jdbc.properties
修改内容如下:
url=jdbc\:mysql\://192.168.154.188
password=123123           

20·在tomcat 服务器中修改项目中连接redis 的参数。

[root@tomcat-node1 classes]# vim /usr/local/tomcat8/webapps/SLSaleSystem/WEB-INF/classes/applicationContext-mybatis.xml
修改内容如下:
38行         <!--redis 配置 开始-->
47行                 <constructor-arg value="192.168.154.188"/>         #虚拟IP
48行                 <constructor-arg value="6379"/>           

-------------测试缓存效果,在redis 上连接VIP

redis-cli -h 192.168.154.188 -p 6379

192.168.154.188:6379> info

keyspace_hits:1 或 keyspace_misses:1 //关注这个值,命中和未命中登陆商城,然后反复点击需要数据库参与的操作界面,再来回检查

-------------以下配置redis集群主从切换--只在主服务器操作-----

redis-cli -h 192.168.154.128 info Replication //获取当前服务器状态

vim /etc/redis-sentinel.conf

17 protected-mode no

69 sentinel monitor mymaster 192.168.154.128 6379 1 //1表示1台服务器

98 sentinel down-after-milliseconds mymaster 3000 //故障切换时间

systemctl start redis-sentinel //启动群集,从服务器也要开启群集

netstat -antp | grep 26379

redis-cli -h 192.168.154.128 -p 26379 info Sentinel //查看群集信息

------------------验证主从切换------------------

在主上:

systemctl stop redis //停止redis

redis-cli -h 192.168.154.128 -p 26379 info Sentinel //再次查看

systemctl start redis.service //再次开启是不会主动回到master ,除非关闭从的redis

--------------验证redis数据同步情况------------

redis-cli -h 192.168.154.128 -p 6379

set name2 test2

在从服务器上连接,get name2 查看是否有数据

--------------mysql 主服务器配置-----------

vim /etc/my.cnf //[mysqld]下

binlog-ignore-db=mysql,information_schema

character_set_server=utf8

log_bin=mysql_bin

server_id=1 //从服务器的id需要修改

log_slave_updates=true

sync-binlog=1

systemctl restart mariadb.service

netstat -antp | grep 3306

mysql -u root -p

grant replication slave on . to 'rep'@'192.168.154.%' identified by '123123';

flush privileges;

show master status; //记录日志文件与偏移量

Slave_IO_Running: Yes   //得到以下两个为Yes的值
    Slave_SQL_Running: Yes           

继续阅读