大型网站架构——百万PV网站

实验架构:

黑线是正常情况数据的流向
红色是异常情况下数据流向

实验环境:

CentOS7-1(master)   192.168.13.128  nginx反向代理(主)、redis缓存处理器(主)、mysql数据库(主)
CentOS7-2(backup)   192.168.13.129  nginx反向代理(备)、redis缓存处理器(备)、mysql数据库(从)
CentOS7-3(tomcat1)  192.168.13.130  tomcat(主)
CentOS7-4(tomcat2)  192.168.13.131  tomcat(备)

1,安装部署nginx和keepalive服务(主备都需安装)

[[email protected] ~]# systemctl stop firewalld.service ##关闭防火墙
[[email protected] ~]# setenforce 0
[[email protected] ~]# rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
##安装nginx源
[[email protected] ~]# yum install -y keepalived nginx  ##下载nginx和keepalive服务
[[email protected] ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
        route_id NGINX_HA             ##备份为 NGINX_HB
}  ##下面删除4行

##触发脚本
vrrp_script nginx {
        script "/opt/shell/nginx.sh"
        interval 2   ##间隔时间
}

vrrp_instance VI_1 {
        state MASTER               ##备份为BACKUP
        interface ens33    ##网卡
        virtual_router_id 51
        priority 100                 ##备份优先级小于主
        advert_int 1
        authentication {
                auth_type PASS
                auth_pass 1111
}

track_script {     ##调用上面的函数
        nginx
}

virtual_ipaddress {   ##虚拟ip
        192.168.200.200
        }
}
//备服务器上修改
router_id NGINX_HB    ##主备不一样
state BACKUP    ##主服务
priority 90    ## 优先级,备服务器设置 90
//
[[email protected] ~]# mkdir /opt/shell
[[email protected] ~]# vim /opt/shell/nginx.sh    ##编写nginx触发脚本
#!/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
[[email protected] ~]# chmod +x /opt/shell/nginx.sh
[[email protected] ~]# vim /etc/nginx/nginx.conf ##在include 上面一行新增
upstream tomcat_pool {
                                server 192.168.13.130:8080;   ##定义后端节点服务器地址池
                                server 192.168.13.131:8080;
                                ip_hash;   ##会话稳固功能,否则无法通过vip地址登陆
                }
server {
                                listen 80;
                                server_name 192.168.13.100;   ##虚拟出的ip
                                location / {
                                                proxy_pass http://tomcat_pool;
                                                proxy_set_header X-Real-IP $remote_addr;
                                }
}
[[email protected] ~]# nginx -t  ##检查nginx配置文件的语法有没有问题
[[email protected] ~]# systemctl start keepalived.service  ##启动keepalive服务
[[email protected] ~]# ip a   ##查看虚拟ip

2,安装部署MySQL(主备都需要安装)

[[email protected] ~]# yum install -y mariadb-server mariadb
[[email protected] ~]# systemctl start mariadb.service
[[email protected] ~]# systemctl enable mariadb.service
[[email protected] ~]# netstat -natp | grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      38997/mysqld
[[email protected] ~]# mysql_secure_installation   ##初始化数据库
Enter current password for root (enter for none):   ##此处直接回车
Set root password? [Y/n] n     ##设置密码
Password updated successfully!
Remove anonymous users? [Y/n] n     ##是否删除匿名用户,选择不删除
Disallow root login remotely? [Y/n] n   ##是否远程连接
Remove test database and access to it? [Y/n] n      ##是否删除测试数据库
Reload privilege tables now? [Y/n] y    ##是否重新加载
 ... Success!
 [[email protected] ~]# mysql -uroot -p < slsaledb-2014-4-10.sql   ##导入数据库
[[email protected] ~]# mysql -uroot -p  ##进入数据库
MariaDB [(none)]> show databases;   ##查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| slsaledb           |    ##导入的数据库
| test               |
+--------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> GRANT all ON slsaledb.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘abc123‘;
##授权slsaledb库下的所有给root用户密码为abc123
MariaDB [(none)]> flush privileges;   ##刷新权限

3,部署tomcat服务(两台节点服务器上做)

