3、基础环境部署:JDK安装与配置、Nginx安装与配置、Redis集群部署、Kafka消息队列部署

好,咱们进入正题。基础环境部署这块,说白了就是给交易系统搭好地基。我见过太多项目,业务代码写得挺漂亮,结果底层环境一塌糊涂,上线就崩。所以这一章,咱们把JDK、Nginx、Redis、Kafka这四个核心组件,一个一个捋清楚。

3.1 JDK安装与配置

JDK是Java应用的命根子。交易系统对JDK版本很敏感,我个人习惯用JDK 8或JDK 11,这两个版本在金融行业最稳。

3.1.1 下载与安装

别去Oracle官网下那个要登录的版本,麻烦。直接用OpenJDK,省心。

# 下载OpenJDK 11
wget https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.10%2B9/OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz

# 解压到指定目录
tar -zxvf OpenJDK11U-jdk_x64_linux_hotspot_11.0.10_9.tar.gz -C /usr/local/

# 重命名目录,方便管理
mv /usr/local/jdk-11.0.10+9 /usr/local/java11

3.1.2 环境变量配置

配置环境变量这一步,我踩过坑。曾经有一次配错了路径,导致整个集群的Java应用都起不来,排查了半天。

# 编辑 /etc/profile
vim /etc/profile

# 在文件末尾添加
export JAVA_HOME=/usr/local/java11
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH

# 使配置生效
source /etc/profile

# 验证安装
java -version

重要:一定要用 source /etc/profile 或者重新登录,否则环境变量不生效。我见过有人配完直接重启服务器,其实没必要。

3.1.3 多JDK版本管理

有时候一个机器上要跑多个Java应用,版本还不一样。怎么办?用 alternatives 命令。

# 注册多个JDK版本
alternatives --install /usr/bin/java java /usr/local/java8/bin/java 1
alternatives --install /usr/bin/java java /usr/local/java11/bin/java 2

# 切换版本
alternatives --config java

嗯,这里要注意:切换后记得检查一下 java -version,确认版本对了再往下走。

3.2 Nginx安装与配置

Nginx在交易系统里主要干两件事:反向代理和负载均衡。说白了就是挡在前面,把请求分发给后面的业务服务器。

3.2.1 安装Nginx

我建议用源码编译安装,虽然麻烦点,但能定制模块。曾经有一次线上Nginx被攻击,就是因为默认安装带了不必要的模块。

# 安装依赖
yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

# 下载源码
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar -zxvf nginx-1.20.1.tar.gz
cd nginx-1.20.1

# 编译安装
./configure --prefix=/usr/local/nginx \
            --with-http_stub_status_module \
            --with-http_ssl_module \
            --with-stream
make && make install

3.2.2 核心配置

交易系统的Nginx配置,我一般这么写:

worker_processes  auto;
events {
    worker_connections  1024;
}

http {
    upstream trade_backend {
        server 192.168.1.10:8080 weight=5;
        server 192.168.1.11:8080 weight=5;
        server 192.168.1.12:8080 backup;
    }

    server {
        listen 80;
        server_name trade.example.com;

        location / {
            proxy_pass http://trade_backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

小技巧:nginx -t 测试配置语法,别直接重启。我曾经手抖写错了一个分号,导致整个站点挂了5分钟。

3.2.3 启动与验证

# 启动
/usr/local/nginx/sbin/nginx

# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload

# 检查进程
ps -ef | grep nginx

3.3 Redis集群部署

Redis在交易系统里,主要做缓存和会话管理。单机Redis扛不住高并发,必须上集群。

3.3.1 集群架构设计

我推荐用Redis Cluster,官方方案,稳定可靠。最少6个节点:3主3从。

核心逻辑:Redis Cluster采用无中心架构,数据自动分片到16384个槽位。每个主节点负责一部分槽位,从节点负责备份。

Redis Cluster 架构图 客户端 主节点1 (M1) 槽位: 0-5460 主节点2 (M2) 槽位: 5461-10922 主节点3 (M3) 槽位: 10923-16383 从节点1 (S1) 备份 M1 从节点2 (S2) 备份 M2 从节点3 (S3) 备份 M3

3.3.2 安装与配置

# 下载Redis
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar -zxvf redis-6.2.6.tar.gz
cd redis-6.2.6
make && make install

# 创建集群目录
mkdir -p /data/redis-cluster/{7001,7002,7003,7004,7005,7006}

# 配置示例(以7001为例)
cat > /data/redis-cluster/7001/redis.conf << EOF
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /var/run/redis_7001.pid
EOF

3.3.3 启动集群

# 启动所有节点
redis-server /data/redis-cluster/7001/redis.conf
redis-server /data/redis-cluster/7002/redis.conf
# ... 依次启动所有节点

# 创建集群
redis-cli --cluster create 192.168.1.10:7001 192.168.1.10:7002 \
          192.168.1.10:7003 192.168.1.11:7004 \
          192.168.1.11:7005 192.168.1.11:7006 \
          --cluster-replicas 1

注意:集群节点之间必须能互相通信。我曾经在云上部署时,忘了开安全组端口,结果集群一直创建失败。检查一下防火墙和网络策略。

3.4 Kafka消息队列部署

Kafka在交易系统里,负责处理订单流、行情数据这些高吞吐量的消息。说白了,就是削峰填谷,防止系统被突发流量冲垮。

3.4.1 安装Kafka

Kafka依赖ZooKeeper,不过新版本可以用KRaft模式,省掉ZK。我个人还是习惯用ZK模式,稳定。

# 下载Kafka
wget https://archive.apache.org/dist/kafka/3.2.0/kafka_2.13-3.2.0.tgz
tar -zxvf kafka_2.13-3.2.0.tgz -C /usr/local/
mv /usr/local/kafka_2.13-3.2.0 /usr/local/kafka

3.4.2 配置Kafka

# 编辑 server.properties
vim /usr/local/kafka/config/server.properties

# 关键配置
broker.id=0
listeners=PLAINTEXT://0.0.0.0:9092
advertised.listeners=PLAINTEXT://192.168.1.10:9092
log.dirs=/data/kafka-logs
num.partitions=3
zookeeper.connect=192.168.1.10:2181,192.168.1.11:2181,192.168.1.12:2181

3.4.3 启动与验证

# 先启动ZooKeeper(如果使用ZK模式)
/usr/local/kafka/bin/zookeeper-server-start.sh -daemon /usr/local/kafka/config/zookeeper.properties

# 启动Kafka
/usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties

# 创建测试主题
/usr/local/kafka/bin/kafka-topics.sh --create \
    --topic trade-order \
    --bootstrap-server 192.168.1.10:9092 \
    --partitions 3 \
    --replication-factor 2

# 查看主题列表
/usr/local/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.1.10:9092

经验之谈:分区数不要设太多,3-6个就够。我曾经在一个项目里设了32个分区,结果管理起来特别麻烦,而且性能提升并不明显。

3.4.4 生产者和消费者测试

# 启动生产者
/usr/local/kafka/bin/kafka-console-producer.sh \
    --topic trade-order \
    --bootstrap-server 192.168.1.10:9092

# 启动消费者
/usr/local/kafka/bin/kafka-console-consumer.sh \
    --topic trade-order \
    --bootstrap-server 192.168.1.10:9092 \
    --from-beginning

嗯,到这里基础环境就部署完了。你想想看,JDK、Nginx、Redis、Kafka这四个组件,就像交易系统的四肢。四肢强壮了,业务代码才能跑得稳。我在项目中遇到过好几次,环境没配好导致线上事故,所以每一步都别偷懒。

组件 版本建议 核心用途 部署要点
JDK 8/11 Java运行环境 多版本管理、环境变量
Nginx 1.20+ 反向代理、负载均衡 源码编译、配置语法检查
Redis 6.x 缓存、会话管理 集群模式、主从复制
Kafka 3.x 消息队列、流处理 分区设计、ZK依赖

专注资料整理