精华内容
下载资源
问答
  • 一般认为NoSQL数据库在性能...这两个SQL解决方案分别是MySQL加NoSQL层插件和支持SQL的VoltDB数据库。MySQL + HandlerSocketYoshinori Matsunobu是Sun/Oracle的前雇员,从事MySQL的研发工作,目前是DeNA的首席数据...

    一般认为NoSQL数据库在性能方面要优于传统的SQL数据库。但是有两个SQL的解决方案宣布:对于大型系统的高可扩展性需求,SQL仍然是可行的解决方案!这两个SQL解决方案分别是MySQL加NoSQL层插件和支持SQL的VoltDB数据库。

    MySQL + HandlerSocket

    Yoshinori Matsunobu是Sun/Oracle的前雇员,从事MySQL的研发工作,目前是DeNA的首席数据库和基础设施架构师,他以插件的方式为MySQL/InnoDB提供解决方案,可以在一台2.53GHZ、8核CPU、32G内存的Nehalem服务器上把每秒的查询数量(qps)提升到750,000以上。

    在同样的硬件环境下,无插件的MySQL只能提供100,000左右的qps,如果使用memecached的话,可以增加到大约400,000。经过对RDBMS的分析,Matsunobu意识到大部分时间都花在SQL的开销上,比如调用MYSQLparse()、MYSQLlex()、make_join_statistics()和JOIN::optimize()等。他写到:

    很显然性能降低的原因主要在SQL层,而不是“InnoDB(存储)”层。MySQL必须做很多事情......但memcached/NoSQL是不需要做这些额外工作的。

    SQL层的功能包括解析SQL语句、打开/锁定/解锁/关闭表、解决并发问题等。Matsunobu的解决方案就是增加额外的NoSQL层:

    我们认为最好的方式就是在MySQL内部实现一个NoSQL的网络服务器。也就是说,编写一个网络服务器作为MySQL的插件(守护插件),用来监听特定端口,接收NoSQL的协议和API,然后通过MySQL内部存储引擎API直接访问InnoDB。这种方式很像NDBAPI,不同的是它可以与InnoDB交互。

    他的团队开发了HandlerSocket插件,有了这个插件,MySQL更像一个NoSQL数据库,通过监听一个独立的端口,接收从SQL层来的简单查询请求,例如主键查询,索引扫描和插入/更新/删除。这一变化把数据库性能提升到了750K qps以上。常用端口可以接收处理复杂查询,其核心仍然是SQL数据库。DeNA采用SQL/NoSQL混合的方式取得了成功,据Matsunobu所言,在相同的时间内,这种解决方案把多个memcached和MySQL主从服务器的方案远远甩在了后面。

    VoltDB

    另一个很有希望的SQL解决方案是VoltDB,这是一个内存中的开源OLTP SQL数据库,能够保证事务的完整性(ACID)。VoltDB是由原Ingres和Postgres的架构师Mike Stonebraker设计的。该数据库主要特征如下:

    为了获得最大化吞吐量,数据保存在内存中(而不是在硬盘),这样可以有效消除缓冲区管理。

    VoltDB通过SQL引擎把数据分发给集群服务器的每个CPU进行处理。

    每个单线程分区自主执行,消除锁定和闩锁的需求。

    VoltDB可以通过简单的在集群中增加附加节点的方式实现性能的线性增加。

    正如其开发者宣称的那样,该数据库的性能使其成为NoSQL解决方案的有力竞争者:

    VoltDB在单节点上可以每秒处理53000个事务请求(TPS),其他DBMS在相同的硬件环境下只能处理1155个。VoltDB的扩展是近似线性的──在12个节点的VoltDB集群上进行同样测试,可以处理560,000 TPS。

    基准案例:某个客户的在线游戏在12个节点的VoltDB集群上处理了130万 TPS。

    VoltDB还针对NoSQL的键-值存储方式作了基准测试,VoltDB在处理各种键-值存储负载的情况下获得了相同或更好的性能。

    除了它的性能,VoltDB的主要优势是可以与SQL用户进行交流,这些SQL用户是很好的资源。

    近期还会推出VoltDB的企业版本,包括基于浏览器的数据库管理系统,提供、管理和监控数据库集群。除了免费的社区版本,针对企业版的支持也开始了。

    展开全文
  • VoltDB安装

    2021-01-30 12:55:20
    1.什么是VoltDB?是一个优化吞吐率的高性能集群开源SQLRDBMS(Database Management System),它是一个内存关系型数据库,既获得了nosql的良好可扩展性,高吞吐量的数据处理,又没有放弃原传统关系型数据库的事务支持--...

    1.什么是VoltDB?

    是一个优化吞吐率的高性能集群开源SQLRDBMS(Database Management System),它是一个内存关系型数据库,既获得了nosql的良好可扩展性,高吞吐量的数据处理,又没有放弃原传统关系型数据库的事务支持--ACID

    从硬件上来看,VoltDB基于PC+以太网+本地存储,从体系结构来看其内部是一个ShareNothing(注1)的内存数据库,通过并行单线程来保证事务的一致性和高性能,所有事务被实现为java存储过程,所有存储过程(事务)都全局有序,由于避免了锁的使用,因此可以保证每个事务在所有分区上并行执行完成后才继续执行下一个事务,事务不会乱序执行。存储过程内部支持分组,多路join,聚合,函数等等,

    VoltDB---自动数据分区,数据表会自动分配到集群节点,可以看成是传统sharding的升级整合版本。

    ---自动快照,意味着一个事务内部无需进行IO操作,可在微秒级别完成事务,

    ---异步事务提交,从某种意义上看,VoltDB是一个共享内存的集群(?),支持多节点并行事务处理,理论上不存在节点上限

    2.VoltDB部署安装环境

    voltdb的代码以及系统构建都是在64位的linux/OS X之上的,它的编译需要如下环境:

    java 1.8

    Apache Ant 1.7 或者更高版本

    一个支持C++11的编译器

    Python 2.6 或者更高版本

    cmake 2.8 或者更高版本

    安装ant:

    tar -xzvf apache-ant-1.9.13-bin.tar.gz

    # 配置环境变量vi /etc/profile

    export ANT_HOME=/data/webserver/apache-ant-1.9.13

    export PATH=$ANT_HOME/bin:$PATH

    VoltDB安装:

    unzip voltdb-voltdb-9.0.zip

    cd voltdb-voltdb-9.0

    ant clean

    ant

    配置VoltDB环境变量:

    export VOLTDB_PATH=/data/webserver/voltdb-voltdb-9.0

    export PATH=$VOLTDB_PATH/bin:$PATH

    export CLASSPATH=.:$VOLTDB_PATH/lib/*:$VOLTDB_PATH/voltdb/*:$CLASSPATH

    初始化VoltDB并启动:

    voltdb init

    voltdb start

    启动成功后,通过浏览器http://localhost:8080访问VoltDB管理控制台:

    225a0edc6d4ede3e0827379bde6e4e88.png

    展开全文
  • VoltDB是内存关系型数据库和计算引擎,能在廉价服务器集群上实现每秒数百万次数据事务处理和毫秒级的平均延迟,提供了NoSQL数据库的可伸缩性和传统关系数据库系统的ACID一致性。通过将数据库表进行自动哈希分区来...

    VoltDB是内存关系型数据库和计算引擎,能在廉价服务器集群上实现每秒数百万次数据事务处理和毫秒级的平均延迟,提供了NoSQL数据库的可伸缩性和传统关系数据库系统的ACID一致性。通过将数据库表进行自动哈希分区来支持按CPU内核的高并发,同时也支持复制表。支持存储过程、物化视图、自定义函数来存储和检索数据。VoltDB也满足SQL92和大部分SQL99标准,能良好的运行在商用x86服务器、虚拟机和容器之上。它是Postgres和Vertica联合创始人、2014年图灵奖得主Michael Stonebraker领导开发的New SQL管理系统。

    VoltDB支持数据持久化,但所有的运营数据都是在内存中,能够容纳的数据量取决于集群内所有节点的全部内存大小。所以VoltDB并不适合用来做数仓。VoltDB内部采用按CPU内核分区并行计算的MPP架构,适合对性能要求极高的OLTP和实时流计算场景。但是对于复杂的Ad-Hoc查询可能会碰到瓶颈,而有时我们的规划中还有使用MySQL等传统数据库的应用需要纳入统一的考虑。所以当遇见类似这样较复杂的混合应用场景时,典型的做法是使用VoltDB处理实时线上事务处理,并将原始数据和/或计算结果保存在HDFS、Hive以及MySQL中,做离线分析。同时我们使用Presto作为单一访问接口,进行跨数据源的即席查询。

    当涉及这么多不同组件集群环境的搭建时,安装调试往往是个麻烦事,所幸通过Terraform自动化云平台发布脚本,只需一个命令就几乎可以完成以上集群运行环境的搭建。

    本文的目的就是记录下本安装过程的脚本和踩坑过程,通过Terraform 实现自动在Alicloud创建集群,并自动完成VoltDB(企业试用版)、Hadoop/Hive(CDH 发行版)、MySQL、Presto(StarburstData发行版)的安装和配置、启动过程。本文部分内容参考自互联网,特别是Terraform安装CDH,如:https://github.com/danielfrg/terraform-cloudera

    搭建好的集群如下图示意:

    • Terraform脚本准备

    Terraform 是一种安全有效地构建、更改和版本控制基础设施的工具(基础架构自动化的编排工具)。它的目标是 "Write, Plan, and create Infrastructure as Code", 基础架构即代码。Terraform 几乎可以支持所有市面上能见到的云服务。具体的说就是可以用代码来管理维护 IT 资源,把之前需要手动操作的一部分任务通过程序来自动化的完成。

    Terraform 支持使用多个tf脚本文件,便于项目规划。

    本文只使用单个tf文件:main.tf,如下所示的Terraform脚本以操作Alicloud为例。如需详细的元素解释请参阅Terraform官方文档:https://www.terraform.io/docs/providers/alicloud/index.html

    provider "alicloud" {
       access_key = "" #Alicloud 的访问key pair,可以在Alicloud生成后填入。
    	secret_key = ""
       region = "ap-northeast-1"
    }
     
    #定义Coordinator 数量
    variable "cdh_server" {
      default = "1"
    }
     
    #定义Worker 数量
    variable "cdh_node" {
      default = "2"
    }
     
    #选择Linux 版本
    variable "platform"{
      default = "centos7"
    }
     
    #定义Coordinator主机名前缀
    variable "cdh_server_prefix" {
      description = "Prefix to use when naming cluster members"
      default = "cdh-master"
    }
     
    #定义Worker主机名前缀
    variable "cdh_node_prefix" {
      description = "Prefix to use when naming cluster members"
      default = "cdh-peer"
    }
     
    #定义Linux root登录密码
    variable "password" {
      type = "string"
      default = "XXX"
    }
     
    #Alicloud 服务器区域
    variable "availabe_zone" {
      type = "string"
      default = "ap-northeast-1a"
    }
     
    #Alicloud ECS 硬件配置
    data "alicloud_instance_types" "hardware_cfg" {
      cpu_core_count = 4
      memory_size = 16
    }
     
    #定义VPC Internal IP
    resource "alicloud_vpc" "vpc" {
      name       = "voltdb_cdh_test"
      cidr_block = "172.16.0.0/12"
    }
     
    #定义Virtual Switch
    resource "alicloud_vswitch" "vsw" {
      vpc_id            = "${alicloud_vpc.vpc.id}"
      cidr_block        = "172.16.0.0/21"
      availability_zone = "${var.availabe_zone}"
    }
     
    #定义安全组
    resource "alicloud_security_group" "default" {
      name = "default"
      vpc_id = "${alicloud_vpc.vpc.id}"
    }
     
    #定义默认安全访问规则
    resource "alicloud_security_group_rule" "allow_all_tcp" {
      type              = "ingress"
      ip_protocol       = "tcp"
      nic_type          = "intranet"
      policy            = "accept"
      port_range        = "1/65535"
      priority          = 1
      security_group_id = "${alicloud_security_group.default.id}"
      cidr_ip           = "0.0.0.0/0"
    }
     
    #定义将要启动的Coordinator实例的配置
    resource "alicloud_instance" "cdh_server" {
      count = "${var.cdh_server}" #启动数量
      # ECS 所在区域
      availability_zone = "${var.availabe_zone}"
      security_groups = ["${alicloud_security_group.default.*.id}"]
     
      # ECS 实例的配置
      instance_type        = "${data.alicloud_instance_types.hardware_cfg.instance_types.0.id}"
      system_disk_category = "cloud_efficiency"
      #操作系统版本
      image_id             = "centos_7_04_64_20G_alibase_201701015.vhd"
      #实例和主机名
      instance_name        = "${var.cdh_server_prefix}-${count.index}"
      host_name        = "${var.cdh_server_prefix}-${count.index}"
      vswitch_id = "${alicloud_vswitch.vsw.id}"
      #可用外部访问的最大带宽(5M)
      internet_max_bandwidth_out = 5
      #登录密码
      password = "${var.password}"
     
    }
     
    #Coordinator实例启动后执行一系列动作,通过脚本完成安装和配置
    resource "null_resource" "configure-ins-ips" {
      count = "${var.cdh_server}"
      connection {
              type     = "ssh"
              user     = "root"
              host = "${element(alicloud_instance.cdh_server.*.public_ip, count.index)}"
              password = "${var.password}"
          }
      provisioner "remote-exec" {
        scripts = [
          "${path.module}/scripts/${var.platform}/base.sh",
          "${path.module}/scripts/${var.platform}/cloudera-repo.sh"
        ]
      }
     
      provisioner "remote-exec" {
        script = "${path.module}/scripts/${var.platform}/cdh-server.sh"
      }
     
      provisioner "file" {
        source      = "${path.module}/scripts/${var.platform}/cdh-agent.sh"
        destination = "/tmp/cdh-agent.sh"
      }
     
      provisioner "file" {
        source      = "${path.module}/scripts/${var.platform}/passwd-free-access.sh"
        destination = "/tmp/passwd-free-access.sh"
      }
     
      provisioner "file" {
        source      = "${path.module}/scripts/${var.platform}/presto-install-master.sh"
        destination = "/tmp/presto-install-master.sh"
      }
     
      provisioner "remote-exec" {
        inline = [
          "chmod +x /tmp/cdh-agent.sh",
          "/tmp/cdh-agent.sh ${alicloud_instance.cdh_server.private_ip}",
        ]
      }
     
      provisioner "file" {
            source = "${path.module}/scripts/${var.platform}/initialization_env.sh"
            destination = "~/initialization_env.sh"
      }
     
      provisioner "remote-exec" {
            inline = [
                # Adds all cluster members' IP addresses to /etc/hosts (on each member)
                "sudo echo '${join("\n", formatlist("%v", alicloud_instance.cdh_server.*.private_ip))}' | awk 'BEGIN{ print \"\\n\\n# Cluster members:\" }; { print $0 \" ${var.cdh_server_prefix}-\" NR-1 }' | sudo tee -a /etc/hosts > /dev/null",
                "sudo echo '${join("\n", formatlist("%v", alicloud_instance.cdh_node.*.private_ip))}' | awk 'BEGIN{ print \"\\n\\n# Cluster members:\" }; { print $0 \" ${var.cdh_node_prefix}-\" NR-1 }' | sudo tee -a /etc/hosts > /dev/null",
                "sudo chmod +x ~/initialization_env.sh",
                "sudo ~/initialization_env.sh",
                "chmod +x /tmp/passwd-free-access.sh /tmp/presto-install-master.sh",
                "/tmp/passwd-free-access.sh cdh-peer-0",#这里偷懒了,不应该固定
                "/tmp/passwd-free-access.sh cdh-peer-1",
                "/tmp/passwd-free-access.sh cdh-master-0",
                "/tmp/presto-install-master.sh",
                "/opt/voltdb/bin/voltdb start --http=8090 --dir=/opt --host=${join(",", formatlist("%v", alicloud_instance.cdh_server.*.host_name))},${join(",", formatlist("%v", alicloud_instance.cdh_node.*.host_name))} -B >/dev/null"
            ]
      }
     
    }
     
    #定义将要启动的Worker实例的配置
    resource "alicloud_instance" "cdh_node" {
      count = "${var.cdh_node}"
      
      availability_zone = "${var.availabe_zone}"
      security_groups = ["${alicloud_security_group.default.*.id}"]
     
      
      instance_type        = "${data.alicloud_instance_types.hardware_cfg.instance_types.0.id}"
      system_disk_category = "cloud_efficiency"
      image_id             = "centos_7_04_64_20G_alibase_201701015.vhd"
      instance_name        = "${var.cdh_node_prefix}-${count.index}"
      host_name        = "${var.cdh_node_prefix}-${count.index}"
      vswitch_id = "${alicloud_vswitch.vsw.id}"
      internet_max_bandwidth_out = 5
      password = "${var.password}"
     
    }
     
    #Worker实例启动后执行一系列动作,通过脚本完成安装和配置
    resource "null_resource" "configure-ins2-ips" {
      count = "${var.cdh_node}"
     
      connection {
              type     = "ssh"
              user     = "root"
              host = "${element(alicloud_instance.cdh_node.*.public_ip, count.index)}"
              password = "${var.password}"
          }
     
      provisioner "remote-exec" {
        scripts = [
          "${path.module}/scripts/${var.platform}/base.sh",
          "${path.module}/scripts/${var.platform}/cloudera-repo.sh"
        ]
      }
     
      provisioner "file" {
        source      = "${path.module}/scripts/${var.platform}/cdh-agent.sh"
        destination = "/tmp/cdh-agent.sh"
      }
     
      provisioner "remote-exec" {
        inline = [
          "chmod +x /tmp/cdh-agent.sh",
          "/tmp/cdh-agent.sh ${alicloud_instance.cdh_server.private_ip}",
        ]
      }
     
      provisioner "file" {
            source = "${path.module}/scripts/${var.platform}/initialization_env.sh"
            destination = "~/initialization_env.sh"
      }
      
      provisioner "remote-exec" {
            inline = [
                # Adds all cluster members' IP addresses to /etc/hosts (on each member)
                "sudo echo '${join("\n", formatlist("%v", alicloud_instance.cdh_server.*.private_ip))}' | awk 'BEGIN{ print \"\\n\\n# Cluster members:\" }; { print $0 \" ${var.cdh_server_prefix}-\" NR-1 }' | sudo tee -a /etc/hosts > /dev/null",
                "sudo echo '${join("\n", formatlist("%v", alicloud_instance.cdh_node.*.private_ip))}' | awk 'BEGIN{ print \"\\n\\n# Cluster members:\" }; { print $0 \" ${var.cdh_node_prefix}-\" NR-1 }' | sudo tee -a /etc/hosts > /dev/null",
                "sudo chmod +x ~/initialization_env.sh",
                "sudo ~/initialization_env.sh",
                "/opt/voltdb/bin/voltdb start --http=8090 --dir=/opt --host=${join(",", formatlist("%v", alicloud_instance.cdh_server.*.host_name))},${join(",", formatlist("%v", alicloud_instance.cdh_node.*.host_name))} -B >/dev/null"
            ]
      }
      
    }
     
    #Terraform 执行后的打印内容,这里输出Public IP of ECS Instances,就用通过SSH登录 
    output "cdh_master_address" {
      value = "${alicloud_instance.cdh_server.*.public_ip}"
    }
     
    output "cdh_peer_address" {
      value = "${alicloud_instance.cdh_node.*.public_ip}"
    }

    Terraform 的安装和使用相对简单,参考:https://learn.hashicorp.com/terraform/getting-started/install.html,安装好后在main.tf所在的目录执行命令(首次需初始化),Terraform 会下载对应的Provider,这可能需要一点时间。

    #terraform init

    #terraform apply

     

    • 安装和配置脚本

    base.sh用来安装和配置基本工具,该脚本会在Coordinator和Worker节点启动后执行。

    #!/bin/bash
    
    set -e
    set -x
    
    # 安装一些必备工具
    sudo yum install -y unzip tmux bzip2
    
    # 安装Chrony并配置,保证集群节点间时间一致
    yum install chrony -y
    mkdir -p /etc/chrony
    cat > /etc/chrony/chrony.conf << EOF
    server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
    server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
    stratumweight 0
    driftfile /var/lib/chrony/drift
    rtcsync
    makestep 10 3
    allow 192.168.1.0/24
    bindcmdaddress 127.0.0.1
    bindcmdaddress ::1
    keyfile /etc/chrony/chrony.keys
    commandkey 1
    generatecommandkey
    noclientlog
    logchange 0.5
    logdir /var/log/chrony
    EOF
    
    #启动Chrony
    chronyd -f /etc/chrony/chrony.conf
    
    # 按个人喜好,如果已经预装了OpenJDK就移除
    sudo yum remove --assumeyes *openjdk*
    
    # 安装JDK并配置环境变量
    wget https://mail-tp.fareoffice.com/java/jdk-8u151-linux-x64.rpm
    rpm -Uvh jdk-8u151-linux-x64.rpm
    echo 'JAVA_HOME=/usr/java/jdk1.8.0_151' >> /etc/profile
    echo 'PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile

    cloudera-repo.sh用来配置CDH Manager安装包,该脚本会在Coordinator和Worker节点启动后执行。

    #!/bin/bash
    
    set -e
    set -x
    
    sudo yum clean all
    
    # CDH
    sudo curl -o /etc/yum.repos.d/cloudera-manager.repo https://archive.cloudera.com/cm5/redhat/7/x86_64/cm/cloudera-manager.repo
    sudo rpm --import https://archive.cloudera.com/cm5/redhat/7/x86_64/cm/RPM-GPG-KEY-cloudera
    
    # CDSW
    sudo curl -o /etc/yum.repos.d/cloudera-cdsw.repo https://archive.cloudera.com/cdsw1/1.4.3/redhat7/yum/cloudera-cdsw.repo
    sudo rpm --import https://archive.cloudera.com/cdsw1/1.4.3/redhat7/yum/RPM-GPG-KEY-cloudera
    
    # Cloudera Director (has Java 8)
    sudo curl -o /etc/yum.repos.d/cloudera-director.repo https://archive.cloudera.com/director/redhat/7/x86_64/director/cloudera-director.repo
    sudo rpm --import https://archive.cloudera.com/director/redhat/7/x86_64/director/RPM-GPG-KEY-cloudera
    
    
    
    sudo yum clean all
    sudo yum repolist

    cdh-server.sh用来安装CDH Manager,该脚本只会在Coordinator执行。

    #!/bin/bash
    
    set -e
    set -x
    
    sudo yum install -y cloudera-manager-daemons cloudera-manager-server cloudera-manager-server-db-2
    sudo setenforce 0 || /bin/true
    sudo iptables -F
    sudo service cloudera-scm-server-db start
    sudo service cloudera-scm-server start

    passwd-free-access.sh通过expect来设置免密,该脚本只会在Coordinator执行。

    #!/bin/bash
    
    passwd='xxx'
    
    /usr/bin/expect <<-EOF
    set timeout 30                
    spawn ssh -p22 root@$1
    expect {
    "*yes/no" { send "yes\r"; exp_continue }
    "*password:" { send "$passwd\r" }
    }
    expect "*#"                        
    send "mkdir -p ~/.ssh && chmod 700 ~/.ssh\r"          
    expect "*#"    
    send "exit\r"
    #interact      
    expect eof
    EOF
    
    /usr/bin/expect <<-EOF
    set timeout 30                
    spawn scp -oStrictHostKeyChecking=no /root/.ssh/id_rsa.pub root@$1:/root/.ssh/id_rsa.pub
    expect {
    "*yes/no" { send "yes\r"; exp_continue }
    "*password:" { send "$passwd\r" }
    "100%" {send "exit\r"}
    }
    expect eof
    EOF
    
    /usr/bin/expect <<-EOF
    set timeout 30                
    spawn ssh -p22 root@$1
    expect {
    "*yes/no" { send "yes\r"; exp_continue }
    "*password:" { send "$passwd\r" }
    }
    expect "*#"                        
    send "cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys\r"          
    expect "*#"    
    send "exit\r"
    #interact      
    expect eof
    EOF
    

    presto-install-master.sh 下载并安装Presto和MySQL,该脚本只会在Coordinator执行。

    #!/bin/bash
    
    cd /root
    wget https://s3.us-east-2.amazonaws.com/starburstdata/presto-admin/2.6/prestoadmin-2.6-offline-el7.tar.gz
    wget https://s3.us-east-2.amazonaws.com/starburstdata/presto/starburst/302e/302-e.11/presto-server-rpm-302-e.11.x86_64.rpm
    wget https://s3.us-east-2.amazonaws.com/starburstdata/presto/starburst/302e/302-e.11/presto-cli-302-e.11-executable.jar
    wget https://s3.us-east-2.amazonaws.com/starburstdata/presto/starburst/302e/302-e.11/presto-jdbc-302-e.11.jar
    
    tar -xzvf prestoadmin-2.6-offline-el7.tar.gz
    mv presto-cli-302-e.11-executable.jar presto-cli
    chmod +x presto-cli
    
    cd /root/prestoadmin ; ./install-prestoadmin.sh
    /usr/bin/expect <<-EOF
    set timeout 600                
    spawn ./presto-admin server install ../presto-server-rpm-302-e.11.x86_64.rpm
    expect {
    "*user name*" { send "\r"; exp_continue }
    "*port*" { send "\r"; exp_continue }
    "*IP address for coordinator node*" { send "cdh-master-0\r"; exp_continue }
    "*IP addresses for worker nodes*" { send "cdh-peer-0 cdh-peer-1\r" }
    }        
    #expect "*#"    
    #send "echo success!\r"  
    #interact
    expect eof
    EOF
    
    cat > /etc/presto/catalog/hive.properties << EOF
    connector.name=hive-hadoop2
    hive.metastore.uri=thrift://cdh-master-0:9083
    EOF
    
    cat > /root/.prestoadmin/coordinator/config.properties << EOF
    query.max-memory=12GB
    node-scheduler.include-coordinator=true
    discovery.uri=http://cdh-master-0:8080
    discovery-server.enabled=true
    http-server.http.port=8080
    coordinator=true
    query.max-memory-per-node=2GB
    EOF
    
    cat > /root/.prestoadmin/workers/config.properties << EOF
    query.max-memory=12GB
    coordinator=false
    query.max-memory-per-node=2GB
    http-server.http.port=8080
    discovery.uri=http://cdh-master-0:8080
    EOF
    
    cat > /etc/presto/catalog/hive.properties << EOF
    connector.name=hive-hadoop2
    hive.metastore.uri=thrift://cdh-master-0:9083
    EOF
    
    cat > /etc/presto/catalog/mysql.properties << EOF
    connector.name=mysql
    connection-url=jdbc:mysql://127.0.0.1:3306
    connection-user=root
    connection-password=Mypass!234
    EOF
    
    ./presto-admin configuration deploy
    ./presto-admin server start
    
    yum -y localinstall https://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
    yum -y install mysql-community-server
    systemctl start mysqld
    systemctl enable mysqld
    echo `grep 'temporary' /var/log/mysqld.log`
    

    cdh-agent.sh 安装、启动CDH Agent,并完成环境设置,该脚本会在Coordinator和Worker都执行。

    #!/bin/bash
    
    set -e
    set -x
    
    CDH_SERVER_PRIVATE_IP=$1
    
    sudo setenforce 0 || /bin/true
    sudo iptables -F
    
    sudo yum install -y cloudera-manager-daemons cloudera-manager-agent
    sudo sed -i 's/server_host=localhost/server_host='"$CDH_SERVER_PRIVATE_IP"'/' /etc/cloudera-scm-agent/config.ini
    sudo service cloudera-scm-agent start
    
    #############
    # Performance
    #############
    
    # Swappiness to 1
    sudo sysctl vm.swappiness=1  # Sets at runtime
    sudo bash -c "echo 'vm.swappiness = 1' >> /etc/sysctl.conf"  # Persists after reboot
    
    # Disable Transparent Huge Page Compaction
    sudo bash -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"   # At runtime
    sudo bash -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"  # At runtime
    sudo bash -c "echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.d/rc.local"   # Persists after reboot
    sudo bash -c "echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local"  # Persists after reboot
    sudo chmod +x /etc/rc.d/rc.local  # Activate script

    initialization_env.sh 复杂安装、启动VoltDB相关的命令,并完成环境设置和配置文件,该脚本会在Coordinator和Worker都执行。

    #!/bin/bash
    
    
    cd /usr/src
    wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz
    tar xzf Python-2.7.15.tgz
    cd Python-2.7.15
    ./configure --enable-optimizations
    make altinstall
    
    #VoltDB企业版需要的License文件,可以在线申请。
    echo -e '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
                    <license>
                    <permit version="1" scheme="0">
                    <type>Enterprise Edition</type>
                    <issuer>
                    <company>VoltDB</company>
                    <email>support@voltdb.com</email>
                    <url>http://voltdb.com/</url>
                    </issuer>
                    <issuedate>2019-01-09</issuedate>
                    <licensee>VoltDB Field Engineering</licensee>
                    <expiration>2020-01-09</expiration>
                    <hostcount max="200"/>
                    <features trial="false">
                    <wanreplication>true</wanreplication>
                    <dractiveactive>true</dractiveactive>
                    </features>
                    </permit>
                    <signature>
                        ...
                    </signature>
                    </license>' > ~/license.xml
                
    echo -e "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>
                  <deployment>
                    <cluster sitesperhost=\"8\" kfactor=\"1\" />
                    <commandlog synchronous=\"false\" enabled=\"true\" logsize=\"10000\"/>
                    <snapshot enabled=\"false\"/>
                    <httpd enabled=\"true\">
                        <jsonapi enabled=\"true\" />
                    </httpd>
                    <systemsettings>
                    <temptables maxsize=\"1024\"/>
                    <query timeout=\"30000\"/>
                    </systemsettings>
                    <export>
                        <configuration target=\"hadoop\" enabled=\"true\" type=\"http\">
                            <property name=\"endpoint\">
                                http://cdh-master-0:50070/webhdfs/v1/%t/data%p-%g.%d.csv
                            </property>
                            <property name=\"batch.mode\">true</property>
                            <property name=\"period\">2</property>
                        </configuration>
                        <configuration target=\"mysql\" enabled=\"true\" type=\"jdbc\">
                            <property name=\"jdbcurl\">
                                jdbc:mysql://cdh-master-0:3306/bigdb
                            </property>
                            <property name=\"jdbcuser\">root</property>
                            <property name=\"jdbcpassword\">Mypass!234</property>
                            <property name=\"createtable\">true</property>
                            <property name=\"ignoregenerations\">true</property>
                            <property name=\"lowercase\">true</property>
                        </configuration>
                    </export>
                  </deployment>" > ~/deployment.xml
    
    curl -L -o /opt/voltdb-ent-9.0.tar.gz -O https://downloads.voltdb.com/technologies/server/voltdb-ent-9.0.tar.gz
    tar -xzvf /opt/voltdb-ent-9.0.tar.gz -C /opt/
    mv /opt/voltdb-ent-9.0 /opt/voltdb
    
    echo -e 'export VOLT=/opt/voltdb' >> ~/.bashrc
    echo -e 'export PATH=$PATH:$VOLT/bin' >> ~/.bashrc
    echo -e 'export VOLTDB_HEAPMAX="2048"' >> ~/.bashrc
    mv -f ~/license.xml /opt/voltdb/voltdb/
    /opt/voltdb/bin/voltdb init -f -C ~/deployment.xml --dir=/opt --force >> ~/voltdb_init.log
    export VOLTDB_HEAPMAX="2048"
    yum -y install pip
    pip install -r /opt/voltdb/lib/python/voltsql/requirements.txt
    yum -y install expect
    yum -y install git
    ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa > /dev/null
    
    wget https://services.gradle.org/distributions/gradle-5.1-bin.zip -P /tmp
    unzip -d /opt/gradle /tmp/gradle-5.1.zip
    ln -s /opt/gradle/gradle-5.1/bin/gradle /usr/bin/gradle
    
    wget http://www.java2s.com/Code/JarDownload/mysql/mysql-connector-java-5.1.24-bin.jar.zip -P /opt/voltdb/lib/extension
    unzip -o /opt/voltdb/lib/extension/mysql-connector-java-5.1.24-bin.jar.zip -d /opt/voltdb/lib/extension/
    
    
    • Terraform 启动

    脚本都准备好之后,就可以开始创建集群了。

    第一次使用Terraform需要先初始化

    $ terraform init

    Initializing provider plugins...
    - Checking for available provider plugins on https://releases.hashicorp.com...
    - Downloading plugin for provider "null" (2.1.2)...
    - Downloading plugin for provider "alicloud" (1.44.0)...

    The following providers do not have any version constraints in configuration,
    so the latest version was installed.

    To prevent automatic upgrades to new major versions that may contain breaking
    changes, it is recommended to add version = "..." constraints to the
    corresponding provider blocks in configuration, with the constraint strings
    suggested below.

    * provider.alicloud: version = "~> 1.44"
    * provider.null: version = "~> 2.1"

    Terraform has been successfully initialized!

    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.

    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.

    然后执行 

    $terraform apply

    出现以下提示说明执行成功,集群已经自动搭建完毕。可以通过tf 脚本输出的Public IP来访问ECS实例了。

    Apply complete! Resources: 10 added, 0 changed, 0 destroyed.

    Outputs:

    cdh_master_address = [
        47.74.52.x
    ]
    cdh_peer_address = [
        47.74.51.x,
        47.74.27.x
    ]

    • Terraform 执行完毕后,可以通过上面的Public IP登录,试一下各组件都工作正常。

    修改MySQL登录口令和配置远程访问权限。

    找到初始密码,然后登录:

    # echo `grep 'temporary' /var/log/mysqld.log`
    2019-05-25T03:03:25.244623Z 1 [Note] A temporary password is generated for root@localhost: AFk?urG<a8su 2019-05-25T03:03:28.683716Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables 

    # mysql -u root -p
    Enter password:

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Mypass!234';
    Query OK, 0 rows affected (0.01 sec)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Mypass!234' WITH GRANT OPTION;
    Query OK, 0 rows affected, 1 warning (0.00 sec)

    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)

    mysql> create database bigdb;

    • 测试VoltDB正常工作,将数据通过JDBC自动导出到MySQL。在VoltDB新建Stream,根据配置会默认在MySQL建立对应的表。然后我们往VoltDB Stream写入数据。

    # voltsql

    > CREATE STREAM visits1
      EXPORT TO TARGET mysql(
          user_id varchar(20),
          login TIMESTAMP
      );

    > insert into visits1 values('2', now());

    insert into visits1 values('2', now());
    (Returned 1 rows in 0.01s)

    • 检查MySQL中是否自动建立了该表,数据自动被导入了。

    mysql> use bigdb;
    mysql> show tables;
    +-----------------+
    | Tables_in_bigdb |
    +-----------------+
    | visits1         |
    +-----------------+
    1 row in set (0.00 sec)

    mysql> select * from visits1;
    +---------------------+-----------------------+-----------------------------+-------------------+--------------+-----------------------+---------+---------------------+
    | volt_transaction_id | volt_export_timestamp | volt_export_sequence_number | volt_partition_id | volt_site_id | volt_export_operation | user_id | login               |
    +---------------------+-----------------------+-----------------------------+-------------------+--------------+-----------------------+---------+---------------------+
    |    3619631923331072 |      1199505208127783 |                           1 |                 0 |            2 |                     1 | 1       | 2019-05-25 03:08:48 |
    |    3619631923363840 |      1199505208222730 |                           2 |                 0 |            2 |                     1 | 2       | 2019-05-25 03:10:23 |
    |    3619631923494912 |      1199505208958264 |                           1 |                 0 |            2 |                     1 | 2       | 2019-05-25 03:22:38 |
    +---------------------+-----------------------+-----------------------------+-------------------+--------------+-----------------------+---------+---------------------+

    确认无误。

     

    • 将数据从VoltDB导出到Hive,目前需要先将数据导出到HDFS然后再加载到Hive.

    先通过CDH Manager GUI安装Hadoop基本组件。

    Hadoop安装好之后,为了测试需要新建目录并配置目录权限。

    # su - hdfs

    # curl -i -g -X PUT "http://cdh-master-0:50070/webhdfs/v1/VISITS?op=MKDIRS&user.name=hdfs"

    # hadoop fs -chmod 777 /user

    # hadoop fs -chmod 777 /VISITS

    建立对应HDFS的VoltDB Stream,写入测试数据。

    # voltsql
    > CREATE STREAM visits
      EXPORT TO TARGET hadoop(
          user_id BIGINT NOT NULL,
          login TIMESTAMP
      );
    Command succeeded.
    > insert into visits values(1, now());

    检查数据是否已经写到HDFS。

    [hdfs@cdh-master-0 ~]$ curl -i -g "http://cdh-master-0:50070/webhdfs/v1/VISITS?op=LISTSTATUS"
    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Expires: Sat, 25 May 2019 04:22:45 GMT
    Date: Sat, 25 May 2019 04:22:45 GMT
    Pragma: no-cache
    Expires: Sat, 25 May 2019 04:22:45 GMT
    Date: Sat, 25 May 2019 04:22:45 GMT
    Pragma: no-cache
    Content-Type: application/json
    X-FRAME-OPTIONS: SAMEORIGIN
    Transfer-Encoding: chunked

    {"FileStatuses":{"FileStatus":[
    {"accessTime":1558757980036,"blockSize":134217728,"childrenNum":0,"fileId":17241,"group":"supergroup","length":30,"modificationTime":1558757980123,"owner":"dr.who","pathSuffix":"data0-mx336in27wu7.20190525T12.csv","permission":"644","replication":3,"storagePolicy":0,"type":"FILE"}

    检查文件内容:

    [hdfs@cdh-master-0 ~]$ curl -i -g -L "http://cdh-master-0:50070/webhdfs/v1/VISITS/data0-mx336in27wu7.20190525T12.csv?op=OPEN"
    HTTP/1.1 307 TEMPORARY_REDIRECT
    Cache-Control: no-cache
    Expires: Sat, 25 May 2019 04:23:25 GMT
    Date: Sat, 25 May 2019 04:23:25 GMT
    Pragma: no-cache
    Expires: Sat, 25 May 2019 04:23:25 GMT
    Date: Sat, 25 May 2019 04:23:25 GMT
    Pragma: no-cache
    X-FRAME-OPTIONS: SAMEORIGIN
    Location: http://cdh-peer-1:50075/webhdfs/v1/VISITS/data0-mx336in27wu7.20190525T12.csv?op=OPEN&namenoderpcaddress=cdh-master-0:8020&offset=0
    Content-Type: application/octet-stream
    Content-Length: 0

    HTTP/1.1 200 OK
    Access-Control-Allow-Methods: GET
    Access-Control-Allow-Origin: *
    Content-Type: application/octet-stream
    Connection: close
    Content-Length: 30

    "1","2019-05-25 12:14:13.111"

     将数据导入到Hive。

    # beeline -n root -u jdbc:hive2://cdh-master-0:10000/default

    hive> create schema bigdb;

    hive> CREATE TABLE bigdb.visits(user_id string, login string) 

    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

    hive> load data inpath 'hdfs://cdh-master-0:8020/VISITS/data0-mx336in27wu7.20190525T12.csv' into table visits;

    数据已经可以通过Hive检索。

    0: jdbc:hive2://cdh-master-0:10000/default> select * from bigdb.visits;
    INFO  : Compiling command(queryId=hive_20190525122828_705b1233-022d-4235-9cec-5e118c276166): select * from bigdb.visits
    INFO  : Semantic Analysis Completed
    INFO  : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:visits.user_id, type:string, comment:null), FieldSchema(name:visits.login, type:string, comment:null)], properties:null)
    INFO  : Completed compiling command(queryId=hive_20190525122828_705b1233-022d-4235-9cec-5e118c276166); Time taken: 0.26 seconds
    INFO  : Executing command(queryId=hive_20190525122828_705b1233-022d-4235-9cec-5e118c276166): select * from bigdb.visits
    INFO  : Completed executing command(queryId=hive_20190525122828_705b1233-022d-4235-9cec-5e118c276166); Time taken: 0.001 seconds
    INFO  : OK
    +-----------------+----------------------------+--+
    | visits.user_id  |        visits.login        |
    +-----------------+----------------------------+--+
    | "1"             | "2019-05-25 12:14:13.111"  |
    +-----------------+----------------------------+--+
    1 row selected (0.325 seconds)

    最后通过Presto同时从Hive和 MySQL查询数据

    # ./presto-cli --server cdh-master-0:8080 --catalog mysql --schema bigdb

    presto:bigdb> select a.user_id,a.login from mysql.bigdb.visits1 a join hive.bigdb.visits b on a.user_id<>b.user_id;
     user_id |          login
    ---------+-------------------------
     1       | 2019-05-25 03:08:48.000
     2       | 2019-05-25 03:10:23.000
     2       | 2019-05-25 03:22:38.000
    (3 rows)

    Query 20190525_043802_00026_x8k6s, FINISHED, 2 nodes
    Splits: 35 total, 35 done (100.00%)
    0:01 [5 rows, 68B] [5 rows/s, 69B/s]
     

    到此完成了整个搭建过程,脚本程序目录结构如下:

    • 如果只是测试,资源用完之后记得释放,执行命令:

    $terraform destroy

    Destroy complete! Resources: 10 destroyed.

    展开全文
  • 大数据时代,随着数据量的爆炸式增长,对于数据的处理速度要求也越来越高,以往基于MySQL的数据处理方案已无法满足大吞吐、低延迟的写入和高速查询的场景;百分点总结出了一套完整的解决方案,本文就带你一同了解...

    大数据时代,随着数据量的爆炸式增长,对于数据的处理速度要求也越来越高,以往基于MySQL的数据处理方案已无法满足大吞吐、低延迟的写入和高速查询的场景;百分点总结出了一套完整的解决方案,本文就带你一同了解VoltDB在流数据交互查询的应用实践。

    流式数据交互查询场景

    在百分点,每天有10亿条记录产生,针对这些大量实时产生的数据,不仅要做到实时写入,类似推荐调优、数据验证等查询要在秒级响应。有简单的单条验证,也有几个小时或一天的聚合计算,也有基于几千万/几亿数据表间的联合聚合查询。例如如下SQL查询:

    对于前期的MySQL方案,虽然已经根据一定规则做了人工的分库,但是对于上面SQL中的表Event落在单机上的数据量达到几千万,Result表也近千万,在这样的大表之间进行复杂的联合聚合查询,MySQL查下来要花费30分钟左右,甚至更长,或是没响应了。

    因此在针对同时要求大吞吐、低延迟的写入和高速查询的场景下,基于MySQL的现存方案完全无法实现。在不放弃SQL语句的便利基础上,经历过多种选型和方案调研,最终选择了VoltDB来解决此类问题。

    如上图,线上的全量流量,通过Streaming总线同时到达VoltDB和离线Hive表。不同的是,数据写入VoltDB使用实时方式,写入Hive使用批量方式。新的数据要求在极短的延迟内马上写入VoltDB待查询;批量写入Hive的数据也可以做到小时级以内刷写到对应分区。

    VoltDB简介

    VoltDB是一种开源的极速的内存关系型数据库,由Ingres和Postgres联合创始人Mike Stonebraker带领开发的NewSQL,提供社区版本和商业版本。VoltDB采用shard-nothing架构,既获得了NoSQL的良好可扩展性以及高吞吐量数据处理,又没有放弃传统关系型数据库的事务支持---ACID。

    一般VoltDB数据库集群由大量的站点(分区)组成,分散在多台机器上,数据的存储与处理都是分布在各个站点的,架构图如下所示:

    如上图,集群有3个节点、每个节点1个站点构成。因此图中的表都只分成3个区,当然也可以分成更多的区,那么一张表在单个节点上则存在多个分区。

    具体在使用上涉及以下几个概念

    • 客户端可以连接集群中任意一个节点,集群中所有节点是对等的,采用的也是水平分区的方式;

    • 每张表指定一个字段作为分区键,VoltDB使用该键采用哈希算法方式分布表数据到各个分区。事实上VoltDB中存在两种类型的表,一种是分区表,还有一种叫做”Replicated table”。”Replicated表”在每个节点存储的不是某张表的部分数据,而是全部数据,适用于小数据量的表。

      这里我们主要看重分区表,分区表的分区字段的选择很重要,应该尽量选择使数据分散均匀的字段。

    VoltDB支持的客户端语言或接口

    • C++

    • C#

    • Erlang

    • Go

    • Java

    • Python

    • Node.js

    • JDBC 驱动接口

    HTTPJSON 接口 (这意味着所有能实现http请求语言,都能编写VoltDB的客户端程序,且非常直观)

    VoltDB的思想是,所有的事务都是由java实现的预编译存储过程完成,且所有的存储过程在任意站点上都是序列化执行的,这样使VoltDB达到了最高的隔离级别,且消除了锁的使用,很好地提高了处理速度。在官方的测试结果中,VoltDB可以轻松的扩展到39台服务器(300核),120个分区,每秒处理160万复杂事务。

    百分点的实践

    VoltDB在百分点的使用如下图结构所示:

    • 数据从Kafka接入,补充下我们使用的是社区版本,社区版是没有持久化到磁盘功能的。因此使用Kafka非常适合,一旦出现故障,可以迅速从Kafka中恢复数据。

    • 使用Storm分布式实时计算框架,作为VoltDB的客户端,同时也是Kafka的消费者,充分利用Storm框架的高可用性和低延时特性。从数据产生,到进入VoltDB,逐条写入延时在16ms内,如果优化成汇聚小batch写入,可以提升吞吐但降低写入延迟。

    图中的Zookeeper保存数据写入VoltDB的规则配置,Storm拓扑通过监听配置决定写入VoltDB的数据。由于需要根据业务场景,创建合理的Schema、数据存储策略以及索引的应用。

    例如,在不同表之间的关联查询,关联条件是变化的,可能用户在两表间需要根据商品进行关联查询,也可能会要求根据用户信息进行关联查询,但对于VoltDB来讲,在分区表间进行Join查询时还要求同时符合VoltDB分区规则;由于数据量大,数据结构也存在一定的差异,而Storm拓扑内存资源总是有限的。

    于是我们采用了Zookeeper来做实时的动态配置,可以控制那些变化的数据进入VoltDB,也可以控制数据进入不同的Schema(本来是同一张表,但却使用了不同的分区策略而分成多个表)。

    另外,VoltDB目前还没有TTL的功能,我们构建自动剔除过期数据的程序,每隔10分钟删除一次最老的数据。这样一来,每天10亿条记录进出VoltDB,时刻保持着24小时数据的VoltDB应用平台就构建起来了。如下是在测试环境上进行的写入测试:

    CPU cores: 24

    Machines: 4

    Client threads: 64

    经过在测试环境中运行,在64线程时压测达到了100,000/s 的TPS,机器的平均CPU使用率在17%左右,而且VoltDB的处理能力基本上随着机器数增加呈线性增长。在高吞吐写入过程中,执行日常查询工作可以达到10秒内。

    上线后,部署5台机器,每台384G内存,同样24 cpu cores。写入的峰值接近70,000/s,相比原来同样的数据分布在13台MySQL机器上,在一台机器上(也就是部分数据上)花费30分钟的查询甚至使MySQL失去响应的复杂查询,到了VoltDB集群里基本上减少到十几秒,或者二十几秒,实现流式数据的交互查询。

    总结

    VoltDB 是一种性能极好的OLTP分布式内存SQL数据库,也存在一些缺陷,需要看使用场景,如其采用哈希的数据分布策略,进行范围查询可能不能体现出很大的优势。还有动态SQL,不支持动态表指定等等。

    数据库在大数据领域是核心组件,目前数据库产品非常多,可谓百花齐放,各有各的优势/不足,作为数据库的设计,关键还是要了解自己的需求,需要数据库来完成什么工作,再去理解每个数据库的功能和使用场景,这样才能根据需求选择合适的产品,设计出合理的Schema。

    展开全文
  • voltdb简介_VoltDB简介

    2020-07-04 15:16:25
    传统的关系数据库(例如MySQL)和大多数NoSQL系统将其数据存储在磁盘上。 VoltDB将所有内容存储在主内存中。 如果可以避免使用磁盘,则可以显着提高性能-访问内存比使用磁盘快一个数量级! 如今,RAM的成本大大低于...
  • 之前在git上下载的voltdb,以及在官网下载的社区版voltdb均不支持持久性事务,和扩展集群,今天下载了企业试用版voltdb,安装过程不再赘述,记录一下我的使用过程持久性测试以前的voltadminshutdown;之后重新启动...
  • voltdb的一些文档

    2021-01-30 12:54:55
    本帖最后由 〇〇 于 2014-8-31 16:23 编辑VoltDB实时投票应用性能测试分类: 工作日志272013-01voter是votedb开源包中的一个性能测试程序,代码位于源码包examples/voter/目录下。该程序模拟短时间内大量用户发起投票...
  • He wrote a short guide to help his team get through the transition for PHP developers moving from MySQL to VoltDB. Here’s an excerpt: Is there PhpMyAdmin or similar Yes there is! This tool is ...
  • VoltDB上手介绍

    2019-09-17 16:16:48
    下一篇预告,VoltDB官方例程Voter(实时... 最近开始研究voltdb,先分享一些粗浅的安装和使用经验 1)介绍 “Time is the enemy of data”。我觉得VoltDB官网的这句话相当有道理。大数据时代,最关键的技术问题...
  • MySQL/HandlerSocket和VoltDB:NoSQL的竞争者 一般认为NoSQL数据库在性能方面要优于传统的SQL数据库。但是有两个SQL的解决方案宣布:对于大型系统的高可扩展性需求,SQL仍然是可行的解决方案!这两个SQL解决方案...
  • 2020年,VoltDB变得更易于维护,更易于二次开发,更易于集成到业务的数据流管道中。 最新的长期支持版本(LTS)V9.3,让生产环境中使用VoltDB也更加放心。 公共云和私有云中更易于维护 VoltDB V10引入了VoltDB ...
  • MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于 Cluster 中这些组件的关系,请参见下图: 所有的...
  • VoltDB入门

    2019-03-22 10:23:00
    安装运行 环境要求 python2.7以上,不支持python3 java8 安装 ...解压 把voltdb/bin/加入环境变量 ...voltdb inti 在当前目录生成voltdbroot文件夹,里面存放着数据库数据之类的东西,还有命令行快照,用来...voltdb s...
  • VoltDB 简介

    2015-05-26 09:44:27
    VoltDB 简介 对 Java 代码使用一个内存型的、高性能的数据库 了解 VoltDB,一个内存数据库,提供了 NoSQL 数据库的可伸缩性和传统关系数据库系统的 ACID 一致性。我们将设计数据库表并对其进行分区,使用 Java™ ...
  • VoltDB FAQ

    2016-03-31 11:51:45
    1.1VoltDB为何物? VoltDB是为满足极端多的事务处理以及以下需求而设计的关系数据库系统: 可以提供比传统数据库系统好很多的性能。 可以线性扩展。 兼容SQL作为数据库管理接口。 兼容ACID,满足数据一致与完整性。 ...
  • VoltDB内存数据库的十大FAQ

    千次阅读 2014-08-06 03:06:01
    VoltDB与传统数据库(如DB2,Oracle,MySQL等)最大的不同点就是,VoltDB把全部数据放在内存里,并且可以scale out,运行在一个集群上,集群上的每个节点都可以执行部分数据处理任务。 VoltDB官网:http://vol
  • 转自: ... ...     VoltDB是一个革命性的新型数据库产品,被称作NewSQL数据库。它基于H-Store,号称比当前数据库产品的吞吐量高45倍,同时又具有很高的扩展性...
  • voltDB简介

    千次阅读 2011-09-01 10:39:52
     对于OLTP系统,在同等硬件的情况下,VoltDB提供比MySQL分片更好的性能。 2.2VoltDBMySQL with Memcached的区别  Memcached,分布式内存缓存.一般放在应用和数据库之间,提供频繁访问的数据库对象的缓存,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 640
精华内容 256
关键字:

mysqlvoltdb

mysql 订阅