[[email protected] ~]# systemctl stop firewalld.service
[[email protected] ~]# setenforce 0
[[email protected] ~]# tar zxvf apache-tomcat-8.5.23.tar.gz -C /opt/  ##解压压缩包
[[email protected] ~]# tar zxvf jdk-8u144-linux-x64.tar.gz -C /opt/
[[email protected] ~]# cp -r /opt/jdk1.8.0_144/ /usr/local/java   ##复制jdk目录到/usr/local/java
[[email protected] ~]# 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
[[email protected] ~]# source /etc/profile
[[email protected] ~]# java -version   ##查看版本
[[email protected] ~]# cp -r /opt/apache-tomcat-8.5.23/ /usr/local/tomcat8 ##tomcat目录
[[email protected] ~]# ln -s /usr/local/tomcat8/bin/startup.sh /usr/bin/tomcatup  ##建立软连接
[[email protected] ~]# ln -s /usr/local/tomcat8/bin/shutdown.sh /usr/bin/tomcatdown
[[email protected] ~]# tomcatup  ##开启tomcat
[[email protected] ~]# netstat -natp | grep 8080  ##查看tomcat端口号
tcp6       0      0 :::8080                 :::*                    LISTEN      37752/java
[[email protected] ~]# vim /usr/local/tomcat8/webapps/ROOT/index.jsp //修改默认网页内容
                        <h1>server 130</h1>   //节点1的网页内容

                        <h1>server 131</h1>  //节点2的网页内容



[[email protected] ROOT]# cd /usr/local/tomcat8/conf/
[[email protected] conf]# vim server.xml  ##修改tomcat配置文件
148       <Host name="localhost"  appBase="webapps"
149             unpackWARs="true" autoDeploy="true">
150       <Context path="" docBase="SLSaleSystem" reloadable="true" debug="    0"></Context>
##日志调试信息debug为0表示信息越少,docBase指定访问目录
[[email protected] conf]# tomcatup  ##启动tomcat服务

4,搭建商城网站

[[email protected] ~]# tar zxvf SLSaleSystem.tar.gz -C /usr/local/tomcat8/webapps/
[[email protected] ~]# cd /usr/local/tomcat8/webapps/SLSaleSystem/WEB-INF/classes/
[[email protected] classes]# vim jdbc.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://192.168.13.100\:3306/slsaledb?useUnicode\=true&characterEncoding\=UTF-8
##修改地址为虚拟ip
uname=root
password=abc123  ##授权的用户名和密码
minIdle=10
maxIdle=50
initialSize=5
maxActive=100
maxWait=100
removeAbandonedTimeout=180
removeAbandoned=true
[[email protected] classes]# tomcatdown  ##关闭开启tomca服务
[[email protected] classes]# tomcatup



5,部署redis主从和群集(在主备上配置)

[[email protected] ~]# yum install -y epel-release
[[email protected] ~]# yum install redis -y
[[email protected] ~]# cat /etc/redis.conf | grep -v "^#" | grep -v "^$"
[[email protected] ~]# vim /etc/redis.conf
 bind 0.0.0.0
 ##从服务器上266行多如下一行配置
 slaveof 192.168.200.128  6379  ##主服务器的IP不是虚拟IP
 [[email protected] ~]# systemctl start redis.service  ##开启redis服务
[[email protected] ~]# netstat -natp | grep 6379
[[email protected] ~]# redis-cli -h 192.168.13.128 -p 6379   ##在主上设置键值
192.168.13.128:6379> set name test
OK
192.168.13.128:6379> get name
"test"
[[email protected] ~]# redis-cli -h 192.168.13.129 -p 6379   ##在从上查看,显示主从同步
192.168.13.129:6379> get name
"test"

6,在tomcat服务器上配置(配置项目商城中连接redis的参数)

[[email protected] classes]# vim /usr/local/tomcat8/webapps/SLSaleSystem/WEB-INF/classes/applicationContext-mybatis.xml
 47                 <constructor-arg value="192.168.13.100"/>  ##虚拟地址
 48                 <constructor-arg value="6379"/>
[[email protected] classes]# tomcatdown  ##关闭开启tomca服务
[[email protected] classes]# tomcatup

7,在主备服务器上配置(测试Redis缓存效果)

//登录商城,然后反复点击需要数据库参与的操作页面,再回来检查keyspace_hits或者keyspace_misses: 值变化
//keyspace_hits: 或者 keyspace_misses://关注这个值,命中数和未命中数
[[email protected] ~]# redis-cli -h 192.168.13.100 -p 6379
192.168.13.100:6379> info
expired_keys:0
evicted_keys:0
keyspace_hits:2   ##命中,说明redis参与工作了
keyspace_misses:0
pubsub_channels:0

