博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分布式系统设计之DB类(来自深空老大)
阅读量:6953 次
发布时间:2019-06-27

本文共 1624 字,大约阅读时间需要 5 分钟。

hot3.png

这可能是个庞大的话题,没有亲自作过相关系统。

可能有几层分布:
1、WEB分布,这个只需LVS支持即可,状态保持不保持无所谓,可以通过PHPSESSID来保持这个会话。因而接入服务器仅作为接入之用,存储转到后端,这里要保持接入机无用户文件还是比较难的,有时候保存一些可能会使系统更简单一些。
2、CACHE分布,接入机统一处理会话,根据规则命中某台特定CACHE机,当然,这里的CACHE机器不仅限于如MEMCACHED、XCACHE等,简单的方法可以直接使用DB代替,如MEMORY表,这样后端数据和CACHE的同步规则就需要自己定制,效率也可能没有自动完成CACHE<->DB双向更新的效率高。
3、DB分布,这里认为CACHE和DB也可用应用程序来控制访问,而不一定需要CACHE本身来完成,至于效率降低多少不清楚,个人觉得可以在后台设置一些定时调度脚本来更新CACHE,和将CACHE中的数据转存到后端DB。当然DB和CACHE的数量不一定是一一对应,如果CACHE多,那么DB存储可能会相应减少,这里需要测试一个平衡。
我在DB里设计了一个简单的路由器,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public
static
function
&init(&
$dsn
,
$dbKey
,
$fetchMode
= self::DB_FETCH_ASSOC) {
    
if
(isset(self::
$db
[
$dbKey
])) {
        
return
self::
$db
;
    
}
    
$route
= Route::init();
    
$dbInfo
=
$route
->getDbRoute(
$dsn
,
$dbKey
);
    
//这里要检测DB相同DBINFO的实例是否存在,如果存在则直接返回引用
    
if
(
is_array
(self::
$db
)) {
        
foreach
(self::
$db
as
$key
=>
$value
) {
            
if
(self::
$db
[
$key
]->dsn ==
$dbInfo
) {
                
self::
$db
[
$dbKey
] = self::
$db
[
$key
];
                
return
self::
$db
;
            
}
        
}
    
}
    
$className
=
'DB_'
. self::
$dbType
[
strtolower
(
$dbInfo
[
'dbType'
])];
    
self::
$db
[
$dbKey
] =
new
$className
(
$dbInfo
,
$dbKey
,
$fetchMode
);
    
return
self::
$db
;
}

根据规则获取需要的DSN,然后返回一个DB,貌似这个路由很简单,很雷人:

1
2
3
4
5
6
7
8
9
10
public
function
getDbRoute(&
$dsn
,
$dbKey
) {
    
global
$_configs
;
    
if
(
$_configs
[
'route'
][
'db'
][
$dbKey
]) {
        
if
(
$_configs
[
'route'
][
'db'
][
$dbKey
][
'routeRule'
] ==
'rand'
) {
            
return
$dsn
[
$dbKey
][
array_rand
(
$dsn
[
$dbKey
])];
        
}
    
}
else
{
        
return
$dsn
[
$dbKey
];
    
}
}

当然路由规则是可以写进配置文件的,这里我默认写了个随机进行测试,发现可行,HOHO。一个规则可行,那么取模等规则当然也可行。

改进后的DB类会更为简练,当然最大的特性是支持分布- -!!

转载于:https://my.oschina.net/tenking/blog/28575

你可能感兴趣的文章
主元素
查看>>
ASP.NET夜话笔记10
查看>>
SQL语句修改多条记录某一字段的值
查看>>
CSS注意事项(一)
查看>>
滴滴出行跨出国门,再战Uber胜算有多大?
查看>>
山寨文化的博弈论解读
查看>>
ZCS证书的重新签发
查看>>
Python 之time模块
查看>>
备份 Outlook 2010 中接收到的邮件和联系人
查看>>
用open***组建lan to lan ***
查看>>
我的友情链接
查看>>
Vuejs学习系列(十七)--模板语法(三)
查看>>
Invalid source HTML for this operation , Error In IE
查看>>
Linux服务器间建立双向信任-无密码相互访问
查看>>
【COCOS2D-HTML5 开发之二】cocos2d-html5项目定义成员,局部变量,函数笔记随笔
查看>>
我的友情链接
查看>>
Linux grub设置密码
查看>>
学习方式
查看>>
常用DOS命令补充
查看>>
rsync与inotify
查看>>