简单的描述一下我的疑惑:比如:QQ登陆,这个逻辑。我在前端放了一台网关服务器,负责负载均衡,将客户端引导到指定的Serve服务器(根据业务规模,机器数量做横向扩展)。客户端到Server服务器,将会进行登陆验证,那么需要去DB里查询该用户的账号信息。
现在问题是:假设有20台Server服务器,每台Server每秒承载2000的登录量,所以面临20台Server并发查询DB的问题。假设DB服务器采用apache的prefork来接受Serve的长连接,也就是DB服务器有20个子进程做并发DB查询。我之前考虑这个压力好像没什么,DB每一时刻不过就是20个查询一同发起,这个对一个DB来说算不了什么吧?(问题1)尤其是innorDB引擎的情况下,行锁提供的并发能力不容忽视.  
=========================================================================================================再有一个疑问,这个应该属于分布式的疑问.假设我现在就是要20台用户账号信息的DB,我想让注册的账号信息均匀的散布在这些DB里,而且能够满足Server服务器O(1)时间定位到其中一个DB完成查询。有一致性哈希专门做这种问题,包括一定的容灾能力,但毕竟还是逃不出哈希函数,有什么牛逼的索引方法可以做一个用户ID到所在DB服务器的映射么?

解决方案 »

  1.   


    有一点先声明,我问有没有什么索引方法做用户ID->DB服务器的映射,主要考虑是这样设计相当于把负载压力转移到了索引服务器. 这样想来想去,负载总会落在某个单台服务器的瓶颈上,谁给我点破迷雾呢.
      

  2.   

    是我小看了网络传输速率和计算机的执行速度么....现在市面上的IM架构在涉及到DB的部分通常做法是什么.
      

  3.   

    1.20个并发查询算什么;
    2.InnoDB引擎的事务槽是有限制的,但是查询是不加锁的,所以没有被限制的能力,只要把一些服务器端参数配置好,这点可以参考文章:http://www.mysqlops.com/2011/10/26/mysql-variable-one.html3.若是你们做IM的话,能吸收到多少用户账号信息,这点非常关键,言外之意:不要轻易考虑分布式,这样会把系统搞复杂了,以及成本和维护都增加非常大,可能对你们公司发展不利,等用户真上那个量了,可以平稳过渡地切换;4.对于用户数据的问题,有2种办法:HASH和路由表法 ,先阅读文章:
    http://www.mysqlops.com/2011/06/28/distribute-database-architecture.html 
    然后再看其上的其他关联文章最后一点建议:
    依然建议不要轻易拆分,你若只是认证账号的话,若是想提供性能还有一招 MySQL+MC OR redis,
    相信你们用数据库不会有任何问题,因为InnoDB引擎的话,多分配点内存给innodb_buffer_pool_size 数据一读热就基本上是内存的查找了,可以非常快的,毫秒级别;若是该数据库服务实例只是用户验证数据的话,再打开query_cahce_type 那么可以再提高速度,甚至平均降到毫秒以下的可能性。#****************************************#
    MySQL技术及运维自动化网:www.mysqlops.com新浪微博账号:http://weibo.com/mysqlops
    #****************************************#  
      

  4.   

    首先,你说每台服务器每秒2000个登录请求的话,我怀疑你20个数据库长连接是否能达到要求,个人经验类似登录操作还是使用短连接+连接池比较合适。其次,对于应用服务器的横向扩展能力,你已经20台服务器了,一个DB显然已经是无法承受对应压力的。需要采用memcache或者master/slave这类支持分布式的读写分离技术。对于登录操作,重复不会太多,memcache不是太适合,建议用master/slave方式。
      

  5.   


    memcached对于登陆这一块的确不合适。20台应用服务器并发访问1个DB的压力应该是因为缓慢的DB操作+20台服务器大流量对网卡缓冲的压力。master/slave刚才去了解了一下,请问slave定期同步master数据,如果应用服务器被分配到slave上读取数据,结果没有找到,这时候应该转回master去读取,对么。
      

  6.   

    这是你理解上的偏差master和slave是保持同步的,你可以理解为副本,而且是分布式的,一个master可对应多个slave,并支持负载均衡。
      

  7.   


    网上说,slave是定时去拉取Master的log进行同步的,那么如果某一个访问slave发生在拉取之前,那么可能是得不到那个数据的,我理解错了么。。
      

  8.   

    master slave一般是做在一个网段内  基本可以保证实时