当前位置: 首页 > news >正文

中型规模生产架构部署详细步骤

一、环境规划与准备

1. 服务器规划(5 台物理 / 云服务器)

服务器角色IP 地址硬件配置主要部署组件
负载层192.168.15.1434 核 8G 100GNginx、Keepalived
应用层 1192.168.15.1454 核 8G 100GSpring Cloud 微服务、Filebeat
应用层 2192.168.15.1344 核 8G 100GSpring Cloud Cloud 微服务、Filebeat
数据层192.168.15.1698 核 16G 500GMySQL(主从)、Redis 集群
日志层192.168.15.1494 核 8G 500GElasticsearch、Logstash、Kibana

2. 基础环境初始化(所有服务器执行)

(1)系统配置

bash

# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config# 配置时间同步
yum install -y ntpdate
ntpdate ntp.aliyun.com
echo "*/30 * * * * ntpdate ntp.aliyun.com" >> /etc/crontab# 安装基础工具
yum install -y wget vim net-tools gcc gcc-c++ make
(2)配置 hosts 解析

bash

cat >> /etc/hosts << EOF
192.168.1.10  nginx-server
192.168.1.11  app-server1
192.168.1.12  app-server2
192.168.1.13  data-server
192.168.1.14  log-server
EOF
(3)安装 Docker 与 Docker Compose

bash

# 安装Docker
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker# 安装Docker Compose
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

二、数据层部署(192.168.15.143)

1. MySQL 主从部署

(1)创建 MySQL 配置文件

bash

mkdir -p /data/mysql/master /data/mysql/slave

主库配置(/data/mysql/master/my.cnf)

ini

[mysqld]
server-id=1
log-bin=mysql-bin
binlog_format=ROW
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

从库配置(/data/mysql/slave/my.cnf)

ini

[mysqld]
server-id=2
log-bin=mysql-bin
binlog_format=ROW
relay-log=relay-log
log-slave-updates=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
(2)启动 MySQL 容器

bash

# 启动主库
docker run -d --name mysql-master -p 3306:3306 \
-v /data/mysql/master/my.cnf:/etc/my.cnf \
-v /data/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Root@123456 \
--restart=always mysql:5.7# 启动从库
docker run -d --name mysql-slave -p 3307:3306 \
-v /data/mysql/slave/my.cnf:/etc/my.cnf \
-v /data/mysql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=Root@123456 \
--restart=always mysql:5.7
(3)配置主从复制

bash

# 进入主库容器
docker exec -it mysql-master mysql -uroot -pRoot@123456# 主库创建同步用户
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'Repl@123456';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;  # 记录File和Position值# 进入从库容器
docker exec -it mysql-slave mysql -uroot -pRoot@123456# 配置从库同步
CHANGE MASTER TO
MASTER_HOST='192.168.1.13',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000001',  # 替换为主库的File值
MASTER_LOG_POS=154;  # 替换为主库的Position值START SLAVE;
SHOW SLAVE STATUS\G;  # 确认Slave_IO_Running和Slave_SQL_Running为Yes

2. Redis 集群部署

bash

# 创建Redis配置目录
mkdir -p /data/redis/{7001,7002,7003}# 创建配置文件(以7001为例,7002、7003类似,仅端口不同)
cat > /data/redis/7001/redis.conf << EOF
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize no
bind 0.0.0.0
requirepass Redis@123
masterauth Redis@123
EOF# 启动3个Redis容器
docker run -d --name redis-7001 -p 7001:7001 \
-v /data/redis/7001/redis.conf:/etc/redis/redis.conf \
-v /data/redis/7001/data:/data \
--restart=always redis:5.0 redis-server /etc/redis/redis.confdocker run -d --name redis-7002 -p 7002:7002 \
-v /data/redis/7002/redis.conf:/etc/redis/redis.conf \
-v /data/redis/7002/data:/data \
--restart=always redis:5.0 redis-server /etc/redis/redis.confdocker run -d --name redis-7003 -p 7003:7003 \
-v /data/redis/7003/redis.conf:/etc/redis/redis.conf \
-v /data/redis/7003/data:/data \
--restart=always redis:5.0 redis-server /etc/redis/redis.conf# 创建Redis集群
docker exec -it redis-7001 redis-cli -p 7001 -a Redis@123 cluster create \
192.168.1.13:7001 192.168.1.13:7002 192.168.1.13:7003 \
--cluster-replicas 0

三、日志层部署(192.168.15.145)

1. 部署 Elasticsearch

bash

