课程任务

  1. 系统概况

gpmall商城是一个开源的基于Java开发的网上商城应用。现在用户已经提供了gpmall应用的打包代码及系统架构等信息,我们需要按照要求部署gmall应用。gpmal 商城平台主要涉及MySQL、 Kafka、ZooKeeper、Nginx 和 gpmall 源代码的使用。

  1. 系统架构

gpmall商城的系统架构如下图所示。其中:

  • 负载均衡集群:负载均衡软件采用Nginx,Web服务器不用使用Web容器,直接运行编写好的jar包。

  • 应用系统调度集群:Zookeeper集群和Kafka集群构提供应用系统调度服务。

  • 消息队列服务器:Redis提供消息队列服务。

  • MySQL集群:利用MyCAT实现读写分离功能。

clip_image002.jpg

  1. 节点规划

为了节省资源、简化操作,把原有10个节点的功能分布到3个节点上。

注意:主机名是gpmall应用提供的。

集群物理节点节点功能主机名IP
MySQL集群node1MyCATmysql.mall192.168.137.101
MySQL集群node2MariaDB/主/写node2192.168.137.102
MySQL集群node3MariaDB/从/读node3192.168.137.103
Zookeeper集群node1zk1.mall192.168.137.101
Zookeeper集群node2zk2.mall192.168.137.102
Zookeeper集群node3zk3.mall192.168.137.103
Kafka集群node1kafka1.mall192.168.137.101
Kafka集群node2kafka2.mall192.168.137.102
Kafka集群node3kafka3.mall192.168.137.103
Redisnode1redis.mall192.168.137.101
Web服务集群node1负载均衡nginx192.168.137.101
Web服务集群node2Web服务jar1192.168.137.102
Web服务集群node3Web服务jar2192.168.137.103

节点基础配置

制作模板机

模板机信息如下:

操作系统:centos7.9
用户名:root
密码:000000

模板机操作:

修改模板机的主机名,IP地址,配置yum源,关闭防火墙,关闭selinux,安装jdk

  • 修改主机名
1
2
[root@yyt ~]# hostnamectl set-hostname node0
[root@yyt ~]# bash
  • 修改网络配置
1
2
3
4
5
6
7
8
9
10
11
12
[root@node0 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
UUID=d1ca53e5-8af5-46db-a170-3076f10794f7
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.137.100
NETMASK=255.255.255.0
GATEWAY=192.168.137.2
DNS1=114.114.114.114
DNS2=8.8.8.8
  • 关闭防火墙
1
2
[root@node0 ~]# systemctl stop firewalld
[root@node0 ~]# systemctl disable firewalld
  • 关闭selinux
1
2
3
[root@node0 ~]# setenforce 0
[root@node0 ~]# vi /etc/selinux/config
SELINUX=disabled
  • 修改hosts解析
1
2
3
4
5
6
7
8
[root@node0 ~]# vi /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdoma
in4
::1 localhost localhost.localdomain localhost6 localhost6.localdoma
in6
192.168.137.101 node1 mysql.mall zk1.mall kafka1.mall nginx redis.mall
192.168.137.102 node2 zk2.mall kafka2.mall jar1
192.168.137.103 node3 zk3.mall kafka3.mall jar2
  • 修改yum源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 备份原yum文件
[root@node0 ~]# mkdir /etc/yum.repos.e && mv /etc/yum.repos.d/* /etc/yum.repos.e
# 然后创建local.repo文件并修改为如下内容
[root@node0 ~]# cat /etc/yum.repos.d/local.repo
[gpmall]
name=gpmall
baseurl=file:///opt/gpmall-repo
gpgcheck=0
enabled=1
[mariadb]
name=mariadb
baseurl=file:///opt/gpmall-repo
gpgcheck=0
enabled=1

# 看到如下信息表示配置正确
[root@node0 ~]# yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
源标识 源名称 状态
!gpmall gpmall 298
!mariadb mariadb 298
repolist: 596

构建读写分离数据库集群

根据模板机克隆出三台虚拟机,并修改三台虚拟机的主机名和IP地址分别为

node1:192.168.137.101

node2:192.168.137.102

node3:192.168.137.103

集群规划

用Mycat作为数据库中间件服务构建读写分离的数据库集群,节点规划⻅下表 :

物理节点 节点功能 主机名 IP
node1 MyCAT mysql.mall 192.168.137.101
node2 MariaDB/主/写 node2 192.168.137.102
node3 MariaDB/从/读 node3 192.168.137.103

安装mariadb

node2、node3节点安装mariadb,root密码为123456,启动服务并设置开机自启

1
2
3
4
5
6
7
[root@node2 ~]# yum install -y mariadb mariadb-server
[root@node2 ~]# systemctl start mariadb
[root@node2 ~]# systemctl enable mariadb
Created symlink from /etc/systemd/system/multi-user.target.wants/mariadb.se
rvice to /usr/lib/systemd/system/mariadb.service.
[root@node2 ~]# mysql_secure_installation
# 初始化,回车,y,y,n,y,y

配置主从复制

主节点(node2)配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 修改主节点配置文件
[root@node2 ~]# vi /etc/my.cnf
# 新增内容,开启二进制日志
[mysqld]
skip-name-resolve
log_bin=mysql-bin
server_id=102
# 默认内容
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security ris
ks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
# 重启服务,重新加载配置文件
[root@node2 ~]# systemctl restart mariadb
[root@node2 ~]# mysql -uroot -p123456

配置数据库信息

1
2
3
4
5
6
7
8
9
10
11
12
13
# 授权访问数据库
[root@node2 ~]# mysql -uroot -p123456 -e "grant all privileges on *.* to root@'%' identified by "123456";"
# 刷新权限
[root@node2 ~]# mysql -uroot -p123456 -e "flush privileges;"
# 创建gpmall数据库
[root@node2 ~]# mysql -uroot -p123456 -e "create database gpmall;"
[root@node2 ~]# mysql -uroot -p123456
MariaDB [(none)]> use gpmall
Database changed
# 导入数据
MariaDB [gpmall]> source /opt/gpmall-web/gpmall.sql
MariaDB [(none)]> quit
Bye

从节点node3配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@node3 ~]# mysql -uroot -p123456 -e "change master to master_host='192.168.137.102',master_user='root',master_password='123456';"
[root@node3 ~]# mysql -uroot -p123456 -e "start slave;"
[root@node3 ~]# mysql -uroot -p123456 -e "show slave status\G"
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.137.102
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 320
Relay_Log_File: mariadb-relay-bin.000004
Relay_Log_Pos: 604
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

配置Mycat读写分离

node1配置

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
# 将MyCAT软件包解压到/usr/local目录
[root@node1 ~]# tar -zxvf /opt/Mycat-server-1.6-RELEASE-20161028204710-lin
ux.tar.gz -C /usr/local/
# 添加Mycat服务的系统环境变量
[root@node1 ~]# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
# 使环境变量生效
[root@node1 ~]# source /etc/profile
# 配置读写分离规则
[root@node1 ~]# 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="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="192.168.137.102:3306" user="root" password="123456">
<readHost host="hostS1" url="192.168.137.103:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
# 配置用户访问规则
[root@node1 ~]# vi /usr/local/mycat/conf/server.xml
# 修改内容
<user name="root">
<property name="password">123456</property>
<property name="schemas">gpmall</property>
# 启动mycat
[root@node1 ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@node1 ~]# ss -nltp| egrep '8066|9066'
State Recv-Q Send-Q Local Address:Port Peer Addre
ss:Port
LISTEN 0 100 [::]:9066
[::]:* users:(("java",pid=16043,fd=74))
LISTEN 0 100 [::]:8066
[::]:* users:(("java",pid=16043,fd=78))
# 安装mariadb客户端
[root@node1 ~]# yum install -y mariadb
# 验证读写分离配置
[root@node1 ~]# mysql -h127.0.0.1 -P9066 -uroot -p123456 -e 'show @@datasource;'
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| dn1 | hostM1 | mysql | 192.168.137.102 | 3306 | W | 0 | 9 | 1000 | 13717 | 0 | 0 |
| dn1 | hostS1 | mysql | 192.168.137.103 | 3306 | R | 0 | 9 | 1000 | 13710 | 0 | 0 |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+

