网站Logo 时光杂货铺

Linux上安装中间件

admin
90
2025-06-23

以CentOS7.6为例

前期准备

安装Docker

1、运行以下命令,下载docker-ce的yum源
sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  
2、运行以下命令,安装Docker
sudo yum -y install docker-ce
3、执行以下命令,检查Docker是否安装成功
sudo docker -v
4、执行以下命令,启动Docker服务,并设置开机自启动
sudo systemctl start docker
sudo systemctl enable docker
5、执行以下命令,查看Docker是否启动。 
sudo systemctl status docker


设置镜像加速器
# 执行如下命令:
mkdir /etc/docker  表示创建一个文件夹
#如果有该文件则进入编辑状态,如果没有,则创建该文件然后进入编辑状态
vi /etc/docker/daemon.json  
#编写以下内容
{
    "registry-mirrors": [
        "https://mirror.ccs.tencentyun.com"
    ]
}

安装Docker-Compose

1、运行以下命令,安装setuptools。
sudo pip3 install -U pip setuptools
2、运行以下命令,安装docker-compose。
sudo pip3 install docker-compose
3、运行以下命令,验证docker-compose是否安装成功。
docker-compose --version

Git安装

以CentOS7.6 为例子
1、执行安装命令
sudo yum install -y git
2、查看 是否 安装成功
git --version

安装Mysql

1、执行 mkdir mysql

2、cd mysql 进入文件夹

3、执行命令 vi docker-compose.yml 如果有文件编辑此文件,如果没有文件创建并编辑此文件,将以下内容复制粘贴

version: '3'
services:
  mysql:
    container_name: mysql
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}  # 从环境变量读取密码
    image: "mysql:8.0"
    restart: always
    volumes:
      - "./data:/var/lib/mysql"
    ports:
      - "3306:3306"

在docker-compose.yml文件同级 执行命令 vi .env 命令创建一个env文件

填写内容

MYSQL_ROOT_PASSWORD=root # 这里填写你的实际密码

执行命令 docker-compose.yml up -d 拉取镜像执行

安装Nacos(Git拉取方式)

1、下载最新版nacos源码 git clone https://github.com/nacos-group/nacos-docker.git

2、进入对应目录修改配置文件 修改 nacos-docker/env/nacos-standlone-mysql.env,将其中Mysql连接信息修改成自己数据库连接信息

主要修改:MYSQL_SERVICE_HOST、MYSQL_SERVICE_DB_NAME、MYSQL_SERVICE_USER、MYSQL_SERVICE_PASSWORD等几个为你自己的数据链接信息

之后修改目录 example 中的 .env文件 需要执行命令 ll -a显示全部才能看见,vi .env,修改nacos版本号为2.5.0,再修改standalone-mysql.yaml文件,如果你已设置外部数据库,文件内只需保留nacos信息。从 depends_on: 从这行命令往下,全部注释掉

3、创建数据库及建表

创建名称为nacos_config的数据库,并且初始化表结构,建表语句在下面(请找你自己安装的版本对应的SQL文件)

https://github.com/alibaba/nacos/blob/2.3.0/distribution/conf/mysql-schema.sql (如果你安装的是大于等于2.5.0的建表语句:https://github.com/alibaba/nacos/blob/2.5.0/distribution/conf/mysql-schema.sql

如果是更新的版本,请找你对应的版本的SQL执行)

4、启动nacos

在nacos-docker-2.3.0/example目录下执行:

docker-compose -f standalone-mysql.yaml up

安装Redis

1、创建redis文件夹

mkdir redis

2、进入此文件夹 执行vi docker-compose.yml 编辑文件

version: '3.8'  

services:
  redis:
    container_name: redis  
    image: redis:5.0.7     # 镜像版本(可以根据自己需求修改)
    restart: always        
    ports:
      - "6379:6379"        # 端口映射(宿主机:容器内)
    volumes:
      - ./conf/redis.conf:/etc/redis/redis.conf:rw
      - ./data:/data:rw
    # 启动命令(数组格式,避免YAML解析错误)
    command:
      - redis-server
      - /etc/redis/redis.conf  # 加载挂载的配置文件
      - --requirepass          # 密码参数(从.env读取)
      - ${REDIS_PASSWORD}
    environment:
      - TZ=Asia/Shanghai  # 时区配置(与宿主机保持一致)
    # 资源限制(可选,根据服务器配置调整)
    deploy:
      resources:
        limits:
          cpus: '0.5'     # 最大使用0.5个CPU核心
          memory: 1G      # 最大使用1GB内存

ESC退出编辑模式,按:号 wq保存退出

3、执行vi .env文件 创建并编辑

输入 REDIS_PASSWORD=root # Redis 访问密码(建议替换为复杂密码)

保存并退出

4、执行 mkdir conf 创建conf目录

cd conf 进入目录 执行 vi redis.conf命令 配置持久化

输入

# -------------------------- RDB 持久化配置 --------------------------
# 900秒内有1次修改则触发RDB快照
save 900 1
# 300秒内有10次修改则触发RDB快照
save 300 10
# 60秒内有10000次修改则触发RDB快照
save 60 10000
# RDB文件压缩(yes启用,节省空间但消耗CPU)
rdbcompression yes
# RDB文件校验(yes启用,确保文件完整性)
rdbchecksum yes
# RDB文件名(默认即可)
dbfilename dump.rdb


# -------------------------- AOF 持久化配置 --------------------------
# 启用AOF持久化(与命令行无冲突,配置文件优先级低于命令行,但建议保持一致)
appendonly yes
# AOF文件名(默认即可)
appendfilename "appendonly.aof"
# AOF刷盘策略:每秒一次(平衡性能与安全性)
appendfsync everysec
# AOF重写时是否暂停同步(no:不暂停,保证数据不丢失)
no-appendfsync-on-rewrite no
# AOF文件大小增长比例达到100%时触发重写
auto-aof-rewrite-percentage 100
# AOF文件最小重写大小(64MB)
auto-aof-rewrite-min-size 64mb


# -------------------------- 混合持久化配置 --------------------------
# 开启混合持久化(AOF重写时包含RDB前缀,Redis 4.0+支持,5.0.7兼容)
aof-use-rdb-preamble yes


# -------------------------- 数据目录配置 --------------------------
# 数据文件(RDB/AOF)存储目录(需与挂载的/data目录一致)
dir /data


# -------------------------- 内存配置 --------------------------
# 最大使用内存(根据服务器实际情况调整,这里设为512MB)
maxmemory 512mb
# 内存满时的淘汰策略:删除最少使用的key(适用于缓存场景)
maxmemory-policy allkeys-lru


# -------------------------- 网络配置 --------------------------
# 绑定IP(0.0.0.0表示允许所有IP访问,生产环境建议指定具体IP)
bind 0.0.0.0
# 连接超时时间(300秒)
timeout 300


# -------------------------- 其他安全配置 --------------------------
# 关闭保护模式(允许远程连接,配合密码使用更安全)
protected-mode no
# 客户端最大连接数(默认10000,根据需求调整)
maxclients 10000

保存退出

在docker-compose.yml文件同级执行命令

docker-compose up -d

测试持久化是否生效

127.0.0.1替换为运行redis的服务器的ip
# 测试数据持久化
127.0.0.1:6379> set test "hello redis"
OK
127.0.0.1:6379> get test
"hello redis"
127.0.0.1:6379> exit

# 重启容器后验证数据是否保留
docker-compose restart redis
docker exec -it redis redis-cli
127.0.0.1:6379> auth Redis@2024_secure
OK
127.0.0.1:6379> get test  # 仍能获取到值,说明持久化生效
"hello redis"

ElasticSearch安装

1、创建一个文件夹

mkdir es

2、进入es文件夹中创建一个docker-compose.yml文件

vi docker-compose.yml

3、在docker-compose.yml中加入以下内容

version: '3'
services:
  elasticsearch:
    image: elasticsearch:8.13.0
    container_name: elasticsearch
    restart: always
    environment:
      - bootstrap.memory_lock=true
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - "discovery.type=single-node"
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /root/es/plugins:/usr/share/elasticsearch/plugins
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: kibana:8.13.0
    container_name: kibana
    environment:
      - SERVER_NAME=kibana
      - ELASTICSEARCH_URL=http://127.0.0.1:9200   #这里要替换为你运行es容器的服务器的ip
      - XPACK_MONITORING_ENABLED=true
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
    external_links:
      - elasticsearch