8,配置redis集群主从切换(只在主服务器上操作)

[[email protected] ~]# redis-cli -h 192.168.13.128 info Replication  ##获取当前服务器的角色
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.13.129,port=6379,state=online,offset=10800,lag=0
master_repl_offset:10800
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:10799
[[email protected] ~]# vim /etc/redis-sentinel.conf  ##修改redis哨兵配置文件
17 protected-mode no
69 sentinel monitor mymaster 192.168.200.128 6379 1 ##1表示1台从 注意:修改
98 sentinel down-after-milliseconds mymaster 3000 ##故障切换时间单位是毫秒
[[email protected] ~]# service redis-sentinel start   ##启动集群
[[email protected] ~]# netstat -anpt | grep 26379  ##查看端口号
[[email protected] ~]# redis-cli -h 192.168.13.128 -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.13.128:6379,slaves=1,sentinels=1
//验证主从切换//
[[email protected] ~]# systemctl stop redis.service   ##关闭主的redis服务
[[email protected] ~]# redis-cli -h 192.168.13.128 -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.13.129:6379,slaves=1,sentinels=1
##此时切换到129备服务器上
[[email protected] ~]# systemctl start redis.service  ##重启开启主的redis服务

9,在主备服务器上配置(配置mysql主从复制)

//主服务器上配置//
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
binlog-ignore-db=mysql,information_schema
character_set_server=utf8
log_bin=mysql_bin
server_id=1
log_slave_updates=true
sync_binlog=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
[[email protected] ~]# systemctl restart mariadb.service
[[email protected] ~]# netstat -natp | grep 3306
[[email protected] ~]# mysql -uroot
MariaDB [(none)]> show master status;  ##查看主数据库状态信息
+------------------+----------+--------------+--------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         |
+------------------+----------+--------------+--------------------------+
| mysql_bin.000001 |      245 |              | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> grant replication slave on *.* to ‘rep‘@‘192.168.13.%‘ identified by ‘123456‘;
##授权复制权限
MariaDB [(none)]> flush privileges;
//备服务器上配置//
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
binlog-ignore-db=mysql,information_schema
character_set_server=utf8
log_bin=mysql_bin
server_id=2      ##修改id为2
log_slave_updates=true
sync_binlog=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
[[email protected] ~]# systemctl restart mariadb.service
[[email protected] ~]# mysql -uroot
MariaDB [(none)]> change master to master_host=‘192.168.13.128‘,master_user=‘rep‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000001‘,master_log_pos=245;
##复制主服务器上的二进制日志文件及位置

MariaDB [(none)]> start slave;   ##开启同步
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> show slave status\G  ##查看从同步状态
                         Slave_IO_Running: Yes
                        Slave_SQL_Running: Yes

10,关闭master主服务器,验证架构


谢谢阅读!!!

原文地址:https://blog.51cto.com/14080162/2478985

时间: 2024-10-05 11:25:54

大型网站架构——百万PV网站的相关文章

在CentOS7上部署百万PV网站架构

网站架构概述 网站架构是根据客户需求分析的结果,准确定位网站目标群体,设定网站的整体架构,规划.设计网站栏目及其内容,制定网站开发流程的顺序,最大限度地进行高效资源分配与管理的设计. 百万PV网站架构 案例设计 采用四层模式实现,主要分为前端反向代理层.Web层.数据库缓存层和数据库层.前端反向代理层层采用主备模式,Web层采用群集模式,数据库缓存层采用主备模式,数据库层采用主从模式. 为了更接近生产环境,采用两台实体机部署此次环境,将前端反向代理层.数据库缓存层.数据库层部署在实体机上,只将W

【超详细】在centos7上部署百万PV网站架构

PV(Page View,页面浏览量)即点击量,通常意义上说PV的多少是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标.pv的解释是这样的:一个访问者在24小时(0点-23点)内到底看了网站的几个页面.需要注意的是:同一个人浏览网站的同一个页面,不重复计算pv量,点击100次页只算1次. 案例概述:本案例设计采用四层模型实现,主要分为前端反向代理层,web层,数据库缓存层和数据库层.前端反向代理词采用主备模式,web层采用群集模式,数据库缓存层采用主备模式,数据层采用主从模式这里我为了节省

