MediaWiki REL1_40
Wikimedia\Rdbms\LBFactoryMulti Class Reference

LoadBalancer manager for sites with several "main" database clusters. More...

Inherits Wikimedia\Rdbms\LBFactory.

Collaboration diagram for Wikimedia\Rdbms\LBFactoryMulti:

Public Member Functions

 __construct (array $conf)
 Template override precedence (highest => lowest):
 
 getAllExternalLBs ()
 Get the tracked load balancer instances for all external clusters.
 
 getAllMainLBs ()
 Get the tracked load balancer instances for all main clusters.
 
 getExternalLB ( $cluster)
 Get the tracked load balancer instance for an external cluster.
 
 getMainLB ( $domain=false)
 Get the tracked load balancer instance for the main cluster that handles the given domain.
 
 newExternalLB ( $cluster)
 Create a new load balancer instance for an external cluster.
 
 newMainLB ( $domain=false)
 Create a new load balancer instance for the main cluster that handles the given domain.
 
 reconfigure (array $conf)
 Reconfigure using the given config array.
 
- Public Member Functions inherited from Wikimedia\Rdbms\LBFactory
 appendShutdownCPIndexAsQuery ( $url, $index)
 Append ?cpPosIndex parameter to a URL for ChronologyProtector purposes if needed.
 
 autoReconfigure ()
 Reload config using the callback passed defined $config['configCallback'].
 
 beginPrimaryChanges ( $fname=__METHOD__)
 Flush any primary transaction snapshots and set DBO_TRX (if DBO_DEFAULT is set)
 
 closeAll ( $fname=__METHOD__)
 Close all connections on instantiated tracked load balancer instances.
 
 commitAndWaitForReplication ( $fname, $ticket, array $opts=[])
 Commit primary DB transactions and wait for replication (if $ticket indicates it is safe).
 
 commitPrimaryChanges ( $fname=__METHOD__, int $maxWriteDuration=0)
 Commit changes and clear view snapshots on all primary connections.
 
 destroy ()
 Close all connections and make further attempts to open connections result in DBAccessError.
 
 disableChronologyProtection ()
 Disable the ChronologyProtector on all instantiated tracked load balancer instances.
 
 flushPrimarySessions ( $fname=__METHOD__)
 Release important session-level state (named lock, table locks) as post-rollback cleanup.
 
 flushReplicaSnapshots ( $fname=__METHOD__)
 Commit all replica database server transactions, clearing any REPEATABLE-READ/SSI snapshots.
 
 getAllLBs ()
 Get all tracked load balancer instances (generator)
 
 getChronologyProtectorTouched ( $domain=false)
 Get the UNIX timestamp when the client last touched the DB, if they did so recently.
 
 getEmptyTransactionTicket ( $fname)
 Get a token asserting that no write transactions are active on tracked connections.
 
 getLocalDomainID ()
 Get the local (and default) database domain ID of connection handles.
 
 getPrimaryDatabase ( $domain=false)
 Get connection to the primary database.
 
 getReplicaDatabase ( $domain=false, $group=null)
 Get connection to a replica database.
 
 getTransactionProfiler ()
 Get the TransactionProfiler used by this instance.
 
 hasOrMadeRecentPrimaryChanges ( $age=null)
 Determine if any primary connection has pending/written changes from this request.
 
 hasPrimaryChanges ()
 Determine if any primary connection has pending changes.
 
 hasTransactionRound ()
 Check if an explicit transaction round is active.
 
 isReadyForRoundOperations ()
 Check if transaction rounds can be started, committed, or rolled back right now.
 
 laggedReplicaUsed ()
 Determine if any lagged replica database server connection was used.
 
 redefineLocalDomain ( $domain)
 Close all connections and redefine the local database domain.
 
 resolveDomainID ( $domain)
 
 rollbackPrimaryChanges ( $fname=__METHOD__)
 Rollback changes on all primary connections.
 
 setAgentName ( $agent)
 
 setDefaultReplicationWaitTimeout ( $seconds)
 Set the default timeout for replication wait checks.
 
 setDomainAliases (array $aliases)
 Convert certain database domains to alternative ones.
 
 setIndexAliases (array $aliases)
 Convert certain index names to alternative names before querying the DB.
 
 setLocalDomainPrefix ( $prefix)
 Set a new table prefix for the existing local domain ID for testing.
 
 setMockTime (&$time)
 
 setRequestInfo (array $info)
 Inject HTTP request header/cookie information during setup of this instance.
 
 setTableAliases (array $aliases)
 Make certain table names use their own database, schema, and table prefix when passed into SQL queries pre-escaped and without a qualified database name.
 
 setWaitForReplicationListener ( $name, callable $callback=null)
 Add a callback to be run in every call to waitForReplication() before waiting.
 
 shutdown ( $flags=self::SHUTDOWN_NORMAL, callable $workCallback=null, &$cpIndex=null, &$cpClientId=null)
 Prepare all instantiated tracked load balancer instances for shutdown.
 
 waitForReplication (array $opts=[])
 Waits for the replica database server to catch up to the current primary position.
 

Protected Member Functions

 getLBsForOwner ()
 Get all tracked load balancers with the internal "for owner" interface.
 
- Protected Member Functions inherited from Wikimedia\Rdbms\LBFactory
 baseLoadBalancerParams ()
 Get parameters to ILoadBalancer::__construct()
 
 configure (array $conf)
 
 getChronologyProtector ()
 
 initLoadBalancer (ILoadBalancerForOwner $lb)
 
 resolveDomainInstance ( $domain)
 
 shutdownChronologyProtector (ChronologyProtector $cp, &$cpIndex=null)
 Get and record all of the staged DB positions into persistent memory storage.
 

Additional Inherited Members

- Static Public Member Functions inherited from Wikimedia\Rdbms\LBFactory
static getCPInfoFromCookieValue (?string $value, int $minTimestamp)
 Parse a string conveying the client and write index of the chronology protector data.
 
static makeCookieValueFromCPIndex (int $writeIndex, int $time, string $clientId)
 Build a string conveying the client and write index of the chronology protector data.
 
- Public Attributes inherited from Wikimedia\Rdbms\ILBFactory
const SHUTDOWN_NO_CHRONPROT = 1
 Do not save "session consistency" DB replication positions.
 
const SHUTDOWN_NORMAL = 0
 Idiom for "no special shutdown flags".
 
- Protected Attributes inherited from Wikimedia\Rdbms\LBFactory
BagOStuff $cpStash
 
DatabaseFactory $databaseFactory
 
DatabaseDomain $localDomain
 Local domain.
 
string false $readOnlyReason = false
 Reason all LBs are read-only or false if not.
 
BagOStuff $srvCache
 
WANObjectCache $wanCache
 

Detailed Description

LoadBalancer manager for sites with several "main" database clusters.

Each database cluster consists of a "primary" server and any number of replica servers, all of which converge, as soon as possible, to contain the same schemas and records. If a replication topology has multiple primaries, then the "primary" is merely the preferred co-primary for the current context (e.g. datacenter).

For single-primary topologies, the schemas and records of the primary define the "dataset". For multiple-primary topologies, the "dataset" is the convergent result of applying/merging all committed events (regardless of the co-primary they originated on); it possible that no co-primary has yet converged upon this state at any given time (especially when there are frequent writes and co-primaries are geographically distant).

A "main" cluster contain a "main" dataset, which consists of data that is compact, highly relational (e.g. read by JOIN queries), and essential to one or more sites. The "external" clusters each store an "external" dataset, which consists of data that is non-relational (e.g. key/value pairs), self-contained (e.g. JOIN queries and transactions thereof never involve a main dataset), or too bulky to reside in a main dataset (e.g. text blobs).

The class allows for large site farms to split up their data in the following ways:

  • Vertically shard compact site-specific data by site (e.g. page/comment metadata)
  • Vertically shard compact global data by module (e.g. account/notification data)
  • Horizontally shard any bulk data by blob key (e.g. page/comment content blobs)

Definition at line 53 of file LBFactoryMulti.php.

Constructor & Destructor Documentation

◆ __construct()

Wikimedia\Rdbms\LBFactoryMulti::__construct ( array $conf)

Template override precedence (highest => lowest):

  • templateOverridesByServer
  • masterTemplateOverrides
  • templateOverridesBySection/templateOverridesByCluster
  • externalTemplateOverrides
  • serverTemplate Overrides only work on top level keys (so nested values will not be merged).

Server config maps should be of the format Database::factory() requires. Additionally, a 'max lag' key should also be set on server maps, indicating how stale the data can be before the load balancer tries to avoid using it. The map can have 'is static' set to disable blocking replication sync checks (intended for archive servers with unchanging data).

See also
LBFactory::__construct()
Parameters
array$confAdditional parameters include:
  • hostsByName: map of (server name => IP address). [optional]
  • sectionsByDB: map of (database => main section). The database name "DEFAULT" is interpreted as a catch-all for all databases not otherwise mentioned. If no section name is specified for "DEFAULT", then the catch-all section is assumed to be named "DEFAULT". [optional]
  • sectionLoads: map of (main section => server name => load ratio); the first host listed in each section is the primary DB server for that section. [optional]
  • groupLoadsBySection: map of (main section => group => server name => group load ratio). Any ILoadBalancer::GROUP_GENERIC group will be ignored. [optional]
  • externalLoads: map of (cluster => server name => load ratio) map. [optional]
  • serverTemplate: server config map for Database::factory(). Note that "host", "serverName" and "load" entries will be overridden by "groupLoadsBySection" and "hostsByName". [optional]
  • externalTemplateOverrides: server config map overrides for external stores; respects the override precedence described above. [optional]
  • templateOverridesBySection: map of (main section => server config map overrides); respects the override precedence described above. [optional]
  • templateOverridesByCluster: map of (external cluster => server config map overrides); respects the override precedence described above. [optional]
  • masterTemplateOverrides: server config map overrides for masters; respects the override precedence described above. [optional]
  • templateOverridesByServer: map of (server name => server config map overrides); respects the override precedence described above and applies to both core and external storage. [optional]
  • loadMonitor: LoadMonitor::__construct() parameters with "class" field. [optional]
  • readOnlyBySection: map of (main section => message text or false). String values make sections read only, whereas anything else does not restrict read/write mode. [optional]
  • configCallback: A callback that returns a conf array that can be passed to the reconfigure() method. This will be used to autoReconfigure() to load any updated configuration.

