CentOS搭建Mycat中间件

两台虚拟机角色规划(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

关键调整说明

  1. 负载均衡 :直接部署在node01的Nginx中,反向代理到192.168.1.11:8080(自身Web1)和192.168.1.12:8080(node02的Web2),实现负载均衡核心逻辑;
  2. 读写分离:Mycat部署在node01(主库侧),配置写节点为node01,读节点为node02,保留数据库读写分离核心;
  3. Web服务:两台虚拟机各部署一套Nginx+SpringBoot后端,模拟Web集群,满足负载均衡的节点要求;
  4. Zabbix监控:服务端部署在node02(从库侧,复用MariaDB数据库),两台虚拟机均安装zabbix-agent,实现对整个分布式环境的监控。

两台虚拟机部署核心步骤(精简版,保留核心命令)

一、基础环境配置(两台虚拟机全部执行
  1. 网络配置(静态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
  1. 关闭防火墙+SELinux
bash 复制代码
systemctl stop firewalld && systemctl disable firewalld
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  1. 配置阿里云源+安装基础工具+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  # 验证
  1. 修改主机名
bash 复制代码
# node01执行
hostnamectl set-hostname node01
# node02执行
hostnamectl set-hostname node02
bash  # 生效
  1. 两台虚拟机互做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前端添加被监控主机
  1. 浏览器登录http://192.168.1.12/zabbix(Admin/zabbix);
  2. 配置→主机→创建主机,分别添加node01(192.168.1.11)node02(192.168.1.12)
  3. 关联模板Template OS Linux,等待ZBX图标变绿,即监控成功。

实验环境验证要点

  1. 负载均衡 :浏览器多次访问ncp.52lab.com,会轮询到node01和node02的Web服务;
  2. 主从同步:node01主库创建数据库/表,node02从库能实时同步;
  3. 读写分离:通过Mycat的8066端口连接,读操作走node02,写操作走node01;
  4. 监控:Zabbix前端能看到两台虚拟机的CPU、内存、Nginx、MariaDB等监控数据。
相关推荐
花间相见2 小时前
【Ubuntu实用工具】—— Fcitx5 输入法安装与完整配置指南(新手友好+避坑版)
linux·数据库·ubuntu
blockrock2 小时前
Linux Virtual Server (LVS)
linux·运维·lvs
kyle~2 小时前
MySQL基础知识点与常用SQL语句整理
android·sql·mysql
蜡笔小炘2 小时前
Haproxy -- 高级功能配置及实用案例
linux·运维·服务器·haproxy
礼拜天没时间.2 小时前
Linux运维实战:巧用mv命令管理多版本Go环境,避免采坑
linux·运维·golang·centos
青衫码上行2 小时前
高频SQL 50题 | 聚合
数据库·sql·mysql·leetcode·面试
鸠摩智首席音效师2 小时前
如何在 Ubuntu 上安装 phpMyAdmin ?
linux·运维·ubuntu
Doro再努力2 小时前
【Linux操作系统16】Linux进程管理深度解析:从fork到内核链表设计
linux·运维·链表
杨云龙UP2 小时前
Oracle ASM归档日志自动清理:RMAN+crontab一键闭环(生产可用)
linux·运维·服务器·数据库·oracle·centos·ux