Commit 03a6a3d5 authored by root's avatar root Committed by agata

switch to new hashing algorithm for hyperdb

parent a9c4a437
This diff is collapsed.
This diff is collapsed.
Uso di HyperDB con il piano R di A/I
------------------------------------
I database di noblogs sono distribuiti su piu' di un backend, utilizzando
un sistema di consistent hashing che associa ogni blog_id ad un backend
specifico.
L'elenco dei backend e' specificato nel file /etc/noblogs/backends.
Lo schema e' molto semplice e si basa sull'ID pubblico di ciascun server
(es, latitanza:1, confino:3, etc). Ogni server ha un database 'noblogs_ID'
(in /opt/noblogs/mysql), cui puo' accedere l'utente 'noblogsdb'.
<?php
function noblogs_load_backends($db_config_file, &$hashptr) {
global $wpdb;
$backend_map = array();
$fp = @fopen($db_config_file, "r");
if (!$fp) {
die("Database backends not configured!");
}
while (($line = fgets($fp, 1024)) !== false) {
if ($line[0] == '#') {
continue;
}
$line_parts = explode(" ", rtrim($line));
$server_id = $line_parts[0];
$dataset = "backend_" . $server_id;
$backend_url = $line_parts[2];
$backend_url_data = parse_url($backend_url);
$backend = array(
"host" => $backend_url_data["host"] . ":" . $backend_url_data["port"],
"user" => $backend_url_data["user"],
"password" => $backend_url_data["pass"],
"name" => substr($backend_url_data["path"], 1),
"dataset" => $dataset,
"read" => 1, "write" => 1, "timeout" => 2
);
$wpdb->add_database($backend);
$hashptr->addTarget($dataset);
$backend_map[$dataset] = $backend;
}
fclose($fp);
return $backend_map;
}
#!/opt/noblogs/cron/php-noblogs
<?php
// Load wordpress api.
define('WP_CACHE',false);
/** Setup WordPress environment */
require_once('wp-load.php');
require_once('db-config-new.php');
function old_hash($dbid) {
if (($dbid % 2) == 0) {
return array('host' => '172.16.1.3',
'port' => '3307',
'user' => 'noblogs',
'password' => 'n0bl0gst3st',
'db' => 'noblogs_2');
} else {
return array('host' => '172.16.1.8',
'port' => '3307',
'user' => 'noblogsusr',
'password' => 'n0bl0gsdb4xpw!',
'db' => 'noblogs');
}
}
function new_hash($dbid) {
global $wpdb_hash;
global $wpdb_reverse_backend_map;
$lookup = $wpdb_hash->lookup($dbid);
$backend = $wpdb_reverse_backend_map[$lookup];
$result = array();
if (preg_match('/^(.*):([0-9]*)$/', $backend['host'], $matches)) {
$result['host'] = $matches[1];
$result['port'] = $matches[2];
}
$result['user'] = $backend['user'];
$result['password'] = $backend['password'];
$result['db'] = $backend['name'];
return $result;
}
function mysqlopts(&$attrs) {
return ("-h" . $attrs['host'] . " -P" . $attrs['port'] . " -u" . $attrs['user']
. " '-p" . $attrs['password'] . "'");
}
function mysqlurl(&$attrs) {
return ("mysql://" . $attrs['user'] . "@" . $attrs['host']
. ":" . $attrs['port'] . "/" . $attrs['db']);
}
function get_all_blogs()
{
global $wpdb;
$sql = "SELECT blog_id, domain, path FROM $wpdb->blogs WHERE public = 1 AND deleted = 0 AND archived = '0' ORDER BY domain, path";
$result = $wpdb->get_results($sql);
return ($result);
}
$new_counts = array();
$moved_count = 0;
$blogs = get_all_blogs();
foreach ($blogs as $blog) {
$blog_id = $blog->blog_id;
$old_params = old_hash($blog_id);
$old_dburi = mysqlurl($old_params);
$new_params = new_hash($blog_id);
$new_dburi = mysqlurl($new_params);
if ($new_counts[$new_params['host']]) {
$new_counts[$new_params['host']] += 1;
} else {
$new_counts[$new_params['host']] = 1;
}
if ($old_dburi != $new_dburi) {
echo "echo moving blog $blog_id from " . $old_params['host'] . " to " . $new_params['host'] . "\n";
echo "tables=\$(mysql " . mysqlopts($old_params) . " " . $old_params['db'] . " -NBe \"show tables like 'wp\\_" . $blog_id . "\\_%'\")\n";
echo "mysqldump --opt " . mysqlopts($old_params) . " " . $old_params['db'] . " \${tables} \\\n";
echo " | mysql " . mysqlopts($new_params) . " " . $new_params['db'] . "\n";
$moved_count += 1;
} else {
echo "echo blog $blog_id stays on " . $old_params['host'] . "\n";
}
}
echo "\n\n\nBlog distribution:\n";
print_r($new_counts);
print "\n $moved_count blogs moved\n";
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment