Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add multi-data center config example #2

Open
misterbisson opened this issue Dec 14, 2015 · 0 comments
Open

Add multi-data center config example #2

misterbisson opened this issue Dec 14, 2015 · 0 comments

Comments

@misterbisson
Copy link
Contributor

If you look closely at the sample HyperDB config, you spot some details related to usage across data centers. Specifically, note the following:

    // dc is not used in hyperdb. This produces the desired effect of
    // trying to connect to local servers before remote servers. Also
    // increases time allowed for TCP responsiveness check.
    if ( !empty($dc) && defined(DATACENTER) && $dc != DATACENTER ) {
        if ( $read )
            $read += 10000;
        if ( $write ) 
            $write += 10000;
        $timeout = 0.7;
    }

Here's the larger context:

/**
 * This is back-compatible with an older config style. It is for convenience.
 * lhost, part, and dc were removed from hyperdb because the read and write
 * parameters provide enough power to achieve the desired effects via config.
 *
 * @param string $dataset Datset: the name of the dataset. Just use "global" if you don't need horizontal partitioning.
 * @param int $part Partition: the vertical partition number (1, 2, 3, etc.). Use "0" if you don't need vertical partitioning.
 * @param string $dc Datacenter: where the database server is located. Airport codes are convenient. Use whatever.
 * @param int $read Read group: tries all servers in lowest number group before trying higher number group. Typical: 1 for slaves, 2 for master. This will cause reads to go to slaves unless all slaves are unreachable. Zero for no reads.
 * @param bool $write Write flag: is this server writable? Works the same as $read. Typical: 1 for master, 0 for slaves.
 * @param string $host Internet address: host:port of server on internet. 
 * @param string $lhost Local address: host:port of server for use when in same datacenter. Leave empty if no local address exists.
 * @param string $name Database name.
 * @param string $user Database user.
 * @param string $password Database password.
 */
function add_db_server($dataset, $part, $dc, $read, $write, $host, $lhost, $name, $user, $password, $timeout = 0.2 ) {
    global $wpdb;

    // dc is not used in hyperdb. This produces the desired effect of
    // trying to connect to local servers before remote servers. Also
    // increases time allowed for TCP responsiveness check.
    if ( !empty($dc) && defined(DATACENTER) && $dc != DATACENTER ) {
        if ( $read )
            $read += 10000;
        if ( $write ) 
            $write += 10000;
        $timeout = 0.7;
    }

    // You'll need a hyperdb::add_callback() callback function to use partitioning.
    // $wpdb->add_callback( 'my_func' );
    if ( $part )
        $dataset = $dataset . '_' . $part;

    $database = compact('dataset', 'read', 'write', 'host', 'name', 'user', 'password', 'timeout');

    $wpdb->add_database($database);

    // lhost is not used in hyperdb. This configures hyperdb with an
    // additional server to represent the local hostname so it tries to
    // connect over the private interface before the public one.
    if ( !empty( $lhost ) ) {
        if ( $read )
            $database['read'] = $read - 0.5;
        if ( $write )
            $database['write'] = $write - 0.5;
        $wpdb->add_database( $database );
    }
}

Implementing that will require a lot more work in setting up cross-data center networking, but it's worth noting and marking as a project.

misterbisson added a commit that referenced this issue Apr 5, 2016

Verified

This commit was signed with the committer’s verified signature.
ctrlcctrlv Fredrick Brennan
nfs WIP 04/04/2106
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant