两台虚拟机角色规划(CentOS7)
| 虚拟机编号 | 主机名 | 规划IP | 合并角色 | 核心运行服务 |
|---|---|---|---|---|
| 虚拟机1 | node01 | 192.168.1.11 | 负载均衡+MariaDB主库+Web服务器1 | Nginx(负载均衡+Web1)、MariaDB(主)、Mycat(读写分离)、JDK |
| 虚拟机2 | node02 | 192.168.1.12 | Zabbix监控+MariaDB从库+Web服务器2 | Nginx(Web2)、MariaDB(从)、Zabbix-server/agent、JDK、zabbix-agent |
关键调整说明
- 负载均衡 :直接部署在node01的Nginx中,反向代理到
192.168.1.11:8080(自身Web1)和192.168.1.12:8080(node02的Web2),实现负载均衡核心逻辑; - 读写分离:Mycat部署在node01(主库侧),配置写节点为node01,读节点为node02,保留数据库读写分离核心;
- Web服务:两台虚拟机各部署一套Nginx+SpringBoot后端,模拟Web集群,满足负载均衡的节点要求;
- Zabbix监控:服务端部署在node02(从库侧,复用MariaDB数据库),两台虚拟机均安装zabbix-agent,实现对整个分布式环境的监控。
两台虚拟机部署核心步骤(精简版,保留核心命令)
一、基础环境配置(两台虚拟机全部执行)
- 网络配置(静态IP,对应各自规划IP)
bash
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 修改内容
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.11 # node02改为1192.168.1.12
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254
# 重启网络
systemctl restart network
- 关闭防火墙+SELinux
bash
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
- 配置阿里云源+安装基础工具+JDK
bash
# 替换源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 安装工具
yum install -y vim net-tools wget unzip bash-completion
# 安装JDK
yum install -y java java-1.8.0-openjdk-devel
java -version # 验证
- 修改主机名
bash
# node01执行
hostnamectl set-hostname node01
# node02执行
hostnamectl set-hostname node02
bash # 生效
- 两台虚拟机互做hosts解析
bash
vim /etc/hosts
# 添加以下两行
192.168.2.11 node01
192.168.2.12 node02
二、数据库层部署(MariaDB主从+Mycat读写分离)
1. MariaDB安装+基础配置(两台均执行,server_id必须不同)
bash
# 安装
yum install -y mariadb mariadb-server
# 配置my.cnf
vi /etc/my.cnf
# [mysqld]段添加以下内容,node01 server_id=2,node02 server_id=3
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
server_id=2 # node02改为3
log-bin=/var/lib/mysql/mysql-bin # 开启binlog(主从必备)
# 启动并开机自启
systemctl start mariadb && systemctl enable mariadb
# 验证
mysql -e "select @@server_id; select @@log_bin;"
-- 在主库执行
-- 进入主库MariaDB命令行
bash
mysql -u root -p
-- 2. 适配5.x版本的删除命令(不用IF EXISTS,直接删)
bash
DROP USER 'repl'@'%';
-- 3. 创建repl账号并授权所有IP访问(%)
bash
CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 4. 刷新权限(必须执行,使配置生效)
bash
FLUSH PRIVILEGES;
bash
SET PASSWORD FOR 'repl'@'%' = PASSWORD('123456');
-- 1. 进入从库MariaDB,停止同步
bash
mysql -u root -p
STOP SLAVE;
-- 2. 重置从库同步状态(清空之前的同步记录)
bash
RESET SLAVE ALL; -- MariaDB 10.2+用RESET SLAVE ALL,旧版本用RESET SLAVE
-- 3. 重新配置主从同步(替换成你的主库信息)
bash
CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='repl', -- 之前创建的同步账号
MASTER_PASSWORD='123456', -- 同步账号密码
MASTER_LOG_FILE='mysql-bin.000001', -- 主库SHOW MASTER STATUS查到的File
MASTER_LOG_POS=758; -- 主库SHOW MASTER STATUS查到的Position
-- 4. 启动同步
bash
START SLAVE;
-- 5. 检查同步状态(关键:确保两个Yes)
bash
SHOW SLAVE STATUS\G
2. MariaDB权限配置(两台均执行)
bash
# 设置root密码123456
mysqladmin -u root password '123456'
# 授权远程登录
mysql -uroot -p123456 -e "grant all privileges on *.* to root@'%' identified by '123456' with grant option; flush privileges;"
3. 搭建主从复制(node01=主库,node02=从库)
(1)主库node01操作
bash
# 登录数据库,创建主从复制用户repl
mysql -uroot -p123456 -e "grant replication slave on *.* to repl@'%' identified by '123456'; flush privileges;"
# 查看主库状态(记录File和Position,后续从库用)
mysql -uroot -p123456 -e "show master status;"
# 示例结果:File=mysql-bin.000001,Position=389
(2)从库node02操作
bash
# 登录数据库,配置主从复制(替换File和Position为node01的查询结果)
mysql -uroot -p123456 << EOF
CHANGE MASTER TO
MASTER_HOST='192.168.2.11',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=690,
MASTER_CONNECT_RETRY=10;
start slave;
show slave status\G
EOF
# 验证:Slave_IO_Running=Yes、Slave_SQL_Running=Yes 即为成功
CHANGE MASTER TO
MASTER_HOST='主库IP地址',
MASTER_USER='repl', -- 之前创建的同步账号
MASTER_PASSWORD='repl123', -- 同步账号密码
MASTER_LOG_FILE='mysql-bin.000001', -- 主库SHOW MASTER STATUS查到的File
MASTER_LOG_POS=758; -- 主库SHOW MASTER STATUS查到的Position
4. Mycat读写分离配置(仅node01执行)
下载失败Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz请联系作者,发送离线压缩包
bash
# 创建目录并下载Mycat
mkdir /mycat && cd /mycat
wget http://dl.mycat.org.cn/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
tar xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
# 配置环境变量
echo "export PATH=/mycat/mycat/bin:\$PATH" >> /etc/profile && source /etc/profile
# 配置schema.xml(读写分离核心)
cd /mycat/mycat/conf/ && mv schema.xml schema.xml.bak
vi schema.xml
# 写入以下内容(写=node01,读=node02)
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mysqldemo" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="mysqldemo" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="db1" url="10.0.0.10:3306" user="root" password="123456">
<readHost host="db2" url="10.0.0.11:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
bash
# 修改server.xml,替换TESTDB为mysqldemo
sed -i 's/TESTDB/mysqldemo/g' /mycat/mycat/conf/server.xml
# 启动Mycat
mycat start
# 验证8066端口(Mycat工作端口)
netstat -lntup | grep 8066
5. 导入商城数据库(仅node01主库执行)
bash
# 上传商城数据库脚本mysql.sql到node01根目录,执行导入
mysql -uroot -p123456 < mysql.sql
# 验证
mysql -uroot -p123456 -e "use mysqldemo;show tables;"
三、Web服务+负载均衡部署(Nginx)
1. Nginx安装(两台均执行)
bash
# 配置Nginx官方源
vi /etc/yum.repos.d/nginx.repo
# 写入内容
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
# 安装
yum install -y nginx && systemctl start nginx && systemctl enable nginx
curl 127.0.0.1 # 验证
2. 部署商城前端+后端(两台均执行,操作完全一致)
bash
# 上传前端dist.zip、后端jar包到根目录
# 部署前端
mkdir -p /ncp && cp dist.zip /ncp/ && cd /ncp && unzip dist.zip
# 部署后端(后台启动,连接Mycat的8066端口)
java -jar demo-0.0.1-SNAPSHOT-new.jar \
--spring.datasource.username=root \
--spring.datasource.password=123456 \
--server.port=8080 \
--spring.datasource.url="jdbc:mysql://192.168.1.11:8066/mysqldemo?characterEncoding=utf8&serverTimezone=UTC&useSSL=false" \
&>/dev/null &
# 配置Nginx反向代理(前端+后端接口)
vi /etc/nginx/conf.d/default.conf
# 替换内容
server {
listen 80;
server_name ncp.52lab.com;
# 前端
location / {
root /ncp;
index index.html index.htm;
}
# 后端接口代理
location /users {
proxy_pass http://127.0.0.1:8080;
}
location /items {
proxy_pass http://127.0.0.1:8080;
}
}
# 重启Nginx
nginx -t && systemctl reload nginx
3. 配置负载均衡(仅node01执行,复用自身Nginx)
bash
# 删除默认配置,创建负载均衡配置
cd /etc/nginx/conf.d/ && rm -rf default.conf
vi lb.conf
# 写入内容(反向代理到两台Web服务器)
upstream web-cluster {
server 192.168.1.11:80; # 自身Web1
server 192.168.1.12:80; # node02的Web2
}
server {
listen 80;
server_name ncp.52lab.com;
location / {
proxy_pass http://web-cluster;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 重启Nginx
nginx -t && systemctl reload nginx
# 本地测试:修改本机hosts,添加1192.168.1.11 ncp.52lab.com,浏览器访问即可(轮询到两台Web)
四、Zabbix监控部署(仅node02部署服务端,两台均装agent)
1. node02安装Zabbix服务端(复用MariaDB从库)
bash
# 配置Zabbix源
rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-2.el7.noarch.rpm
# 安装Zabbix组件
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-agent zabbix-get
# 创建Zabbix数据库和用户
mysql -uroot -p123456 << EOF
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
flush privileges;
EOF
# 初始化Zabbix数据库
zcat /usr/share/doc/zabbix-server-mysql-4.0.32/create.sql.gz | mysql -uzabbix -pzabbix zabbix
# 配置Zabbix数据库密码
sed -i 's/# DBPassword=/DBPassword=zabbix/' /etc/zabbix/zabbix_server.conf
# 配置时区(关键)
sed -i 's/# php_value date.timezone Europe\/Riga/php_value date.timezone Asia\/Shanghai/' /etc/httpd/conf.d/zabbix.conf
# 启动服务
systemctl start httpd zabbix-server && systemctl enable httpd zabbix-server
# 浏览器访问初始化:http://192.168.1.12/zabbix ,默认账号Admin,密码zabbix
2. 两台虚拟机安装zabbix-agent并配置(均执行)
bash
# 若已装则跳过,未装则执行
rpm -ivh https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.32-1.el7.x86_64.rpm
# 配置agent,指向node02的Zabbix服务端
vi /etc/zabbix/zabbix_agentd.conf
# 修改以下3行
Server=192.168.1.12
ServerActive=192.168.1.12
Hostname=node01 # node02改为node02
# 启动agent
systemctl start zabbix-agent && systemctl enable zabbix-agent
# 验证端口
netstat -lntup | grep 10050
3. Zabbix前端添加被监控主机
- 浏览器登录
http://192.168.1.12/zabbix(Admin/zabbix); - 配置→主机→创建主机,分别添加
node01(192.168.1.11)和node02(192.168.1.12); - 关联模板
Template OS Linux,等待ZBX图标变绿,即监控成功。
实验环境验证要点
- 负载均衡 :浏览器多次访问
ncp.52lab.com,会轮询到node01和node02的Web服务; - 主从同步:node01主库创建数据库/表,node02从库能实时同步;
- 读写分离:通过Mycat的8066端口连接,读操作走node02,写操作走node01;
- 监控:Zabbix前端能看到两台虚拟机的CPU、内存、Nginx、MariaDB等监控数据。