# datastack **Repository Path**: ccbtr/datastack ## Basic Information - **Project Name**: datastack - **Description**: No description available - **Primary Language**: Shell - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-01 - **Last Updated**: 2026-09-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # datastack Ansible 自动化部署数据平台四组件:**Kafka / InfluxDB / TiDB / Hadoop**,全栈 JDK17,支持离线(内网无外网)部署。 | 组件 | 版本 | 部署形态 | |------|------|----------| | Kafka | 4.1.0(KRaft,无 ZK 依赖) | 单节点 / 3 broker 集群,systemd 裸装 | | InfluxDB | 1.8.10 OSS | 单节点(1.x 无集群,不做 HA),二进制 tarball | | TiDB | 8.5.6 | 单机 standalone / 3 节点集群,TiUP 官方离线镜像,无 TiFlash | | Hadoop | 3.5.0 | 伪分布式 / HA(NN×2 + JN/ZK×3 + RM),YARN 全节点 NM | > 详细设计见 [部署方案.md](部署方案.md)(规模档位、主机规划、各组件部署大纲、已确认决策记录)。 ## 架构原则 - **agentless**:只有控制端装 Ansible,**目标机零安装**(靠系统自带 python3 执行,ALinux 3 的 3.6.8 够用) - **四组件全部裸装**(tarball / 二进制 / TiUP),不用 Docker——KRaft 对磁盘 IO 敏感,裸装排查链路最短 - **幂等**:所有任务可重复执行,已部署的组件会自动跳过 - **敏感信息**:密码/密钥在 `inventory/group_vars/all/secrets.yml`(ansible-vault 加密),vault 口令在 `.vault_pass`,均不进 git ## 目录结构 ``` datastack/ ├── run.sh # 部署入口(唯一需要记的命令) ├── ansible.cfg ├── inventory/ │ ├── hosts-single.yml # 单机测试档(1 机全跑,无 HA) │ ├── hosts-min.yml # 最小生产档(占位 IP,11 台) │ ├── hosts.yml # 真实 inventory(本地维护,不提交 git) │ └── group_vars/ │ ├── all/ # 全局版本 + 安装通道 + secrets.yml(vault) │ └── <组件>/ # 各组件配置 ├── playbooks/ # site / site-single / 单组件 / smoke ├── roles/ │ ├── common/ # 基线:时区、JDK17、基础包(所有节点) │ ├── kafka/ influxdb/ tidb/ hadoop/ │ └── <组件>/files/ # ⬅ 离线包放这里(不进 git) └── 部署方案.md ``` ## 一、控制端准备(装 Ansible 的机器) 要求:**Python ≥ 3.9** + `ansible-core >= 2.15` + collection `ansible.posix`。 本仓库开发机用 `../atr` 虚拟环境(已装好,`run.sh` 自动探测)。若换机器(例如直接在一台目标机上做控制端,Mac 不可达内网时): ```bash dnf -y module install -y python39 # ALinux 3 默认只有 python3.6,需补 3.9 python3.9 -m venv /opt/ansible-env /opt/ansible-env/bin/pip install 'ansible-core==2.15.13' 'ansible-posix==1.5.4' /opt/ansible-env/bin/ansible-galaxy collection install ansible.posix ``` `run.sh` 优先用 `../atr`,找不到则回退 `/opt/ansible-env`。装完跑: ```bash ./run.sh check-env # 检测版本 + collection,不满足时打印安装指引 ``` ## 二、目标机准备 1. **SSH 可达**:控制机能 `ssh root@<机器IP>` 免密(`ssh-copy-id root@<机器IP>` 一次即可) 2. 操作系统:Alibaba Cloud Linux 3 / 兼容 RHEL 8 系(dnf 系) 3. **无需预装任何软件** ## 三、离线包放置(install_mode: offline 时) 默认 `install_mode: offline`(`inventory/group_vars/all/main.yml`)。把软件包按下面清单放入 `roles/<组件>/files/`(大文件不进 git,`.gitignore` 已忽略): | 组件 | 文件名 | 放入目录 | 来源 | |------|--------|----------|------| | Kafka | `kafka_2.13-4.1.0.tgz` | `roles/kafka/files/` | archive.apache.org | | InfluxDB | `influxdb-1.8.10_linux_amd64.tar.gz` | `roles/influxdb/files/` | dl.influxdata.com | | TiDB | `tidb-community-server-v8.5.6-linux-amd64.tar.gz` | `roles/tidb/files/` | pingcap release | | TiDB | `tidb-community-toolkit-v8.5.6-linux-amd64.tar.gz` | `roles/tidb/files/` | pingcap release | | Hadoop | `hadoop-3.5.0.tar.gz` | `roles/hadoop/files/` | archive.apache.org | | ZooKeeper | `apache-zookeeper-3.9.2-bin.tar.gz` | `roles/hadoop/files/` | archive.apache.org(仅 HA 模式需要) | | JDK17 | `jdk17-linux-x64.tar.gz`(按需) | `roles/common/files/` | 内部仓库 | > 如果目标机能访问内网文件服务器,可把 `install_mode` 改为 `online`,包地址在各 `group_vars` 的 `*_download_url` 中配置。 ## 四、inventory 配置 **单机测试**(1 台机器跑全部组件):编辑 `inventory/hosts-single.yml`,把 `` 换成真实 IP。 **生产**:编辑 `inventory/hosts-min.yml`,替换全部 `` 占位符。注意: - Kafka/TiDB 按组内顺序分配 node id(`kafka-1/2/3`、`tidb-1/2/3`),主机名顺序即编号顺序 - Hadoop 4 台同组,角色由主机级变量(`hadoop_nn/jn/rm/dn`)区分,前 2 台是 NN+JN+RM,后 2 台是 DN(第 3 台兼 JN,凑齐 ZK quorum=3) - 磁盘要求:TiDB 节点需要 ≥2T 数据盘,`/data/pingcap` 目录所在分区 **敏感信息**:`inventory/group_vars/all/secrets.yml` 是 vault 加密文件,需要改内容时: ```bash EDITOR="vim" ANSIBLE_VAULT_PASSWORD_FILE=.vault_pass \ ansible-vault edit inventory/group_vars/all/secrets.yml ``` ## 五、部署 ```bash # 0. 部署前体检(推荐) ./run.sh check-env # 控制端 Ansible 环境 ./run.sh check -i inventory/hosts-min.yml # 目标机 SSH ping + 语法检查 # 1. 单机测试档(1 台机器全组件) ./run.sh single -i inventory/hosts-single.yml # 2. 生产全量(一次部署四组件) ./run.sh all -i inventory/hosts-min.yml # 3. 或按组件单独部署 / 加节点 / 重装 ./run.sh kafka -i inventory/hosts-min.yml ./run.sh influxdb -i inventory/hosts-min.yml ./run.sh tidb -i inventory/hosts-min.yml ./run.sh hadoop -i inventory/hosts-min.yml ``` **推荐逐组件验证**(部署方案.md §7 的顺序):kafka → 冒烟 → influxdb → 冒烟 → tidb → 冒烟 → hadoop → 冒烟。每步: ```bash ./run.sh kafka -i inventory/hosts-min.yml --check # 先模拟,看会做什么 ./run.sh kafka -i inventory/hosts-min.yml # 真实执行 ./run.sh smoke -i inventory/hosts-min.yml # 建测试 topic/库,写读验证 ``` **TiDB 特殊说明**:集群模式由 `tidb-1`(组首台)作为 TiUP 控制端发起部署,角色会自动生成专用 SSH 密钥下发到全部 TiDB 节点(非交互,无需手动输密码)。`deploy_dir=/data/pingcap/tidb-deploy`、`data_dir=/data/pingcap/tidb-data`,确认这两块分区空间。 **常用附加参数**(透传给 ansible-playbook): ```bash ./run.sh kafka --check # 模拟运行,不做变更 ./run.sh kafka --diff # 显示配置变更 diff ./run.sh kafka -l kafka-1 # 只在指定主机执行 ./run.sh kafka --skip-tags init # 跳过指定 tag ``` ## 六、冒烟验证(smoke.yml) 对已部署组件做真实读写验证: - Kafka:建 topic → 写入 100 条 → 消费读回 - InfluxDB:建库 → 写点 → 查询 - TiDB:建表 → 插入 → 查询 - Hadoop:`hdfs dfsadmin -report` + `yarn node -list`(仅首台节点执行) ## 七、运维速查 | 操作 | 命令 / 位置 | |------|-------------| | 列出 inventory 主机 | `./run.sh list -i inventory/hosts-min.yml` | | Kafka broker 状态 | `systemctl status kafka`,`/opt/kafka/bin/kafka-broker-api-versions.sh -b :9090` | | InfluxDB 健康 | `curl http://:8086/ping`(204 = OK),`systemctl status influxdb` | | TiDB 状态 | 在 tidb-1 上 `tiup cluster display <集群名>`(集群名见 `group_vars/tidb/main.yml`) | | Hadoop NN 状态 | `hdfs hastatus`,JN/ZK:`systemctl status zookeeper jn` | | 重渲染配置 | 改 `group_vars` 后重跑对应组件的 playbook(幂等,会自动通知 restart) | | 日志 | 控制端 `logs/ansible.log`(`ansible.cfg` 配置) | ## 八、常见问题 - **`./run.sh` 报找不到 Ansible 环境**:控制端未安装,见 §一;装好后 `./run.sh check-env` 验证 - **ping 检查某台主机超时**:检查该机器 SSH 免密(从控制端 `ssh root@ hostname`) - **离线包缺失报错**:对照 §三 清单补包;`install_mode: online` 时检查 `*_download_url` 内网仓库可达 - **TiDB 部署卡在某节点**:控制端(tidb-1)日志看 `tiup cluster deploy` 输出;角色已用密钥免密,若手动改过 SSH 配置需重新跑 `./run.sh tidb`(会重新分发密钥) - **Kafka 集群 join 不上**:确认 3 台 `controller.quorum.voters` 里的 hostname 互通(/etc/hosts 或 DNS) - **重跑幂等性**:所有角色已部署则跳过,可放心重复执行;升级版本时先清理旧数据目录再改 `group_vars` 版本号 ## 九、Git 约定 - 远端:`gitee.com/ccbtr/datastack`,分支 `master` - **不提交**:真实 IP 的 `inventory/hosts.yml`、`secrets.yml`(用 vault)、`.vault_pass`、`roles/*/files/` 下的大离线包 - 公开文档/代码中出现敏感信息一律用占位符(`` 等)