构建分布式服务集群

使用ZooKeeper集群、Kafka集群供应用系统调度服务,使用Redis提供应用系统消息队列服务。

集群规划

集群 物理节点 主机名 IP

Zookeeper集群 node1 zk1.mall 192.168.137.101

Zookeeper集群 node2 zk2.mall 192.168.137.102

Zookeeper集群 node3 zk3.mall 192.168.137.103

Kafka集群 node1 kafka1.mall 192.168.137.101

Kafka集群 node2 kafka2.mall 192.168.137.102

Kafka集群 node3 kafka3.mall 192.168.137.103

配置Zookeeper集群

为Zookeeper集群各个节点做以下配置。

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
# 将ZooKeeper软件包解压到/usr/local目录
[root@node1 ~]# tar -zxvf /opt/zookeeper-3.4.14.tar.gz -C /usr/local/
# 赋予ZooKeeper目录权限
[root@node1 ~]# chown -R 777 /usr/local/zookeeper-3.4.14/
# 添加ZooKeeper的系统环境变量
[root@node1 ~]# echo export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.14 >>/etc/profile
# 使环境变量生效
[root@node1 ~]# source /etc/profile
[root@node1 ~]# cd /usr/local/zookeeper-3.4.14/conf
# 复制配置文件
[root@node1 conf]# cp zoo_sample.cfg zoo.cfg
# 创建新的数据目录
[root@node1 conf]# mkdir -p /usr/local/zookeeper-3.4.14/data
# 修改配置文件
[root@node1 conf]# vi zoo.cfg
# 修改数据目录
dataDir=/usr/local/zookeeper-3.4.14/data
# 新增集群配置
server.1=192.168.137.101:2888:3888
server.2=192.168.137.102:2888:3888
server.3=192.168.137.103:2888:3888
# 注意!分别为每个节点创建myid文件,myid分别为1、2、3
[root@node1 conf]# echo 1 > /usr/local/zookeeper-3.4.14/data/myid
[root@node1 conf]# cat /usr/local/zookeeper-3.4.14/data/myid
1
# 切换目录
[root@node1 conf]# cd /usr/local/zookeeper-3.4.14/bin
# 启动服务
[root@node1 bin]# ./zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
# 查看节点状态
[root@node1 bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
Mode: follower

配置Kafka集群

使用ZooKeeper集群的3个节点来构建Kafka集群,因为Kafka依赖于ZooKeeper,所以不再多创建节点。

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
# 将Kafka软件包解压到/usr/local目录
[root@node1 ~]# tar -zxvf /opt/kafka_2.11-1.1.1.tgz -C /usr/local/
# 赋予目录权限
[root@node1 ~]# chown -R 777 /usr/local/kafka_2.11-1.1.1/
# 创建日志目录
[root@node1 ~]# mkdir -p /usr/local/kafka_2.11-1.1.1/config/logs
# 修改配置文件
[root@node1 ~]# vi /usr/local/kafka_2.11-1.1.1/config/server.properties
#节点ID
broker.id=1
# Zookeeper集群信息
zookeeper.connect=192.168.137.101:2181,192.168.137.102:2181,192.168.137.103:2181
# 注意!不同节点的listeners地址应按实际地址填写
listeners = PLAINTEXT://192.168.137.101:9092
# 数据目录
log.dirs=/usr/local/kafka_2.11-1.1.1/config/logs
# 切换目录
[root@node1 ~]# cd /usr/local/kafka_2.11-1.1.1/bin
# 启动服务
[root@node1 bin]# ./kafka-server-start.sh -daemon ../config/server.properties
# 验证服务
[root@node1 bin]# jps
119090 Jps
118938 Kafka
65663 WrapperSimpleApp
104111 QuorumPeerMain

配置redis服务

在node1节点安装Redis服务。

1
2
3
4
5
6
7
8
9
10
11
12
# 安装redis
[root@node1 ~]# yum install redis -y
# 修改redis配置文件
# 将 bind 127.0.0.1 这一行注释掉,将 protected-mode yes 改为 protected-mode no。
[root@node1 ~]# vi /etc/redis.conf
# 启动redis服务并设置开机自启
[root@node1 ~]# systemctl start redis
[root@node1 ~]# systemctl enable redis
# 验证redis服务
[root@node1 ~]# ss -nltp | grep 6379
LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=122273,fd=5))
LISTEN 0 128 [::]:6379 [::]:* users:(("redis-server",pid=122273,fd=4))

