mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-07-13 21:50:33 +03:00
nixos/druid: init module
This commit is contained in:
parent
52eab37679
commit
4bfc173d8f
2 changed files with 297 additions and 0 deletions
|
@ -389,6 +389,7 @@
|
||||||
./services/blockchain/ethereum/geth.nix
|
./services/blockchain/ethereum/geth.nix
|
||||||
./services/blockchain/ethereum/lighthouse.nix
|
./services/blockchain/ethereum/lighthouse.nix
|
||||||
./services/cluster/corosync/default.nix
|
./services/cluster/corosync/default.nix
|
||||||
|
./services/cluster/druid/default.nix
|
||||||
./services/cluster/hadoop/default.nix
|
./services/cluster/hadoop/default.nix
|
||||||
./services/cluster/k3s/default.nix
|
./services/cluster/k3s/default.nix
|
||||||
./services/cluster/kubernetes/addon-manager.nix
|
./services/cluster/kubernetes/addon-manager.nix
|
||||||
|
|
296
nixos/modules/services/cluster/druid/default.nix
Normal file
296
nixos/modules/services/cluster/druid/default.nix
Normal file
|
@ -0,0 +1,296 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.services.druid;
|
||||||
|
inherit (lib)
|
||||||
|
concatStrings
|
||||||
|
concatStringsSep
|
||||||
|
mapAttrsToList
|
||||||
|
concatMap
|
||||||
|
attrByPath
|
||||||
|
mkIf
|
||||||
|
mkMerge
|
||||||
|
mkEnableOption
|
||||||
|
mkOption
|
||||||
|
types
|
||||||
|
mkPackageOption
|
||||||
|
;
|
||||||
|
|
||||||
|
druidServiceOption = serviceName: {
|
||||||
|
enable = mkEnableOption serviceName;
|
||||||
|
|
||||||
|
restartIfChanged = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
description = ''
|
||||||
|
Automatically restart the service on config change.
|
||||||
|
This can be set to false to defer restarts on clusters running critical applications.
|
||||||
|
Please consider the security implications of inadvertently running an older version,
|
||||||
|
and the possibility of unexpected behavior caused by inconsistent versions across a cluster when disabling this option.
|
||||||
|
'';
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkOption {
|
||||||
|
default = { };
|
||||||
|
type = types.attrsOf types.anything;
|
||||||
|
description = ''
|
||||||
|
(key=value) Configuration to be written to runtime.properties of the druid ${serviceName}
|
||||||
|
<https://druid.apache.org/docs/latest/configuration/index.html>
|
||||||
|
'';
|
||||||
|
example = {
|
||||||
|
"druid.plainTextPort" = "8082";
|
||||||
|
"druid.service" = "servicename";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
jdk = mkPackageOption pkgs "JDK" { default = [ "jdk17_headless" ]; };
|
||||||
|
|
||||||
|
jvmArgs = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "";
|
||||||
|
description = "Arguments to pass to the JVM";
|
||||||
|
};
|
||||||
|
|
||||||
|
openFirewall = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Open firewall ports for ${serviceName}.";
|
||||||
|
};
|
||||||
|
|
||||||
|
internalConfig = mkOption {
|
||||||
|
default = { };
|
||||||
|
type = types.attrsOf types.anything;
|
||||||
|
internal = true;
|
||||||
|
description = "Internal Option to add to runtime.properties for ${serviceName}.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
druidServiceConfig =
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
serviceOptions ? cfg."${name}",
|
||||||
|
allowedTCPPorts ? [ ],
|
||||||
|
tmpDirs ? [ ],
|
||||||
|
extraConfig ? { },
|
||||||
|
}:
|
||||||
|
(mkIf serviceOptions.enable (mkMerge [
|
||||||
|
{
|
||||||
|
systemd = {
|
||||||
|
services."druid-${name}" = {
|
||||||
|
after = [ "network.target" ];
|
||||||
|
|
||||||
|
description = "Druid ${name}";
|
||||||
|
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
|
||||||
|
inherit (serviceOptions) restartIfChanged;
|
||||||
|
|
||||||
|
path = [
|
||||||
|
cfg.package
|
||||||
|
serviceOptions.jdk
|
||||||
|
];
|
||||||
|
|
||||||
|
script =
|
||||||
|
let
|
||||||
|
cfgFile =
|
||||||
|
fileName: properties:
|
||||||
|
pkgs.writeTextDir fileName (
|
||||||
|
concatStringsSep "\n" (mapAttrsToList (n: v: "${n}=${toString v}") properties)
|
||||||
|
);
|
||||||
|
|
||||||
|
commonConfigFile = cfgFile "common.runtime.properties" cfg.commonConfig;
|
||||||
|
|
||||||
|
configFile = cfgFile "runtime.properties" (serviceOptions.config // serviceOptions.internalConfig);
|
||||||
|
|
||||||
|
extraClassPath = concatStrings (map (path: ":" + path) cfg.extraClassPaths);
|
||||||
|
|
||||||
|
extraConfDir = concatStrings (map (dir: ":" + dir + "/*") cfg.extraConfDirs);
|
||||||
|
in
|
||||||
|
''
|
||||||
|
run-java -Dlog4j.configurationFile=file:${cfg.log4j} \
|
||||||
|
-Ddruid.extensions.directory=${cfg.package}/extensions \
|
||||||
|
-Ddruid.extensions.hadoopDependenciesDir=${cfg.package}/hadoop-dependencies \
|
||||||
|
-classpath ${commonConfigFile}:${configFile}:${cfg.package}/lib/\*${extraClassPath}${extraConfDir} \
|
||||||
|
${serviceOptions.jvmArgs} \
|
||||||
|
org.apache.druid.cli.Main server ${name}
|
||||||
|
'';
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
User = "druid";
|
||||||
|
SyslogIdentifier = "druid-${name}";
|
||||||
|
Restart = "always";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
tmpfiles.rules = concatMap (x: [ "d ${x} 0755 druid druid" ]) (cfg.commonTmpDirs ++ tmpDirs);
|
||||||
|
};
|
||||||
|
networking.firewall.allowedTCPPorts = mkIf (attrByPath [
|
||||||
|
"openFirewall"
|
||||||
|
] false serviceOptions) allowedTCPPorts;
|
||||||
|
|
||||||
|
users = {
|
||||||
|
users.druid = {
|
||||||
|
description = "Druid user";
|
||||||
|
group = "druid";
|
||||||
|
isNormalUser = true;
|
||||||
|
};
|
||||||
|
groups.druid = { };
|
||||||
|
};
|
||||||
|
}
|
||||||
|
extraConfig
|
||||||
|
]));
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.druid = {
|
||||||
|
package = mkPackageOption pkgs "apache-druid" { default = [ "druid" ]; };
|
||||||
|
|
||||||
|
commonConfig = mkOption {
|
||||||
|
default = { };
|
||||||
|
|
||||||
|
type = types.attrsOf types.anything;
|
||||||
|
|
||||||
|
description = "(key=value) Configuration to be written to common.runtime.properties";
|
||||||
|
|
||||||
|
example = {
|
||||||
|
"druid.zk.service.host" = "localhost:2181";
|
||||||
|
"druid.metadata.storage.type" = "mysql";
|
||||||
|
"druid.metadata.storage.connector.connectURI" = "jdbc:mysql://localhost:3306/druid";
|
||||||
|
"druid.extensions.loadList" = ''[ "mysql-metadata-storage" ]'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
commonTmpDirs = mkOption {
|
||||||
|
default = [ "/var/log/druid/requests" ];
|
||||||
|
type = types.listOf types.str;
|
||||||
|
description = "Common List of directories used by druid processes";
|
||||||
|
};
|
||||||
|
|
||||||
|
log4j = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
description = "Log4j Configuration for the druid process";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraClassPaths = mkOption {
|
||||||
|
default = [ ];
|
||||||
|
type = types.listOf types.str;
|
||||||
|
description = "Extra classpath to include in the jvm";
|
||||||
|
};
|
||||||
|
|
||||||
|
extraConfDirs = mkOption {
|
||||||
|
default = [ ];
|
||||||
|
type = types.listOf types.path;
|
||||||
|
description = "Extra Conf Dirs to include in the jvm";
|
||||||
|
};
|
||||||
|
|
||||||
|
overlord = druidServiceOption "Druid Overlord";
|
||||||
|
|
||||||
|
coordinator = druidServiceOption "Druid Coordinator";
|
||||||
|
|
||||||
|
broker = druidServiceOption "Druid Broker";
|
||||||
|
|
||||||
|
historical = (druidServiceOption "Druid Historical") // {
|
||||||
|
segmentLocations = mkOption {
|
||||||
|
|
||||||
|
default = null;
|
||||||
|
|
||||||
|
description = "Locations where the historical will store its data.";
|
||||||
|
|
||||||
|
type =
|
||||||
|
with types;
|
||||||
|
nullOr (
|
||||||
|
listOf (submodule {
|
||||||
|
options = {
|
||||||
|
path = mkOption {
|
||||||
|
type = path;
|
||||||
|
description = "the path to store the segments";
|
||||||
|
};
|
||||||
|
|
||||||
|
maxSize = mkOption {
|
||||||
|
type = str;
|
||||||
|
description = "Max size the druid historical can occupy";
|
||||||
|
};
|
||||||
|
|
||||||
|
freeSpacePercent = mkOption {
|
||||||
|
type = float;
|
||||||
|
default = 1.0;
|
||||||
|
description = "Druid Historical will fail to write if it exceeds this value";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
middleManager = druidServiceOption "Druid middleManager";
|
||||||
|
router = druidServiceOption "Druid Router";
|
||||||
|
};
|
||||||
|
config = mkMerge [
|
||||||
|
(druidServiceConfig rec {
|
||||||
|
name = "overlord";
|
||||||
|
allowedTCPPorts = [ (attrByPath [ "druid.plaintextPort" ] 8090 cfg."${name}".config) ];
|
||||||
|
})
|
||||||
|
|
||||||
|
(druidServiceConfig rec {
|
||||||
|
name = "coordinator";
|
||||||
|
allowedTCPPorts = [ (attrByPath [ "druid.plaintextPort" ] 8081 cfg."${name}".config) ];
|
||||||
|
})
|
||||||
|
|
||||||
|
(druidServiceConfig rec {
|
||||||
|
name = "broker";
|
||||||
|
|
||||||
|
tmpDirs = [ (attrByPath [ "druid.lookup.snapshotWorkingDir" ] "" cfg."${name}".config) ];
|
||||||
|
|
||||||
|
allowedTCPPorts = [ (attrByPath [ "druid.plaintextPort" ] 8082 cfg."${name}".config) ];
|
||||||
|
})
|
||||||
|
|
||||||
|
(druidServiceConfig rec {
|
||||||
|
name = "historical";
|
||||||
|
|
||||||
|
tmpDirs = [
|
||||||
|
(attrByPath [ "druid.lookup.snapshotWorkingDir" ] "" cfg."${name}".config)
|
||||||
|
] ++ (map (x: x.path) cfg."${name}".segmentLocations);
|
||||||
|
|
||||||
|
allowedTCPPorts = [ (attrByPath [ "druid.plaintextPort" ] 8083 cfg."${name}".config) ];
|
||||||
|
|
||||||
|
extraConfig.services.druid.historical.internalConfig."druid.segmentCache.locations" = builtins.toJSON cfg.historical.segmentLocations;
|
||||||
|
})
|
||||||
|
|
||||||
|
(druidServiceConfig rec {
|
||||||
|
name = "middleManager";
|
||||||
|
|
||||||
|
tmpDirs = [
|
||||||
|
"/var/log/druid/indexer"
|
||||||
|
] ++ [ (attrByPath [ "druid.indexer.task.baseTaskDir" ] "" cfg."${name}".config) ];
|
||||||
|
|
||||||
|
allowedTCPPorts = [ (attrByPath [ "druid.plaintextPort" ] 8091 cfg."${name}".config) ];
|
||||||
|
|
||||||
|
extraConfig = {
|
||||||
|
services.druid.middleManager.internalConfig = {
|
||||||
|
"druid.indexer.runner.javaCommand" = "${cfg.middleManager.jdk}/bin/java";
|
||||||
|
"druid.indexer.runner.javaOpts" =
|
||||||
|
(attrByPath [ "druid.indexer.runner.javaOpts" ] "" cfg.middleManager.config)
|
||||||
|
+ " -Dlog4j.configurationFile=file:${cfg.log4j}";
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPortRanges = mkIf cfg.middleManager.openFirewall [
|
||||||
|
{
|
||||||
|
from = attrByPath [ "druid.indexer.runner.startPort" ] 8100 cfg.middleManager.config;
|
||||||
|
to = attrByPath [ "druid.indexer.runner.endPort" ] 65535 cfg.middleManager.config;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
||||||
|
(druidServiceConfig rec {
|
||||||
|
name = "router";
|
||||||
|
|
||||||
|
allowedTCPPorts = [ (attrByPath [ "druid.plaintextPort" ] 8888 cfg."${name}".config) ];
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue