
上面是Gearman的一个角色功能图,它在整个系统体系里面担任中间代理人的作用,负责接收和分配任务并返回结果。这样它能很好的胶合各个子系统从而实现项目目标。
之所以介绍这个,我是想将它用到MySQL的监控管理备份平台上,DB服务器上运行worker daemon连接到管理节点上,这样需要对DB进行动作的时候,只要在管理节点上通过gearman下达任务即可,而且不同的地方可以用最合适的语言去实现,实现开发效率和运行效率的平衡和统一。开发人员能给我们带来这么好的东东,实乃大幸。Gearman可用的地方非常多,它在一定程度上开阔了人的思路,提供了一个相对通用的解决方案。
---------- ---------- ---------- ----------
| Client | | Client | | Client | | Client |
---------- ---------- ---------- ----------
\ / \ /
\ / \ /
-------------- --------------
| Job Server | | Job Server |
-------------- --------------
| |
----------------------------------------------
| | | |
---------- ---------- ---------- ----------
| Worker | | Worker | | Worker | | Worker |
---------- ---------- ---------- ----------
Gearman的官方网站在这里
谭俊青 C, MySQL, news / tools
前段时间看innodb plugin源码的时候,看到有如下一段
include/univ.i
/* The 2-logarithm of UNIV_PAGE_SIZE: */
#define UNIV_PAGE_SIZE_SHIFT 14
/* The universal page size of the database */
#define UNIV_PAGE_SIZE (1 << UNIV_PAGE_SIZE_SHIFT)
/* Maximum number of parallel threads in a parallelized operation */
#define UNIV_MAX_PARALLELISM 32
尝试将 UNIV_PAGE_SIZE_SHIFT 改成13 (相当于page size为8K),编译通过并可以正常使用。
后来找到Google的MySQL团队发表的一篇文章,文中的介绍 Innodb page size 可以选择 8K、 16K、 32K、 64K。不过因为Innodb每个page都有不小的冗余空间,从空间和内存利用的角度来讲,page size越大越好。但是从checkpoint的角度来讲恰恰相反,page size越小,性能越好(上次演讲的时候我介绍过原理)。所以最后选择多大的page size可以根据实际的业务测试而定。
谭俊青 C, MySQL Innodb
有时候为了方便,利用event/trigger调用系统外部命令,可因为安全问题,mysql自身并没有提供相关命令,这里提供个调用系统命令的自定义函数mylab_sys_exec
so文件下载:mylab_sys_exec.so ( mysql5.1.34 测试通过)
加载:
CREATE FUNCTION mylab_sys_exec RETURNS INTEGER SONAME "mylab_sys_exec.so";
使用:
SELECT mylab_sys_exec (‘CMD’);
源码:
my_bool mylab_sys_exec_init
(UDF_INIT *initid, UDF_ARGS *args,
char *message
);
void mylab_sys_exec_deinit
(UDF_INIT *initid
);
int mylab_sys_exec
(UDF_INIT *initid, UDF_ARGS *args,
char *is_null,
char *error
);
my_bool mylab_sys_exec_init( UDF_INIT *initid, UDF_ARGS *args, char *message )
{
if(args->arg_count == 1 && args->arg_type[0]==STRING_RESULT)
{
return 0;
} else {
strcpy( message, "One string type parameter expected");
return 1;
}
}
void mylab_sys_exec_deinit ( UDF_INIT *initid ){}
int mylab_sys_exec( UDF_INIT *initid , UDF_ARGS *args , char *is_null , char *error )
{
return system (args->args[0]);
}
文章链接地址:mylab_sys_exec UDF调用mysql外部系统命令(For linux)
谭俊青 C, MySQL
随着数据量的增大,在数据库的扩展上通常遇到切分时保证键值的唯一性问题,遇到这种情况,通常有如下几种相对简单的解决方案:
1 UUID 这种方案的优点是实现和管理简单,缺点是占用空间大,查询效率低下。
2 Sequence Number 优点是实现和管理简单,确定是有性能瓶颈和单点问题。
3 不同的集群采用的起始点或者增长间隔不同 这种方案实现简单,但是后期管理麻烦。
除了上述解决方案之外其实还有很多简单可行的办法,但是通用性不太好,在各种解决方案的接触上,本人总结出一个实现和性能上都很好的解决方案,那就是采用时间戳加毫秒数再加随机数来解决,存储字段采用bigint。
下面给出php代码实现:
function ivan_fetch_unique_bigint_id
()
{
$start_timestamp =
1238119411;
$ivan_len =
3;
$time =
explode( ‘ ‘,
microtime());
$id =
($time[1] -
$start_timestamp) .
sprintf(‘%06u’,
substr($time[0],
2,
6));
if ($ivan_len >
0) {
$id .=
substr(sprintf(‘%010u’,
mt_rand()),
0,
$ivan_len);
}
return $id;
}
取模测试均分性很好。
–
转载请注明出处,谢谢。
–
谭俊青 C, MySQL
最近评论