Вступление
Несколько месяцев назад я опубликовал статью о
Amazon Web Services Redshift — решении хранилища данных Amazon в облаке.
XtremeData dbX — это похожий массивный параллельный движок баз данных SQL, который может быть запущен как локально , так и в облаке. Это специально разработанное высокопроизводительное и масштабируемое решение для приложений хранилища данных и крупномасштабной аналитики с использованием инновационных технологий, таких как модель векторного исполнения, динамическое распределение данных и автоматическое распределение нагрузки.
XtremeData dbX Architecture
XtremeData dbX — это полностью совместимый с SQL и ACID механизм баз данных, основанный на массовом параллельном выполнении запросов без разделения ресурсов. Базовая технология основана на PostgreSQL (аналогично AWS Redshift). По сути, ключевыми компонентами архитектуры являются головной узел и несколько узлов данных — это довольно распространенные модели в массовых сценариях параллельного выполнения. Головной узел управляет клиентскими подключениями, анализирует и планирует запросы и отправляет результат обратно клиентам. Узлы данных управляют хранением данных и выполняют запросы.
XtremeData dbX в облаке AWS
Помимо локального варианта развертывания, XtremeData dbX доступна в облаке AWS. Нам нужно зайти на AWS Marketplace, чтобы зарегистрироваться для этого. Существуют разные версии; один для dbX Head и другой для dbX Data узлов.
XtremeData предоставляет документ по настройке головы dbX и узлов данных в облаке AWS, но я решил внедрить шаблоны AWS CloudFormation, чтобы упростить развертывание. Поскольку есть два разных AMI для головного узла и узла данных, я создал два шаблона. Шаблон AWS CloudFormation dbX-Head:
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "XtremeData dbX-Head CloudFormation", "Parameters" : { "ClusterName" : { "Description" : "Name of the XtremeData Cluster", "Type" : "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern" : "[-_ a-zA-Z0-9]*", "ConstraintDescription" : "can contain only alphanumeric characters, spaces, dashes and underscores." }, "KeyName" : { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances", "Type" : "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern" : "[-_ a-zA-Z0-9]*", "ConstraintDescription" : "can contain only alphanumeric characters, spaces, dashes and underscores." }, "InstanceType" : { "Description" : "XtremeData dbX-Head EC2 instance type", "Type" : "String", "Default" : "m1.medium", "AllowedValues" : [ "m1.medium","m1.large","m1.xlarge","m2.xlarge","m2.2xlarge","m2.4xlarge", "c1.xlarge","hi1.4xlarge"], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSRegion2AMI" : { "us-east-1" : {"AMI" : "ami-4c2f5d25"}, "us-west-2" : {"AMI" : "ami-c127b7f1"}, "us-west-1" : {"AMI" : "ami-84cde4c1"} } }, "Resources": { "XtremeDataSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable XTremedata Access", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": "22", "ToPort": "22", "CidrIp": "0.0.0.0/0" } ] } }, "XtremeDataSecurityGroupIngress" : { "Type": "AWS::EC2::SecurityGroupIngress", "Properties": { "GroupName": { "Ref": "XtremeDataSecurityGroup" }, "IpProtocol": "tcp", "FromPort": "0", "ToPort": "65535", "SourceSecurityGroupName": { "Ref": "XtremeDataSecurityGroup" } } }, "XtremeDataHeadInstance": { "Type": "AWS::EC2::Instance", "Properties": { "UserData" : { "Fn::Base64" : { "Ref" : "ClusterName" }}, "SecurityGroups": [ { "Ref": "XtremeDataSecurityGroup" } ], "ImageId" : { "Fn::FindInMap" : [ "AWSRegion2AMI", { "Ref" : "AWS::Region" }, "AMI" ]}, "InstanceType": {"Ref" : "InstanceType"}, "KeyName": { "Ref" : "KeyName" }, "BlockDeviceMappings" : [ { "DeviceName" : "/dev/sdf", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } }, { "DeviceName" : "/dev/sdg", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } }, { "DeviceName" : "/dev/sdh", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } }, { "DeviceName" : "/dev/sdi", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } } ], "Tags" : [ { "Key" : "Name", "Value" : "XtremeData dxX-Head"} ] } } } }
Это создаст группу безопасности для связи с узлом dbX, определит данные пользователя (имя кластера) и выделит 4 тома EBS (по 100 ГБ каждый) для головного узла dbX. Шаблон AWS CloudFormation dbX-Data выглядит следующим образом:
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "XtremeData dbX-Data CloudFormation", "Parameters" : { "ClusterNameAnddbXHead" : { "Description" : "Name of the XtremeData Cluster and the dbX-Head EC2 hostname concatenated with semi-colon", "Type" : "String", "MinLength": "1", "MaxLength": "64" }, "XtremeSecurityGroup" : { "Description" : "Name of the XtremeData SecurityGroup", "Type" : "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern" : "[-_ a-zA-Z0-9]*", "ConstraintDescription" : "can contain only alphanumeric characters, spaces, dashes and underscores." }, "NumberOfDataNodes" : { "Description" : "Max. Number of Xtreme Data Instances to start (in addition to the Head Instance)", "Type" : "Number", "Default" : "2" }, "HeadAvailZone" : { "Description" : "Name of the Availability Node where dbX-Head instance is running", "Type" : "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern" : "[-_ a-zA-Z0-9]*", "ConstraintDescription" : "can contain only alphanumeric characters, spaces, dashes and underscores." }, "KeyName" : { "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances", "Type" : "String", "MinLength": "1", "MaxLength": "64", "AllowedPattern" : "[-_ a-zA-Z0-9]*", "ConstraintDescription" : "can contain only alphanumeric characters, spaces, dashes and underscores." }, "InstanceType" : { "Description" : "XtremeData dbX-Data EC2 instance type", "Type" : "String", "Default" : "m1.large", "AllowedValues" : [ "m1.large","m1.xlarge","m2.xlarge","m2.2xlarge","m2.4xlarge", "c1.xlarge","hi1.4xlarge"], "ConstraintDescription" : "must be a valid EC2 instance type." } }, "Mappings" : { "AWSRegion2AMI" : { "us-east-1" : {"AMI" : "ami-442c5e2d"}, "us-west-2" : {"AMI" : "ami-1d28b82d"}, "us-west-1" : {"AMI" : "ami-66cce523"} } }, "Resources": { "XtremeDataNodeGroup" : { "Type" : "AWS::AutoScaling::AutoScalingGroup", "Properties" : { "AvailabilityZones" : [ { "Ref" : "HeadAvailZone" } ], "LaunchConfigurationName" : { "Ref" : "DataNodeLaunchConfig" }, "MinSize" : "0", "MaxSize" : {"Ref" : "NumberOfDataNodes"}, "DesiredCapacity" : {"Ref" : "NumberOfDataNodes"}, "Tags" : [ { "Key" : "Name", "Value" : "XtremeData dbX-Data", "PropagateAtLaunch" : "true" } ] } }, "DataNodeLaunchConfig" : { "Type" : "AWS::AutoScaling::LaunchConfiguration", "Properties": { "UserData" : { "Fn::Base64" : { "Ref" : "ClusterNameAnddbXHead" }}, "KeyName" : { "Ref" : "KeyName" }, "SecurityGroups" : [ { "Ref" : "XtremeSecurityGroup" } ], "InstanceType" : { "Ref" : "InstanceType" }, "ImageId" : { "Fn::FindInMap" : [ "AWSRegion2AMI", { "Ref" : "AWS::Region" }, "AMI" ]}, "BlockDeviceMappings" : [ { "DeviceName" : "/dev/sdf", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } }, { "DeviceName" : "/dev/sdg", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } }, { "DeviceName" : "/dev/sdh", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } }, { "DeviceName" : "/dev/sdi", "Ebs" : { "VolumeType" : "standard", "DeleteOnTermination" : "true", "VolumeSize" : "100" } } ] } } } }
Этот шаблон использует имя кластера и имя хоста AWS EC2, объединенные с; для пользовательских данных он также использует зоны доступности для головного узла dbX и группу безопасности, которую мы только что определили для головного узла dbX. Кроме того, он позволяет определить количество узлов данных — он будет использоваться для настройки группы автоматического масштабирования, чтобы обеспечить выполнение запрошенного количества экземпляров данных. ПРЕДУПРЕЖДЕНИЕ. Обратите внимание, что недостаточно просто завершить работу узлов, если определено автоматическое масштабирование, поскольку AWS будет инициировать новые узлы. Нам нужно завершить экземпляры с помощью команды as-terminate-instance-in-auto-scaling-group, а затем удалить конфигурацию автоматического масштабирования с помощью as-delete-auto-scaling-group и as-delete-launch-config. Более подробную информацию об автоматическом масштабировании AWS можно найти
здесь.Чтобы запустить головной узел XtremeData dbX, нам нужно перейти в раздел «Формирование облака» консоли AWS, а затем выбрать «Создать стек».
Через некоторое время мы увидим один головной узел и запрошенное число узлов данных, работающих в консоли AWS EC2:
Создание базы данных в ExtremeData dbX
После того, как мы запустили узлы, мы можем войти в головной узел как ec2-пользователь, используя ssh (или, например, putty в Windows). Сначала нам нужно запустить кластер (обратите внимание, что это деструктивная операция, данные не будут сохранены), затем запустить кластер и механизм базы данных dbX:
[ec2-user@ip-10-224-122-90 home]$ cluster_init -i 2 init started examining nodes initializing head ebs disks: xvdf xvdg xvdh xvdi mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. mkfs.xfs: Specified data stripe unit 512 is not the same as the volume stripe unit 128 initializing node ebs disks: xvdf xvdg xvdh xvdi clearing head ephemeral disks clearing nodes ephemeral disks cluster_init done [ec2-user@ip-10-224-122-90 home]$ cluster_start initializing head ephemeral disks head ephemeral disks: xvdb raid-ing mdadm: /dev/xvdb appears to contain an ext2fs file system size=419395584K mtime=Sat Jul 6 21:52:00 2013 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md1 started. mkfs.xfs: Specified data stripe unit 512 is not the same as the volume stripe unit 128 mkfs.xfs: Specified data stripe width 512 is not the same as the volume stripe width 128 examining nodes assembling node EBSs: xvdf xvdg xvdh xvdi initializing node tmp disks: xvdb xvdc raid-ing cluster_start done [ec2-user@ip-10-224-122-90 home]$ dbx_start new dbx installation initialized Initializing kernel nfsd: [ OK ] Starting NFS services: [ OK ] Starting NFS mountd: [ OK ] Stopping RPC idmapd: [ OK ] Starting RPC idmapd: [ OK ] Starting NFS daemon: [ OK ] rpc.svcgssd is stopped rpc.mountd (pid 3402) is running... nfsd (pid 3467 3466 3465 3464 3463 3462 3461 3460) is running... Generating binary repository file ... file 'xdapp.conf2.txt.conf0' generated. starting dbx nodes Starting xdu daemon... [ OK ] dbx startup done [ec2-user@ip-10-224-122-90 home]$ [ec2-user@ip-10-224-122-90 home]$
Теперь мы можем войти в систему как пользователь dbxdba (мы можем сделать это снова с помощью ssh или putty, так как ключ скопирован из ec2-пользователя). Затем нам нужно изменить пароль dbxdba (используя passwd Linux commad), чтобы иметь возможность войти в систему с помощью инструментов dbX. Теперь мы готовы создать сервер, и как только сервер будет создан, мы можем создать базу данных. Самый простой способ управления базой данных и выполнения запросов SQL — использовать инструмент командной строки с именем xdudb:
$ xdudb create aws_server 32145 ||==================|| [dbxdba@ip-10-224-122-90 ~]$ xdudb list ||==================|| aws_server [dbxdba@ip-10-224-122-90 ~]$ xdudb status ||==================|| ip-10-224-122-90 configuration: 1 head node and 2 data nodes running dbx services : 1 head node and 2 data nodes [dbxdba@ip-10-224-122-90 ~]$ xdudb start aws_server ||==================|| [dbxdba@ip-10-224-122-90 ~]$ xdudb info aws_server ||==================|| Name : aws_server NodeSet : Default_NS Owner : dbxdba Port : 32145 H|0 |head |10.224.122.90 |head |/volumes/data/dbstore/dbxdba/aws_server/head D|1 |node00 |10.154.137.31 |n0 |/hd/dbxdba/aws_server/n0 D|2 |node01 |10.165.7.225 |n1 |/hd/dbxdba/aws_server/n1 [dbxdba@ip-10-224-122-90 ~]$ xdudb dbcreate aws_server aws_db CREATE DATABASE
Теперь мы можем создать таблицу, вставить несколько строк и выполнить операторы select.
[dbxdba@ip-10-224-122-90 ~]$ xdudb sql aws_server aws_db Welcome to dbX psql 3.2.5, the interactive SQL terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit aws_db=# CREATE TABLE products ( aws_db(# product_no INTEGER, aws_db(# name VARCHAR(30), aws_db(# price NUMERIC(10,2) aws_db(# ); CREATE TABLE aws_db=# INSERT INTO products VALUES(1, 'Product1', 100.00); INSERT 0 1 aws_db=# SELECT * FROM products; product_no | name | price ------------+----------+-------- 1 | Product1 | 100.00 (1 row, Query Total: 1)
С помощью инструмента командной строки xdudb мы можем проверить версию dbX, проверить использование диска и смонтированные файловые системы и т. Д.
[dbxdba@ip-10-224-122-90 ~]$ xdudb version ip-10-224-122-90 2013-07-07 00:03:10 DB : dbX SQL 3.2.5 : fpga.run r4347 command line : xdudb 1.4 GUI : xdadm 3.0.2 daemon : xdutils 4.5.8 OS : Linux 3.4.43-43.43.amzn1.x86_64 [dbxdba@ip-10-224-122-90 ~]$ xdudb du aws_server ||==================|| H|0 |head |10.224.122.90 |head |60M |/volumes/data/dbstore/dbxdba/aws_server/head D|1 |node00 |10.154.137.31 |n0 |58M |/hd/dbxdba/aws_server/n0 D|2 |node01 |10.165.7.225 |n1 |58M |/hd/dbxdba/aws [dbxdba@ip-10-224-122-90 ~]$ xdudb df head : 10.224.122.90 Filesystem Size Used Avail Use% Mounted on /dev/md0 400G 95M 400G 1% /volumes/data node00 : 10.154.137.31 Filesystem Size Used Avail Use% Mounted on /dev/md0 400G 93M 400G 1% /volumes/data node01 : 10.165.7.225 Filesystem Size Used Avail Use% Mounted on /dev/md0 400G 93M 400G 1% /volumes/data
Веб-интерфейс управления xdAdm
В дополнение к инструменту командной строки, который мы описали в сценарии развертывания облака AWS, есть также графический веб-интерфейс для управления приложением — он основан на Apache Tomcat. Мы просто перейдем по адресу http: // dbx-headnode: 8080 / xdadm url и войдите в систему. Мы можем управлять серверами и базами данных, проверять наборы узлов и контролировать систему:
Виртуальная машина XtremeData dbX
Если кто-то просто хочет попробовать движок базы данных dbX, он может загрузить виртуальную машину с веб-сайта XtremeData. Экземпляр можно запустить, например, с помощью vmplayer. После того, как пользователь вошел в виртуальную машину как dbxdba, он может запустить сервер:
$ xdudb start dbxtest