负载均衡+Tomcat集群+MySQL主从 实验

IP

功能

软件

192.168.25.216

网络入口,负载均衡

Nginx服务

192.168.25.26

应用服务器

Tomcat服务

192.168.25.27

应用服务器

Tomcat服务

192.168.25.28

应用服务器

Tomcat服务

192.168.25.31

数据库服务+中间件mycat

MySQL主服务+中间件

192.168.25.32

数据库服务

MySQL从服务

实验步骤

#1.先搭建MySQL主从+中间价
·使用MySQL自动安装脚本在192.168.25.31和192.168.25.32安装MySQL
浏览器git官网里的脚本
·在局域网内直接下载安装脚本
wget 192.168.56.200/Software/mysql_install.sh
·执行脚本
bash mysql_install.sh
·添加环境变量
vim /etc/profile

export PATH=$PATH:/usr/local/mysql/bin
·重新加载环境
source /etc/profile
bash
·创建远程登陆账号
create user 'root'@'%' identified with mysql_native_password by 'root123';
grant all on *.* to 'root'@'%';
flush privileges;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#2.搭建31和32主从
·修改主服务器(192.168.25.31)的配置文件 /etc/my.cnf 
vim /etc/my.cnf

[mysqld]
... # 省略
·主从复制-主机配置
·主服务器唯一ID
server-id=1
·启用二进制日志
log-bin=mysql-bin
·设置不要复制的数据库(可设置多个)
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
#设置需要复制的数据库(可设置多个)
#binlog-do-db=test
#设置logbin格式
binlog_format=ROW
------------------------
·修改从服务器(192.168.25.32)的配置文件 /etc/my.cnf
vi /etc/my.cnf

[mysqld]
...
·在之前配置下方编写
·主从复制-从机配置
·从服务器唯一ID
server-id=2
·启用中继日志
relay-log=mysql-relay
-------------------------
·分别重启两台服务器上的MySQL
/etc/init.d/mysqld restart

·主数据库创建用户slave 并授权
·在主数据库端(192.168.25.31)
·登录mysql -uroot -p
·创建用户
create user 'slave'@'%' identified with mysql_native_password by 'root123';
·授权
grant replication slave on *.* to 'slave'@'%';
·刷新权限
flush privileges;

·从数据库端验证主数据库slave用户是否可用
·在从数据库端(192.168.25.32)
·验证主数据库slave用户是否可用
mysql -uslave -proot123 -h192.168.25.31 -P3306
·验证成功后退出

·配置主从节点信息
·在主数据库端(192.168.25.31)
·查询服务ID及Master状态
·登录
mysql -uroot -p

·查询server_id是否可配置文件中一致
show variables like 'server_id';
·若不一致,可设置临时ID(重启失效)
set global server_id = 100;

·查询Master状态,并记录 File(对应下一步中的master_log_file)
·Position (对应下一步中的master_log_pos)的值
show master status\G;
·输出
             File: mysql-bin.000001
         Position: 828
     Binlog_Do_DB: 
 Binlog_Ignore_DB: sys,mysql,information_schema,performance_schema
Executed_Gtid_Set: 
·注意:执行完此步骤后退出主数据库
·防止再次操作导致 File 和 Position 的值发生变化

·在从数据库端设置同步
·在从数据库端(192.168.25.32)

·登录
mysql -uroot -p
·查询server_id是否可配置文件中一致
show variables like 'server_id';
·若不一致,可设置临时ID(重启失效)
set global server_id = 101;

·设置主数据库参数(用上一步创建的slave用户及密码)
change master to 
master_host='192.168.25.31',
master_port=3306,
master_user='slave',
master_password='root123',
master_log_file='mysql-bin.000001',
master_log_pos=828;

·开始同步
start slave;

·查询Slave状态
show slave status\G;


·查看是否配置成功
·查看参数 Slave_IO_Running 和 Slave_SQL_Running 是否都为yes,则证明配置成功。若为no,则需要查看对应的 Last_IO_Error 或 Last_SQL_Error 的异常值

·若出现错误,则停止同步,重置后再次启动
·停止
stop slave;
·重置
reset slave;
·启动
start slave;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#3.在192.168.25.31上安装mycat中间件
#1.准备一台下载好MySQL的服务器
#安装JDK1.8
# CentOS7
yum -y install java-1.8.0-openjdk.x86_64
# 测试安装,显示java版本则为安装成功
java -version
#输出
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)