搭建百万PV网站架构

百万PV网站构架 1.实验概述 实验例设计采用四层模式实现,主要为前端反向代理层.Web层.数据库缓存层和数据库层.前端反向代理采用主备模式,Web层采用群集模式,数据库缓存层采用主备模式,数据库层采用主从模式. 2.百万PV网站建构实验拓补图 3.实验环境 主机名 IP地址 系统 用途 master 192.168.190.130 CentOS 7 前端反向代理主机.redis缓存主机.MySQL数据库 backup 192.168.190.128 CentOS 7 前端反向代理主机.redi

用心剖析,详解如何搭建百万PV网站架构,简单易懂!!!

简介: 本项目案例结合SVN.LNMP和MySQL三种环境,部署一个社交网站,本社交网站采用PHP语言开发,搭建SVN服务器进行版本控制和集中管理PHP程序员开发的代码,以Nginx作为前端服务器,通过fastcgi协议访问后端的PHP服务器,调用PHP页面:为保证数据安全,搭建MySQL主从复制环境存储用户重要数据:另外搭建MFS分布式文件系统来存储用户照片. 1.SVN服务器:简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的 2.MFS分布式文件系统,比NFS分布式文件系统更加

超详解百万PV网站架构案例部署(内附安装包)

网站架构概述 网站架构是根据客户需求分析的结果,准确定位网站目标群体,设定网站的整体架构,规划.设计网站栏目及其内容,制定网站开发流程的顺序,最大限度地进行高效资源分配与管理的设计. 网站架构分很多种,一般我们平常所说的是软件方面的架构,例如: 前端使用了什么代理服务器? web服务器用的是什么? 中间又使用了什么缓存服务器? 数据库服务器用的是什么? 代码又是基于什么框架开发的? 这个网站架构每天访问量有多少(通常所说的PV)?并发数为多少? PV(page view 页面浏览量)即点击量,通

大型网站架构之百万PV网站架构案例

一.案例概述 本案例采用四层模式实现,主要分为前端反向代理.web层.数据库缓存层和数据库层. 前端反向代理采用主备模式 web层采用群集模式 数据库缓存层采用主备模式 数据库层采用主从模式 由于实验条件限制,本次实验共打开四台虚拟机,此处实验将前端代理层.数据库缓存层.数据库层服务搭建在前两台虚拟服务器上,web层采用群集模式,用于单独放置两台虚拟机.故本次实验实际模型为了模拟实际环境,服务搭建按照如下拓扑搭建. 二.实验环境 主机名 操作系统 IP地址 用途 server1 centosx8

手把手带你搭建百万PV网站架构

简介 PV( page view),即页面浏览量,或点击量;通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标.对PV的解释是,一个访问者在24小时(0点到24点)内到底看了你网站几个页面.这里需要强调:同一个人浏览你网站同一个页面,不重复计算PV量,点100次也算1次.说白了pV就是一个访问者打开了你的几个页面.PV之于网站,就像收视率之于电视,从某种程度上已成为投资者衡量商业网站表现的最重要的尺度.PV的计算:当一个访问者访问的时候,记录他所访问的页面和对应的IP,然后确定这个P今天

百万PV网站大体架构

大体简介 PV(page view)即页面浏览量,或点击量,通常是衡量一个网络网站的主要指标采用四层模式实现,主要分为前端反向代理层.Web层.数据库缓存层和数据库层.前端反向代理层采用主备模式,Web层采用集群模式,数据库缓存层采用主备模式,数据库层采用主从模式. 软件 版本 简介 Keepa 1.3.5-6.el7 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服

大型网站技术架构(一):大型网站架构演化

第一章:大型网站架构演化 九层之台,始于垒土:千里之行,始于足下. 对于网站的发展,亦是如此,从上世纪90年代开始,互联网经历了20多年的发展,发生了翻天覆地的变化,今天,全球有一半的人使用互联网,从信息检索到实时通信,从电子购物到文化娱乐,互联网渗透到了生活的每一个角落.但是,构建一个高性能的网站,绝非一朝一夕可以完成,我们来看下,作为一个大型网站系统应有的特点: 1.大型网站系统应有的特点 高并发,大流量:需要面对高并发用户,大流量访问.举个例子,去往迪拜的飞机有200张票,但是有100w人