# 创建ES配置和数据目录
mkdir -p /data/elasticsearch/{config,data,logs}
chmod 777 /data/elasticsearch/{data,logs}# 创建配置文件
cat > /data/elasticsearch/config/elasticsearch.yml << EOF
cluster.name: es-cluster
node.name: es-node1
path.data: /usr/share/elasticsearch/data
path.logs: /usr/share/elasticsearch/logs
network.host: 0.0.0.0
discovery.type: single-node
bootstrap.memory_lock: true
"ES_JAVA_OPTS": "-Xms512m -Xmx512m"
EOF# 启动ES容器
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/logs:/usr/share/elasticsearch/logs \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
--restart=always elasticsearch:7.14.0

2. 部署 Logstash

bash

# 创建Logstash配置目录
mkdir -p /data/logstash/config# 创建配置文件
cat > /data/logstash/config/logstash.conf << EOF
input {beats {port => 5044}
}filter {if [log_type] == "spring" {grok {match => { "message" => "%{TIMESTAMP_ISO8601:log_time} %{LOGLEVEL:log_level} %{DATA:class} - %{DATA:content}" }}}
}output {elasticsearch {hosts => ["192.168.1.14:9200"]index => "app-log-%{+YYYY.MM.dd}"}stdout { codec => rubydebug }
}
EOF# 启动Logstash容器
docker run -d --name logstash -p 5044:5044 \
-v /data/logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \
--link elasticsearch:elasticsearch \
--restart=always logstash:7.14.0

3. 部署 Kibana

bash

# 创建Kibana配置目录
mkdir -p /data/kibana/config# 创建配置文件
cat > /data/kibana/config/kibana.yml << EOF
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://192.168.1.14:9200"]
kibana.index: ".kibana"
EOF# 启动Kibana容器
docker run -d --name kibana -p 5601:5601 \
-v /data/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml \
--link elasticsearch:elasticsearch \
--restart=always kibana:7.14.0

四、应用层部署(192.168.15.134 和 192.168.15.169)

1. 部署 Filebeat(日志收集)

bash

# 创建Filebeat配置目录
mkdir -p /data/filebeat/config# 创建配置文件
cat > /data/filebeat/config/filebeat.yml << EOF
filebeat.inputs:
- type: logenabled: truepaths:- /data/logs/*.logtags: ["spring-log"]fields:log_type: springoutput.logstash:hosts: ["192.168.15.134:5044"]processors:- add_host_metadata: ~- add_cloud_metadata: ~
EOF# 启动Filebeat容器
docker run -d --name filebeat \
-v /data/filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /data/logs:/data/logs \
--restart=always elastic/filebeat:7.14.0

2. 部署 Spring Cloud 微服务

bash

# 创建应用目录和日志目录
mkdir -p /data/apps /data/logs# 上传Spring Cloud应用包到/apps目录(示例以gateway服务为例)
# 假设已上传gateway.jar到/data/apps目录# 创建启动脚本
cat > /data/apps/start.sh << EOF
#!/bin/bash
nohup java -jar /data/apps/gateway.jar --spring.profiles.active=prod \
--spring.datasource.url=jdbc:mysql://192.168.1.13:3306/cloud_db \
--spring.redis.cluster.nodes=192.168.1.13:7001,192.168.1.13:7002,192.168.1.13:7003 \
> /data/logs/gateway.log 2>&1 &
EOF# 启动应用
chmod +x /data/apps/start.sh
/data/apps/start.sh# 设置开机自启
echo "/data/apps/start.sh" >> /etc/rc.local
chmod +x /etc/rc.local

注:在 192.168.1.12 服务器上执行相同步骤部署其他微服务(如 user-service、order-service 等)

五、负载层部署(192.168.1.5.149)

1. 部署 Nginx

bash

# 创建Nginx配置目录
mkdir -p /data/nginx/{conf,conf.d,logs,html}# 创建主配置文件
cat > /data/nginx/conf/nginx.conf << EOF
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" ''\$status \$body_bytes_sent "\$http_referer" ''"\$http_user_agent" "\$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;include /etc/nginx/conf.d/*.conf;
}
EOF# 创建应用代理配置
cat > /data/nginx/conf.d/cloud.conf << EOF
server {listen 80;server_name localhost;location / {proxy_pass http://app_servers;proxy_set_header Host \$host;proxy_set_header X-Real-IP \$remote_addr;proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;}
}upstream app_servers {server 192.168.1.11:8080;server 192.168.1.12:8080;
}
EOF# 启动Nginx容器
docker run -d --name nginx -p 80:80 \
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf.d:/etc/nginx/conf.d \
-v /data/nginx/logs:/var/log/nginx \
-v /data/nginx/html:/usr/share/nginx/html \
--restart=always nginx:1.21

2. 部署 Keepalived(高可用)

bash

# 安装Keepalived
yum install -y keepalived# 创建配置文件
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived
global_defs {router_id NGINX_MASTER
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2weight -20
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.100/24}track_script {check_nginx}
}
EOF# 创建Nginx检查脚本
cat > /etc/keepalived/check_nginx.sh << EOF
#!/bin/bash
if [ \$(ps -ef | grep nginx | grep -v grep | wc -l) -eq 0 ]; thensystemctl restart docker  # 尝试重启Docker中的Nginxsleep 3if [ \$(ps -ef | grep nginx | grep -v grep | wc -l) -eq 0 ]; thensystemctl stop keepalived  # 仍失败则停止Keepalived,触发切换fi
fi
EOFchmod +x /etc/keepalived/check_nginx.sh# 启动Keepalived
systemctl start keepalived
systemctl enable keepalived

六、系统验证与测试

  1. 访问验证:通过 VIP(192.168.15.100)访问系统,确认能正常访问应用

  2. 负载均衡测试

    bash

    # 多次访问测试负载均衡效果
    for i in {1..10}; do curl http://192.168.1.100; done
    
  3. 高可用测试

    bash

    # 在Nginx服务器上停止Nginx容器
    docker stop nginx
    # 检查VIP是否漂移(需在备用Nginx节点上配置Keepalived)
    ip addr show eth0
    
  4. 日志收集测试

    bash

    # 生成测试日志
    echo "2023-10-07 10:00:00 INFO com.example.demo.IndexController - Test log message" >> /data/logs/gateway.log
    # 在Kibana(http://192.168.1.14:5601)中查看是否收集到日志
    
  5. 数据库主从测试

    bash

    # 在主库插入数据
    docker exec -it mysql-master mysql -uroot -pRoot@123456 -e "insert into testdb.t1 values(1,'test')"
    # 在从库查询验证
    docker exec -it mysql-slave mysql -uroot -pRoot@123456 -e "select * from testdb.t1"
    

七、监控与运维建议

  1. 部署监控工具:建议在 log-server 上部署 Prometheus+Grafana 监控系统各组件状态

  2. 备份策略

    • MySQL:每日全量备份 + binlog 增量备份
    • 重要配置文件:定期备份到对象存储
  3. 安全加固

    • 所有服务器配置防火墙,只开放必要端口
    • 数据库和 Redis 设置复杂密码,并限制访问 IP
    • 定期更新系统和组件补丁
  4. 日志管理

    • 配置 Elasticsearch 索引生命周期管理,自动清理过期日志
    • 设置关键日志告警(如 ERROR 级别日志)
http://www.dtcms.com/a/453509.html

相关文章:

  • 如何加强英文网站建设重庆网站建设的公司哪家好
  • 逆向分析文档:基于 app.endata.com.cn 票房数据接口的加密与解密流程
  • 为什么做腾讯网站如何压缩网站
  • 吴恩达机器学习课程(PyTorch适配)学习笔记:1.1 基础模型与数学原理
  • 【全志V821_FoxPi】6-1 MIPI协议与MIPI摄像头
  • 【防火墙源码】WordPress防火墙插件1.0测试版
  • 全国美容网站建设房源信息网
  • CentOS 7 环境下 MySQL 5.7 深度指南:从安装、配置到基础 SQL 操作
  • ⚡ arm 32位嵌入式 Linux 系统移植 NTP 服务
  • 抖音,小红书等自媒体平台多开账号如何操作不违规
  • [Java]PTA: jmu-Java-03面向对象基础-Object
  • 【大模型实战篇】基于xiaohongshu-mcp实现对话模式的小红书笔记操作
  • LangChain详解(一)
  • 门户网站建设需求wordpress云主机
  • 【OpenArm|Control】openarm机械臂ROS2仿真控制
  • 网站开发小组百度网页制作网站建设
  • 中小型项目组织架构和职能说明
  • wordpress发表文章更新失败网站标题优化工具
  • C++网络编程(五)socket编程---从socket()到connect()
  • 23-25年总结:23年因为大模型而转型科技,24年起发力具身,25年长沙具身开始一轮轮突飞猛进
  • AI智能体(Agent)大模型入门【7】--构建传统的RAG应用
  • 淮阴区建设局网站网站备案变更公司名称
  • Bittensor 中国巡回 Meetup|上海站
  • S11e Network 商业模型:AI × Web3 × RWA 驱动的实体经济新范式
  • 人脸跟随 ( Channel 实现(缓存5条数据 + 2度过滤 + 平滑移动))
  • 线性表——数组描述
  • 帮客户做网站 没签合同咋办重视网站阵地建设
  • Raven2
  • 面试陷阱:SQL 子查询 vs JOIN 的性能差异
  • 做蛋糕视频的网站非法网站开发