Доступ с использованием языков программирования

В этом документе описывается, как подключиться к YMatrix и выполнять запросы с помощью языков программирования. Будут рассмотрены два способа подключения — с высокой доступностью и без неё.

Высокая доступность означает наличие в YMatrix механизма автоматического переключения при сбое. После отказа основного узла (Master) его резервный узел (Standby) продолжает предоставлять сервисы внешним клиентам.

Подключение с высокой доступностью означает, что программа автоматически переподключается к рабочему узлу после переключения при сбое в YMatrix.

Строки подключения с высокой доступностью (Connection URLs/DSN) обеспечивают стандартизированный формат, который можно использовать в различных приложениях без необходимости повторного ввода всей информации о подключении.
Обычно она состоит из нескольких полей, каждое из которых представляет разную информацию о подключении, например:
postgres://username:password@master_ip:master_port,standby_ip:standby_port/database?sslmode=disable

где:

  • username и password — имя пользователя и пароль для входа в базу данных соответственно.
  • master_ip:master_port и standby_ip:standby_port — информация о подключении к Master и Standby.
  • database — имя базы данных, к которой осуществляется подключение.
  • sslmode — указывает, включено ли SSL-подключение.

Примечание!
YMatrix поддерживает высокоскоростную запись данных через интерфейс MatrixGate API. Подробнее см. в разделе Запись из языка программирования через MatrixGate.


Создайте пример пользователя ymatrix с паролем 1234.

=# CREATE USER ymatrix PASSWORD '1234';
  • IP-адрес Master: 172.16.100.81; Порт: 5432
  • IP-адрес Standby: 172.16.100.82; Порт: 5432
  • База данных: ymatrixdb


1 JAVA (высокая доступность)

Рекомендуется использовать официальный драйвер PostgreSQL JDBC Driver в качестве драйвера подключения к базе данных.

package com.postgresqltutorial;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class App{
    private final String url = "jdbc:postgres://ymatrix:[email protected]:5432,172.16.100.82:5432/ymatrixdb?sslmode=disable"; 
    private final String user = "ymatrix";
    private final String password = "1234";
    /**
     * Connect to the YMatrix database
     *
     * @return a Connection object
     */
    public Connection connect() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("Connected to the YMatrix server successfully.");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return conn;
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        App app = new App();
        app.connect();
    }
}


2 Python (высокая доступность)

Рекомендуется использовать psycopg 2/3 в качестве драйвера подключения к базе данных.

# -*- coding: utf-8 -*-
import psycopg2

class YMatrix(object):
    def __init__(self):
        self.dsn = "postgres://ymatrix:[email protected]:5432,172.16.100.82:5432/ymatrixdb?sslmode=disable"

    def get_conn(self):
        conn = psycopg2.connect(dsn=self.dsn)
        return conn

    def create_table(self):
        conn = self.get_conn()
        cursor = conn.cursor()
        sql = "CREATE TABLE data(" \
              "time timestamp," \
              "tag_id int," \
              "metrics1 float8," \
              "metrics2 float8," \
              "metrics3 float8" \
              ")USING MARS3" \
              "DISTRIBUTED BY (tag_id)" \
              "ORDER BY (tag_id)"
        cursor.execute(sql)
        conn.commit()
        conn.close()

    def insert(self):
        conn = self.get_conn()
        cursor = conn.cursor()
        sql = "INSERT INTO data VALUES(now(), 1, 1.1, 1.2, 1.3)"
        cursor.execute(sql)
        conn.commit()
        conn.close()

    def select(self):
        conn = self.get_conn()
        cursor = conn.cursor()
        sql = "SELECT * FROM data"
        cursor.execute(sql)
        data = cursor.fetchone()
        conn.commit()
        conn.close()
        return data

if __name__ == '__main__':
    mxdb = YMatrix()
    mxdb.create_table()
    mxdb.insert()
    print(mxdb.select())


3 Golang (высокая доступность)

Рекомендуется использовать pgx в качестве драйвера подключения к базе данных.

package main

import (
    "context"
    "fmt"
    "github.com/jackc/pgx/v4"
)

func main() {
    // Build connection configuration
    dsn := "postgres://ymatrix:<password>@172.16.100.81:5432,172.16.100.82:5432/ymatrixdb?sslmode=disable"
    config, err := pgx.ParseConfig(dsn)
    if err != nil {
        fmt.Println("Unable to parse config:", err)
        return
    }
    // Connect to the database
    conn, err := pgx.ConnectConfig(context.Background(), config)
    if err != nil {
        fmt.Println("Unable to connect to database:", err)
        return
    }
    defer conn.Close(context.Background())
}


4 Ruby (высокая доступность)

Рекомендуется использовать ruby-pg в качестве драйвера подключения к базе данных, скомпилировав с заголовками PostgreSQL 12.

require 'pg'
# Build connection configuration
dsn = "postgres://ymatrix:[email protected]:5432,172.16.100.82:5432/ymatrixdb?sslmode=disable"
conn = PG.connect(dsn)
# Perform database operations
begin
  conn.exec('SELECT * FROM table_name') do |result|
    result.each do |row|
      # Process each row of data
      puts row.inspect
    end
  end
rescue PG::Error => e
  puts "执行数据库操作时发生错误:#{e.message}"
ensure
  # Close the database connection
  conn.close if conn
end


5 Rust (высокая доступность)

Рекомендуется использовать rust-postgres в качестве драйвера подключения к базе данных.

use postgres::{Client, Error, NoTls};
fn main() -> Result<(), Error> {
    let mut client = Client::connect(
        "postgresql://ymatrix:[email protected]:5432,172.16.100.82:5432/ymatrixdb",
        NoTls,
    )?;
    for row in client.query("SELECT * FROM table_name", &[])? {
        let id: i32 = row.get(0);
        let name: String = row.get(1); 
        println!("ID: {}, Name: {}", id, name);
        // Here you can perform the data processing operations you need
    }
    Ok(())
}


6 C# (высокая доступность)

Рекомендуется использовать npgsql в качестве драйвера подключения к базе данных.

C#
using System;
using Npgsql;
class Program
{
    static void Main()
    {
        // Configure high availability DSN
        var connectionString = "Host=sdw1, sdw2;Port=5432;Database=mydatabase;Username=myuser;Password=mypassword;Load Balance Hosts=true";
        // Create a database connection
        using var connection = new NpgsqlConnection(connectionString);
        try
        {
            // Open a database connection
            connection.Open();
            // Perform database operations
            using var command = new NpgsqlCommand("SELECT * FROM table_name", connection);
            using var reader = command.ExecuteReader();
            // Process query results
            while (reader.Read())
            {
                // Process each row of data
                var column1Value = reader.GetString(0);
                var column2Value = reader.GetInt32(1);
                Console.WriteLine($"{column1Value}, {column2Value}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}


7 C/C++ (высокая доступность)

Рекомендуется использовать ODBC в качестве драйвера подключения к базе данных.

Примечание!
Все приведённые ниже команды необходимо выполнять от имени пользователя root или с правами sudo.

Скачайте и установите ODBC.

# yum install -y unixODBC.x86_64
# yum install -y postgresql-odbc.x86_64

Отредактируйте файлы, связанные с ODBC.

# cat /usr/local/etc/odbcinst.ini
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver      = /usr/lib/psqlodbcw.so
Setup       = /usr/lib/libodbcpsqlS.so
Driver64    = /usr/lib64/psqlodbcw.so
Setup64     = /usr/lib64/libodbcpsqlS.so
FileUsage = 1

# cat /usr/local/etc/odbc.ini
[pg]
Description = Test to pg
Driver = PostgreSQL
Database = test
// The content of "<>" needs to be replaced with the actual cluster information, and the "<>" symbol is removed
Servername = <Master,Standby>
UserName = mxadmin
Password = mxadmin
Port = <Master Port,Standby Port>
ReadOnly = 0

Отредактируйте файлы, связанные с C/C++.

# cat test.c

#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
#include <string.h>
#include <sqltypes.h>

int main()
{
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    SQLRETURN ret;

    // Assign environment handles
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    // Set environment properties
    ret = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
    // Assign a connection handle
    ret = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
    // Connect to the database
    ret = SQLConnect(hdbc, "pg", SQL_NTS, "mxadmin", SQL_NTS, "mxadmin", SQL_NTS);
    if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
    {
        printf("Connected to PostgreSQL database successfully.\n");

        // Create a table and replace <tablename> with actual information
        ret = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
        ret = SQLExecDirect(hstmt, "CREATE TABLE <tablename> (id int) USING MARS3 DISTRIBUTED BY (id) ORDER BY (id)", SQL_NTS);
        if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
        {
                printf("成功创建表<tablename>.\n");
        }
        // Disconnect the database
        SQLDisconnect(hdbc);
    }
    else
    {
        printf("Failed to connect to PostgreSQL database.\n");
    }
    // Release the handle
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    SQLFreeHandle(SQL_HANDLE_ENV, henv);

    return 0;
}

Скомпилируйте.

# gcc -lodbc -o test test.c

Запустите.

# ./test
Connected to PostgreSQL database successfully.

Убедитесь, что таблица успешно создана.

=#  \d <tablename>
              Table "public.test2"
 Column |  Type   | Collation | Nullable | Default 
-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 id     | integer |           |          | 
Distributed by: (id)


8 NodeJS (высокая доступность)

Рекомендуется использовать модуль postgres в качестве драйвера подключения к базе данных.

const postgres = require('postgres')

async function query() {
  // Создать подключение с высокой доступностью
  const conn = postgres(`postgres://username:password@master,stanby:port/database?sslmode=disable`)
  try {
    // Выполнить SQL-запрос
    const rows = await conn`SELECT id, name FROM users`
    rows.forEach(row => {
      console.log(`id: ${row.id}, name: ${row.name}`)
    })
  } catch (err) {
    console.error(err)
  } finally {
    // Закрыть соединение
    await conn.end()
  }
}

query()