负载均衡+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/profileexport 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.000001Position: 828Binlog_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 installvim /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