#2.安装MyCAT2
#创建/usr/local/src
mkdir -p  /usr/local/src
#进入/usr/local/src目录
cd /usr/local/src
#在src目录里下载mycat和依赖环境
# 如果没有wget
# CentOS7安装wget
yum -y install wget
# 第三方下载
wget --no-check-certificate https://download.topunix.com/MySQL/Software-Cluster/Software-Mycat/Mycat2/mycat2-install-template-1.20.zip
wget --no-check-certificate https://download.topunix.com/MySQL/Software-Cluster/Software-Mycat/Mycat2/mycat2-1.21-release-jar-with-dependencies.jar
# 局域网下载(192.168.57.200)
wget http://192.168.57.200/Software/mycat2-install-template-1.21.zip
wget http://192.168.57.200/Software/mycat2-1.21-release-jar-with-dependencies.jar

#3.下载完成后检查下载文件是否正确
[root@26_mycat src]# ls
mycat2-1.21-release-jar-with-dependencies.jar  mycat2-install-template-1.21.zip
#4.解压并移动到/usr/local目录下
# 没有解压缩工具先下载解压缩工具
yum -y install unzip
# 解压Mycat2
unzip mycat2-install-template-1.21.zip
#把解压完的mycat移动到/usr/local/mycat
mv mycat ../

#5.把bin目录的文件加执行权限
cd /usr/local/mycat/
chmod +x  bin/*
#把所需的jar复制到mycat/lib目录
# mycat2-1.21-release-jar-with-dependencies.jar是MyCAT2依赖文件,缺失会导致MyCAT启动失败
cp /usr/local/src/mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/
#移动完查看一下是否正确
#检查mycat结构是否正确
drwxr-xr-x 2 root root 4096 3月   5 2021 bin
drwxr-xr-x 9 root root  275 3月   5 2021 conf
drwxr-xr-x 2 root root 4096 8月  19 11:15 lib
drwxr-xr-x 2 root root    6 3月   5 2021 logs
#bin 执行命令的目录
#conf 配置文件
#lib 依赖包
#logs 日志包

#6.配置系统环境变量,让我们可以在任意位置执行mycat命令
#先查到mycat里bin目录的位置
cd bin/
pwd
/usr/local/mycat/bin
#编辑环境变量
vim /etc/profile
#在末尾添加
#export PATH=$PATH:/usr/local/mycat/bin
export MYCAT_PATH=/usr/local/mycat
export MYSQL_PATH=/usr/local/mysql
export PATH="$MYSQL_PATH/bin:$MYCAT_PATH/bin:$PATH"

#加载环境变量
source /etc/profile

#7.启动一个3306的MySQL
 #启动mysql服务
service mysqld start
# 能够连接而上mysql
mysql -uroot -proot123 

#8.配置物理库地址
#打开并修改配置文件
vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json
#修改成
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ_WRITE",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "prototypeDs",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://localhost:3306?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}

#9.启动MyCAT
#设置了环境变量,可在任意位置执行mycat命令
cd /usr/local/mycat/bin

./mycat start 启动
./mycat stop 停止
./mycat console 前台运行
./mycat install 添加到系统自动启动
./mycat remove 取消随系统自动启动
./mycat restart 重启
./mycat pause 暂停
./mycat status 查看启动状态
#启动mycat
mycat start

#10.查看logs/wrapper.log文档看有无错误
cat /usr/local/mycat/logs/wrapper.log
#正确结果
STATUS | wrapper  | 2025/08/19 11:50:25 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2025/08/19 11:50:25 | Launching a JVM...
INFO   | jvm 1    | 2025/08/19 11:50:25 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2025/08/19 11:50:25 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2025/08/19 11:50:25 | 
INFO   | jvm 1    | 2025/08/19 11:50:26 | path:/usr/local/mycat/./conf
INFO   | jvm 1    | 2025/08/19 11:50:26 | 2025-08-19 11:50:26,214[INFO]io.mycat.MycatCore.newMycatServer:213start VertxMycatServer
INFO   | jvm 1    | 2025/08/19 11:50:26 | 2025-08-19 11:50:26,571[INFO]com.alibaba.druid.pool.DruidDataSource.init:990{dataSource-1} inited
INFO   | jvm 1    | 2025/08/19 11:50:26 | 2025-08-19 11:50:26,828[INFO]io.mycat.replica.heartbeat.HeartbeatFlow.sendDataSourceStatus:71prototypeDs heartStatus DatasourceStatus(status=OK_STATUS, isSlaveBehindMaster=false, dbSynStatus=DB_SYN_NORMAL, master=true)
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,760[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server 5ace8c13-1dad-4e02-acac-6615ae3140a3 started up.
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,761[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server d93fb9b5-91b0-42c6-866a-62047715eed6 started up.
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,770[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server 59488811-db7f-4dbb-a8da-bcb6da18a9e4 started up.
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,771[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server 5e34af6f-0c85-403d-9f6e-746ce1faa525 started up.
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,771[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server dbf9feeb-3767-4c6f-b351-f5b48a3a8f81 started up.
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,772[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server f89e3d87-c1eb-4f00-980e-11f11f3d6524 started up.
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,773[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server a60a85f5-dc07-49b3-9822-a56e68bf91af started up.
INFO   | jvm 1    | 2025/08/19 11:50:27 | 2025-08-19 11:50:27,790[INFO]io.mycat.vertx.VertxMycatServer.lambda$start$1:120Mycat Vertx server 2213c4b3-a110-4328-8ba2-252170fa2c1a started up.

#11.连接MyCAT
MyCAT的默认用户是:root
初始密码是:123456
端口号是:8066
#使用MySQL默认客户端或者mycli命令行登陆MyCAT
mysql -uroot -p123456 -P8066 -h127.0.0.1
# 或者
mycli -uroot -P8066 -h"127.0.0.1"
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#4.搭建mycat一主一从 
#两台服务器搭建主从连接 两台服务器都需要创建远程连接账号
#一台安装MyCAT  mysql -uroot -proot123 -P8066 -h127.0.0.1 -A db1【新建的库名】

#在mycat服务器上操作
#创建数据源
#-- 重置配置
/*+ mycat:resetConfig{} */ 【可选】

#1.添加读写的数据源  【添加主服务器】
/*+ mycat:createDataSource
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ_WRITE",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "m1",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://192.168.25.31:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}
*/;

#2.添加读的数据源 【添加从服务器】
/*+ mycat:createDataSource
{
    "dbType": "mysql",
    "idleTimeout": 60000,
    "initSqls": [],
    "initSqlsGetConnection": true,
    "instanceType": "READ",
    "maxCon": 1000,
    "maxConnectTimeout": 3000,
    "maxRetryCount": 5,
    "minCon": 1,
    "name": "m1s1",
    "password": "root123",
    "type": "JDBC",
    "url": "jdbc:mysql://192.168.25.32:3306?useUnicode=true&serverTimezone=UTC&characterEncoding=UTF-8",
    "user": "root",
    "weight": 0
}
*/;

# 查询数据源 是否添加成功
/*+ mycat:showDataSources{} */\G;

#3.创建集群
/*! mycat:createCluster{
  "clusterType":"MASTER_SLAVE",
  "heartbeat":{
    "heartbeatTimeout":1000,
    "maxRetry":3,
    "minSwitchTimeInterval":300,
    "slaveThreshold":0
  },
  "masters":[
    "m1"
  ],
  "maxCon":2000,
  "name":"c1",
  "readBalanceType":"BALANCE_ALL",
  "replicas":[
    "m1s1"
  ],
  "switchType":"SWITCH"
} */;

#查询集群是否创建正确
/*! mycat:showClusters{} */\G;

#4. 创建逻辑库 

#在mycat上创建逻辑库 ,主从数据库上都应该存在
CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
#修改逻辑库的数据源
vim /usr/local/mycat/conf/schemas/shop.schema.json
## 在里面添加集群的名称,作用是让该集群生成并管理这个库的物理库
"targetName":"c1"
#重启MyCAT:
mycat restart

#5.测试读写分离是否成功(在MyCAT里面测试)
#在MyCAT里面的shop库里创建一个products表:
CREATE TABLE products(  id INT PRIMARY KEY,  name VARCHAR(200),  price decimal);
#检查主从数据库内是否存在我们创建的表
#通过注释生成物理库和物理表:
#如果物理表不存在,在 MyCAT2 能正常启动的情况下,根据当前配置自动创建分片表,全局表和物理表:
/*+ mycat:repairPhysicalTable{} */;
#查看后端物理库:发现物理库和物理表都生成了。
#在MyCAT里面向products表添加一条数据:
INSERT INTO products(id, name, price) VALUES(1, "XIAOMING", 199.99);
#查看主从库里的先对应的表中内容有没有添加上


------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#5.安装部署三台Tomcat并绑定上同一个ProxySQL的数据库
192.168.25.26/192.168.25.27/192.168.25.28
#·在linux上安装jdk 安装到/usr/loacl/jdk
·先创建/usr/local/jdk 目录
cd /usr/local
mkdir jdk
cd jdk
·在windows终端中将提前下载好的jdk-8u451-linux-x64.tar.gz 安装包 发送到Linux 的/usr/loacl/jdk 目录中
scp E:\lwy用户\下载\JDK-Tomcat-Maven\jdk-8u451-linux-x64.tar.gz root@192.168.25.26:/usr/local/jdk
·然后在jdk目录中解压
tar -xvf jdk-8u451-linux-x64.tar.gz
·解压好后修改一下文件名
mv jdk1.8.0_451/ jdk1.8
·查看jdk1.8的完整路径
cd jdk1.8
pwd
·配置 jdk 环境变量
vim /etc/profile

在最后一行后面添加
#set java enviroment
JAVA_HOME=/usr/local/jdk/jdk1.8 
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH

·保存退出,并重置环境
source /etc/profile
·查看版本,输出是否正确
java -version

#·在linux上 Centos7 上安装tomcat 安装到/usr/loacl/tomcat
·先创建/usr/local/tomcat 目录
cd /usr/local
mkdir tomcat
cd tomcat
·在windows终端中将提前下载好的apache-tomcat-9.0.106.tar.gz 安装包 发送到Linux 的/usr/loacl/tomcat 目录中
scp E:\lwy用户\下载\JDK-Tomcat-Maven\apache-tomcat-9.0.106.tar.gz root@192.168.25.26:/usr/local/tomcat
·在tomcat目录中解压
tar -xvf apache-tomcat-9.0.106.tar.gz
·解压好后修改一下文件名
mv apache-tomcat-9.0.106 tomcat9.0.106
·进入 tomcat9.0.106 的 bin 目录,输入启动指令
cd tomcat9.0.106/bin
执行 
 ./startup.sh 
·测试是否启动成功,在浏览器中输入:192.168.25.211:8080
查看是否进入tomcat 9.0.106 页面
·在windows终端中将提前编译好的starter-tomcat-5.0.war 发送到Linux 的/usr/local/tomcat/tomcat9.0.106/webapps 目录中
scp F:\school_apps\jpress\starter-tomcat\target\starter-tomcat-5.0.war root@192.168.25.26:/root
·把webapps里的原有文件删除
cd /usr/local/tomcat/tomcat9.0.106/webapps
rm -rf *
·把我们上传的war改名成ROOT.war
cd
mv starter-tomcat-5.0.war ROOT.war
·在重复到wep目录
cd /usr/local/tomcat/tomcat9.0.106/webapps
cp /root/ROOT.war .
·重启Tomcat,测试是否启动成功,在浏览器中输入:192.168.25.26:8080

·进去注册页面后,我们三台Tomcat的注册页面选择同一个mycat的信息
库名 jpress
账号 root
密码 123456
ip 192.168.25.31 (安装mycat的IP)
端口 8066

·连接好后选择创建同一个账号

#·在linux上 UBuntu 上安装tomcat
·使用apt 下载 tomcat
apt -y install tomcat9         
·查找webapps的文件路径
find / -name webapps
/var/lib/tomcat9/webapps
·修改配置文件
vim /etc/tomcat9/server.xml

修改port端口号为9527
<Connector port="9527" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
·保存退出,重启tomcat9
systemctl restart tomcat9

·在windows终端中将提前编译好的starter-tomcat-5.0.war 发送到Linux 的 /var/lib/tomcat9/webapps目录中
 scp F:\school_apps\jpress\starter-tomcat\target\starter-tomcat-5.0.war root@192.168.25.211:/var/lib/tomcat9/webapps
·把webapps中的原有文件删除,只保留上传的.war文件
·去浏览器测试搜索 192.168.25.211:9527 是否能打开JPress页面

·进去注册页面后,我们三台Tomcat的注册页面选择同一个mycat的信息
库名 jpress
账号 root
密码 123456
ip 192.168.25.31 (安装mycat的IP)
端口 8066

·连接好后选择创建同一个账号

------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#6.安装部署nginx 连接tomcat集群 实现反向代理,负载均衡
·在192.168.25.216 上安装nginx
#乌班图安装
编译安装
## 安装依赖
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
## 下载源码
wget http://192.168.57.200/Software/nginx-1.26.2.tar.gz
#wget http://nginx.org/download/nginx-latest.tar.gz
## 解压
tar -zxvf nginx-*.tar.gz
## 进入解压后的Nginx源码目录,执行配置脚本,并指定安装目录和其他选项
./configure --prefix=/usr/local/nginx --with-http_ssl_module
## 编译并安装
make && sudo make install

vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

#重新启动加载配置
systemctl daemon-reload 
systemctl reload nginx

·安装好后修改配置文件 
cd /usr/local/nginx/conf
vim nginx.conf

#在http{ }内添加以下内容
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '$upstream_addr';
    access_log  /var/log/nginx/access.log  main;


    upstream web1 {
        server 192.168.25.26:8080;
        server 192.168.25.27:8080;
        server 192.168.25.28:8080;
    }
	server {
		   listen       80;
       		   server_name  192.168.25.216;

       		 location / {
          		proxy_pass http://web1;
        		}
    		

        location = /50x.html {
            root   html;
        }
}

·保存退出

·创建nginxlog的日志文件,方便我们查看nginx代理的哪一台tomcat
mkdir -p /var/log/nginx

·检查配置文件
/usr/local/nginx/sbin/nginx -t

·重启nginx
systemctl restart nginx

#实时查看日志,在浏览器搜索代理服务器的ip 192.168.25.216 查看是否代理成功,并且是哪个后台端口
tail -f /var/log/nginx/access.log