Aaron Schulz has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/392221 )
Change subject: [WIP] Add mcrouter module and mcrouter_wancache profile ...................................................................... [WIP] Add mcrouter module and mcrouter_wancache profile Change-Id: I8b881a036c121c010f1f2c8e42ddbf266630c1b2 --- M hieradata/common.yaml M hieradata/labs/deployment-prep/common.yaml A modules/mcrouter/manifests/init.pp A modules/mcrouter/manifests/monitoring.pp A modules/mcrouter/templates/default.erb A modules/profile/manifests/mediawiki/mcrouter_wancache.pp M modules/role/manifests/deployment/mediawiki.pp 7 files changed, 238 insertions(+), 0 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/operations/puppet refs/changes/21/392221/10 diff --git a/hieradata/common.yaml b/hieradata/common.yaml index 099761c..ef0a85e 100644 --- a/hieradata/common.yaml +++ b/hieradata/common.yaml @@ -528,3 +528,44 @@ # HTTP proxy (can be used as an env variable) http_proxy: "http://webproxy.%{::site}.wmnet:8080" + +# Servers pools for multi-datacenter shared cache +mediawiki_wancache_memcached_servers: + eqiad: + - '10.64.0.80:11211:1' + - '10.64.0.81:11211:1' + - '10.64.0.82:11211:1' + - '10.64.0.83:11211:1' + - '10.64.0.84:11211:1' + - '10.64.16.107:11211:1' + - '10.64.16.108:11211:1' + - '10.64.16.109:11211:1' + - '10.64.16.110:11211:1' + - '10.64.32.208:11211:1' + - '10.64.32.209:11211:1' + - '10.64.32.210:11211:1' + - '10.64.32.211:11211:1' + - '10.64.32.212:11211:1' + - '10.64.48.155:11211:1' + - '10.64.48.156:11211:1' + - '10.64.48.157:11211:1' + - '10.64.48.158:11211:1' + codfw: + - '10.192.0.83:11211:1' + - '10.192.0.84:11211:1' + - '10.192.0.85:11211:1' + - '10.192.0.86:11211:1' + - '10.192.16.60:11211:1' + - '10.192.16.61:11211:1' + - '10.192.16.62:11211:1' + - '10.192.16.194:11211:1' + - '10.192.32.159:11211:1' + - '10.192.32.160:11211:1' + - '10.192.32.161:11211:1' + - '10.192.32.162:11211:1' + - '10.192.32.163:11211:1' + - '10.192.48.76:11211:1' + - '10.192.48.77:11211:1' + - '10.192.48.78:11211:1' + - '10.192.48.79:11211:1' + - '10.192.48.80:11211:1' \ No newline at end of file diff --git a/hieradata/labs/deployment-prep/common.yaml b/hieradata/labs/deployment-prep/common.yaml index 3c3fbe2..95ec636 100644 --- a/hieradata/labs/deployment-prep/common.yaml +++ b/hieradata/labs/deployment-prep/common.yaml @@ -148,6 +148,10 @@ mediawiki_memcached_servers: - 10.68.23.25:11211:1 # deployment-memc04 - 10.68.23.49:11211:1 # deployment-memc05 +mediawiki_wancache_memcached_servers: + eqiad: + - 10.68.23.25:11211:1 # deployment-memc04 + - 10.68.23.49:11211:1 # deployment-memc05 profile::memcached::version: 'present' profile::memcached::growth_factor: '1.05' profile::memcached::size: '3000' diff --git a/modules/mcrouter/manifests/init.pp b/modules/mcrouter/manifests/init.pp new file mode 100644 index 0000000..9c316a9 --- /dev/null +++ b/modules/mcrouter/manifests/init.pp @@ -0,0 +1,104 @@ +# == Class: mcrouter +# +# mcrouter is a fast routing proxy for memcached. +# It can reduce the connection count on the backend caching servers +# and also supports layered pools, replication, and key/operation +# based routing to pools. +# +# === Parameters +# +# [*pools*] +# A hash defining a mcrouter server pool. +# See <https://github.com/facebook/mcrouter/wiki/Config-Files>. +# +# [*route*] +# A hash defining a mcrouter routing policy. +# See <https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles>. +# +# [*region*] +# Datacenter name for the one in this geographical region +# +# [*cluster*] +# Memcached cluster name +# +# [*cross_region_timeout_ms*] +# Timeout, in milliseconds, when performing cross-region memcached operations +# +# [*cross_cluster_timeout_ms*] +# Timeout, in milliseconds, when performing cross-cluster memcached operations +# +# === Examples +# +# class { '::mcrouter': +# pools => { +# cluster-main' => { +# servers => [ '10.68.23.25:11211', '10.68.23.49:11211' ] +# } +# }, +# route => { +# type => 'OperationSelectorRoute', +# default_policy => 'PoolRoute|cluster-main', +# operation_policies => { +# set => 'AllFastestRoute|Pool|cluster-main', +# delete => 'AllSyncRoute|Pool|cluster-main' +# } +# } +# } +# +class mcrouter( + $pools, + $route, + $region, + $cluster, + $cross_region_timeout_ms, + $cross_cluster_timeout_ms, + $ensure = present +) { + validate_hash($pools) + validate_hash($route) + + require_package('mcrouter') + + $config = { 'pools' => $pools, 'route' => $route } + + file { '/etc/mcrouter/mcrouter.json': + ensure => $ensure, + content => ordered_json($config), + owner => 'root', + group => 'root', + mode => '0444', + require => Package['mcrouter'], + } + + if ( + $ensure == 'present' and + versioncmp($::puppetversion, '3.5') >= 0 and + versioncmp($::serverversion, '3.5') >= 0 + ) { + File['/etc/mcrouter/mcrouter.json'] { + validate_cmd => '/usr/sbin/mcrouter --validate-config --conf-file %', + } + } + + file { '/etc/default/mcrouter': + ensure => $ensure, + content => template('mcrouter/default.erb'), + owner => 'root', + group => 'root', + mode => '0444', + notify => Service['mcrouter'], + } + + file { '/etc/init/mcrouter.override': + ensure => $ensure, + content => "limit nofile 64000 64000\n", + owner => 'root', + group => 'root', + mode => '0444', + notify => Service['mcrouter'], + } + + service { 'mcrouter': + ensure => ensure_service($ensure), + } +} diff --git a/modules/mcrouter/manifests/monitoring.pp b/modules/mcrouter/manifests/monitoring.pp new file mode 100644 index 0000000..d0e9cd2 --- /dev/null +++ b/modules/mcrouter/manifests/monitoring.pp @@ -0,0 +1,17 @@ +# == Class: mcrouter::monitoring +# +# Provisions Icinga alerts for mcrouter. +# +class mcrouter::monitoring($port = 11213) { + nrpe::monitor_service { 'mcrouter': + description => 'mcrouter process', + nrpe_command => '/usr/lib/nagios/plugins/check_procs -c 1:1 -u mcrouter -C mcrouter', + } + + if ($port != 0) { + nrpe::monitor_service { 'mcrouter_port': + description => 'mcrouter port', + nrpe_command => "/usr/lib/nagios/plugins/check_tcp -H 127.0.0.1 -p ${port} --timeout=2", + } + } +} diff --git a/modules/mcrouter/templates/default.erb b/modules/mcrouter/templates/default.erb new file mode 100644 index 0000000..d9d2a2f --- /dev/null +++ b/modules/mcrouter/templates/default.erb @@ -0,0 +1,5 @@ +# Default settings for mcrouter. +# This file is managed by Puppet. + +DAEMON_OPTS="--route-prefix=<%= @region %>/<%= @cluster %> \ +--cross-region-timeout-ms=<%= @cross_region_timeout_ms %> --cross_cluster_timeout_ms=<%= @cross_cluster_timeout_ms %>" diff --git a/modules/profile/manifests/mediawiki/mcrouter_wancache.pp b/modules/profile/manifests/mediawiki/mcrouter_wancache.pp new file mode 100644 index 0000000..de01553 --- /dev/null +++ b/modules/profile/manifests/mediawiki/mcrouter_wancache.pp @@ -0,0 +1,62 @@ +# Class profile::mcrouter_wancache +# +# Configures a mcrouter instance for multi-datacenter caching +class profile::mediawiki::mcrouter_wancache( + $servers_by_datacenter = hiera('mediawiki_wancache_memcached_servers'), + $monitor_port = hiera('profile::mcrouter_wancache::monitor_port'), # set to 0 if no port available +) { + validate_hash($servers_by_datacenter) + + $pools = merge( $servers_by_datacenter.map |$region, $servers| { + { $region => { 'servers' => $servers } } + } ) + + $route = union( + $servers_by_datacenter.map |$region, $servers| { + { + 'aliases' => [ '/' + $region + '/mw/' ], + 'route' => 'PoolRoute|' + $region + } + }, + $servers_by_datacenter.map |$region, $servers| { + { + 'aliases' => [ '/' + $region + '/mw-wan/' ], + 'route' => { + 'type' => 'OperationSelectorRoute', + 'default_policy' => 'PoolRoute|' + $region, + 'operation_policies' => { + 'set' => 'AllFastestRoute|Pool|' + $region, + 'delete' => 'AllFastestRoute|Pool|' + $region + } + } + } + } + ) + + class { '::mcrouter': + pools => $pools, + route => $route, + region => $::site, + cluster => 'mw', + cross_region_timeout_ms => 250, + cross_cluster_timeout_ms => 1000 + } + + class { '::mcrouter::monitoring': + port => $monitor_port, + } + + ferm::rule { 'skip_mcrouter_wancache_conntrack_out': + desc => 'Skip outgoing connection tracking for mcrouter', + table => 'raw', + chain => 'OUTPUT', + rule => 'proto tcp sport (6378:6382 11212) NOTRACK;', + } + + ferm::rule { 'skip_mcrouter_wancache_conntrack_in': + desc => 'Skip incoming connection tracking for mcrouter', + table => 'raw', + chain => 'PREROUTING', + rule => 'proto tcp dport (6378:6382 11212) NOTRACK;', + } +} diff --git a/modules/role/manifests/deployment/mediawiki.pp b/modules/role/manifests/deployment/mediawiki.pp index 8cb17e8..5f28ea0 100644 --- a/modules/role/manifests/deployment/mediawiki.pp +++ b/modules/role/manifests/deployment/mediawiki.pp @@ -14,6 +14,11 @@ include ::profile::scap::dsh include ::scap::ferm + # mcrouter testing (T151466) + if $::realm == 'labs' { + include ::profile::mediawiki::mcrouter_wancache + } + # Keyholder require ::keyholder require ::keyholder::monitoring -- To view, visit https://gerrit.wikimedia.org/r/392221 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8b881a036c121c010f1f2c8e42ddbf266630c1b2 Gerrit-PatchSet: 10 Gerrit-Project: operations/puppet Gerrit-Branch: production Gerrit-Owner: Aaron Schulz <asch...@wikimedia.org> Gerrit-Reviewer: Imarlier <imarl...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits