Add Redis as a Pacemaker resource
authorYanis Guenane <yanis.guenane@enovance.com>
Wed, 13 May 2015 11:02:47 +0000 (13:02 +0200)
committerYanis Guenane <yanis.guenane@enovance.com>
Fri, 5 Jun 2015 21:40:44 +0000 (23:40 +0200)
Change-Id: I731b408f24da01c1bc897bfffe8fd4d5638932ed

controller.yaml
environments/puppet-pacemaker.yaml
overcloud-without-mergepy.yaml
puppet/controller-puppet.yaml
puppet/manifests/overcloud_controller_pacemaker.pp

index 82cff3f..efd73da 100644 (file)
@@ -364,6 +364,9 @@ parameters:
     default: 5672
     description: Set rabbit subscriber port, change this if using SSL
     type: number
+  RedisVirtualIP:
+    type: string
+    default: ''  # Has to be here because of the ignored empty value bug
   SnmpdReadonlyUserName:
     default: ro_snmp_user
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
index f235cf8..70e1b3e 100644 (file)
@@ -2,3 +2,6 @@
 # Overcloud controller with Pacemaker.
 resource_registry:
   OS::TripleO::ControllerConfig: ../puppet/controller-config-pacemaker.yaml
+
+parameter_defaults:
+  RedisVirtualIP: 192.0.2.142
index 61dcc3b..8c2c86e 100644 (file)
@@ -399,6 +399,9 @@ parameters:
         Specifies the interface where the public-facing virtual ip will be assigned.
         This should be int_public when a VLAN is being used.
     type: string
+  RedisVirtualIP:
+    type: string
+    default: ''  # Has to be here because of the ignored empty value bug
   SSLCertificate:
     default: ''
     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
@@ -655,6 +658,7 @@ resources:
           RabbitClientPort: {get_param: RabbitClientPort}
           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
+          RedisVirtualIP: {get_param: RedisVirtualIP}
           SSLCertificate: {get_param: SSLCertificate}
           SSLKey: {get_param: SSLKey}
           SSLCACertificate: {get_param: SSLCACertificate}
index ff3f933..c5ade57 100644 (file)
@@ -368,6 +368,9 @@ parameters:
     default: 5672
     description: Set rabbit subscriber port, change this if using SSL
     type: number
+  RedisVirtualIP:
+    type: string
+    default: ''  # Has to be here because of the ignored empty value bug
   SnmpdReadonlyUserName:
     default: ro_snmp_user
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
@@ -741,6 +744,7 @@ resources:
         horizon_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
         rabbitmq_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
         redis_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
+        redis_vip: {get_param: RedisVirtualIP}
         memcached_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
         mysql_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
         ceph_cluster_network: {get_attr: [NetIpSubnetMap, net_ip_map, {get_param: [ServiceNetMap, CephClusterNetwork]}]}
@@ -966,6 +970,7 @@ resources:
                 rabbitmq::erlang_cookie: {get_input: rabbit_cookie}
                 # Redis
                 redis::bind: {get_input: redis_network}
+                redis_vip: {get_input: redis_vip}
                 # Misc
                 memcached::listen_ip: {get_input: memcached_network}
                 neutron_public_interface_ip: {get_input: neutron_public_interface_ip}
index 695724b..48e625a 100644 (file)
@@ -55,6 +55,7 @@ if hiera('step') >= 1 {
   class { '::tripleo::loadbalancer' :
     controller_hosts       => $controller_node_ips,
     controller_hosts_names => $controller_node_names,
+    redis                  => false,
     manage_vip             => false,
     haproxy_service_manage => false,
   }
@@ -109,6 +110,13 @@ if hiera('step') >= 1 {
     service_manage => false,
   }
 
+  # Redis
+  class { '::redis' :
+    bind           => '0.0.0.0',
+    service_manage => false,
+    notify_service => false,
+  }
+
   # Galera
   if str2bool(hiera('enable_galera', 'true')) {
     $mysql_config_file = '/etc/my.cnf.d/galera.cnf'
@@ -246,25 +254,35 @@ if hiera('step') >= 2 {
       require         => Class['::mysql::server'],
       before          => Exec['galera-ready'],
     }
-  }
-
-  # Redis
-  $redis_node_ips = hiera('redis_node_ips')
-  $redis_master_hostname = downcase(hiera('bootstrap_nodeid'))
 
-  if $redis_master_hostname == $::hostname {
-    $slaveof = undef
-  } else {
-    $slaveof = "${redis_master_hostname} 6379"
-  }
-  class {'::redis' :
-    slaveof => $slaveof,
-  }
+    pacemaker::resource::ocf { 'redis':
+      ocf_agent_name  => 'heartbeat:redis',
+      master_params   => '',
+      meta_params     => 'notify=true ordered=true interleave=true',
+      resource_params => 'wait_last_known_master=true',
+      require         => Class['::redis'],
+    }
+    $redis_vip = hiera('redis_vip')
+    pacemaker::resource::ip { 'vip-redis':
+      ip_address => $redis_vip,
+    }
+    pacemaker::constraint::base { 'redis-master-then-vip-redis':
+      constraint_type => 'order',
+      first_resource  => 'redis-master',
+      second_resource => "ip-${redis_vip}",
+      first_action    => 'promote',
+      second_action   => 'start',
+      require => [Pacemaker::Resource::Ocf['redis'],
+                  Pacemaker::Resource::Ip['vip-redis']],
+    }
+    pacemaker::constraint::colocation { 'vip-redis-with-redis-master':
+      source  => "ip-${redis_vip}",
+      target  => 'redis-master',
+      score   => 'INFINITY',
+      require => [Pacemaker::Resource::Ocf['redis'],
+                  Pacemaker::Resource::Ip['vip-redis']],
+    }
 
-  if count($redis_node_ips) > 1 {
-    Class['::tripleo::redis_notification'] -> Service['redis-sentinel']
-    include ::redis::sentinel
-    include ::tripleo::redis_notification
   }
 
   exec { 'galera-ready' :
@@ -1175,6 +1193,15 @@ if hiera('step') >= 4 {
                             Pacemaker::Resource::Service[$::mongodb::params::service_name]],
       }
     }
+    pacemaker::constraint::base { 'vip-redis-then-ceilometer-central':
+      constraint_type => 'order',
+      first_resource  => "ip-${redis_vip}",
+      second_resource => "${::ceilometer::params::agent_central_service_name}-clone",
+      first_action    => 'start',
+      second_action   => 'start',
+      require => [Pacemaker::Resource::Service[$::ceilometer::params::agent_central_service_name],
+                  Pacemaker::Resource::Ip['vip-redis']],
+    }
     pacemaker::constraint::base { 'keystone-then-ceilometer-central-constraint':
       constraint_type => 'order',
       first_resource  => "${::keystone::params::service_name}-clone",