Reimplemented from Wikimedia\Rdbms\LBFactory.

Definition at line 133 of file LBFactoryMulti.php.

References Wikimedia\Rdbms\ILoadBalancer\GROUP_GENERIC.

Member Function Documentation

◆ getAllExternalLBs()

Wikimedia\Rdbms\LBFactoryMulti::getAllExternalLBs ( )

Get the tracked load balancer instances for all external clusters.

If no tracked instance exists for a cluster, then one will be instantiated

Returns
ILoadBalancer[] Map of (cluster name => ILoadBalancer)
Since
1.29

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 240 of file LBFactoryMulti.php.

◆ getAllMainLBs()

Wikimedia\Rdbms\LBFactoryMulti::getAllMainLBs ( )

Get the tracked load balancer instances for all main clusters.

If no tracked instance exists for a cluster, then one will be instantiated

Note that default main cluster name is ILoadBalancer::CLUSTER_MAIN_DEFAULT

Returns
ILoadBalancer[] Map of (cluster name => ILoadBalancer)
Since
1.29

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 229 of file LBFactoryMulti.php.

◆ getExternalLB()

Wikimedia\Rdbms\LBFactoryMulti::getExternalLB ( $cluster)

Get the tracked load balancer instance for an external cluster.

If no tracked instances exists, then one will be instantiated

Parameters
string$clusterExternal cluster name
Exceptions
InvalidArgumentExceptionIf $cluster is not recognized
Returns
ILoadBalancer

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 219 of file LBFactoryMulti.php.

◆ getLBsForOwner()

Wikimedia\Rdbms\LBFactoryMulti::getLBsForOwner ( )
protected

Get all tracked load balancers with the internal "for owner" interface.

Most subclasses override this, we just provide an implementation here for the benefit of Wikibase's FakeLBFactory.

Returns
Generator|ILoadBalancerForOwner[]

Reimplemented from Wikimedia\Rdbms\LBFactory.

Definition at line 249 of file LBFactoryMulti.php.

◆ getMainLB()

Wikimedia\Rdbms\LBFactoryMulti::getMainLB ( $domain = false)

Get the tracked load balancer instance for the main cluster that handles the given domain.

If no tracked instances exists, then one will be instantiated

Note
The local/default database domain used by the load balancer instance will still inherit from this ILBFactory instance, regardless of the $domain parameter.
Parameters
string | false$domainDomain ID, or false for the current domain
Returns
ILoadBalancer

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 192 of file LBFactoryMulti.php.

◆ newExternalLB()

Wikimedia\Rdbms\LBFactoryMulti::newExternalLB ( $cluster)

Create a new load balancer instance for an external cluster.

The resulting object will be untracked and the caller is responsible for cleaning it up. Database replication positions will not be saved by ChronologyProtector.

This method is for only advanced usage and callers should almost always use getExternalLB() instead. This method can be useful when a table is used as a key/value store. In that cases, one might want to query it in autocommit mode (DBO_TRX off) but still use DBO_TRX transaction rounds on other tables.

Parameters
string$clusterExternal cluster name
Exceptions
InvalidArgumentExceptionIf $cluster is not recognized
Returns
ILoadBalancerForOwner

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 203 of file LBFactoryMulti.php.

◆ newMainLB()

Wikimedia\Rdbms\LBFactoryMulti::newMainLB ( $domain = false)

Create a new load balancer instance for the main cluster that handles the given domain.

The resulting object will be untracked and the caller is responsible for cleaning it up. Database replication positions will not be saved by ChronologyProtector.

This method is for only advanced usage and callers should almost always use getMainLB() instead. This method can be useful when a table is used as a key/value store. In that cases, one might want to query it in autocommit mode (DBO_TRX off) but still use DBO_TRX transaction rounds on other tables.

Note
The local/default database domain used by the load balancer instance will still inherit from this ILBFactory instance, regardless of the $domain parameter.
Parameters
string | false$domainDomain ID, or false for the current domain
Returns
ILoadBalancerForOwner

Implements Wikimedia\Rdbms\ILBFactory.

Definition at line 169 of file LBFactoryMulti.php.

◆ reconfigure()

Wikimedia\Rdbms\LBFactoryMulti::reconfigure ( array $conf)

Reconfigure using the given config array.

Any fields omitted from $conf will be taken from the current config.

If the config changed, this calls reconfigure() on all load balancers, which causes them to close all existing connections.

Note
This invalidates the current transaction ticket.
Warning
This must only be called in top level code such as the execute() method of a maintenance script. Any database connection in use when this method is called will become defunct.
Since
1.39
Parameters
array$confA configuration array, using the same structure as the one passed to the constructor (see also $wgLBFactoryConf).

Reimplemented from Wikimedia\Rdbms\LBFactory.

Definition at line 349 of file LBFactoryMulti.php.


The documentation for this class was generated from the following file: