ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

StarRocks UNINSTALL PLUGIN 卸载插件指南:语法、权限与源码实现解析

StarRocks UNINSTALL PLUGIN 卸载插件指南:语法、权限与源码实现解析 StarRocks UNINSTALL PLUGIN 卸载插件指南语法、权限与源码实现解析【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks本指南以 StarRocks 官方文档 UNINSTALL PLUGIN 为核心系统讲解如何在 StarRocks 集群中卸载自定义插件涵盖完整语法、SYSTEM 级 PLUGIN 权限要求、与 SHOW PLUGINS / INSTALL PLUGIN 的组合使用并结合 FE 端源码Parser、Analyzer、PluginMgr剖析卸载的内部流程与注意事项。读完本文你将能安全、准确地从 StarRocks 中卸载任何非内置插件并在卸载失败时定位问题根源。一、UNINSTALL PLUGIN 概述UNINSTALL PLUGIN 是 StarRocks 用于卸载插件的 SQL 语句。StarRocks 通过插件Plugin机制在不改动核心代码的前提下扩展 FE 的功能例如审计日志Audit Log插件。当某个自定义插件不再需要时即可使用本语句将其从集群中移除。与安装插件INSTALL PLUGIN、查看插件SHOW PLUGINS配套卸载操作是插件生命周期管理的最后一环阶段命令说明安装INSTALL PLUGIN从本地 zip、插件目录或 HTTP(S) 链接安装插件查看SHOW PLUGINS展示全部内置插件与自定义插件卸载UNINSTALL PLUGIN卸载一个非内置插件1.1 权限要求UNINSTALL PLUGIN 属于集群管理类 DDL 操作需要SYSTEM 级别的 PLUGIN 权限。如果当前用户缺少该权限语句会被拒绝执行。授权方式可参考 GRANT 文档典型授权语句如下GRANT PLUGIN ON SYSTEM TO user;需要说明的是该权限要求同时适用于 INSTALL PLUGIN、SHOW PLUGINS 与 UNINSTALL PLUGIN 三个语句它们都在各自的文档中被明确标注为需要 SYSTEM 级 PLUGIN 权限。1.2 插件开关plugin_enable从源码看插件的安装与卸载都受 FE 配置项plugin_enable控制。PluginAnalyzer 中的visitInstallPluginStatement与visitUninstallPluginStatement都会先检查该开关if (!Config.plugin_enable) { ErrorReport.reportSemanticException(ErrorCode.ERR_OPERATION_DISABLED, INSTALL PLUGIN, Please enable it by setting plugin_enable true); }plugin_enable定义于 Config.java默认值为true。同时插件存放目录由plugin_dir指定默认值为${STARROCKS_HOME}/plugins见 Config.java。如果集群中该开关被显式关闭执行卸载语句会直接报错需要先在fe.conf中恢复plugin_enable true并重启 FE 后重试。二、语法详解UNINSTALL PLUGIN 的完整语法如下UNINSTALL PLUGIN [IF EXISTS] plugin_name参数说明语法元素含义IF EXISTS可选关键字。指定后若目标插件不存在语句静默成功不返回错误未指定时插件不存在将直接报错plugin_name目标插件名称可通过SHOW PLUGINS命令查看2.1 IF EXISTS 语义IF EXISTS是幂等卸载的关键它允许重复执行卸载命令而不会因为插件已被移除而中断脚本。其实现逻辑位于 PluginMgr.uninstallPluginFromStmtString pluginName stmt.getPluginName(); if (!checkDynamicPluginNameExist(pluginName)) { if (stmt.isIfExists()) { LOG.info(uninstall plugin[{}] which does not exist, pluginName); return; } throw new DdlException(Plugin pluginName does not exist); }可以看到未加IF EXISTS时插件不存在会抛出DdlException(Plugin ... does not exist)加了IF EXISTS后则记录一条日志并静默返回。2.2 语法树的落地在语法解析层面UNINSTALL PLUGIN被解析为 UninstallPluginStmt 节点。该 AST 类持有两个核心字段pluginName待卸载的插件名称ifExists是否带IF EXISTS关键字。该语句继承自DdlStmt属于 DDL 语句因此会进入 FE 的 DDL 执行链路并在执行前经过 AuthorizerStmtVisitor 完成权限校验SYSTEM 级 PLUGIN 权限。三、使用示例3.1 直接卸载插件UNINSTALL PLUGIN auditdemo;该语句卸载名为auditdemo的插件。若auditdemo尚未安装会返回类似如下的错误ERROR 1064 (HY000): Plugin auditdemo does not exist3.2 幂等卸载IF EXISTSUNINSTALL PLUGIN IF EXISTS auditdemo;当auditdemo存在时执行卸载不存在时静默成功适合用于自动化运维脚本、集群初始化脚本等对幂等性有要求的场景。3.3 实战完整的插件生命周期操作结合 INSTALL PLUGIN 与 SHOW PLUGINS一个完整的插件生命周期如下-- 1. 安装插件从本地 zip 包 INSTALL PLUGIN FROM /home/users/starrocks/auditdemo.zip; -- 2. 查看已安装的插件确认 auditdemo 的状态 SHOW PLUGINS; -- 3. 卸载插件 UNINSTALL PLUGIN auditdemo; -- 4. 幂等场景下再次卸载不会报错 UNINSTALL PLUGIN IF EXISTS auditdemo;SHOW PLUGINS会展示包括内置插件与自定义插件在内的全部插件列表可用于在卸载前确认plugin_name的准确拼写插件名区分大小写。四、仅支持卸载非内置插件UNINSTALL PLUGIN只能卸载非内置动态安装插件内置插件Built-in Plugin无法通过该语句卸载。这一点在原文档中有明确说明其源码依据位于 PluginMgr.uninstallPluginif (!loader.isDynamicPlugin()) { throw new DdlException(Only support uninstall dynamic plugins); }StarRocks 的内置插件在 FE 启动时通过initBuiltinPlugins()注册见 PluginMgr.initBuiltinPlugins例如内置的审计日志插件AuditLogBuilder就是使用BuiltinPluginLoader加载的对应registerBuiltinPlugin方法PluginMgr.java。而通过INSTALL PLUGIN安装的插件使用DynamicPluginLoader加载属于动态插件具备isDynamicPlugin() true才可以被卸载。因此如果尝试卸载一个内置插件FE 会抛出Only support uninstall dynamic plugins错误。五、卸载的内部流程源码视角一次成功的卸载操作在 FE 内部经历以下关键调用链UNINSTALL PLUGIN auditdemo; │ ▼ Parser 解析为 UninstallPluginStmt │ ▼ AuthorizerStmtVisitor 校验 SYSTEM 级 PLUGIN 权限 │ ▼ PluginAnalyzer 校验 plugin_enable 开关 │ ▼ DDLStmtExecutor.visitUninstallPluginStatement │ (fe/fe-core/src/main/java/com/starrocks/qe/DDLStmtExecutor.java#L942-L952) ▼ PluginMgr.uninstallPluginFromStmt(stmt) │ ├─ 1. checkDynamicPluginNameExist 检查插件是否安装 ├─ 2. PluginMgr.uninstallPlugin(pluginName) │ ├─ 校验 isDynamicPlugin非内置 │ ├─ loader.pluginUninstallValid() │ ├─ loader.setStatus(PluginStatus.UNINSTALLING) │ ├─ loader.uninstall() │ └─ loader.setStatus(PluginStatus.UNINSTALLED) └─ 3. 写 EditLoglogUninstallPlugin(UninstallPluginLog)5.1 DDL 执行入口DDL 执行器在 DDLStmtExecutor.visitUninstallPluginStatement 中调用context.getGlobalStateMgr().getPluginMgr().uninstallPluginFromStmt(stmt)完成卸载任何IOException都会被包装为运行时异常抛出导致语句失败。5.2 卸载失败不会污染插件管理器uninstallPlugin的注释明确强调If uninstall failed, the plugin should NOT be removed from plugin manager卸载失败时插件不应从插件管理器移除。这是卸载操作的重要原子性保证只有loader.uninstall()成功返回后插件才会被真正从 FE 的内存插件表中移除。5.3 元数据持久化与副本同步卸载成功后FE 会通过GlobalStateMgr.getCurrentState().getEditLog().logUninstallPlugin(new UninstallPluginLog(pluginName), wal - {...})将卸载操作写入 EditLog并同步删除插件表中对应的条目与动态插件名。对应的日志对象为 UninstallPluginLog在 EditLog 与 EditLogDeserializer 中注册了序列化与反序列化逻辑。在 FE 从 EditLog 回放replay日志时replayUninstallPluginPluginMgr.java会重新执行卸载动作并从插件管理器中移除插件从而保证 BDBJE 元数据库中的日志回放与主副本内存状态一致实现卸载操作在 FE 集群Leader 与 Follower间的正确同步。六、常见错误与排查错误信息原因解决办法ERROR 1064: Plugin auditdemo does not exist插件名称拼写错误或插件未安装先执行SHOW PLUGINS确认插件名或加上IF EXISTSOnly support uninstall dynamic plugins试图卸载内置插件内置插件不可卸载仅可卸载通过INSTALL PLUGIN安装的动态插件ERR_OPERATION_DISABLED: Please enable it by setting plugin_enable trueFE 配置项plugin_enable被设为false在fe.conf中设置plugin_enable true并重启 FE权限被拒绝无 PLUGIN 权限当前用户缺少 SYSTEM 级 PLUGIN 权限使用 GRANT 授予权限后重试七、补充说明插件名区分大小写plugin_name需与SHOW PLUGINS输出中的名称完全一致。卸载是持久化操作卸载会写入 FE 的 EditLog属于集群级元数据变更执行前请确认目标插件确已不再需要。动态插件与目录通过INSTALL PLUGIN安装的动态插件存放于plugin_dir默认${STARROCKS_HOME}/plugins卸载动作由DynamicPluginLoader.uninstall()负责清理插件资源。相关文档安装插件INSTALL PLUGIN查看插件SHOW PLUGINS权限授予GRANT核心实现PluginMgr.java、UninstallPluginStmt.java、PluginAnalyzer.java【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表