分布式系统设计之DB类

本文探讨了分布式数据库系统的架构设计,包括WEB分布、CACHE分布和DB分布,并详细介绍了DB类的路由机制和多实例管理策略。通过实现一个简单的路由器,文章展示了如何实现在不同数据库实例之间的负载均衡和数据同步,旨在提高系统的可用性和性能。

有几层分布:
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])) {
        returnself::$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];
                returnself::$db;
            }
        }
    }
    $className= 'DB_' . self::$dbType[strtolower($dbInfo['dbType'])];
    self::$db[$dbKey] =new $className($dbInfo,$dbKey, $fetchMode);
    returnself::$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类会更为简练,当然最大的特性是支持分布- -!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值