课程任务
- 系统概况
gpmall商城是一个开源的基于Java开发的网上商城应用。现在用户已经提供了gpmall应用的打包代码及系统架构等信息,我们需要按照要求部署gmall应用。gpmal 商城平台主要涉及MySQL、 Kafka、ZooKeeper、Nginx 和 gpmall 源代码的使用。
- 系统架构
gpmall商城的系统架构如下图所示。其中:
- 节点规划
为了节省资源、简化操作,把原有10个节点的功能分布到3个节点上。
注意:主机名是gpmall应用提供的。
集群 | 物理节点 | 节点功能 | 主机名 | IP |
---|
MySQL集群 | node1 | MyCAT | mysql.mall | 192.168.137.101 |
MySQL集群 | node2 | MariaDB/主/写 | node2 | 192.168.137.102 |
MySQL集群 | node3 | MariaDB/从/读 | node3 | 192.168.137.103 |
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 |
Redis | node1 | | redis.mall | 192.168.137.101 |
Web服务集群 | node1 | 负载均衡 | nginx | 192.168.137.101 |
Web服务集群 | node2 | Web服务 | jar1 | 192.168.137.102 |
Web服务集群 | node3 | Web服务 | jar2 | 192.168.137.103 |
节点基础配置
制作模板机
模板机信息如下:
操作系统:centos7.9
用户名:root
密码:000000
模板机操作:
修改模板机的主机名,IP地址,配置yum源,关闭防火墙,关闭selinux,安装jdk
1 2
| [root@yyt ~] [root@yyt ~]
|
1 2 3 4 5 6 7 8 9 10 11 12
| [root@node0 ~] 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 ~] [root@node0 ~]
|
1 2 3
| [root@node0 ~] [root@node0 ~] SELINUX=disabled
|
1 2 3 4 5 6 7 8
| [root@node0 ~] 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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| [root@node0 ~]
[root@node0 ~] [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 ~] 已加载插件: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 ~]
[mysqld] skip-name-resolve log_bin=mysql-bin server_id=102
datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock
ks symbolic-links=0 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid
[root@node2 ~] [root@node2 ~]
|
配置数据库信息
1 2 3 4 5 6 7 8 9 10 11 12 13
| [root@node2 ~]
[root@node2 ~]
[root@node2 ~] [root@node2 ~] 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 ~] [root@node3 ~] [root@node3 ~] *************************** 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
| [root@node1 ~] ux.tar.gz -C /usr/local/
[root@node1 ~]
[root@node1 ~]
[root@node1 ~] <?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 ~]
<user name="root"> <property name="password">123456</property> <property name="schemas">gpmall</property>
[root@node1 ~] Starting Mycat-server... [root@node1 ~] 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))
[root@node1 ~]
[root@node1 ~] +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+ | 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
| [root@node1 ~]
[root@node1 ~]
[root@node1 ~]
[root@node1 ~] [root@node1 ~]
[root@node1 conf]
[root@node1 conf]
[root@node1 conf]
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
[root@node1 conf] [root@node1 conf] 1
[root@node1 conf]
[root@node1 bin] ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
[root@node1 bin] 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
| [root@node1 ~]
[root@node1 ~]
[root@node1 ~]
[root@node1 ~]
broker.id=1
zookeeper.connect=192.168.137.101:2181,192.168.137.102:2181,192.168.137.103:2181
listeners = PLAINTEXT://192.168.137.101:9092
log.dirs=/usr/local/kafka_2.11-1.1.1/config/logs
[root@node1 ~]
[root@node1 bin]
[root@node1 bin] 119090 Jps 118938 Kafka 65663 WrapperSimpleApp 104111 QuorumPeerMain
|
配置redis服务
在node1节点安装Redis服务。
1 2 3 4 5 6 7 8 9 10 11 12
| [root@node1 ~]
[root@node1 ~]
[root@node1 ~] [root@node1 ~]
[root@node1 ~] 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
| [root@node2 ~] [root@node2 ~] [root@node2 ~] [root@node2 ~]
[root@node2 ~] 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
| [root@node1 ~] [root@node1 ~] [root@node1 ~]
[root@node1 ~]
[root@node1 ~]
[root@node1 ~] 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 ~]
[root@node1 ~]
|
系统功能测试
首页访问页面
登录成功演示图:
提交订单页面演示图: