博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pgpool-II的性能缺陷(二)
阅读量:6322 次
发布时间:2019-06-22

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

接上文 pgpool-II的性能缺陷:

前文已经说到,pgpool-II在replication mode状态下,是顺次而非并行执行SQL文给各个DB节点。

从Source的角度,可以看到:

SimpleQuery → pool_send_and_wait  → send_simplequery_message
/*                                     * Process Query('Q') message                                     * Query messages include an SQL string.                                     */                                    POOL_STATUS SimpleQuery(POOL_CONNECTION *frontend,                 POOL_CONNECTION_POOL *backend, int len, char *contents){    ……                                    /* log query to log file if necessary */                                    if (pool_config->log_statement){                                        pool_log("statement: %s", contents);                                }else{                                        pool_debug("statement2: %s", contents);                                }                                    ……                                    string = query_context->original_query;     if (!RAW_MODE){                                        ……                                    /*                                     * Query is not commit/rollback                                     */                                    if (!commit){                                        char *rewrite_query;                                    ……                                    /*                                     * Optimization effort: If there's only one session, we do              * not need to wait for the master node's response, and              * could execute the query concurrently.                                     */                                    if (pool_config->num_init_children == 1){                                        /* Send query to all DB nodes at once */                                    status = pool_send_and_wait(query_context, 0, 0);                 /*                                    free_parser();                                    */                                    return status;                                }                                                                     /* Send the query to master node */                                    if (pool_send_and_wait(query_context, 1, MASTER_NODE_ID) != POOL_CONTINUE) {                                        free_parser();                                    return POOL_END;                                }                                }                                 /*                                     * Send the query to other than master node.                                     */                                    if (pool_send_and_wait(query_context, -1, MASTER_NODE_ID) != POOL_CONTINUE{
free_parser(); return POOL_END; } …… }else{ …… } return POOL_CONTINUE; }

/* 

* Send simple query and wait for response
* send_type:
* -1: do not send this node_id
* 0: send to all nodes
* >0: send to this node_id
*/
POOL_STATUS pool_send_and_wait(POOL_QUERY_CONTEXT *query_context,
int send_type, int node_id)
{
  ……
  /* Send query */
  for (i=0;i<NUM_BACKENDS;i++){
     ……
     per_node_statement_log(backend, i, string);
    if ( send_simplequery_message(CONNECTION(backend, i),

           len, string, MAJOR(backend)) != POOL_CONTINUE) { 

          return POOL_END;

    }
  }
  /* Wait for response */
  for (i=0;i<NUM_BACKENDS;i++){
    ……
    if (wait_for_query_response(frontend, CONNECTION(backend, i),

          MAJOR(backend)) != POOL_CONTINUE){

           /* Cancel current transaction */
           CancelPacket cancel_packet;
          cancel_packet.protoVersion = htonl(PROTO_CANCEL);
          cancel_packet.pid = MASTER_CONNECTION(backend)->pid;
          cancel_packet.key= MASTER_CONNECTION(backend)->key;
          cancel_request(&cancel_packet);
          return POOL_END;
    }
    ……
  }
return POOL_CONTINUE;
}

经过对程序的进一步分析和试验,可以得出以下的结论:

在 Master Node 和其他各Node之间,对SQL文的执行是串行的。

在 Master Node以外的其他各Node之间,是并行执行的。其实是 

/* Send query */ 一段,无阻塞方式向各节点发送SQL文。
/* Wait for response */ 一段,虽然也是个循环,但是是串行。 不过好在向各节点发SQL文的时候,几乎是同时地发送命令, 所以 Wait for response 对一个节点检查获得SQL文执行结束消息以后, 几乎同时也会获得下一个节点SQL文执行结束的消息。 综合以上:如果对一个节点单独执行一段批处理耗时1小时,那么在replication mode 多个节点运行条件下,执行时间将变成 2小时。

至于为何 pgpool-II把对 Master Node和 其他Node的执行分开,也许有特殊考虑,也许是为了保证Master Node的正确性。

本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/08/09/2630172.html,如需转载请自行联系原作者

你可能感兴趣的文章
leetcode1089
查看>>
sqlite在c++中的使用方法
查看>>
Spark基础-scala学习(三、Trait)
查看>>
ROS Hotspot服务器的搭建与设定!(上网认证)
查看>>
PHP:第五章——字符串的概念
查看>>
Asp.net Core1.1创建简单WebAPI对Mongodb进行CRUD操作
查看>>
有道词典 纯净版 - imsoft.cnblogs
查看>>
java读取文件夹下所有文件并替换文件每一行中指定的字符串
查看>>
设置mysql远程连接root权限
查看>>
NFS 网络文件系统测试笔记
查看>>
javascript 2
查看>>
梳理,
查看>>
spring mvc 接收页面表单List
查看>>
说说大型高并发高负载网站的系统架构(更新)
查看>>
Neutron L2Populate
查看>>
oracle命令行导出、导入dmp文件
查看>>
化了妆的祝福 3
查看>>
Conventions and patterns for multi-platform development
查看>>
VS 扩展管理器,方便的插件
查看>>
【转载】3389远程终端常用CMD命令
查看>>