精华内容
下载资源
问答
  • 游戏服务器之中心服务器

    千次阅读 2014-02-17 20:05:41
    中心服务器是控制消息流程和服务器启动使用的。 功能: 1、控制服务器启动验证。 2、转发其他服务器的消息到其他服务器。 3、控制重登陆。 本文内容: 1、中心服务器初始化 2、其他类型服务器的启动验证 3、转发...

    中心服务器是连接其他服务器并控制其他服务器的中心枢纽。


    设计上:

    (1)控制消息转发流程

    (1-1)中心服务器的全局连接管理器管理其他服务器连接到中心服务器的连接 (g_center_session_manager)。

    (1-2)登录连接管理器管理连接到登录服务器的会话。

    (1-3)gm连接管理器管理连接到gm服务器的会话。

    (2)其他服务器启动控制

    根据服务器表来控制其他服务器启动依赖关系。动态服务器需要等待静态服务器启动了才能启动。

    (3)登录流程控制

    (3-1)登录临时会话管理器管理临时登陆会话。

      (3-2)加入登录临时会话到登录管理器。如果已有该登录会话(表示同一连接正在登录中),并且中心角色在线,那么发送强行存档到网关。

    (3-3)登录成功就添加账号到中心服务器(适用于账号与角色一一对应的情况)。如果该玩家已登录就注销该玩家。已经登陆但找不到用户就移除该账号。成功登录,就发送消息到网关。 


    1、中心服务器初始化

    初始化mysql句柄池,从数据库获取中心服务器配置,初始化网络被动连接线程池,初始化网络主动连接线程池,主动连接到登录服务器(和gm服务器),
    绑定服务器端口(初始化监听socket,设置收发缓冲区大小(窗口大小128k),并把监听socket注册到epoll描述符里)


    bool center_server::init()
    {
    mysqlPool = new mysql_handle_pool();
    if (NULL == mysqlPool
    || !mysqlPool->putUrl(0, g_xml_config.get_string("Global.MYSQL.Config")))
    {
    g_log->error("连接数据库失败");
    return false;
    }
    
    strncpy(pstrIP, tcp_socket::getIPByIfName(g_xml_config.get_string("Global.NetCard.Config")), MAX_IP_LENGTH - 1);
    
    if (!getServerInfo())//从数据库或配置文件获取中心服务器的配置
    return false;
    
    //初始化连接线程池(网络被动连接线程池)
    taskPool = new tcp_session_pool(g_xml_config.get_integer("Global.ThreadCarryLink.Config"));
    if (NULL == taskPool || !taskPool->init())
    return false;
    
    //初始化客户端连接池(网络主动连接线程池)
    clientPool = new tcp_client_pool(8,50000);
    if (NULL == clientPool || !clientPool->init())
    return false;
        if(!login_client::init(clientPool))//主动连接到登录服务器
    {
    g_log->error("初始化登陆服务器模块...失败");
    return false;
    }
    
    #ifdef GMSERVER
        if(!gm_client::init(clientPool))//主动连接到gm服务器
      {
      g_log->error("初始化登陆服务器模块...失败");
      return false;
      }
    #endif
    
    g_log->info("初始化登陆服务器模块...成功");
    if( !g_main_logic_thread.start())
    {
    g_log->error("初始化main_logic_thread模块...失败");
    return false;
    }
    g_log->info("初始化main_logic_thread模块...成功");
    
    
    if (!server_base::bind_socket(wdPort))//绑定服务器端口(初始化监听socket,设置收发缓冲区大小(窗口大小128k),并把监听socket注册到epoll描述符里)
    {
    return false;
    }
    
    return true;
    }


    2、其他类型服务器的启动验证

    (1)检查服务器依赖 

    检查服务器依赖,如果其他被依赖的服务器都启动了就可以通知该服务器来启动

    除了中心服务器、登录服务器、运营服务器,其他服务器需要等待静态服务器的启动之后才能启动。

    服务器之间依赖的标准来自于数据库的静态表。

    静态服务器:全局唯一并在数据库服务器表中配了的都是,如db服务器、中心服务器、登录服务器、运营服务器、社会关系服务器。

    动态服务器:可启动多个的,如场景服务器和网关服务器。

     

    int center_session::waitSync()
    {
    ...
    unsigned char ptrmsg[tcp_socket::MAX_DATASIZE];
    int msglen = mSocket.recvToCmd_NoPoll(ptrmsg, sizeof(ptrmsg));
    if (msglen > 0)
    {
    using namespace MSG::Server;
    
    stOKStartServerCmd *ptCmd = (stOKStartServerCmd *)ptrmsg;//服务器启动了会发送这个消息来表明其已经启动
      
    if (START_SERVERCMD == ptCmd->first
    && OK_START_SERVERCMD_PARA == ptCmd->second
    && id == ptCmd->ServerID)
    {
    sendmsg(ptCmd,sizeof(stOKStartServerCmd));
    //debug("客户端连接同步验证成功");
    g_log->error("服务器连接同步验证成功,收到消息(%u,%u)",ptCmd->first,ptCmd->second);
    return 1;
    }
    else
    {
    return 0;
    }
    }
    if(!hasNotifyOther && _sequence_timer(main_logic_thread::currentTime) 
    && g_center_session_manager.checkDependence(getType()))//检查服务器依赖,如果其他被依赖的服务器都启动了就可以通知该服务器来启动
    {
    if(notifyOther())
    {
    hasNotifyOther=true; 
    }
    }
    if(!hasNotifyMe && hasNotifyOther && notifyReturnOk())
    {
    hasNotifyMe=true; 
    notifyMe();
    }
    return 0;
    }

    (2)获取数据库中的服务器依赖

    检查服务器的服务器之间依赖,检查其他服务器依赖的静态服务器是否都已经启动。
    中心服务器的连接管理器中可检查获取其他服务器对中心服务器的连接,以此来判断其他服务器是否启动了并连接上中心服务器。

    const bool center_session_manager::checkDependence(uint16 type)
    {
    mysql_record_set *recordset=NULL;
    std::ostringstream oss;
    mysql_record column,where;
    mysql_handle *handle = center_server::mysqlPool->getHandle();
    if (!handle)
    {
    g_log->error("不能从数据库连接池获取连接句柄");
    return false;
    }
    //除了中心服务器、登录服务器、运营服务器,其他服务器需要等待静态服务器的启动之后才能启动
    oss << "type<" << type << " and type!=" << CENTERSERVER << " and type!= " \
    << LOGINSERVER << " and type!= " << OPERATIONLOGSERVER;
    where.put("type",oss.str());
    column.put("id");
    column.put("dynamic");
    column.put("name");
    recordset = handle->exeSelect("SERVERLIST",&column,&where);
    unsigned int i;
    bool bret=true;
    if(recordset)
    {
    g_log->debug("服务器类型:%d找到依赖服务器个数:%d",type,recordset->size());
    for(i = 0; i < recordset->size(); i++)
    {
    center_session *task = g_center_session_manager.getTaskByID((uint16)recordset->get(i)->getvalue("id"));
    uint32 dynamic = recordset->get(i)->getvalue("dynamic");
    if(!dynamic && (!task || task->getState() != tcp_session::okay || !task->notifyMeRetornOk()))
    {
    g_log->debug("等待服务器:%s的启动",(const char *)recordset->get(i)->getvalue("name"));
    bret=false;
    break;
    }
    }
    }
    SAFE_DELETE(recordset);
    center_server::mysqlPool->putHandle(handle);
    return bret;
    }

    3、转发服务器消息

    (1)转发系统消息

    转发服务器消息和广播服务器之间消息(这里接口是处理服务器启动、关闭和系统时间等系统消息)。
    其中:中心连接管理器包含所有被动连接。登录连接管理器包含到登录服务器的连接。

    bool center_session::msgParseStart(const MSG::base_msg *ptrMsg, const unsigned int msglen)
    {
    ...
    case TIMESYNC_START_SERVERCMD_PARA://调整服务器的时间
    {
    stTimeSyncStartServerCmd *rev = (stTimeSyncStartServerCmd *)ptrMsg;
    realtime::set_timesync(rev->sync_sec);
    g_log->debug("调整系统时间相对值:%d",rev->sync_sec);
    g_center_session_manager.broadcast(rev,sizeof(stTimeSyncStartServerCmd));//转发到连接中心会话的其他服务器
    g_login_client_manager.broadcast(rev, sizeof(stTimeSyncStartServerCmd));//转发到登录服务器
    return true;
    }
    break;
    case SHUTDOWN_START_SERVERCMD_PARA://广播服务器关闭消息(服务器关闭需要发送消息到中心服务器)
    {
    stShutdownStartServerCmd *rev = (stShutdownStartServerCmd *)ptrMsg;
    //其他服务器会连接中心服务器,关闭时发送这个消息过来,中心服务器再广播到所有连接它的服务器
    g_center_session_manager.broadcast(rev,sizeof(stShutdownStartServerCmd));
    return true;
    }
    break;
    ...
    }


    (2)转发和处理逻辑消息

    转发服务器消息和广播服务器之间消息。
    使用直发包头消息:其他服务器发来的直发消息,不再转发到其他服务器了。

    使用转发包头消息:服务器之间的消息通过中心服务器转发的消息,和中心服务器主动发送的消息

    (这里的是处理角色登录消息(处理登录、登出、换场景消息,往中心服务器增减中心服务器玩家))。

    stFLServerForwardServerCmd 是服务器之间转发消息在普通消息上加的包头,含服务器id字段和数据长度字段(普通消息长度)


    bool center_session::msgParseForward(const MSG::base_msg *ptrMsg, const unsigned int msglen)
    {
    case SEND_USERCMD_TO_SERVERUSER_FORWARD_SERVERCMD://其他服务器发来的直发消息(不再转发到其他服务器了),会使用这个直发包头
    {
    stSendplayerCmdToServerplayerForwardServerCmd *rev = (stSendplayerCmdToServerplayerForwardServerCmd *)ptrMsg;
    center_player* pplayer = g_center_player_manager.get_player_by_id(rev->charid);
    if(pplayer)
    {
    pplayer->usermsgParse((MSG::base_msg *)rev->data, rev->datasize());//处理中心服务器角色终结、注销、挂起、锁定
    }
    return true;
    }
    break;
    case FL_SERVER_FORWARD_SERVERCMD:
    {
    //服务器之间的消息通过中心服务器转发和中心服务器主动发送的转发消息会使用一个转发包头
    stFLServerForwardServerCmd *rev = (stFLServerForwardServerCmd *)ptrMsg;
    if(!rev->id)//转发消息不解析消息体,根据消息头的服务器id转发到对应的服务器上
    {
    g_login_client_manager.broadcast(rev->data, rev->datasize());//广播登录消息到登录服务器(连接到登录服务器的连接管理器)
    }
    else
    {
    g_login_client_manager.broadcastToID(rev->id,rev->data, rev->datasize());//广播登录消息到登录服务器(按服务器id)
    }
    return true;
    }
    break;
    case SHARE_FORWARD_SERVERCMD:服务器之间的消息通过中心服务器转发和中心服务器主动发送的登录消息会使用一个转发包头 (处理登录相关消息)
    {
    stShareForwardServerCmd *rev = (stShareForwardServerCmd *)ptrMsg;
    loginmsgParse((MSG::base_msg*)rev->data,rev->datasize());//处理角色登录消息(处理登录、登出、换场景消息,往中心服务器增减中心服务器玩家)
    return true;
    }
    break;
    ...
    }

    其中:转发消息构造方式

    uint8 buf[tcp_socket::MAX_DATASIZE];
    MSG::Server::stFLServerForwardServerCmd *sendmsg=(MSG::Server::stFLServerForwardServerCmd *)buf;
    constructInPlace(sendmsg);//构造对象,  模板函数placement new : template<class T> inline void constructInPlace(T  *_Ptr){ new ((void  *)_Ptr) T();}
    sendmsg->id = serverid;
    sendmsg->num=msglen;
    bcopy(ptrmsg,sendmsg->data,msglen);//拷贝消息数据到转发消息体


    4、登陆控制

    (1)中心服务器处理登录服务器连接发来的登录消息 

    处理登录中心角色的流程:

    1)加入登录临时会话到登录管理器

    2)下线存档正在在线的玩家

    3)如果角色在线,那么强行存档

    4)添加账号到中心服务器

    5)如果该玩家已登录就注销该玩家

    6)已经登陆但找不到用户就移除该账号

    7)开始登录,发送消息到网关

    8)成功登录

    bool login_client::msgparser_login(const MSG::base_msg *ptrMsg,const unsigned int msglen)
    {
    switch(ptrMsg->second)
    {
    using namespace MSG::FL;
     
    case MSG::FL::PARA_SESSION_NEWSESSION://登录服务器发来的登录消息
    {
    t_NewLoginMsg *rev = (t_NewLoginMsg *)ptrMsg;
    t_NewLoginMsg  newsession;
    newsession.session = rev->session;
                 
    LoginCommand *loginSession = new LoginCommand(rev->session);
    
    if(loginSession)
    {
    bool ok = true;
    (1-1)加入登录临时会话到登录管理器
    if(!g_loginsession_mgr.addSession(loginSession))//g_loginsession_mgr.addSession 可以查看该玩家是否还在登录流程
    {
    //账号正在网关登陆,有玩家的话就需要进行下线处理(存档和提示前端)
    error_log("账号正在网关登陆%s(%u,%u)",rev->session.account,rev->session.accid,rev->session.loginTempID);
    ok = false;//登录失败,有该玩家正在登录
    }
    (1-2)下线存档正在在线的玩家
      center_player *c_player = g_center_player_manager.get_player_by_accid(rev->session.accid);
      if(c_player) 如果角色在线。那么强行存档
     {
       MSG::Share::t_Force_Save_Player_Data send;
       send.charid = c_player->id;
       strncpy(send.name, c_player->name.c_str(), MAX_NAME_LEN);
       debug_log("角色下线:%u,%s", c_player->id, c_player->name.c_str());
    
       MSG::center::stTerminateErrorcenterCmd logoutsend;
       logoutsend.accid = rev->session.accid;
       c_player->terminate_error = false;
       if(c_player->gateway)
       {
          debug_log("通知网关:%u 角色下线:%u,%s", c_player->gateway->id, c_player->id, c_player->name.c_str());
          c_player->gateway->sendmsg(&logoutsend,sizeof(logoutsend));
       }
    ......
    }
    (1-3)添加账号到中心服务器
    if(ok && !g_center_player_manager.addAccid(rev->session.accid, rev->session.wdGatewayID))
    {
    (1-4)如果该玩家已登录就注销该玩家
    center_player *user = g_center_player_manager.get_player_by_accid(rev->session.accid);
    if(user)//注销该玩家
    {
    if( user->terminate_error )//(1-5)该玩家终结有误的发送终结消息
    {
    info_log("错误终止消息");
    MSG::center::stTerminateErrorcenterCmd send;
    send.accid = rev->session.accid;
    user->terminate_error = false;
    user->gateway->sendmsg(&send,sizeof(send));
    }
    if(!user->terminate_unreg)//(1-6)还没注销的玩家就是重登录,发送终结消息给原来的客户端
    {
    MSG::center::stTerminateErrorcenterCmd send;
    send.accid = rev->session.accid;
    user->terminate_error = false;
    user->gateway->sendmsg(&send,sizeof(send));                               
    warn_log("警告,【%s,%u】试图从别处登陆该游戏帐号",user->name.c_str(), user->id);
     ok = true;
    }
    }
    else
    {
    //(1-7)已经登陆但找不到用户就移除该账号
    error_log("已经登陆但找不到用户,%s(%u,%u)",rev->session.account, rev->session.accid,rev->session.loginTempID);
    g_loginsession_mgr.removeSession(loginSession);
    SAFE_DELETE(loginSession);
    g_center_player_manager.removeAccid(rev->session.accid);
    ok = false;
    return false;
    }
    }
     (1-8)开始登录,发送消息到网关
    if(ok && !g_login_client_manager.sendmsgToGateway(newsession.session.wdGatewayID, &newsession,sizeof(newsession)))
    {
    error_log("帐号%s(%u,%u)登陆时网关已经关闭",rev->session.account, rev->session.accid,rev->session.loginTempID);
    g_loginsession_mgr.removeSession(loginSession);
    SAFE_DELETE(loginSession);
    g_center_player_manager.removeAccid(rev->session.accid);
    ok = false;
    return true;
    }
    
    //成功登录(或重登录)
    debug_log("帐号登陆%s(%u,%u,%u)",rev->session.account, rev->session.accid,rev->session.loginTempID,rev->session.wdGatewayID);
    }
    return true;
    }
    break;
    default:
    break;
    }
    
    g_log->error("%s(%u, %u, %u)", __PRETTY_FUNCTION__, ptrMsg->first, ptrMsg->second, msglen);
    return false;
    }


    (2)登录临时会话管理

    删除过期的会话,删除中心服务器账号。

    在中心服务器的逻辑线程循环里遍历删除需要删除的会话列表:

    LoginVerifyTimeOut exec(main_logic_thread::currentTime);
    g_loginsession_mgr.traverse(exec);
    for(std::list<LoginCommand *>::iterator iter = exec._del.begin() ; iter != exec._del.end() ; ++ iter)
    {
    g_log->debug("通知网关删除Social:(%d,%d)", (*iter)->accid, (*iter)->loginTempID);
    g_loginsession_mgr.removeSession(*iter);
    SAFE_DELETE(*iter);
    }





    展开全文
  • 基于GitStack搭建Git中心服务器

    千次阅读 2014-03-14 16:33:58
    在Git常用命令的使用情景中提到过多人协作的项目往往是需要一个中心服务器来同步多人之间的工作成果,另外,最终的工作成果通常也是中心服务器上的代码为准(为了项目管理的需要),因此,备份时往往需要对中心...

    通过前一段时间对Git的学习,基本掌握了Git常用命令的使用方法,并进行了总结,有兴趣的可以看看Git常用命令的使用情景Git学习笔记

    Git常用命令的使用情景中提到过多人协作的项目往往是需要一个中心服务器来同步多人之间的工作成果,另外,最终的工作成果通常也是中心服务器上的代码为准(为了项目管理的需要),因此,备份时往往需要对中心服务器上的仓库进行刻盘。

    中心服务器上创建的项目仓库一般为裸仓库(没有工作目录),且需要为项目开发人员设置访问和操作中心服务器上仓库的权限(访问、读、写)。

    本文将介绍如何使用开源软件GitStack在Windows上搭建Git中心服务器。

    为了学习如何在Windows上搭建Git服务器,用Google搜索了一下,发现多数的方案是采用CopSSH + msysgit + PuTTY的方式来实现,这种方案使用SSH协议(采用公钥和私钥进行身份验证,用PuTTY可以产生公钥和私钥,关于公钥和私钥可参考这篇入门介绍)与Git服务器通信,在安全性上应该来说是比较高的,但缺点就是搭建过程比较麻烦,且要清楚一些概念才知道自己在做什么,因此对新手来说有一定的难度。

    另外,让我暂时没采用这种的方案的原因是CopSSH已经不再免费了(找到一个免费的版本Copssh 3.0.3,需要将icwbase-2.0.3-patch-100.exe这个补丁拷贝到Copssh的安装目录下运行来修复回退键和左右方向键不能正常的问题),对于喜欢开源软件的我来说,还是希望能够找到其他的开源软件来代替。

    关于这种方案的几篇文章:

    另外,还有一种采用Gitolite来搭建的方案,可参考Gitolite构建Git服务器,讲的很详细。

    无意之中,通过google发现了GitStack,查看了官方文档,感觉不需要做什么特殊的设置就可以在Windows上搭建Git服务器,并且对用户权限的设置也很简单,故决定下载下来试用一下,测试下来果然很方便,且在Client端也成功进行了clone和push等操作(虽然中间遇到一个问题,后面会提到)。

    为了以后有个参考,特在此记录下用GitStack搭建Git服务器的主要过程。

    工具列表:

    下载并安装GitStack

    到其官方网站上下载最新版的GitStack 1.4.1

    安装文件有100M,要注意的是,目前GitStack只支持下面几个系统(不支持Windows XP):

    • Windows Server 2008
    • Windows Server 2008 R2
    • Windows Vista
    • Windows 7

    另外,GitStack是一个新的开源软件(可以看看release的历史),目前有些功能可能还不是很完善,文档也不是很全面,好在GitStack并不复杂。

    安装和普通的Windows软件一样,双击安装包自动进行安装,要注意的是最好其安装路径中不要包括空格,所以不建议安装到C:\Program Files下,默认是安装到C:\GitStack下。

    安装好GitStack后,下面主要就是配置GitStack和仓库管理。

    提醒一下,只需要在服务器上安装GitStack即可,其他的客户机上是不要安装的。安装好GitStack后,可以在任意机器上通过浏览器登录到Git服务器上(当然实际上只有仓库的管理员才有权限登录)。

    GitStack的配置

    在服务器上,可以通过开始菜单找到GitStack打开,也可以直接打开浏览器,在地址栏里输入http://localhost/gitstack/打开登录界面。

    另外,也可以通过server机的IP地址来登录,如server的IP地址为:192.168.0.105,则可以直接在浏览器的地址栏中输入 http://192.168.0.105/gitstack/打开登录界面(注意在客户机上只能使用这种方式来打开登录界面,通过ipconfig可以 查看本机的IP地址)。

    初始状态下,默认的登录账户为admin,登录密码也为admin。管理员登录后可在Settings->General中修改admin的登录密码。

    勾选Enable web based repository browsing选项开启在浏览器中直接查看Git仓库的内容。

    另外还有两个Repositories和Users & Groups两个界面,其中在Repositories中可以在服务器上创建项目的裸仓库,直接输入仓库名(如输入ProjectRepos),然后点击 Create按钮即可(会在服务器C:\GitStack\repositories下创建一个ProjectRepos.git裸仓库),创建好的仓库 也会在Repositories中显示出来,并显示出该仓库的clone的地址git clone http://localhost/ProjectRepos.git,之后就可以在Action下通过浏览器查看仓库、添加用户/Group并设置用户 /Group权限等。

    在Users & Groups中,Users下是用来创建用户或修改用户密码等,每个用户对应一个Username和其Password,已有的用户会在上面的列表中显示 出来;Groups下用于创建组,可以在每个Group下添加或移除用户,已有的Group也会在列表中显示出来。

    gitstack_1.5

    牛刀小试

    上述已经在服务器上创建了一个ProjectRepos.git裸仓库,现在我们在服务器上来克隆该仓库。

    1
    2
    3
    4
    
    cd d:
    mkdir project
    cd project
    git clone http://192.168.0.105/ProjectRepos LocalRepos 或 git clone http://localhost/ProjectRepos LocalRepos 或 git clone http://localhost:80/ProjectRepos LocalRepos
    

    默认的是80端口,可以修改为其他端口。 这里,会提示输入用户名和密码,注意输入的用户名和密码不会被显示出来。

    cd LocalRepos 进入了工作目录,我们可以添加文件到工作区,并提交到本地仓库中。

    然后,将本地修改推送到服务器的仓库里:git push origin master,这里会提示输入用户名和密码,注意输入的用户名和密码不会被显示出来。 通过git remote -v,我们可以查看origin对应的服务器上的仓库地址。

    这时打开GitStack,可以看到服务器上仓库有了提交的内容。

    在客户机上克隆服务器的仓库到本地

    先在客户机上安装msysgit 1.7.10。

    1
    2
    3
    4
    
    cd d:
    mkdir project
    cd project
    git clone http://192.168.0.105/ProjectRepos LocalRepos
    

    这里,会提示输入用户名和密码,注意输入的用户名和密码不会被显示出来。

    cd LocalRepos 进入了工作目录,我们可以添加文件到工作区,并提交到本地仓库中。

    然后,将本地修改推送到服务器的仓库里:git push origin master,这里会提示输入用户名和密码,注意输入的用户名和密码不会被显示出来。 通过git remote -v,我们可以查看origin对应的服务器上的仓库地址。

    这时打开GitStack,可以看到服务器上仓库有了提交的内容。

    在客户机上也可以打开GitStack,直接在浏览器的地址栏中输入http://192.168.0.105/gitstack/打开登录界面,当然这需要知道管理员密码。

    (这里要注意的是,要保证在客户机上能够成功打开GitStack或者从服务器上克隆仓库,必须将服务器的防火墙关闭,否则在客户机上的这些操作就会失败。这个问题一直困扰了我好几个小时。)

    可见,服务器和客户机在操作上已经没有什么区别了,这正是Git作为分布式版本控制系统的体现。

    (全文完)

    展开全文
  • 由于数据中心服务器的形态差异(机架式服务器、刀片服务器),POD中服务器机柜和网络机柜的布线方式也存在差异。本文介绍EOR、MOR、TOR和刀片服务器几种数据中心布线方式的特点和差异。  数据中心机房平面布局通常...

    由于数据中心服务器的形态差异(机架式服务器、刀片服务器),POD中服务器机柜和网络机柜的布线方式也存在差异。本文介绍EOR、MOR、TOR和刀片服务器几种数据中心布线方式的特点和差异。

      数据中心机房平面布局通常采用矩形结构,为了保证制冷效果,通常将 10 至 20 个机柜背靠背并排放置成一行,形成一对机柜组(又称为一个POD)。POD中的机柜都采用前后通风模式,冷空气从机柜前面板的吸入并从后部排出,由此在机柜背靠背摆放的POD中间形成 “热通道”,相邻的两个POD之间形成“冷通道”。热通道正对CRAC(机房空调),热空气沿热通道流回CRAC,再开始新一次循环。

      如下图,每个POD由服务器机柜和网络机柜组成,其中服务器机柜占多数。由于服务器的形态差异(机架式服务器、刀片服务器),POD中服务器机柜和网络机柜的布线方式也存在差异。

    \

      机架式服务器的布线方式:交换机EOR(End of Row)布线方式

      采用交换机EOR布线方式时,每个POD中的两排机柜的最边端摆放2个网络机柜,POD中所有的服务器机柜安装配线架,配线架上的铜缆延伸到POD最边端网络机柜,网络机柜中安装接入交换机。机架式服务器安装在服务器机柜中,服务器网卡通过跳线(铜缆)连接机柜中的配线架,如图所示。

    \

      交换机EOR布线方式特点:

      交换机EOR布线方式最为常见。通常在服务器和接入交换机安装以前,服务器机柜到网络机柜的布线施工已经完成,设备(服务器/交换机)安装和跳线工作都在服务器机柜内和网络机柜内进行。

      如果每台机架式服务器的功率为500W,且每个服务器机柜的电源输出功率按4KW或6KW计算,则一个42U高度的服务器机柜能安装8-12台机架式服务器。

      EOR布线方式的缺点:从服务器机柜到网络机柜的铜缆多(约有20-40根铜缆),且距网络机柜越远的服务器机柜的铜缆,在机房中的布线距离越长,由此导致线缆管理维护工作量大、灵活性差。

      交换机MOR(Middle of Row)布线是对EOR布线方式的改进。MOR方式的网络机柜部署在POD的两排机柜的中部,由此可以减少从服务器机柜到网络机柜的线缆距离,简化线缆管理维护工作。

      机架式服务器的布线方式:交换机TOR(Top of Rack)布线方式(真正大型数据中心的部署方案)

      交换机TOR布线方式是对EOR/MOR方式的扩展,采用TOR布线时,POD中每个服务器机柜的上端部署1-2台两台接入交换机,机架式服务器通过跳线接入到机柜内的交换机上,交换机上行端口通过铜缆或光线接入到EOR/MOR的网络机柜中的汇聚交换上。如图所示

    \

      TOR布线方式特点:

      TOR布线方式简化了服务器机柜与网络机柜间的布线,从每个服务器机柜到EOR/MOR的网络机柜的光纤或铜缆数量较少(4-6根)。

      机柜中服务器的密度高。对于标准的19英寸宽,42U高的机柜,如果采用交换机TOR布线方式,则每个机柜可部署15-30台1U高度的机架式服务器(具体数量需要考虑单台服务器的功耗和机柜的电源输出功率)。

      TOR布线的缺点:每个服务器机柜受电源输出功率限制,可部署的服务器数量有限,由此导致机柜内交换机的接入端口利用率不足。在几个服务器机柜间共用1-2台接入交换机,可解决交换机端口利用率不足的问题,但这种方式增加了线缆管理工作量。

      从网络设计考虑,TOR布线方式的每台接入交换机上的VLAN量不会很多,在网络规划的时候也要尽量避免使一个VLAN通过汇聚交换机跨多台接入交换机,因此采用TOR布线方式的网络拓扑中,每个VLAN的范围不会太大,包含的端口数量不会太多。但对于EOR布线方式来说,接入交换机的端口密度高,在网路最初设计时,就可能存在包含较多端口数的VLAN。

      TOR方式的接入交换机数量多,EOR方式的接入交换机数量少,所以TOR方式的网络设备管理维护工作量大。

      刀片服务器的布线方式

      集成刀片交换机的刀片服务器在进行机柜安装时,不需要考虑机柜内从服务器到接入交换机/或配线架的跳线,只需考虑刀片交换机上行端口的配线方式即可。而机架式服务器则需要分别对每台服务器进行跳线连接。例如,一个42U的服务器机柜安装10台1RU机架式服务器,1台接入交换机,并采用TOR布线方式时,在机柜后面将看到22根电源线(服务器和交换机都配置冗余电源)、10根KVM线、至少30根双绞线(每台服务器两个业务网卡和一个管理网卡),2根光纤(交换机上行端口),这还不包括连接外部存储和其他设备的线缆,显的非常凌乱。而对于一台配置了10个服务器模块和2个交换机模块的刀片服务器来说,则只需2根电源线,1根KVM线,4根光纤。因此刀片服务器在机房布线管理上比机架式服务器具有明显的优势。

      集成交换机模块的刀片服务器主要采用EOR/MOR布线方式,但这种EOR布线方式与机架式服务器TOR布线方式的特点基本相同,如图所示。服务器在服务器机柜内完成网络接入,从服务器机柜到EOR/MOR网络机柜的电缆主要是刀片交换机上行汇聚交换机的光线,而且数量比较少。但刀片服务器的计算单元的密度比机架式服务器更高,所以对单个机柜的电源输出功率以及机房制冷环境的要求也更高。

    \

      采用pass-through模块的刀片服务器的机柜布线方式可分为EOR/MOR和TOR两种,如图所示,两种方式的特点与机架式服务器的相应方式相同,此处不再赘述。

    \

    展开全文
  • 网狐荣耀版棋牌,在启动中心服务器时,显示“服务启动失败”,如下图。 引起这个问题有原因也是两个: 一、这是因为游戏开发库不配套的问题产生的。请更新了相应配套的游戏开发库; 二、内核组件用的与服务器...

    网狐荣耀版棋牌,在启动中心服务器时,显示“服务启动失败”,如下图。

    引起这个问题有原因也是两个:

    一、这是因为游戏开发库不配套的问题产生的。请更新了相应配套的游戏开发库;

    二、内核组件用的与服务器端生成时用的不一致。

    只要上述解决,问题马上处理。游戏顺利启动。

    展开全文
  • 站群服务器什么

    千次阅读 2019-09-26 09:03:29
    随着网站建设及营销手段的不断发展进化,不少企业以及个人站长经营起多个网站来进行群网营销,此刻就需要用到站群服务器了,站群服务器什么呢?下面我们一起来看看。 站群服务器什么? 站群服务器是单独为一...
  • 什么是云计算数据中心? 现在可能会有很多人对云计算、数据中心还有大数据等这类技术和名次感到模糊不清,云计算数据中心是一种基于云计算架构的,计算、存储及网络资源松耦合,完全虚拟化各种IT设备、模块化程度较...
  • 国家授时中心NTP服务器地址

    万次阅读 2018-09-21 17:25:22
    国家授时中心新的NTP服务器地址:ntp.ntsc.ac.cn
  • 在线两地三中心灾备方案网络设计如下: 容灾系统 衡量指标 衡量容灾系统的主要指标有 RPO(Recovery Point Object) :灾难发生时允许丢失的数据量 RTO(Recovery Time Objective) : 系统恢复的时间 容灾半径: ...
  • 戳蓝字“CSDN云计算”关注我们哦!作者 |Hardy责编 | 阿秃服务器对每个从事IT工作的人来说并不陌生,但是服务器所涉及的各种知识细节,并非大家都十分清楚,为...
  • 什么是WEB服务器、应用服务器

    千次阅读 2009-04-16 07:58:00
    WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务。 (1)应用层使用HTTP协议。 (2)HTML文档格式。 (3)浏览器统一资源定位器(URL)。 WWW代表万维网的意思 WWW 是 Internet 的多媒体信息查询...
  • 1.首先,确定打包方式,然后添加项目依赖(将注册中心依赖的父项目jar包cv到注册中心的pom文件中) <artifactId>talentShow_EurekaServer</artifactId> <packaging>war</packaging> &...
  • 微信发展如火如荼,没有哪家的企业营销能避开微信不谈的,那像我们这种给客户实施项目的多多少少会涉及微信的开发,本文只要给从未做过微信开发的人做一些简单的演示,行家里手们可以呵呵一下该干嘛干嘛去了。...
  • Windows国家授时中心服务器时间同步

    千次阅读 2017-08-12 09:53:22
    国家授时中心服务器 cn.pool.ntp.org 中国 cn.ntp.org.cn //自有地址 192.43.244.18 129.6.15.28 118.24.4.66 118.24.195.65 118.24.236.43 202.108.6.95 //由*阿里云*提供 120.25.108.11 182.92....
  • 什么是IDC?IDC数据中心什么意思?

    万次阅读 2019-11-01 10:44:18
    作为一位从事网络工作者...IDC翻译过来的字面意思就是数据中心,它首要是为企业、媒体、网站供给大规模、高质量、安全可靠的互联网服务,首要包含:服务器托管、网站空间租用、带宽批发等业务。加上现在的idc服务商...
  • 数据中心是现代社会的信息资源库,能够提供各项数据服务,它通过互联网与外界进行信息交互,响应服务请求。由于互联网的高度开放性,使得数据中心也成为了互联网上的一个组成节点,同样也面临着其他节点受到的共同...
  • 什么是WEB服务器? 常用的WEB服务器有哪些?   一、什么是WEB服务器  Web服务器可以解析HTTP协议。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求Web服务器可以...
  • U8SDK是一套类似棱镜SDK,AnySDK的统一渠道SDK接入框架,包含客户端部分和服务器端部分。和他们本质的区别是,U8SDK整套框架是技术开源的,我们所有的实现原理,都分享在博客上,为广大手游开发者,收集并提供比较...
  • 大数据基础知识:什么是服务器

    千次阅读 2019-11-27 21:04:22
    什么是服务器服务器: 也称伺服器,是一种高性能计算机,提供计算服务的设备。 服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似。 由于服务器需要提供高可靠的服务,所以在处理能力、...
  • 什么是中心化市场(OpenBazaar)

    万次阅读 2019-05-15 18:50:53
    去中心化市场(OpenBazaar)根本没有中心服务器。它是一个政府机构无法限制访问的点对点客户端。OpenBazaar不是在任何法律许可下运行的,它是自由的全球市场的演化。就像其创建者所说的:“它就像是eBay和BitTorrent的...
  • 本篇解释大家经常问到和混淆的一个概念:超融合服务器什么?超融合一体机是什么?两者有什么区别?下文特别整理了相关概念介绍。 首先,超融合是近几年兴起的一种新的IT 基础架构,这种架构具备以下特点: 1....
  • 使用IDEA搭建Eureka服务中心Server并启动 使用idea创建项目 在启动类上添加注解 @EnableEurekaServer 增加配置application.yml server: port: 8761 #修改端口号 eureka: instance: hostname: ...
  • 国家授时中心标准时间NTP服务器IP

    万次阅读 2019-01-29 21:27:30
    国家授时中心NTP服务器域名地址: ntp.ntsc.ac.cn 今天发现电脑上时间和实际差了2分钟,估计是家里网络连接微软的ntp服务器不够顺畅... 在寻找NTP服务器IP的时候又想起了这个机构“中国科学院国家授时中心”。...
  • 国家授时中心服务器IP地址

    千次阅读 2015-10-11 16:57:34
    210.72.145.44
  • 什么是呼叫中心

    千次阅读 2001-06-21 16:51:00
    什么是呼叫中心 “呼叫中心”是一些公司企业为用户服务而设立的。早在80年代,欧美等国的电信企业、航空公司、商业银行等为了密切与用户联系,应用计算机的支持、利用电话作为与用户交互联系的媒体,设立了”呼叫...
  • 目前,国家授时中心提供两种计算机网络时间服务:SNTP(Simple Network Time Protocol)校时软件服务和“时间精灵”服务。网络授时精度一般为几十毫秒~几百毫秒。 国家授时中心SNTP校时服务的IP地址是:210.72.145....
  • 谈到数据中心(DC),了解什么是数据中心分级,以及它们对IT组织有何影响有帮助。这里首先简要说明什么是数据中心分级,数据中心分级告诉人们数据中心的等级,以及它们的价值所在。
  • PUE是什么?说说数据中心和PUE

    万次阅读 2019-10-16 14:52:54
    1、什么是PUE? 从数据中心诞生的那天起,高耗能仿佛就成为数据中心的“原罪”。因此谈数据中心,就不能不谈PUE这个名词。PUE的英文全称是Power Usage Effectiveness,又叫电源使用效率。PUE是评价数据中心能源效率...
  • 1 问题eureka 注册中心是打成jar包还说war包呢? 答案是打成jar包就可以了 2 利用ldea 自带的meaven 工具,将我们的eureka 注册中心 直接打成jar 包 3 打包成功后如下图所示 ...5 通过远工具 将我们的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 463,096
精华内容 185,238
关键字:

中心服务器是什么