部署Web服务集群

Web服务集群规划

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

集群 物理节点 节点功能 主机名 IP
Web服务集群 node1 负载均衡 nginx 192.168.137.101
Web服务集群 node2 Web服务 jar1 192.168.137.102
Web服务集群 node3 Web服务 jar2 192.168.137.103

部署Web服务

分别在node2、node3上部署后端服务包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 在后台运行Web服务jar包
[root@node2 ~]# nohup java -jar /opt/gpmall-web/user-provider-0.0.1-SNAPSHOT.jar &
[root@node2 ~]# nohup java -jar /opt/gpmall-web/shopping-provider-0.0.1-SNAPSHOT.jar &
[root@node2 ~]# nohup java -jar /opt/gpmall-web/gpmall-shopping-0.0.1-SNAPSHOT.jar &
[root@node2 ~]# nohup java -jar /opt/gpmall-web/gpmall-user-0.0.1-SNAPSHOT.jar &
# 查看服务运行状态
[root@node2 ~]# jps
6945 QuorumPeerMain
7282 Kafka
7387 gpmall-user-0.0.1-SNAPSHOT.jar
7579 Jps
7357 user-provider-0.0.1-SNAPSHOT.jar
7358 shopping-provider-0.0.1-SNAPSHOT.jar
7359 gpmall-shopping-0.0.1-SNAPSHOT.jar

配置负载均衡服务

在node1上部署负载均衡服务,gpmall主要服务虚拟站点如下

服务 功能 服务端口
gpmall-cashier 收银台,负责支付相关的交互逻辑 8083
gpmall-shopping 商品/购物⻋/首⻚渲染等交互 8081
gpmall-user 提供用户相关的交互,如登录、注册、个人中心等 8082

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
# 安装nginx
[root@node1 ~]# yum install nginx -y
[root@node1 ~]# systemctl start nginx
[root@node1 ~]# systemctl enable nginx
# 删除nginx默认Web目录
[root@node1 ~]# rm -rf /usr/share/nginx/html/*
# 将dist中的前端代码复制到nginx的项目目录
[root@node1 ~]# cp -rvf /opt/gpmall-web/dist/* /usr/share/nginx/html/
# 配置nginx负载均衡
[root@node1 ~]# vi /etc/nginx/conf.d/default.conf
upstream myuser {
server 192.168.137.102:8082;
server 192.168.137.103:8082;
ip_hash;
}
upstream myshopping {
server 192.168.137.102:8081;
server 192.168.137.103:8081;
ip_hash;
}
upstream mycashier {
server 192.168.137.102:8083;
server 192.168.137.103:8083;
ip_hash;
}
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;
}
# 验证配置文件
[root@node1 ~]# nginx -t
# 重新加载配置
[root@node1 ~]# nginx -s reload

系统功能测试

首页访问页面

image-20230203111724824

登录成功演示图:

image-20230203111930871

提交订单页面演示图:

image-20230203112025400