155 lines
4.8 KiB
Plaintext
Executable File
155 lines
4.8 KiB
Plaintext
Executable File
# <www.danga.com>LiveJournal
|
|
|
|
DROP TABLE IF EXISTS domain;
|
|
CREATE TABLE domain (
|
|
dmid SMALLINT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (dmid),
|
|
|
|
namespace VARCHAR(255),
|
|
UNIQUE (namespace) # LiveJournal:<www.livejournal.com>, FotoBilder:<www.picpix.com>
|
|
|
|
);
|
|
|
|
# classes are tied to domains. domains can have classes of items
|
|
# with different mindevcounts.
|
|
#
|
|
# a minimum devcount is the number of copies the system tries to
|
|
# maintain for files in that class
|
|
#
|
|
# unspecified classname means classid=0 (implicit class), and that
|
|
# implies mindevcount=2
|
|
#
|
|
DROP TABLE IF EXISTS class;
|
|
CREATE TABLE class (
|
|
dmid SMALLINT UNSIGNED NOT NULL,
|
|
classid TINYINT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (dmid,classid),
|
|
classname VARCHAR(50),
|
|
UNIQUE (dmid,classname),
|
|
mindevcount TINYINT UNSIGNED NOT NULL
|
|
);
|
|
|
|
# the length field is only here for easy verifications of content
|
|
# integrity when copying around. no sums or content types or other
|
|
# metadata here. application can handle that.
|
|
#
|
|
# classid is what class of file this belongs to. for instance, on fotobilder
|
|
# there will be a class for original pictures (the ones the user uploaded)
|
|
# and a class for derived images (scaled down versions, thumbnails, greyscale, etc)
|
|
# each domain can setup classes and assign the minimum redundancy level for
|
|
# each class. fotobilder will use a 2 or 3 minimum copy redundancy for original
|
|
# photos and and a 1 minimum for derived images (which means the sole device
|
|
# for a derived image can die, bringing devcount to 0 for that file, but
|
|
# the application can recreate it from its original)
|
|
DROP TABLE IF EXISTS file;
|
|
CREATE TABLE file (
|
|
fid INT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (fid),
|
|
|
|
dmid SMALLINT UNSIGNED NOT NULL,
|
|
dkey VARCHAR(255), # domain-defined. LJ: "<userid>-<blobtype>-<blobid>"
|
|
UNIQUE dkey (dmid, dkey),
|
|
|
|
length INT UNSIGNED, # 4GB limit
|
|
|
|
classid TINYINT UNSIGNED NOT NULL,
|
|
devcount TINYINT UNSIGNED NOT NULL,
|
|
INDEX devcount (dmid,classid,devcount)
|
|
);
|
|
|
|
DROP TABLE IF EXISTS tempfile;
|
|
CREATE TABLE tempfile (
|
|
fid INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
|
PRIMARY KEY (fid),
|
|
|
|
createtime INT UNSIGNED NOT NULL,
|
|
classid TINYINT UNSIGNED NOT NULL,
|
|
dmid SMALLINT UNSIGNED NOT NULL,
|
|
dkey VARCHAR(255),
|
|
devids VARCHAR(60)
|
|
);
|
|
|
|
# files marked for death when their key is overwritten. then they get a new
|
|
# fid, but since the old row (with the old fid) had to be deleted immediately,
|
|
# we need a place to store the fid so an async job can delete the file from
|
|
# all devices.
|
|
DROP TABLE IF EXISTS file_to_delete;
|
|
CREATE TABLE file_to_delete (
|
|
fid INT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (fid)
|
|
);
|
|
|
|
# if the replicator notices that a fid has no sources, that file gets inserted
|
|
# into the unreachable_fids table. it is up to the application to actually
|
|
# handle fids stored in this table.
|
|
DROP TABLE IF EXISTS unreachable_fids;
|
|
CREATE TABLE unreachable_fids (
|
|
fid INT UNSIGNED NOT NULL,
|
|
lastupdate INT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (fid),
|
|
INDEX (lastupdate)
|
|
);
|
|
|
|
# what files are on what devices? (most likely physical devices,
|
|
# as logical devices of RAID arrays would be costly, and mogilefs
|
|
# already handles redundancy)
|
|
#
|
|
# the devid index lets us answer "What files were on this now-dead disk?"
|
|
#
|
|
DROP TABLE IF EXISTS file_on;
|
|
CREATE TABLE file_on (
|
|
fid INT UNSIGNED NOT NULL,
|
|
devid MEDIUMINT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (fid, devid),
|
|
INDEX (devid)
|
|
);
|
|
|
|
# if application or framework detects an error in one of the duplicate files
|
|
# for whatever reason, it can register its complaint and the framework
|
|
# will do some verifications and fix things up w/ an async job
|
|
# MAYBE: let application tell us the SHA1/MD5 of the file for us to check
|
|
# on the other devices?
|
|
DROP TABLE IF EXISTS file_on_corrupt;
|
|
CREATE TABLE file_on_corrupt (
|
|
fid INT UNSIGNED NOT NULL,
|
|
devid MEDIUMINT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (fid, devid)
|
|
);
|
|
|
|
DROP TABLE IF EXISTS device;
|
|
CREATE TABLE device (
|
|
devid MEDIUMINT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (devid),
|
|
|
|
hostid MEDIUMINT UNSIGNED NOT NULL,
|
|
|
|
status ENUM('alive','dead','down'),
|
|
INDEX (status),
|
|
|
|
mb_total MEDIUMINT UNSIGNED,
|
|
mb_used MEDIUMINT UNSIGNED,
|
|
mb_asof INT UNSIGNED
|
|
|
|
);
|
|
|
|
DROP TABLE IF EXISTS host;
|
|
CREATE TABLE host (
|
|
hostid MEDIUMINT UNSIGNED NOT NULL,
|
|
PRIMARY KEY (hostid),
|
|
|
|
status ENUM('alive','dead','down'),
|
|
http_port MEDIUMINT UNSIGNED DEFAULT 7500,
|
|
http_get_port MEDIUMINT UNSIGNED,
|
|
|
|
hostname VARCHAR(40),
|
|
UNIQUE (hostname),
|
|
hostip VARCHAR(15),
|
|
UNIQUE (hostip),
|
|
altip VARCHAR(15),
|
|
UNIQUE (altip),
|
|
altmask VARCHAR(18),
|
|
|
|
remoteroot VARCHAR(60)
|
|
);
|
|
|