4、es文件夹下执行脚本

  docker-compose up -d

seata安装

1、下载安装包

https://seata.apache.org/zh-cn/unversioned/release-history/seata-server

我下载的是2.0.0的版本

下载后解压,unzip unzip seata-server-2.0.0.zip ,解压后的目录结构如下:

2、配置文件修改

进入conf目录,找到application.yml,修改其中的配置:

seata:
  config:
    type: nacos
    nacos:
      server-addr: 127.0.0.1:8848
      group: 'seata'
      namespace: '32d418dd-ff3b-45a3-8699-dd66bb540e86'
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      group : "seata"
      namespace: "32d418dd-ff3b-45a3-8699-dd66bb540e86"

对应的nacos上的namespace配置如下:

注意这里的命名空间ID、和配置文件中的namespace要一致。

3、在nacos上增加配置信息

在nacos上增加配置,namespace选择刚刚创建好的,和seata的配置对应上,创建一个data_id为seataServer.properties的文件

文件内容来自:https://github.com/apache/incubator-seata/blob/develop/script/config-center/config.txt

把这里面的内容复制过来,修改其中的部分内容,并配置到seataServer.properties中:

#For details about configuration items, see https://seata.io/zh-cn/docs/user/configurations.html
#Transport configuration, for client and server
transport.type=TCP
transport.server=NIO
transport.heartbeat=true
transport.enableTmClientBatchSendRequest=false
transport.enableRmClientBatchSendRequest=true
transport.enableTcServerBatchSendResponse=false
transport.rpcRmRequestTimeout=30000
transport.rpcTmRequestTimeout=30000
transport.rpcTcRequestTimeout=30000
transport.threadFactory.bossThreadPrefix=NettyBoss
transport.threadFactory.workerThreadPrefix=NettyServerNIOWorker
transport.threadFactory.serverExecutorThreadPrefix=NettyServerBizHandler
transport.threadFactory.shareBossWorker=false
transport.threadFactory.clientSelectorThreadPrefix=NettyClientSelector
transport.threadFactory.clientSelectorThreadSize=1
transport.threadFactory.clientWorkerThreadPrefix=NettyClientWorkerThread
transport.threadFactory.bossThreadSize=1
transport.threadFactory.workerThreadSize=default
transport.shutdown.wait=3
transport.serialization=seata
transport.compressor=none

#Transaction routing rules configuration, only for the client
service.vgroupMapping.default_tx_group=default
#If you use a registry, you can ignore it
service.default.grouplist=127.0.0.1:8091
service.enableDegrade=false
service.disableGlobalTransaction=false

#Transaction rule configuration, only for the client
client.rm.asyncCommitBufferLimit=10000
client.rm.lock.retryInterval=10
client.rm.lock.retryTimes=30
client.rm.lock.retryPolicyBranchRollbackOnConflict=true
client.rm.reportRetryCount=5
client.rm.tableMetaCheckEnable=true
client.rm.tableMetaCheckerInterval=60000
client.rm.sqlParserType=druid
client.rm.reportSuccessEnable=false
client.rm.sagaBranchRegisterEnable=false
client.rm.sagaJsonParser=fastjson
client.rm.tccActionInterceptorOrder=-2147482648
client.tm.commitRetryCount=5
client.tm.rollbackRetryCount=5
client.tm.defaultGlobalTransactionTimeout=60000
client.tm.degradeCheck=false
client.tm.degradeCheckAllowTimes=10
client.tm.degradeCheckPeriod=2000
client.tm.interceptorOrder=-2147482648
client.undo.dataValidation=true
client.undo.logSerialization=jackson
client.undo.onlyCareUpdateColumns=true
server.undo.logSaveDays=7
server.undo.logDeletePeriod=86400000
client.undo.logTable=undo_log
client.undo.compress.enable=true
client.undo.compress.type=zip
client.undo.compress.threshold=64k
#For TCC transaction mode
tcc.fence.logTableName=tcc_fence_log
tcc.fence.cleanPeriod=1h

#Log rule configuration, for client and server
log.exceptionRate=100

#Transaction storage configuration, only for the server. The file, db, and redis configuration values are optional.
store.mode=db
store.lock.mode=db
store.session.mode=db
#Used for password encryption
store.publicKey=

#These configurations are required if the `store mode` is `db`. If `store.mode,store.lock.mode,store.session.mode` are not equal to `db`, you can remove the configuration block.
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://rm-xxxxx:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=nfturbo
store.db.password=NFTurbo666
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.distributedLockTable=distributed_lock
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000

#Transaction rule configuration, only for the server
server.recovery.committingRetryPeriod=1000
server.recovery.asynCommittingRetryPeriod=1000
server.recovery.rollbackingRetryPeriod=1000
server.recovery.timeoutRetryPeriod=1000
server.maxCommitRetryTimeout=-1
server.maxRollbackRetryTimeout=-1
server.rollbackRetryTimeoutUnlockEnable=false
server.distributedLockExpireTime=10000
server.xaerNotaRetryTimeout=60000
server.session.branchAsyncQueueSize=5000
server.session.enableBranchAsyncRemove=false
server.enableParallelRequestHandle=false

#Metrics configuration, only for the server
metrics.enabled=false
metrics.registryType=compact
metrics.exporterList=prometheus
metrics.exporterPrometheusPort=9898

其中需要修改的部分如下,然后保存即可。

store.db.url=jdbc:mysql://rm-xxxxx:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=nfturbo
store.db.password=NFTurbo666
# 修改为你自己的配置

4、创建数据库及表结构

在你第三步中指定的那个数据库实例中创建一个库名为seata的数据库,然后执行https://github.com/apache/incubator-seata/blob/develop/script/server/db/mysql.sql 文件中的SQL内容:

-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_status_gmt_modified` (`status` , `gmt_modified`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `status`         TINYINT      NOT NULL DEFAULT '0' COMMENT '0:locked ,1:rollbacking',
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_status` (`status`),
    KEY `idx_branch_id` (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

CREATE TABLE IF NOT EXISTS `distributed_lock`
(
    `lock_key`       CHAR(20) NOT NULL,
    `lock_value`     VARCHAR(20) NOT NULL,
    `expire`         BIGINT,
    primary key (`lock_key`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8mb4;

INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('AsyncCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryCommitting', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('RetryRollbacking', ' ', 0);
INSERT INTO `distributed_lock` (lock_key, lock_value, expire) VALUES ('TxTimeoutCheck', ' ', 0);

5、启动Seata服务端

到机器上,先手动创建一个目录:/root/logs/seata/,然后到seata/bin目录下,执行:sh seata-server.sh -h 111.11.11.11 命令。通过-h指定本地的ip, 111.11.11.11记得换成你自己的ip

然后创建一个目录:/root/logs/seata/ 用于打印日志。

接下来,打开你的机器的7091和8091端口,通过7091端口可以访问你的seata的管理控制台,输入用户名(默认seata)、密码(默认seata),即可进入控制台

同时在nacos上能看到有一个seata的服务注册上去了:

image-apxM.png

xxl-job安装

1、创建xxl-job文件夹

mkdir xxl-job

2、进入xxljob文件夹中创建一个docker-compose.yml文件

cd xxljob

vi docker-compose.yml

3、在docker-compose.yml中加入以下内容

version: '3'
services:
  xxl-job:
    image: xuxueli/xxl-job-admin:3.2.0
    container_name: xxl-job
    environment:
      PARAMS: "--spring.datasource.url=jdbc:mysql://192.168.200.104:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai  --spring.datasource.username=root  --spring.datasource.password=root"
    ports:
      - 8888:8080   #(宿主机端口:容器端口)
    volumes:
      - /data/docker/xxl-job/logs/:/data/applogs/xxl-job/

ip换成你自己的ip,同时需要在数据库新建一个名为xxl-job名称的数据库,字符集为utf8mb4;

tables_xxl_job.sql 执行这个sql文件;

路径为 ip:端口/xxl-job-admin/ 如:127.0.0.1:8080/xxl-job-admin

我这里端口改成8888是因为我还运行了jenkins。

进入页面 默认账号:admin 密码:123456