最近想架构一个水平shards架构设计,暂时还是选定Mysql SpockProxy。这个在性能上还是可以的。现在就简单介绍一下我是如何架构和配置。
首先去官网去下载Mysql SpockProxy,接下就是安装和配置了。
./autogen.sh ./configure && make [code] 进入安装目录。老套路到bin中,这里我写一个shell脚本。这个脚本如下: [code] /usr/local/spockproxy/sbin/spockproxy --proxy-address=192.168.1.46:3325 --admin-address=192.168.1.46:3324 --partition-info-host=192.168.1.46 --partition-info-database=pn_cluster --db-user=btoc365 --db-user-password=123456
这样子这个服务就可以起来了。
重点在配置了,这会好好细细分析一下
看到上面配置有人会说为什么是这样子。
我就把这个服务结构图放进去一看大家就明白了。

这个服务代理逻辑都放到这张数据结构图中。
想必大家看了应该有所了解吧
这里我还是去这三张表给说明一下:
1.shard_database_directory
包含的主机名列表,数据库名称,端口,定义数据库服务器,代理服务器将连接到斯波克.这些都是在生活的碎片(注意:如果你只是测试他们没有对seporate机只是给他们不同的DB名称)。
database_id
auto-incrementing, unique ID
host_name
hostname
port_num
port number
database_name
database name
2.shard_table_directory
定义哪些表和列名分区,应该被重定向到一个特定的数据库连接(状态='联合'),哪些不是(状态='通用')。
table_id
auto-incrementing, unique ID
table_name
table name
status
federated (sharded) or universal (on one machine and replicated the all shards)
column_name
column to federate on, or NULL if this table is consolidated
next_id
the next id for this table (since auto_increment is different in the proxy)
increment_column
the automaticly incremented column.
3.shard_range_directory
一个查找表用于定义列的ID(在shard_table_directory定义)和哪个数据库(在shard_database_directory定义)范围内发送的命令.请注意,范围是所有表中的相同,让你可以在表的连接在同一个分区
range_id
auto-incrementing, unique ID
low_id
low boundary of the range for this shard
high_id
high boundary of the range for this shard
database_id
database ID from database_list table
至于这三张表每个字段是英文大家很简单暂时不做翻译呵呵
基本这里我的这个介绍已经差不多了。
不过还是把相关几个重点最后说明一下。
说到这里有人会问这个shards全局ID是如何呢。
4.get_next_id
这是一个存储功能,将增加shard_table_directory.increment_column.它用于插入语句作为AUTO_INCREMENT更换由代理.但你也可以调用它自己获得一个或多个ID为您的表的.
SELECT get_next_id('users', 10);
上述将返回表中的下一个ID的人可用,它增加了10.它总是返回一个整数,如果你问10开始在给定之一,使用下一个9.
其实这一步就是在你的数据库增加一个自定义函数;
这个SQL是这样子以及这三张表数据结构如下:
CREATE TABLE `shard_database_directory` (
`database_id` int unsigned NOT NULL auto_increment,
`host_name` varchar(255) NOT NULL,
`port_number` int NOT NULL default '3306',
`database_name` varchar(255) NOT NULL,
PRIMARY KEY (`database_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE `shard_table_directory` (
`table_id` int unsigned NOT NULL auto_increment,
`table_name` varchar(255) NOT NULL,
`status` enum('federated','universal') NOT NULL default 'universal',
`column_name` varchar(255) default NULL,
`next_id` bigint(20) default '0',
`increment_column` varchar(256) default NULL,
PRIMARY KEY (`table_id`),
KEY `name_status_column` (`table_name`,`status`,`column_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE `shard_range_directory` (
`range_id` int unsigned NOT NULL auto_increment,
`low_id` bigint(20) NOT NULL,
`high_id` bigint(20) NOT NULL,
`database_id` bigint(20) NOT NULL,
PRIMARY KEY (`range_id`),
KEY `id_range` (`low_id`,`high_id`,`database_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
delimiter $$
DROP FUNCTION IF EXISTS get_next_id $$
CREATE FUNCTION `get_next_id`($table varchar(255), $number_needed integer) RETURNS bigint(20)
MODIFIES SQL DATA
BEGIN
DECLARE $next_id bigint;
IF EXISTS(SELECT * FROM shard_table_directory WHERE table_name = $table) THEN
SELECT next_id INTO $next_id FROM shard_table_directory WHERE table_name = $table;
UPDATE shard_table_directory SET next_id = next_id + $number_needed WHERE table_name = $table;
RETURN $next_id;
ELSE
RETURN NULL;
END IF;
END
$$
delimiter ;
启动参数介绍
--proxy-address
代理服务器地址
--admin-address
代理服务器管理查询地址
--partition-info-host
代理服务器主机读取分区信息
--partition-info-database
代理服务器主机读取分区数据库名
--db-user
代理服务器主机读取分区数据库用户名
--db-user-password
代理服务器主机读取分区数据库用户密码
./spockproxy --proxy-address=127.0.0.1:3325 --admin-address=127.0.0.1:3324 --partition-info-host=database_name --partition-info-database=database_universal_production --db-user=database_user --db-user-password=abcdefg > ./spockproxy.log 2>./spockproxy.err
注意一下。在上面创建那个自定义函数可以不能建。其实这个很简单。
show variables like '%function%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin_trust_function_creators | OFF | +---------------------------------+-------+ set global log_bin_trust_function_creators=1; flush privileges; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | log_bin_trust_function_creators | ON | +---------------------------------+-------+
如果你想mysql启动后就可以把这个打开的话,可以在my.cnf 修改 log_bin_trust_function_creators=1
配置到这个已经是可以大功告成了。
接下来你下载这个包中目录下面sample中有三个SQL文件有一些测试数据这样让你可以更新去了解这个水平切分代理一个工作情况和一些底层配置。
相关对于这个开源水平切分代理服务器先讲到这里。接下来还会对于这个开源软件更加细的分析和讲解相关性能方面。








