您的当前位置:首页正文

集群化部署商城应用系统

来源:九壹网

4.1规划节点

其中两台虚拟机master和slave部署mysql数据库服务,搭建主从数据库集群;master作为主节点,负责写入数据库信息;slave作为从节点,负责读取数据库信息。

虚拟机Mycat部署Mycat数据库中间件服务,将用户提交得读写操作识别分发给相应得数据库外节点。

  1. Broker ID: 每个 Kafka Broker 节点的唯一标识符,broker.id 在每个 Kafka 节点的配置文件中配置。每台机器的 ID 都是唯一的,分别为 0, 1, 2。
  2. IP 地址: Kafka Broker 所在虚拟机的 IP 地址,用于 Kafka 监听客户端连接。
  3. Kafka 端口(9092): Kafka 的默认端口,用于客户端(生产者和消费者)的连接和数据传输。
  4. ZooKeeper 地址: Kafka 集群需要依赖 ZooKeeper 来管理集群状态,需要指定 ZooKeeper 集群中所有节点的地址和端口。这里使用 ZooKeeper 集群中的 2181 端口

在使用Mycat读写分离数据库作为应用系统的数据库后端,使用zookeepeer 集群,kafka集群提供应用系统调度服务,使用Reids提供应用系统消息队列服务 

·  Tomcat 应用服务器 1(jar1)

  • ·  功能:这是应用系统的第一个应用服务器节点,负责运行业务逻辑和处理用户请求。应用部署在 Tomcat 容器内,能够处理大量的 HTTP 请求和 Web 服务。
  • 作用:主要用于处理来自负载均衡器(Nginx)的请求,与数据库、Redis 等后端服务进行交互,为用户提供动态内容和应用服务。
  • 特点:Tomcat1 和 Tomcat2 共同承担了应用的服务负载,确保了高可用性。如果一个节点发生故障,另一个节点可以继续服务。

·  Tomcat 应用服务器 2(jar2)

  • ·  功能:和 jar1 一样,jar2 也是应用系统的另一个应用服务器节点,提供业务逻辑处理和用户请求响应。它和 jar1 是并行部署,分担流量。
  • 作用:同样与 Nginx 配合,处理分发到它的请求,并与其他后端服务(如数据库、Redis)进行交互。
  • 特点:双节点设置不仅能提高处理性能,还能通过负载均衡减少单点故障的风险,增强系统的稳定性。

·  Nginx 服务器(nginx)

  • ·  功能:作为反向代理服务器和负载均衡器,负责将用户的请求分发到后面的 Tomcat 应用服务器(jar1 和 jar2)。Nginx 还可以处理静态内容、SSL 加密等。
  • 作用:Nginx 会根据预设的负载均衡策略(如轮询、权重等)将流量分配给 Tomcat 节点,确保流量均匀分布,避免单台应用服务器的过载。同时,Nginx 还能够缓存一些静态资源,提高响应速度。
  • 特点:Nginx 具有高并发处理能力和高效的反向代理功能,通过分发请求确保系统高可用性和负载均衡。同时,它能帮助屏蔽后端应用服务器的细节,对外部用户提供统一的访问入口。

IP

主机名

节点

192.168.213.151

mycat

Mycat中间件服务节点

192.168.213.153

Master

MariaDB数据库集群主节点

192.168.213.146

Slave

MariaDB数据库集群从节点

192.168.213.161

                  zookeeper1

                    集群节点

192.168.213.162

                  zookeeper2

                    集群节点

192.168.213.163

                  zookeeper3

                    集群节点

192.168.213.166

redis

消息队列服务节点

192.168.213.167

jar1

Tomcat1节点

192.168.213.168

jar2

Tomcat2节点

192.168.213.169

nginx

Nginx服务器

4.2 基础准备

使用CentOS 7.2系统,flavor使用2vCPU/4GB内存/50GB硬盘创建云主机 虚拟机Mycat部署Mycat数据库中间件服务,将用户提交的读写操作识别分发给相应的数据库节点。

此外Mycat所使用的压缩包为Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

在主从节点安装mariadb,并配置主从复制功能,三个集群节点分别安装zookeeper服务,kafka服务,在redis节点安装redis

使用提供的zookeeper-3.4.14.tar.gz包和gpmall-repo文件夹,安装ZooKeeper服务

使用ZooKeeper集群搭建的3个节点来构建Kafka集群,因为Kafka服务依赖于ZooKeeper服务,所以不再多创建云主机来进行试验。软件包使用提供的kafka_2.11-1.1.1.tgz软件包。

Redis节点yum源使用提供的gpmall-repo文件夹

使用提供gpmall-shopping-0.0.1-SNAPSHOT.jar、gpmall-user-0.0.1-SNAPSHOT.jar、shopping-provider-0.0.1-SNAPSHOT.jar、user-provider-0.0.1-SNAPSHOT.jar 、dist这5个包部署应用系统,其中4个JAR包为后端服务包,在jar1节点和jar2节点上均运行,dist为前端包,在Nginx节点上部署。

这些包我已经整理好了,有需要的的可以私信我

4.3案例实施

  1. 基础环境配置

(1)修改主机名

登录这10台虚拟机分别使用hostnamectl set-hostname命令修改成对应的主机名

[root@localhost ~]# hostnamectl set-hostname jar1

[root@localhost ~]#bash

(2)关闭防火墙

关闭这10台虚拟机的防火墙输入如下命令

[root@localhost ~]# hostnamectl set-hostname jar1

[root@localhost ~]# bash

(3)配置yum源

直接挂载aliyun YUM源(同理都可以配置aliyunYUM源)

在主从节点上配置yum源

此链接挂载过程

在zookeeper集群配置yum源

# mv /etc/yum.repos.d/* /media/

在3个节点上创建/etc/yum.repo.d/local.repo,文件内容如下:

# cat /etc/yum.repos.d/local.repo

[gpmall]

name=gpmall

baseurl=file:///opt/gpmall-repo

gpgcheck=0

enabled=1

# yum clean all

# yum list

在redis节点挂载yum源

[root@redis ~]# mv /etc/yum.repos.d/* /media/

[root@redis ~]# cat /etc/yum.repos.d/local.repo

[gpmall]

name=gpmall

baseurl=file:///opt/gpmall-repo

gpgcheck=0

