Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision a354dfce

Von Moritz Bunkus vor etwa 5 Jahren hinzugefügt

  • ID a354dfceab313ce89c8739fdb3243183f2bbefbe
  • Vorgänger d5d98964
  • Nachfolger 64c14bc5

Task-Server auf unterschiedlichen Maschinen laufen lassen können

Jede Task-Server-Instanz und jeder Hintergrundjob haben nun ein neues
Attribute »node_id«. Darüber kann gesteuert werden, dass bestimmte
Jobs nur von einer bestimmten Instanz ausgeführt werden.

Die »node_id« eines neu angelegten Jobs ist standardmäßig leer. Das
bedeutet, dass ein Job von einer beliebigen Task-Server-Instanz
ausgeführt werden kann.

Die »node_id« eines Task-Servers ist standardmäßig der Hostname (siehe
ausgabe von »perl -MSys::Hostname -le 'print hostname()'«), kann aber
in der Konfigurationsdatei überschrieben werden (»[task_server]« →
»node_id«).

Zusätzlich gibt es den Konfigurationsparameter »[task_server]« →
»only_run_tasks_for_this_node«. Ist dieser Parameter gesetzt, so führt
der Task-Server nur diejenigen Jobs aus, deren »node_id«-Feld mit der
»node_id« der Task-Server-Instanz übereinstimmt. Andernfalls werden
auch diejenigen Jobs ausgeführt, deren »node_id«-Feld leer ist.

Achtung: es findet momentan keinerlei Locking statt. Das bedeutet,
dass es für jede Datenbank nur eine Task-Server-Instanz geben darf,
bei der »only_run_tasks_for_this_node« nicht gesetzt ist. Für
Load-Balancing eignet sich das also bisher noch nicht.

Unterschiede anzeigen:

SL/BackgroundJob/Test.pm
4 4

  
5 5
use parent qw(SL::BackgroundJob::Base);
6 6

  
7
use SL::System::TaskServer;
8

  
7 9
sub run {
8 10
  my ($self, $db_obj) = @_;
9 11
  my $data            = $db_obj->data_as_hash;
10 12

  
11
  $::lxdebug->message(0, "Test job is being executed.");
13
  $::lxdebug->message(0, "Test job ID " . $db_obj->id . " is being executed on node " . SL::System::TaskServer::node_id() . ".");
12 14

  
13 15
  die "Oh cruel world: " . $data->{exception} if $data->{exception};
14 16

  
SL/DB/Manager/BackgroundJob.pm
8 8
use SL::DB::Helper::Paginated;
9 9
use SL::DB::Helper::Sorted;
10 10

  
11
use SL::System::TaskServer;
12

  
11 13
sub object_class { 'SL::DB::BackgroundJob' }
12 14

  
13 15
__PACKAGE__->make_manager_methods;
......
36 38
                                                 cron_spec   => '',
37 39
                                                 next_run_at => undef,
38 40
                                                 next_run_at => { le => $now } ] ]);
39

  
40
  return $class->get_all(query => [ or => [ @interval_args, @once_args ] ]);
41
  my @node_filter;
42

  
43
  my $node_id = SL::System::TaskServer->node_id;
44
  if ($::lx_office_conf{task_server}->{only_run_tasks_for_this_node}) {
45
    @node_filter = (node_id => $node_id);
46
  } else {
47
    @node_filter = (
48
      or => [
49
        node_id => undef,
50
        node_id => '',
51
        node_id => $node_id,
52
      ]);
53
  }
54

  
55
  return $class->get_all(query => [ or => [ @interval_args, @once_args ], @node_filter ]);
41 56
}
42 57

  
43 58
1;
SL/DB/MetaSetup/BackgroundJob.pm
15 15
  id           => { type => 'serial', not_null => 1 },
16 16
  last_run_at  => { type => 'timestamp' },
17 17
  next_run_at  => { type => 'timestamp' },
18
  node_id      => { type => 'text' },
18 19
  package_name => { type => 'varchar', length => 255 },
19 20
  type         => { type => 'varchar', length => 255 },
20 21
);
SL/System/TaskServer.pm
11 11
use File::Slurp;
12 12
use File::Spec::Functions qw(:ALL);
13 13
use File::Temp;
14
use Sys::Hostname ();
14 15

  
15 16
use SL::System::Process;
16 17

  
......
22 23

  
23 24
use constant PID_BASE => "users/pid";
24 25

  
26
my $node_id;
27

  
25 28
sub status {
26 29
  my ($self) = @_;
27 30

  
......
63 66
  return kill('ALRM', $pid) ? 1 : undef;
64 67
}
65 68

  
69
sub node_id {
70
  return $node_id if $node_id;
71

  
72
  $node_id = ($::lx_office_conf{task_server} // {})->{node_id} || Sys::Hostname::hostname();
73

  
74
  return $node_id;
75
}
76

  
66 77
#
67 78
# private methods
68 79
#
config/kivitendo.conf.default
189 189
debug = 0
190 190
# Chose a system user the daemon should run under when started as root.
191 191
run_as =
192
# Task servers can run on multiple machines. Each needs its own unique
193
# ID. If unset, it defaults to the host name. All but one task server
194
# must have 'only_run_tasks_for_this_node' set to 1.
195
node_id =
196
only_run_tasks_for_this_node = 0
192 197

  
193 198
[task_server/notify_on_failure]
194 199
# If you want email notifications for failed jobs then set this to a
scripts/task_server.pl
322 322
    run_single_job_for_all_clients();
323 323
    return;
324 324
  }
325
  $::lxdebug->message(LXDebug::INFO(), "The task server for node " . SL::System::TaskServer::node_id() . " is up and running.");
325 326

  
326 327
  while (1) {
327 328
    $SIG{'ALRM'} = 'IGNORE';
sql/Pg-upgrade2/add_node_id_to_background_jobs.sql
1
-- @tag: add_node_id_to_background_jobs
2
-- @description: Spalte 'node_id' in 'background_jobs'
3
-- @depends: release_3_5_4
4
ALTER TABLE background_jobs
5
ADD COLUMN node_id TEXT;

Auch abrufbar als: Unified diff