美文网首页一个Java码农眼中的技术世界数据仓库
docker已老, 函数式运维即未来-05:Postgres-X

docker已老, 函数式运维即未来-05:Postgres-X

作者: larluo_罗浩 | 来源:发表于2018-08-22 15:09 被阅读704次

    postgres-xl是个好东西?为什么呢?

    postgres-xl基于postgresql数据库, postgres可以吊打很多数据库.

    1. 它可以搞oltp, 抗衡mysql, mysql没有分析函数功能
    2. 它可以搞oltp, 抗衡oracle, oracle生态弱, 没法实时
    3. 它对json支持好, 抗衡mongodb, mongodb用得人越来越少了。。。
    4. 它还恐怖地支持各种语言扩展, java, javascript, r, python, haskell。。。
    5. 并且开源免费,简单强大的没朋友。。。

    postgres-xl是postgresql MPP集群版, 继续吊打大数据数据库...

    1. 它比greenpulm版本新: 它跟greenpulm本是一家人,都是MPP架构的postgresql集群
      但是原生改造, 版本基本上与postgresql一致, greenpulm的版本升不动啊。。。
    2. 它比oracle RAC/Teradata便宜,免费使用
    3. 它比hadoop省资源,没有GC,基于C语言资源利用率高,并且生态圈丰富,可视化方便
    4. 它出道早,版本稳定性强。

    既然这么优秀,那么我们简单介绍一下。。。

    postgres-xl分为以下组件:
    a. gtm 负责全局事务
    b. coordinator 处理分发执行
    c. datanode 负责底层处理

    datanode跟coordinator都 连接到gtm,
    客户端连接到coordinator运行sql,
    coordinator使用gtm进行一些事务功能分发给datanode执行

    大致如此,了解得不深入,后续会深入学习,再做补充

    一切就绪,现在我们开始正题,一键搭建postgres-xl集群。

    项目源码:https://github.com/clojurians-org/my-env
    部署脚本: run.sh.d/postgres-xl-example/{createvm.sh, package.sh, deploy.sh, start.sh}

    1. 创建虚拟机-createvm.sh
    2. 打包依赖-package.sh(打包依赖后即可离线拷贝部署)
    3. 部署集群-deploy.sh
    4. 启动集群-start.sh
    5. 测试集群

    过程很简单,依次运行createvm.sh, package.sh, deploy.sh, start.sh即可

    下面详细解解释一下发生了什么。

    第0步, 创建虚拟机

    [larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/createvm.sh 
    set -e
    my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
    
    echo -e "\n==== bash nix.sh create-vm nixos-postgres-xl-001" && bash nix.sh create-vm nixos-postgres-xl-001
    echo -e "\n==== bash nix.sh create-vm nixos-postgres-xl-002" && bash nix.sh create-vm nixos-postgres-xl-002
    echo -e "\n==== bash nix.sh create-vm nixos-postgres-xl-003" && bash nix.sh create-vm nixos-postgres-xl-003
    
    image.png

    第1步,打包依赖

    [larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/package.sh
    set -e
    my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
    
    echo -e "\n==== bash nix.sh build nix.postgres-xl-10.0" && bash nix.sh build nix.postgres-xl-10.0
    
    echo -e "\n==== bash nix.sh export tgz.nix-2.0.4" && bash nix.sh export tgz.nix-2.0.4
    echo -e "\n==== bash nix.sh export nix.rsync-3.1.3" && bash nix.sh export nix.rsync-3.1.3
    echo -e "\n==== bash nix.sh export nix.gettext-0.19.8.1" && bash nix.sh export nix.gettext-0.19.8.1
    

    rsync是可选的(避免脚本多次运行scp多次),
    这里的gettext依赖是为了启动脚本中使用envsubst命令替换环境变量

    这里由于nix官方还没有支持postgres-xl,并且postgres-xl对系统底层库有依赖,我们不想使用root权限安装污染系统,所以自己编写nix构建脚本自动打包依赖

    [larluo@larluo-nixos:~/my-env]$ cat nix.conf/postgres-xl-10.0/default.nix
    { fetchgit, stdenv, readline, zlib, perl, bison, flex, ... }:
    stdenv.mkDerivation rec {
      name = "postgres-xl-${version}" ;
      version = "10.0" ;
      rev = "0e7174157b7762959089ab0dd508237679a301c8" ;
    
      buildInputs = [ readline zlib perl bison flex ];
    
      src = fetchgit {
        url= "git://git.postgresql.org/git/postgres-xl.git" ;
        rev = rev ;
        sha256 = "0nv8s4wyswfikb6pbmj9mq6qr8j7vc1d9nhkr6jmnymfkx4rwjxk" ;
      } ;
    }
    
    image.png

    第2步,部署依赖

    [larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/deploy.sh
    set -e
    my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
    
    echo -e "\n==== bash nix.sh create-user 192.168.56.101" && bash nix.sh create-user 192.168.56.101
    echo -e "\n==== bash nix.sh create-user 192.168.56.102" && bash nix.sh create-user 192.168.56.102
    echo -e "\n==== bash nix.sh create-user 192.168.56.103" && bash nix.sh create-user 192.168.56.103
    
    echo -e "\n==== bash nix.sh install 192.168.56.101 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.101 tgz.nix-2.0.4
    echo -e "\n==== bash nix.sh install 192.168.56.102 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.102 tgz.nix-2.0.4
    echo -e "\n==== bash nix.sh install 192.168.56.103 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.103 tgz.nix-2.0.4
    
    echo -e "\n==== bash nix.sh install 192.168.56.101 nix.rsync-3.1.3" && bash nix.sh install 192.168.56.101 nix.rsync-3.1.3
    echo -e "\n==== bash nix.sh install 192.168.56.102 nix.rsync-3.1.3" && bash nix.sh install 192.168.56.102 nix.rsync-3.1.3
    echo -e "\n==== bash nix.sh install 192.168.56.103 nix.rsync-3.1.3" && bash nix.sh install 192.168.56.103 nix.rsync-3.1.3
    
    echo -e "\n==== bash nix.sh install 192.168.56.101 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.101 nix.gettext-0.19.8.1
    echo -e "\n==== bash nix.sh install 192.168.56.102 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.102 nix.gettext-0.19.8.1
    echo -e "\n==== bash nix.sh install 192.168.56.103 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.103 nix.gettext-0.19.8.1
    
    echo -e "\n==== bash nix.sh install 192.168.56.101 nix.postgres-xl-10.0" && bash nix.sh install 192.168.56.101 nix.postgres-xl-10.0
    echo -e "\n==== bash nix.sh install 192.168.56.102 nix.postgres-xl-10.0" && bash nix.sh install 192.168.56.102 nix.postgres-xl-10.0
    echo -e "\n==== bash nix.sh install 192.168.56.103 nix.postgres-xl-10.0" && bash nix.sh install 192.168.56.103 nix.postgres-xl-10.0
    

    首先创建用户,接着安装nix, 然后安装rsync跟gettext工具,最后部署postgres-xl


    image.png

    第3步: 启动集群

    [larluo@larluo-nixos:~/my-env]$ cat run.sh.d/postgres-xl-example/start.sh
    my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
    
    echo -e "\n==== bash nix.sh start 192.168.56.101:6666 postgres-xl-10.0:gtm"
                    bash nix.sh start 192.168.56.101:6666 postgres-xl-10.0:gtm
    export GTM="192.168.56.101:6666"
    
    export DATANODES="192.168.56.101:15432,192.168.56.102:15432,192.168.56.103:15432"
    export COORDINATORS="192.168.56.101:5432,192.168.56.102:5432,192.168.56.103:5432"
    echo -e "\n==== bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:datanode --gtm ${GTM}"
                    bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:datanode --gtm ${GTM}
    echo -e "\n==== bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:datanode --gtm ${GTM}"
                    bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:datanode --gtm ${GTM}
    echo -e "\n==== bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:datanode --gtm ${GTM}"
                    bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:datanode --gtm ${GTM}
    echo -e "\n==== bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:coordinator --gtm ${GTM}"
                    bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:coordinator --gtm ${GTM}
    echo -e "\n==== bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:coordinator --gtm ${GTM}"
                    bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:coordinator --gtm ${GTM}
    echo -e "\n==== bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:coordinator --gtm ${GTM}"
                    bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:coordinator --gtm ${GTM}
    
    echo -e "\n==== sleep 10" && sleep 10
    
    echo -e "\n==== bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
                    bash nix.sh start 192.168.56.101:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
    echo -e "\n==== bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
                    bash nix.sh start 192.168.56.102:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
    echo -e "\n==== bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
                    bash nix.sh start 192.168.56.103:15432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
    echo -e "\n==== bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
                    bash nix.sh start 192.168.56.101:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
    echo -e "\n==== bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
                    bash nix.sh start 192.168.56.102:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
    echo -e "\n==== bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}"
                    bash nix.sh start 192.168.56.103:5432 postgres-xl-10.0:_connector --coordinators ${COORDINATORS} --datanodes ${DATANODES}
    

    这里首先启动gtm,接着指定gtm参数启动datanode跟coordinator.
    最后,对于每个datanode及coordinator与其它datanode及coordinator进行连接


    image.png

    第4步: 测试集群

    
    postgres=# select * from pgxc_node;
                node_name            | node_type | node_port |   node_host    | nodeis_primary | nodeis_preferred |   node_id   
    ---------------------------------+-----------+-----------+----------------+----------------+------------------+-------------
     coordinator_192_168_56_102_5432 | C         |      5432 | 192.168.56.102 | f              | f                | -1979140469
     coordinator_192_168_56_103_5432 | C         |      5432 | 192.168.56.103 | f              | f                |   580660846
     datanode_192_168_56_101_15432   | D         |     15432 | 192.168.56.101 | f              | f                |  1317903039
     datanode_192_168_56_102_15432   | D         |     15432 | 192.168.56.102 | f              | f                |  -102979159
     datanode_192_168_56_103_15432   | D         |     15432 | 192.168.56.103 | f              | f                |  -556920164
     coordinator_192_168_56_101_5432 | C         |      5432 | 192.168.56.101 | f              | f                |  -307067894
    (6 rows)
    
    postgres=# create table test1(id int,name text);
    CREATE TABLE
    postgres=# insert into test1(id,name) select generate_series(1,8),'测试';
    INSERT 0 8
    postgres=# SELECT xc_node_id, count(*) FROM test1 group by xc_node_id ;
     xc_node_id | count 
    ------------+-------
     -556920164 |     3
     -102979159 |     3
     1317903039 |     2
    (3 rows)
    
    

    相关文章

      网友评论

      • 陈_志鹏:docker和postgres-xl不是一个东西好吧,说句简单粗暴的docker能运行postgres-xl所有环境
        陈_志鹏:@larluo 没明白为什么Docker做不到,Docker每一个容器就是一个容器,要加入集群再加多一个容器就好了,软件都已经在容器里面了,为什么要安装?再说了为什么要用到root?容器本身就是个操作系统 没明白你说的什么意思
        larluo_罗浩:@陈_志鹏 无任何人工操作,不需要root权限,不安装任何软件,仅用ssh+copy (import, export),docker做不到。。。
        larluo_罗浩:@陈_志鹏 这个是Nix函数式运维构建的,自带依赖导入导出,版本控制。由于侧重应用未具体展开,可以参见其他文章

      本文标题:docker已老, 函数式运维即未来-05:Postgres-X

      本文链接:https://www.haomeiwen.com/subject/kahyiftx.html