enabled=1

载nginx节点挂载yum

# mv /etc/yum.repos.d/* /media/

# cat /etc/yum.repos.d/local.repo

[gpmall]

name=gpmall

baseurl=file:///opt/gpmall-repo

gpgcheck=0

enabled=1

2.  修改hosts文件

 在三台主从中间件节点在 /etc/hosts 均添加如下内容

[root@slave ~]# vi /etc/hosts

3. 安装JDK环境

再部署Mycat中间件服务时需要先安装JDK软件,注意JDK1.7软件版本需要及以上

  Mycat节点安装java环境

[root@mycat ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

[root@mycat ~]# java -version

4. 部署主从数据库集群服务

(1)安装Mariadb服务

在master主节点和slave从节点上分别安装mariadb服务

[root@slave ~]# yum install -y  mariadb mariadb-server

安装完成后,master和slave节点均启动mariadb服务,并设置开机自启动

[root@master ~]#  systemctl start mariadb

[root@master ~]#  systemctl enable mariadb

(2)初始化mysql服务

在master和slave节点上初始化mariadb数据库,设置数据库root访问用户密码为123456

[root@master ~]#  mysql_secure_installation

(3)配置主节点

编辑master主节点的数据库配置文件my.cnf并添加如下内容

[root@master ~]# vi /etc/my.cnf

编辑完成后重启mysql服务

[root@master ~]# systemctl restart maysql

(4)主节点数据库权限

登录主节点master数据库,设置权限在任何客户端均可以root登录数据库

[root@master ~]# mysql -uroot -p123456

mysql> grant all privileges  on *.* to root@'%' identified by "123456";

在master数据库中创建user用户让从节点slave连接,并赋予从节点同步主节点数据库的权限

[root@master ~]# Mysql> grant replication slave on *.* to 'user'@'slave' identified by '123456';

(5)配置从节点

编辑slave主节点的数据库配置文件 my.cnf并添加如下内容

[root@slave ~]# vi /etc/my.cnf

(6)辑完成后重启mysql服务

[root@master ~]# systemctl restart mysql

(7)登录从节点slave数据库,配置从节点连接主节点的连接信息

[root@slave ~]# mysql -uroot -p123456

Mysql>change master to master_host='master',master_user='user',master_password='123456';

注意:这里要关闭从库的复制线程这将停止从库的l/o线程和SQL线程

[root@master ~]# service mysqld status ERROR! Multiple MySQL running but PID file could not be found (24749 24447 24030 23285 11898)

[r\oot@master ~]#

PID文件无法识别的问题:

在正常登陆数据库或重启数据库,启动数据库,关闭数据库等电源操作时,有时会弹出PID丢失的问题,是常见的问题之一,出现这个报错信息意味着有多个数据库进程正在使用,但服务器无法识别PID文件,这是由于之前的操作中,mysql服务被异常终止,或手动启动了多个数据库的问题导致的。

解决办法:
(1)

查看后台所有的mysql进程

ps -aux|grep mysql

手动关掉这些进程

kill -9 进程号

(2)

使用pkill命令

pkill -9 -f mysqld来终止后台

(9)连接主从数据库

其中master_host为主节点名、master_user为创建的主从连接的用户user

mysql>change master to master_host='master',master_user='user',master_password='123456';

(10)启动slave节点服务并查看节点状态

Mysql> start slave;

Mysql> show slave status\G

5. 主从测试

在master节点的MySQL中创建test数据库,并在test库中创建company表,并向表中添加数据(创建非空表并创建name和addr两个列,在表中添加shenyang china)

Mysql> create database test;

Mysql> use test;

Mysql> create table company(id int not null primary key,name varchar(50),addr varchar(255));

Mysql> insert into company values(1,"shenyang","china");

前面已经创建了所以直接使用

从slave节点查看数据库的内容,从节点db2的数据库就会同步主节点数据库创建的test库,可以在从节点查询test数据库与表company

6. 部署mycat中间件服务

(1)安装mycat中间件服务

[root@mycat ~]# chown -R 777 /usr/local/mycat/

将mycat服务变量添加至系统/etc/profile 变量文件中,并使其生效

[root@mycat ~]# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile

[root@mycat ~]# source /etc/profile

(2)编辑mycat逻辑库配置文件

[root@mycat ~]# vi /usr/local/mycat/conf/schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="gpmall" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>

<dataNode name="dn1" dataHost="localhost1" database="gpmall" />  

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1"  slaveThreshold="100">  

    <heartbeat>select user()</heartbeat>

    <writeHost host="hostM1" url="192.168.213.153:3306" user="root" password="123456">

        <readHost host="hostS1" url="192.168.213.146:3306" user="root" password="123456" />

    </writeHost>

</dataHost>

</mycat:schema>

给以下代码说明

<?xml version="1.0"?>  XML文件的版本

<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 

指定文档类型和DTD文件,用于XML文件验证

<mycat:schema xmlns:mycat="http://io.mycat/">  定义mycat的命名

<schema name="USERDB" mcheckSQLschea="true" sqlMaxLimit="100" dataNode="dn1"></schema>

定义逻辑库USERDB

Name           指定了逻辑库的名称

checkSQLschema 表示是否检查SQL语句的逻辑库

SqlMaxLimit    定义了SQL语句中允许的最大数量限制

DataNode       指定逻辑库映射到的数据节点

<dataNode name="dn1" dataHost="localhost1" database="test" />

定义了一个数据节点 dn1

name     属性指定了数据节点的名称。

dataHost 指定了数据节点关联的数据主机。

database 指定了数据节点关联的具体数据库

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1"  slaveThreshold="100">

定义一个数据主机localhost1

name   属性指定了数据主机的名称。

maxCon 定义了最大连接数。

minCon 定义了最小连接数。

balance 定义了负载均衡策略。

dbType 指定了数据库类型。

dbDriver 指定了数据库连接驱动。

writeType 指定了写操作的类型。

switchType 指定了切换类型。

slaveThreshold 定义了从库的阈值。

    <heartbeat>select user()</heartbeat>  心跳检查SQL语句,检测连接的可用性

    <writeHost host="hostM1" url="192.168.213.153:3306" user="root" password="123456">

        <readHost host="hostS1" url="192.168.213.146:3306" user="root" password="123456" />

writeHost 定义了主写主机的连接信息,包括主机名、URL、用户名和密码。

readHost 定义了从读主机的连接信息,同样包括主机名、URL、用户名和密码

    </writeHost>

</dataHost>

</mycat:schema>

(3)修改配置文件

[root@mycat ~]# chown root:root /usr/local/mycat/conf/schema.xml

(4)编辑mycat访问用户

修改/usr/local/mycat/conf/server.xml文件

在文档最后部分,修改标注的字段即可

[root@mycat ~]# vi /usr/local/mycat/conf/server.xml

<user name="root">

<property name="password">123456</property>

<property name="schemas">gpmall</property>

此段编辑完成后,删除一下字段

<user name="user">

<property name="password">user</property>

<property name="schemas">TESTDB</property>

<property name="readOnly">true</property>

</user>

 更改完成确认无误后,保存退出

   

(5)启动mycat服务

[root@mycat ~]# /bin/bash /usr/local/mycat/bin/mycat start

[root@mycat ~]# netstat -ntpl

启动成功后,查看端口的开放状态,若有8066和9066端口,表示mycat服务开启成功

若可以查询到信息,验证主从数据库集群功能在正常运行

至此,MySQL主从连接全部结束

7. 验证数据库集群服务读写分离功能

(1)用Mycat服务查询数据库信息

先在Mycat虚拟机上使用Yum安装mariadb-client服务。

[root@mycat ~]# yum install -y MariaDB-client

在Mycat虚拟机上使用mysql命令查看Mycat服务的逻辑库USERDB,因为Mycat的逻辑库USERDB对应数据库test(在部署主从数据库时已安装),所以可以查看库中已经创建的表company。命令如下。

[root@mycat ~]# mysql -h127.0.0.1 -P8066 -uroot -p123456

MySQL [(none)]> show databases;

MySQL [(none)]> use gpmall

MySQL [gpmall]> show tables;

MySQL [gpamll]> select * from company;

(2)用Mycat服务添加表数据

在Mycat虚拟机上使用mysql命令对表company添加一条数据(2,"basketball","usa"),添加完毕后查看表信息。命令如下。

MySQL [gpmall]> insert into company values(2,"bastetball","usa");

(3)验证Mycat服务对数据库读写操作分离

在Mycat虚拟机节点使用mysql命令,通过9066端口查询对数据库读写操作的分离信息。可以看到所有的写入操作WRITE_LOAD数都在db1主数据库节点上,所有的读取操作READ_LOAD数都在db2主数据库节点上。由此可见,数据库读写操作已经分离到db1和db2节点上了。命令如下。

[root@mycat ~]# mysql -h127.0.0.1 -P9066 -uroot -p123456 -e 'show  @@datasource;'

查询结果如图所示。

Mycat ,mysql日志文件及位置

mycat日志文件位置:/usr/local/mycat/logs/mycat.log

Mysql (mariadb) 日志文件位置:/data/mysql/master.err

在数据库里可以查询日志文件位置:#show variables like '%log_error%';、

下面分别是mysql,mysql日志

harset、Transaction Isolation 和 Autocommit 设置

  1. charset=latin1:MySQL 使用 latin1 字符集进行数据传输。
  2. txIsolation=3:表示事务隔离级别为 REPEATABLE READ(MySQL 中对应的级别为 3),这意味着事务在读取数据时看不到其他事务未提交的更改。
  3. autocommit=true:表示自动提交模式为开启状态,即每个 SQL 语句都会自动作为一个事务提交。

Connection Info

  1. host=192.168.213.146, port=3306:与 MySQL 服务器的 IP 地址和端口信息,表示正在连接到 IP 为 192.168.213.146 的 MySQL 实例,端口为 3306。
  2. statusSync=null, writeQueue=0, modifiedSQLExecuted=false:当前连接状态信息,表示没有同步状态,没有等待的写入队列,也没有修改的 SQL 被执行。

连接池管理

  1. create connections, because idle connection not enough:表示因为空闲连接数不足,正在创建新的数据库连接。
  2. cur is 7, minCon is 10 for hostM1:当前空闲连接数是 7,连接池的最小空闲连接数要求是 10,MyCat 因此创建了更多连接。
  3. for hostM1 和 for hostS1:表示连接池分别为主库 (hostM1) 和从库 (hostS1) 创建连接。

连接获取事件

  1. connectionAcquired MySQLConnection [id=77]:表示 ID 为 77 的 MySQL 连接已成功建立并被获取。
  2. fromSlaveDB=true:表示这个连接来自于从库 (SlaveDB),意味着这个连接主要用于读取操作。
  3. connectionAcquired MySQLConnection [id=78]:表示 ID 为 78 的 MySQL 连接已成功建立并被获取。
  4. fromSlaveDB=false:表示这个连接来自于主库 (MasterDB),意味着这个连接主要用于写入操作。

Connection 状态

  1. borrowed=false:表示这个连接当前没有被借用,仍然是空闲状态。
  2. schema=gpmall:连接正在访问的数据库名为 gpmall。
总结:

这段日志主要描述了 MyCat 在管理与 MySQL 数据库的连接时的行为。由于空闲连接不足,MyCat 创建了新的连接,并且分别连接到了主库和从库。日志中详细列出了连接的相关属性,包括字符集、事务隔离级别、自动提交状态等。

InnoDB 相关信息

  1. InnoDB: from the doublewrite buffer:InnoDB 正在从 doublewrite buffer 中恢复数据,doublewrite 是一种机制,用于防止部分页写入故障。
  2. Last MySQL binlog file position:表示 MySQL 二进制日志 (binlog) 的最后一个位置,mysql_bin.000010 是当前的 binlog 文件名。
  3. 128 rollback segments active:InnoDB 有 128 个活动的回滚段,用于事务管理。

MySQL 恢复信息

  1. Recovering after a crash:MySQL 正在从崩溃中恢复,使用 mysql_bin 日志进行数据恢复。
  2. Crash recovery finished:崩溃恢复已完成,数据库准备好处理新请求。

网络和 IPv6 支持

  1. Server hostname (bind-address):服务器正在监听所有 IP 地址 (*),端口是 3306(MySQL 默认端口)。
  2. IPv6 is available:表示服务器支持 IPv6。
  3. '::' resolves to '::':确认 IPv6 地址的解析结果。

Server socket 信息

  1. Server socket created on IP '::':服务器已在 IPv6 地址 :: 上创建了 socket,表示 MySQL 已监听在 IPv6 上。

警告

  1. Neither --relay-log nor --relay-log-index were used:表示在启动时没有设置 --relay-log 或 --relay-log-index 参数。如果这个 MySQL 实例作为从库运行,可能会导致复制问题。

建议添加 --relay-log=master-relay-bin 参数来指定 relay log,以避免潜在问题。

Event Scheduler 信息

  1. Loaded 0 events:事件调度器没有加载任何事件。

最后的启动成功信息

MySQL server ready for connections:MySQL 服务器已经启动并准备接受连接。显示了 MySQL 版本 5.6.35-log,监听在 /tmp/mysql.sock socket 文件上,端口为 3306。

总结:
  • MySQL 正在从一次崩溃中恢复,恢复过程已成功完成。
  • 服务器启用了 IPv6,并监听所有 IP 地址。
  • 需要注意的是日志中有一个与 relay log 相关的警告,建议根据日志提示添加合适的配置以避免可能的复制问题。
  • MySQL 已经准备好接受连接。

zookeeper集群部署

(1)编辑hosts文件

3个节点修改/etc/hosts 文件,3个节点均修改成如下代码所示:

# vi /etc/hosts

192.168.213.161 zookeeper1

192.168.213.162 zookeeper2

192.168.213.163 zookeeper3

搭建zookeeper集群       

(1)安装JDK环境

3个节点安装Java JDK环境,3个节点均执行命令如下:

# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

# java -version

openjdk version "1.8.0_222"

OpenJDK Runtime Environment (build 1.8.0_222-b10)

OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

(2)解压ZooKeeper软件包

# tar -zxvf zookeeper-3.4.14.tar.gz

(3)创建myid文件

创建myid文件,命令如下:

zookeeper1节点:

[root@zookeeper1 ~]# mkdir /tmp/zookeeper

[root@zookeeper1 ~]# vi /tmp/zookeeper/myid

[root@zookeeper1 ~]# cat /tmp/zookeeper/myid

1

zookeeper2节点:

[root@zookeeper2 ~]# mkdir /tmp/zookeeper

[root@zookeeper2 ~]# vi /tmp/zookeeper/myid

[root@zookeeper2 ~]# cat /tmp/zookeeper/myid

2

zookeeper3节点:

[root@zookeeper3 ~]# mkdir /tmp/zookeeper

[root@zookeeper3 ~]# vi /tmp/zookeeper/myid

[root@zookeeper3 ~]# cat /tmp/zookeeper/myid

3

(4)修改3个节点配置文件

[root@zookeeper1 conf]# vi zoo.cfg

[root@zookeeper1 conf]# grep -n '^'[a-Z] zoo.cfg

2:tickTime=2000

5:initLimit=10

8:syncLimit=5

12:dataDir=/tmp/zookeeper

14:clientPort=2181

29:server.1=172.16.51.23:2888:3888

30:server.2=172.16.51.32:2888:3888

31:server.3=172.16.51.41:2888:3888

命令解析:

l initLimit:ZooKeeper集群模式下包含多个zk进程,其中一个进程为leader,余下的进程为follower。当follower最初与leader建立连接时,它们之间会传输相当多的数据,尤其是follower的数据落后leader很多。initLimit配置follower与leader之间建立连接后进行同步的最长时间。

l syncLimit:配置follower和leader之间发送消息,请求和应答的最大时间长度。

l tickTime:tickTime则是上述两个超时配置的基本单位,例如对于initLimit,其配置值为5,说明其超时时间为 2000ms * 5 = 10秒。

l dataDir:其配置的含义跟单机模式下的含义类似,不同的是集群模式下还有一个myid文件。myid文件的内容只有一行,且内容只能为1 - 255之间的数字,这个数字亦即上面介绍server.id中的id,表示zk进程的id。

注意:zookeeper2和zookeeper3节点的操作与修改的配置和zookeeper1节点一样。

(5)启动ZooKeeper服务

zookeeper1节点:

[root@zookeeper1 bin]# ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@zookeeper1 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: follower

zookeeper2节点:

[root@zookeeper2 bin]# ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Starting zookeeper ... already running as process 10175.

[root@zookeeper2 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: leader

zookeeper3节点:

[root@zookeeper3 bin]# ./zkServer.sh start

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Starting zookeeper ... STARTED

[root@zookeeper3 bin]# ./zkServer.sh status

ZooKeeper JMX enabled by default

Using config: /root/zookeeper-3.4.14/bin/../conf/zoo.cfg

Mode: follower

可以看到,3个节点,zookeeper2为leader,其他的都是follower。

至此,ZooKeeper集群配置完毕。

注意:查看状态出现问题时,所有节点都启动一下,再查看状态。

Zookeeper日志文件及位置

日志位置:/opt/zookeeper-3.4.14/bin/zookeeper.out

日志解析:

1. 时间戳

  1. 2024-09-14 08:06:46,781: 这是每条日志的时间戳,表示事件发生的确切时间。格式为YYYY-MM-DD HH:MM:SS,毫秒。
2. [myid:1]
  1. myid: 这是当前 ZooKeeper 节点的 ID。在集群中,每个 ZooKeeper 节点都有一个唯一的 myid,用于识别这个节点。日志中 [myid:1] 表示这是来自 ID 为 1 的 ZooKeeper 节点的日志。
3. 线程信息
  1. NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181: 这一部分代表当前执行的线程。它通常表示具体的功能或线程的名称。这里的 NIOServerCxn.Factory 线程负责处理来自客户端的网络连接,0.0.0.0:2181 表示 ZooKeeper 在监听所有网络接口上的 2181 端口。
4. 日志级别
  1. INFO: 这是日志的级别,表示该消息的重要性。常见的日志级别有:

DEBUG:调试信息,通常开发阶段使用。

INFO:信息级别,表示正常的运行信息。

WARN:警告信息,表示可能会出现问题,但不一定会影响服务。

ERROR:错误信息,表示运行中的严重问题。

5. 线程状态
  1. NIOServerCnxn@1056: 表示具体的类名以及它的行号(@1056),通常用来帮助开发者定位代码中的问题或跟踪执行路径。
6. 事件描述
  1. Closed socket connection for client /192.168.213.161:57110 which had sessionid 0x10001a5eeec0000: 这是事件的描述,表示具体发生了什么。

Closed socket connection: 表示该客户端的连接已关闭。

  1. /192.168.213.161:57110: 表示连接到 ZooKeeper 的客户端的 IP 地址和端口号                         
  2. sessionid 0x10001a5eeec0000: 表示客户端的会话 ID,用于标识客户端的会话。
7. 客户端相关字段
  1. IP 地址和端口:
  1. SessionID(会话 ID):

0x10001a5eeec0000: 这是 ZooKeeper 为客户端生成的唯一会话标识符,每个客户端的会话都有不同的 session ID。

8. 事件类型及操作
  1. Accepted socket connection: 表示接受了客户端的连接请求。
  2. Client attempting to renew session: 表示客户端正在尝试续订现有的会话。
  3. Established session: 表示客户端与 ZooKeeper 成功建立会话。
  4. Revalidating client: 表示 ZooKeeper 正在重新验证客户端的会话。
  5. Unable to read additional data from client: 这是警告信息,表示 ZooKeeper 无法从客户端读取更多数据,可能是客户端主动关闭了连接。

  1.  时间戳:事件发生的时间。
  2.  myid:ZooKeeper 节点 ID,标识哪个节点记录了这条日志。
  3.  线程信息:执行的线程及它监听的网络接口和端口。
  4.  日志级别:信息的严重性。
  5.  线程状态:负责处理请求的类及行号。
  6.  事件描述:具体事件的描述,包括客户端 IP、端口、会话 ID 等信息。

Kafka集群部署

(1)解压Kafka软件包

# tar -zxvf kafka_2.11-1.1.1.tgz

(2)修改3个节点配置文件

在配置文件中找到以下两行并注释掉(在文本前加#)如下所示:

#broker.id=0

#zookeeper.connect=localhost:2181

然后在配置文件的底部添加如下3个配置。

zookeeper1节点:

broker.id=1

zookeeper.connect=192.168.213.161:2181,192.168.213.162:2181,192.168.213.163:2181

listeners = PLAINTEXT://192.168.213.161:9092

命令解析:

l broker.id:每台机器不能一样。

l zookeeper.connect:因为有3台ZooKeeper服务器,所以在这里zookeeper.connect设置为3台。

l listeners:在配置集群的时候,必须设置,不然以后的操作会报找不到leader的错误。

另外两台服务器,zookeeper.connect的配置跟这里的一样,但是broker.id和listeners不能一样。

zookeeper2节点:

broker.id=2

zookeeper.connect=172.16.51.23:2181,172.16.51.32:2181,172.16.51.41:2181

listeners = PLAINTEXT://172.16.51.32:9092

zookeeper3节点:

broker.id=3

zookeeper.connect=172.16.51.23:2181,172.16.51.32:2181,172.16.51.41:2181

listeners = PLAINTEXT://172.16.51.41:9092

启动服务需要权限用chmod命令在增加权限

(3)启动服务

zookeeper1节点:

[root@zookeeper1 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

[root@zookeeper1 bin]# jps

11416 Kafka

11464 Jps

10479 QuorumPeerMain

zookeeper2节点:

[root@zookeeper2 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

[root@zookeeper2 bin]# jps

11121 Kafka

11188 Jps

10175 QuorumPeerMain

zookeeper3节点:

[root@zookeeper3 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

[root@zookeeper3 bin]# jps

11080 Kafka

10188 QuorumPeerMain

11149 Jps

(4)测试服务

zookeeper1节点:

[root@zookeeper1 bin]# ./kafka-topics.sh --create --zookeeper 172.16.51.23:2181 --replication-factor 1 --partitions 1 --topic test

Created topic "test".

如果成功的话,会输出“Created topic "test".”。

zookeeper2节点:

[root@zookeeper2 bin]# ./kafka-topics.sh --list --zookeeper 172.16.51.32:2181

test

zookeeper3节点:

[root@zookeeper3 bin]# ./kafka-topics.sh --list --zookeeper 172.16.51.41:2181

test

测试成功。

Kafka服务日志文件及位置

日志位置:输出日志/opt/kafka_2.11-1.1.1/logs/kafkaServer.out

1. 时间戳
  1. [2024-09-13 08:08:59,206] 等等,所有日志的左侧都有时间戳,表示该事件发生的具体时间。
2. 日志级别
  1. INFO:表示该消息是信息类的,不是错误或警告,属于正常操作日志。
  2. ERROR:表示出现了严重的错误,在这种情况下,Kafka 服务器即将退出。
3. 线程名称
  1. [ThrottledRequestReaper-Fetch]:这个线程名称表示它负责处理限制请求的 Fetch 操作。Kafka 中的限流(Throttle)机制会对某些操作(如 Fetch 请求)进行限制,这个线程负责“清理”或终止受限制的请求。
  2. [ThrottledRequestReaper-Produce]:类似于上面,但这是处理生产请求(Produce)的限流清理线程。
  3. [ThrottledRequestReaper-Request]:这是负责处理一般请求的限流清理线程。
4. 事件描述
  1. Stopped:表示相关线程已停止工作。
  2. Shutdown completed:表示该线程已经完成关闭操作。
  3. Shutting down:表示该线程正在关闭的过程中。
5. Kafka 服务器状态
  1. [KafkaServer id=0] shut down completed:表示 Kafka 服务器 ID 为 0 的实例已经完成关闭。
  2. [KafkaServer id=0] shutting down:表示 Kafka 服务器 ID 为 0 的实例正在关闭。
6. 错误信息
  1. ERROR Exiting Kafka:这是严重的错误日志,表示 Kafka 服务器遇到了致命问题,正在退出。kafka.server.KafkaServerStartable 是负责启动和停止 Kafka 服务器的类。


整体流程总结:
  1. 2024-09-13 08:08:59 左右,Kafka 开始清理并关闭多个限流(ThrottledRequestReaper)线程,这些线程用于处理限速的 Fetch、Produce 和常规请求。
  2. 每个线程依次停止,并完成关闭过程。
  3. 2024-09-13 08:09:00 左右,Kafka 服务器 ID 为 0 的实例完成了关闭,并记录了一条 ERROR 日志,表示 Kafka 系统由于某种原因退出了。

日志主要是描述了 Kafka 服务器正常或异常关闭的整个过程。

4o

构建集群系统环境

(1) 新建gpmall数据库

[root@db1 ~]# mysql -uroot -p123456

Welcome to the MariaDB monitor.  Commands end with ; or \g.

Your MariaDB connection id is 19

Server version: 10.3.18-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> create database gpmall;

Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> use gpmall

Database changed

MariaDB [gpmall]> source /root/gpmall.sql

Query OK, 0 rows affected (0.000 sec)

Query OK, 0 rows affected (0.000 sec)

gpmall.sql文件导入完毕后,退出数据库。

(2)修改Mycat配置

[root@mycat conf]# cat schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="gpmall" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>

<dataNode name="dn1" dataHost="localhost1" database="gpmall" />  

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1"  slaveThreshold="100">  

    <heartbeat>select user()</heartbeat>

    <writeHost host="hostM1" url="172.16.51.22:3306" user="root" password="123456">

        <readHost host="hostS1" url="172.16.51.26:3306" user="root" password="123456" />

    </writeHost>

</dataHost>

</mycat:schema>

<user name="root">

<property name="password">123456</property>

<property name="schemas">gpmall</property>

<!-- 表级 DML 权限设置 -->

<!--

<privileges check="false">

<schema name="TESTDB" dml="0110" >

<table name="tb01" dml="0000"></table>

<table name="tb02" dml="1111"></table>

</schema>

</privileges>

 -->

</user>

(3)重启Mycat服务

 [root@mycat bin]# ./mycat restart

Stopping Mycat-server...

Mycat-server was not running.

Starting Mycat-server...

查看Mycat服务是否启动,命令如下,如果能看到8066端口,则说明Mycat服务启动成功。

[root@mycat conf]# netstat -ntpl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      945/sshd            

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      862/master          

tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      15039/java          

tcp6       0      0 :::8066                 :::*                    LISTEN      15039/java          

tcp6       0      0 :::47746                :::*                    LISTEN      15039/java          

tcp6       0      0 :::56870                :::*                    LISTEN      15039/java          

tcp6       0      0 :::9066                 :::*                    LISTEN      15039/java          

tcp6       0      0 :::22                   :::*                    LISTEN      945/sshd            

tcp6       0      0 ::1:25                  :::*                    LISTEN      862/master          

tcp6       0      0 :::1984                 :::*                    LISTEN      15039/java          

(4 ) 安装redis服务

使用Yum命令安装Redis服务,命令如下:

[root@redis ~]# yum install redis -y

(5)启动Redis服务

修改Redis配置文件,编辑/etc/redis.conf文件。

将bind 127.0.0.1这一行注释掉,将protected-mode yes改为protected-mode no。

启动Redis服务命令如下。

[root@mall ~]# systemctl start redis

[root@mall ~]# systemctl enable redis

Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.

检查Redis服务启动,命令如下,如果检查到6379端口,即证明Redis服务运行成功。

[root@redis ~]# netstat -ntpl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      1065/redis-server *

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      942/sshd            

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      860/master          

tcp6       0      0 :::6379                 :::*                    LISTEN      1065/redis-server *

tcp6       0      0 :::22                   :::*                    LISTEN      942/sshd            

tcp6       0      0 ::1:25                  :::*                    LISTEN      860/master        

至此,应用商城集群部署需要的环境Mycat、Redis、Zookeeper、Kafka服务均已部署完毕。Zookeeper和Kafka集群服务直接使用

Redis日志文件及位置

  1. 日志位置: /var/log/redis/redis.log
  2. 19962008表示 Redis 进程的 ID 和模式:
  3. M 表示主进程(Master)。
  4. C 表示子进程(Child),通常负责执行后台任务,如保存数据到磁盘。
日志事件解析

  1. 12 Sep 18:06:05.772 # Server started, Redis version 3.2.12

Redis 服务器在 2024 年 9 月 12 日 18:06:05 启动,版本是 3.2.12

  1. 12 Sep 18:06:05.772 # WARNING overcommit_memory is set to 0!

警告:overcommit_memory 参数设置为 0,这意味着系统在内存不足时,可能无法执行 Redis 的后台保存操作。

解决方案:通过命令 sysctl vm.overcommit_memory=1 修改此参数,或将 vm.overcommit_memory = 1 添加到 /etc/sysctl.conf 并重启。

  1. 12 Sep 18:06:05.772 # WARNING Transparent Huge Pages (THP)

警告:内核启用了透明大页(THP)功能。Redis 不推荐使用该功能,因为可能会导致延迟增加和内存使用效率降低。

解决方案:运行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 关闭该功能,并将其添加到 /etc/rc.local,确保重启后仍生效。

  1. 12 Sep 18:06:05.772 * DB loaded from disk: 0.000 seconds

Redis 从磁盘加载数据库,加载时间为 0.000 秒,表示数据量较小或加载速度非常快。

  1. 12 Sep 18:06:05.772 * The server is now ready to accept connections on port 6379

Redis 服务器已经准备好接受客户端连接,监听端口为 6379

  1. 12 Sep 18:36:08.792 * 1 changes in 900 seconds. Saving...

在过去的 900 秒(15分钟) 内,Redis 发生了 1 次修改,因此触发了保存操作。

  1. 12 Sep 18:36:08.846 * Background saving started by pid 2008

Redis 的子进程 2008 开始执行后台保存操作,将数据保存到磁盘。

  1. 12 Sep 18:36:08.847 * DB saved on disk

数据库已成功保存到磁盘。

  1. 12 Sep 18:36:08.856 * RDB: 4 MB of memory used by copy-on-write

Redis 使用了 4 MB 的内存来执行写时复制(copy-on-write)操作,表明在保存数据时,Redis 创建了一个数据的副本以避免影响正常的操作。

  1. 12 Sep 18:36:08.959 * Background saving terminated with success

后台保存任务成功完成。

  1. 12 Sep 18:41:09.042 * 10 changes in 300 seconds. Saving...

在过去的 300 秒(5分钟) 内发生了 10 次修改,因此再次触发了保存操作。

  1. 12 Sep 18:41:09.043 * Background saving started by pid 2010

Redis 的子进程 2010 开始执行新的后台保存操作。

  1. 12 Sep 18:41:09.044 * DB saved on disk

数据库成功保存到磁盘。

  1. 12 Sep 18:41:09.044 * RDB: 4 MB of memory used by copy-on-write

与前一次保存相同,Redis 在这次保存操作中也使用了 4 MB 的内存进行写时复制操作。

  1. 12 Sep 18:41:09.143 * Background saving terminated with success

后台保存任务再次成功完成。


总结:
  • Redis 在启动时发出了两个警告,一个是关于 overcommit_memory 参数,另一个是关于透明大页(THP)。这些警告会对 Redis 的性能和稳定性造成潜在影响,建议按照提示修改系统配置。
  • Redis 定期自动保存数据到磁盘,使用的是写时复制技术,每次保存操作都成功完成。
  • Redis 服务器正常运行,接受客户端连接并持续处理数据

部署集群应用系统

(1)安装Java环境

因为需要在jar1、jar2节点上运行提供的4个JAR包,所以需要在jar1和jar2节点上配置Java环境。安装java环境命令如下:

jar1节点:

[root@jar1 ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

[root@jar1 ~]# java -version

openjdk version "1.8.0_222"

OpenJDK Runtime Environment (build 1.8.0_222-b10)

OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

jar2节点:

[root@jar2 ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel

[root@jar2 ~]# java -version

openjdk version "1.8.0_222"

OpenJDK Runtime Environment (build 1.8.0_222-b10)

OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

.后端配置

(1)配置hosts文件

在jar1和jar2节点,编辑/etc/hosts配置文件,文件内容如下:

jar1节点:

[root@jar1 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.213.166  redis.mall

192.168.213.151  mysql.mall

192.168.213.161  kafka.mall

192.168.213.162  kafka.mall

192.168.213.163  kafka.mall

192.168.213.161  zookeeper.mall

192.168.213.162  zookeeper.mall

192.168.213.163  zookeeper.mall

jar2节点:

[root@jar2 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.213.166  redis.mall

192.168.213.151  mysql.mall

192.168.213.161  kafka.mall

192.168.213.162  kafka.mall

192.168.213.163  kafka.mall

192.168.213.161  zookeeper.mall

192.168.213.162  zookeeper.mall

192.168.213.163  zookeeper.mall

(2)运行jar包

jar1节点:

[root@jar1 ~]# nohup java -jar user-provider-0.0.1-SNAPSHOT.jar &

[1] 11025

[root@jar1 ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@jar1 ~]# nohup java -jar shopping-provider-0.0.1-SNAPSHOT.jar &

[2] 11039

[root@jar1 ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@jar1 ~]# nohup java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar &

[3] 11085

[root@jar1 ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@jar1 ~]# nohup java -jar gpmall-user-0.0.1-SNAPSHOT.jar &

[4] 11105

[root@jar1 ~]# nohup: ignoring input and appending output to ‘nohup.out’

检查jar包是否运行,命令如下:

[root@jar1 ~]# ps -aux |grep java

root     11025 21.9 12.1 3605624 492588 pts/0  Sl   11:49   0:11 java -jar user-provider-0.0.1-SNAPSHOT.jar

root     11039 21.3  9.9 3596260 400936 pts/0  Sl   11:49   0:10 java -jar shopping-provider-0.0.1-SNAPSHOT.jar

root     11105 28.5  9.4 3590068 384476 pts/0  Sl   11:50   0:09 java -jar gpmall-user-0.0.1-SNAPSHOT.jar

root     11193  161 12.7 3596228 514868 pts/0  Sl   11:50   0:14 java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar

root     11272  0.0  0.0 112640   960 pts/0    S+   11:50   0:00 grep --color=auto java

jar2节点:

[root@jar2 ~]# nohup java -jar user-provider-0.0.1-SNAPSHOT.jar &

[1] 10915

[root@jar2 ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@jar2 ~]# nohup java -jar shopping-provider-0.0.1-SNAPSHOT.jar &

[2] 10929

[root@jar2 ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@jar2 ~]# nohup java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar &

[3] 11004

[root@jar2 ~]# nohup: ignoring input and appending output to ‘nohup.out’

[root@jar2 ~]# nohup java -jar gpmall-user-0.0.1-SNAPSHOT.jar &

[4] 11024

[root@jar2 ~]# nohup: ignoring input and appending output to ‘nohup.out’

检查jar包是否运行,命令如下:

[root@jar2 ~]# ps -ef |grep java

root     10915  9970 27 11:50 pts/0    00:00:11 java -jar user-provider-0.0.1-SNAPSHOT.jar

root     10929  9970 28 11:50 pts/0    00:00:10 java -jar shopping-provider-0.0.1-SNAPSHOT.jar

root     11004  9970 49 11:51 pts/0    00:00:13 java -jar gpmall-shopping-0.0.1-SNAPSHOT.jar

root     11024  9970 41 11:51 pts/0    00:00:09 java -jar gpmall-user-0.0.1-SNAPSHOT.jar

root     11113  9970  0 11:51 pts/0    00:00:00 grep --color=auto java

至此,应用系统部署完毕。

jar包日志位置及解析

日志位置:nohup.out

   日志解析:

日志事件解析

  1. at sun.nio.ch.Net.checkAddress(Net.java:104) ~[na:1.8.0_412]
  1. 这是 Java 底层的网络库 sun.nio.ch.Net 中的方法 checkAddress() 抛出的异常,表示在尝试连接时,检查网络地址时出错。这通常是由于无法解析主机名或 IP 地址,或者地址格式不正确。

  1. At sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:621) ~[na:1.8.0_412]
  1. 这是 Java 的 SocketChannelImpl 尝试建立网络连接的地方,它调用 connect() 方法尝试连接到目标主机,但由于地址无法解析,连接失败。

  1. at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java:277)
  1. 这是 ZooKeeper 客户端的内部代码,负责注册并连接到服务器。在此过程中,它尝试连接到 ZooKeeper 服务器(由配置指定的主机名或 IP),但由于网络地址问题,连接失败。

  1. at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021)
  1. ZooKeeper 客户端的 SendThread 线程负责与服务器建立和维护连接。此时,它在尝试启动连接时失败了。

  1. Opening socket connection to server zookeeper.mall:2181. Will not attempt to authenticate using SASL (unknown error)
  1. ZooKeeper 客户端正在尝试与服务器 zookeeper.mall:2181 建立套接字连接。此处提到不会尝试使用 SASL 进行身份验证(因为遇到了未知错误),这是身份验证方式的问题,但并非导致连接失败的原因。

  1. Session 0x0 for server zookeeper.mall:2181, unexpected error, closing socket connection and attempting reconnect
  1. ZooKeeper 客户端与服务器的连接遇到意外错误(即无法解析地址),因此关闭了套接字连接并尝试重新连接。

  1. java.nio.channels.UnresolvedAddressException: null
  1. UnresolvedAddressException 是 Java NIO 抛出的异常,表示提供的服务器地址 zookeeper.mall:2181 无法解析。可能的原因包括:
  2. zookeeper.mall 这个主机名不存在,或 DNS 服务无法解析该域名。
  3. 配置文件中可能有拼写错误或配置问题。
  4. 网络问题或 DNS 解析服务不可用。
解决方案建议
  • 检查主机名:确认 zookeeper.mall 这个主机名是否正确配置,可以使用 ping 或 nslookup 命令测试是否可以解析该域名。
  • 检查 ZooKeeper 配置:在 ZooKeeper 的客户端配置文件中,确保正确设置了 ZooKeeper 服务器的 IP 地址或域名,并且能够解析。
  • 检查 DNS 设置:如果使用的是域名,请确保系统或服务器的 DNS 服务正常工作,确保能够解析正确的 IP 地址。
  • 检查网络连接:确保客户端与 ZooKeeper 服务器之间的网络连接正常,没有防火墙、路由等阻碍。

前端配置

(1)安装Nginx服务

登录Nginx节点,安装Nginx服务,命令如下:

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

(2)上传前端代码

[root@nginx ~]# rm -rf /usr/share/nginx/html/*

[root@nginx ~]# cp -rvf dist/* /usr/share/nginx/html/

(3)修改Nginx配置文件

upstream myuser {

    server 192.168.213.167:8082;

            server 192.168.213.168:8082;

    ip_hash;

}

        upstream myshopping {

            server 192.168.213.167:8081;

            server 192.168.213.168:8081;

            ip_hash;

        }

        upstream mycashier {

            server 192.168.213.167:8083;

            server 192.168.213.168:8083;

            ip_hash;

        }

server {

    listen       80;

    server_name  localhost;

    #charset koi8-r;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {

        root   /usr/share/nginx/html;

        index  index.html index.htm;

    }

    location /user {

    proxy_pass http://myuser;

        }

    location /shopping {

    proxy_pass http://myshopping;

        }

    location /cashier {

    proxy_pass http://mycashier;

        }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html

    #

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {

        root   /usr/share/nginx/html;

    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80

    #

    #location ~ \.php$ {

    #    proxy_pass   http://127.0.0.1;

    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #

    #location ~ \.php$ {

    #    root           html;

    #    fastcgi_pass   127.0.0.1:9000;

    #    fastcgi_index  index.php;

    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;

    #    include        fastcgi_params;

    #}

    # deny access to .htaccess files, if Apache's document root

    # concurs with nginx's one

    #

    #location ~ /\.ht {

    #    deny  all;

    #}

}

(4)启动Nginx服务

在nginx节点,启动Nginx服务,命令如下:

[root@nginx ~]# systemctl start nginx

查看Nginx是否启动,命令如下(查看80端口是否启动):

[root@nginx ~]# netstat -ntpl

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      10287/nginx: master

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      946/sshd            

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      864/master          

tcp6       0      0 :::22                   :::*                    LISTEN      946/sshd            

tcp6       0      0 ::1:25                  :::*                    LISTEN      864/master        

nginx日志文件及位置

日志位置: /var/log/nginx/error.log(错误日志)access。log(正确日志)

日志解析:

这段日志是来自 Nginx 或 Apache 服务器的 访问日志,记录了用户从浏览器向服务器发出请求的详细信息。让我们逐行解析其含义:

日志结构

①192.168.213.1

②- - [12/Sep/2024:23:10:48 +0800]

③"GET /static/images/nav_logo.png HTTP/1.1":

④200 29939 

⑤"http://192.168.213.169/"

 ⑥"Mozilla/5.0 (Windows NT 10.0; Win64; x64)

⑦AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0" "

192.168.213.1:

c

②[12/Sep/2024:23:10:48 +0800]:

时间戳:表示请求的时间为 2024 年 9 月 12 日 23:10:48,时区为 +0800(即东八区,中国标准时间)。

③"GET /static/images/nav_logo.png HTTP/1.1":

请求方法和资源路径

GET:HTTP 请求方法,表示客户端正在请求获取资源。

/static/images/nav_logo.png:请求的资源路径,表示客户端请求了服务器上的一个静态图片资源。

HTTP/1.1:HTTP 协议版本。

④ 200:

状态码:表示服务器响应的状态,200 意味着请求成功,服务器正确返回了资源。

⑤ 29939:

响应大小:表示服务器返回的数据大小,单位为字节。在这里,服务器返回了 29,939 字节的数据。

⑥ "http://192.168.213.169/":

引用页面:表示用户从哪个页面发起的请求。这里是 http://192.168.213.169/,表示用户从该 URL 页面发出了图片请求。

⑦"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0":

用户代理(User-Agent):表示发出请求的客户端的浏览器和操作系统信息。这里是:

操作系统:Windows 10 (x64)

浏览器内核:AppleWebKit/537.36(与 Chrome、Edge 使用的相同)

浏览器:Edge 128.0.0.0。

"-":

额外信息:这部分通常用来记录请求中的某些额外字段信息。在这里为 "-",表示没有额外信息。

其他行的解析

每一行的结构类似,表示不同的请求:

  • /static/images/account-icon@2x.png 请求的是另一个静态图片资源,响应状态也是 200,大小为 6083 字节。
  • /shopping/categories 请求的是类别页面,返回了 3187 字节的数据。
  • /shopping/recommend 和 /shopping/homepage 分别是请求推荐页面和主页,返回的字节数分别为 2028 和 14026。
综述

网站访问

如果对你有帮助的话一键三连呦会持续更新

因篇幅问题不能全部显示,请点此查看更多更全内容

Top