Python 앱 개발에서 YugabyteDB 사용

오랜 기간PostgreSQL 사용자로서 YugabyteDB이(가) 주목받는 것은 당연합니다. PostgreSQL과 기능이 호환되는 분산 SQL 데이터베이스이므로 투자를 잃을 필요가 없습니다. YugabyteDB는 PostgreSQL의 쿼리 계층을 재사용하므로 평소처럼 개발 도구를 사용할 수 있습니다. Cassandra 쿼리 레이어도 있기 때문에 더 많은 것을 제공합니다. YugabyteDB를 사용하면 NOSQL 데이터 모델(특히 와이드 컬럼 스토어)로 강화된 SQL 기술과 개발 도구를 재사용할 수 있으며 NewSQL의 탄력성, 확장성 및 고성능을 사용할 수 있습니다.

이 기사에서는 로컬 클러스터용 YugabyteDB를 설정하고 데이터를 채우고 Python3을 사용하여 데이터에 액세스합니다.

YugabyteDB 설치 및 구성



설치는 매우 쉽고 간단합니다. 소스 코드 컴파일이 없습니다(정말로 깊이 파고 싶지 않다면). 그냥 download YugabyteDB를 추출하고 실행하십시오 bin/post-install.sh . 이 단계가 완료되면 path/to/extracted/yugabytedb/bin가 $PATH에 있는지 확인하십시오. 내가 한 일은 다음과 같습니다.

생선 껍질

$ set -x path/to/extracted/yugabytedb/bin $PATH


배쉬 쉘

$ export PATH=path/to/extracted/yugabytedb/bin:$PATH


Note: to avoid writing the same thing over and over again, I usually put the set or export statements above inside a file and then whenever I want to use YugabyteDB, I just source the-file.sh.



다음으로 YugabyteDB를 구성해야 합니다. YugabyteDB를 구성하려면 YugabyteDB configuration 을 참조하십시오. 문서는 완전하지만 모든 것이 작동하도록 하려면 다음과 같이 변경/etc/security/limits.conf만 하면 됩니다.

# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
...
...
...
#<domain>      <type>  <item>         <value>
#

*                -       core            unlimited
*                -       data            unlimited
*                -       fsize           unlimited
*                -       sigpending      119934
*                -       memlock         64
*                -       rss             unlimited
*                -       nofile          1048576
*                -       msgqueue        819200
*                -       stack           8192
*                -       cpu             unlimited
*                -       nproc           12000
*                -       locks           unlimited

# End of file


상황에 따라 다시 시작하거나 다시 로그아웃-로그인해야 할 수도 있습니다.

YugabyteDB의 모든 데이터, 로그, 구성 등은 $HOME/var/ 에 있습니다. 추가 구성을 확인하려면$HOME/var/conf/yugabytedb.conf:

{
    "tserver_webserver_port": 9000, 
    "master_rpc_port": 7100, 
    "universe_uuid": "dabc3d28-6982-4585-8b10-5faa7352da02", 
    "webserver_port": 7200, 
    "ysql_enable_auth": false, 
    "cluster_member": true, 
    "ycql_port": 9042, 
    "data_dir": "/home/bpdp/var/data", 
    "tserver_uuid": "71ad70b8eef149ae945842572e0fff75", 
    "use_cassandra_authentication": false, 
    "log_dir": "/home/bpdp/var/logs", 
    "polling_interval": "5", 
    "listen": "0.0.0.0", 
    "callhome": true, 
    "master_webserver_port": 7000, 
    "master_uuid": "1ef618e573a04e1d835f4ed4364825d7", 
    "master_flags": "", 
    "node_uuid": "6ae31951-7199-4c22-b30b-e8f235cef7db", 
    "join": "", 
    "ysql_port": 5433, 
    "tserver_flags": "", 
    "tserver_rpc_port": 9100
}                                                          


Note: PostgreSQL usually uses port 5432, but YugabyteDB default port is 5433. Pay attention to this since we are going to use this when we write our code.



YugabyteDB로 할 수 있는 일은 많지만 이 기사에서는 Python 앱 개발에 더 집중할 것입니다. 따라서 이제 로컬 클러스터만 있으면 충분합니다. 설정하자!.

YugabyteDB를 실행해 보겠습니다.

$ yugabyted start
Starting yugabyted...
✅ System checks           

+--------------------------------------------------------------------------------------------------+
|                                            yugabyted                                             |
+--------------------------------------------------------------------------------------------------+
| Status              : Running. Leader Master is present                                          |
| Web console         : http://127.0.0.1:7000                                                      |
| JDBC                : jdbc:postgresql://127.0.0.1:5433/yugabyte?user=yugabyte&password=yugabyte  |
| YSQL                : bin/ysqlsh   -U yugabyte -d yugabyte                                       |
| YCQL                : bin/ycqlsh   -u cassandra                                                  |
| Data Dir            : /home/bpdp/var/data                                                        |
| Log Dir             : /home/bpdp/var/logs                                                        |
| Universe UUID       : dabc3d28-6982-4585-8b10-5faa7352da02                                       |
+--------------------------------------------------------------------------------------------------+
🚀 yugabyted started successfully! To load a sample dataset, try 'yugabyted demo'.
🎉 Join us on Slack at https://www.yugabyte.com/slack
👕 Claim your free t-shirt at https://www.yugabyte.com/community-rewards/
$


상태 확인:

$ yugabyted status

+--------------------------------------------------------------------------------------------------+
|                                            yugabyted                                             |
+--------------------------------------------------------------------------------------------------+
| Status              : Running. Leader Master is present                                          |
| Web console         : http://127.0.0.1:7000                                                      |
| JDBC                : jdbc:postgresql://127.0.0.1:5433/yugabyte?user=yugabyte&password=yugabyte  |
| YSQL                : bin/ysqlsh   -U yugabyte -d yugabyte                                       |
| YCQL                : bin/ycqlsh   -u cassandra                                                  |
| Data Dir            : /home/bpdp/var/data                                                        |
| Log Dir             : /home/bpdp/var/logs                                                        |
| Universe UUID       : dabc3d28-6982-4585-8b10-5faa7352da02                                       |
+--------------------------------------------------------------------------------------------------+


YugabyteDB를 종료해야 하는 경우를 대비하여:

$ yugabyted stop
Stopped yugabyted using config /home/bpdp/var/conf/yugabyted.conf.
$


자, 이제 YugabyteDB를 실행해 보겠습니다. 이후 프로세스에 사용할 것입니다.

데이터 준비



이제 더 흥미로워집니다. 하나의 YugabyteDB 서버 인스턴스를 사용하여 SQL 및 Cassandra 데이터 모델을 모두 사용할 수 있습니다. 일부 데이터를 PostgreSQL 계층과 Cassandra 계층으로 집계해 보겠습니다. 이를 위해 우리는 여전히 기본 사용자와 비밀번호를 사용합니다. 나중에 YugabyteDB의 보안 측면을 관리할 수 있습니다.

Note: default username and password for PostgreSQL layer: yugabyte:yugabyte, while for Cassandra: cassandra:cassandra.



SQL 데이터



YugabyteDB는 SQL 데이터에 대해 sample datasets을 제공합니다. 우리는 Northwind Traders Database 을 사용할 것입니다. Northwind 샘플 데이터 세트 URL에서 DDLData 스크립트를 가져옵니다. 이 장면 덤프를 따라 데이터베이스, 테이블을 준비하고 데이터를 채웁니다. # pompt는 명령을 작성하는 위치입니다.

$ ysqlsh -U yugabyte
ysqlsh (11.2-YB-2.7.2.0-b0)
Type "help" for help.

yugabyte=# create database northwind;
CREATE DATABASE
yugabyte=# \l
                                   List of databases
      Name       |  Owner   | Encoding | Collate |    Ctype    |   Access privileges   
-----------------+----------+----------+---------+-------------+-----------------------
 northwind       | yugabyte | UTF8     | C       | en_US.UTF-8 | 
 postgres        | postgres | UTF8     | C       | en_US.UTF-8 | 
 system_platform | postgres | UTF8     | C       | en_US.UTF-8 | 
 template0       | postgres | UTF8     | C       | en_US.UTF-8 | =c/postgres          +
                 |          |          |         |             | postgres=CTc/postgres
 template1       | postgres | UTF8     | C       | en_US.UTF-8 | =c/postgres          +
                 |          |          |         |             | postgres=CTc/postgres
 yugabyte        | postgres | UTF8     | C       | en_US.UTF-8 | 
(6 rows)

yugabyte=# \c northwind
You are now connected to database "northwind" as user "yugabyte".
northwind=# \i northwind_ddl.sql 
SET
SET
SET
SET
SET
SET
SET
SET
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
DROP TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
CREATE TABLE
northwind=# \d
                 List of relations
 Schema |          Name          | Type  |  Owner   
--------+------------------------+-------+----------
 public | categories             | table | yugabyte
 public | customer_customer_demo | table | yugabyte
 public | customer_demographics  | table | yugabyte
 public | customers              | table | yugabyte
 public | employee_territories   | table | yugabyte
 public | employees              | table | yugabyte
 public | order_details          | table | yugabyte
 public | orders                 | table | yugabyte
 public | products               | table | yugabyte
 public | region                 | table | yugabyte
 public | shippers               | table | yugabyte
 public | suppliers              | table | yugabyte
 public | territories            | table | yugabyte
 public | us_states              | table | yugabyte
(14 rows)

northwind=# \i northwind_data.sql
...
...
...
INSERT 0 1
INSERT 0 1
INSERT 0 1
northwind=# select * from products;
 product_id |           product_name           | supplier_id | category_id |  quantity_per_unit   | unit_price | units_in_s
tock | units_on_order | reorder_level | discontinued 
-----------------+----------------------------------+-------------+-------------+----------------------+------------+-----------
----------+----------------+---------------+--------------
          4 | Chef Anton's Cajun Seasoning     |           2 |           2 | 48 - 6 oz jars       |         22 |           
  53 |              0 |             0 |            0
         46 | Spegesild                        |          21 |           8 | 4 - 450 g glasses    |         12 |           
  95 |              0 |             0 |            0
         73 | Röd Kaviar                       |          17 |           8 | 24 - 150 g jars      |         15 |           
 101 |              0 |             5 |            0
         29 | Thüringer Rostbratwurst          |          12 |           6 | 50 bags x 30 sausgs. |     123.79 |           
   0 |              0 |             0 |            1
         70 | Outback Lager                    |           7 |           1 | 24 - 355 ml bottles  |         15 |           
  15 |             10 |            30 |            0
         25 | NuNuCa Nuß-Nougat-Creme          |          11 |           3 | 20 - 450 g glasses   |         14 |           
  76 |              0 |            30 |            0
         54 | Tourtière                        |          25 |           6 | 16 pies              |       7.45 |           
  21 |              0 |            10 |            0
...
...
...
         17 | Alice Mutton                     |           7 |           6 | 20 - 1 kg tins       |         39 |           
   0 |              0 |             0 |            1
         59 | Raclette Courdavault             |          28 |           4 | 5 kg pkg.            |         55 |           
  79 |              0 |             0 |            0
(77 rows)

northwind=#  


SQL 데이터로 끝내십시오. 이제 열 전체를 채울 시간입니다. Cassandra 데이터입니다.

NOSQL 열 전체 데이터 - Apache Cassandra



우리는 간단한 키스페이스를 사용할 것입니다: 하나의 키스페이스는 하나의 테이블로 구성됩니다. CQL 스크립트 파일을 만듭니다(여기서 파일 이름은 zimera-employees.cql 입니다).

CREATE KEYSPACE zimera
  WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};

USE zimera;

CREATE TABLE employees(
   e_id int PRIMARY KEY,
   e_fullname text,
   e_address text,
   e_dept text,
   e_role text
   );

INSERT INTO employees (e_id, e_fullname, e_address, e_dept, e_role) VALUES(1,'Zaky A. Aditya', 'Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia', 'Information Technology', 'Machine Learning Developer');


스크립트를 실행합니다.

$ ycqlsh -f zimera-employees.cql 
$


성공 여부 확인:

$ ycqlsh -u cassandra
Password: 
Connected to local cluster at 127.0.0.1:9042.
[ycqlsh 5.0.1 | Cassandra 3.9-SNAPSHOT | CQL spec 3.4.2 | Native protocol v4]
Use HELP for help.
cassandra@ycqlsh> use zimera;
cassandra@ycqlsh:zimera> select * from employees;

 e_id | e_fullname     | e_address                                                            | e_dept                 | e_role
-----------+----------------+----------------------------------------------------------------------+------------------------+----------------------------
    1 | Zaky A. Aditya | Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia | Information Technology | Machine Learning Developer

(1 rows)
cassandra@ycqlsh:zimera> 
$


파이썬 - 드라이버



PostgreSQL과 Apache Cassandra 데이터 모델을 모두 사용할 것이므로 PostgreSQL용 psycopg2Python Driver for Apache Cassandra 두 드라이버를 설치해야 합니다.

Note: currently, psycopg is still developing psycopg3. We do not use psycopg3 since it is still in early development stage, but once psycopg3 is released, there should be easy to migrate.



카산드라 드라이버 설치

$ conda install cassandra-driver
...
...
...
  added / updated specs:
    - cassandra-driver


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    cassandra-driver-3.25.0    |   py39h27cfd23_0         3.0 MB
    ------------------------------------------------------------
                                           Total:         3.0 MB

The following NEW packages will be INSTALLED:

  blas               pkgs/main/linux-64::blas-1.0-mkl
  cassandra-driver   pkgs/main/linux-64::cassandra-driver-3.25.0-py39h27cfd23_0
  intel-openmp       pkgs/main/linux-64::intel-openmp-2021.3.0-h06a4308_3350
  libev              pkgs/main/linux-64::libev-4.33-h7b6447c_0
  mkl                pkgs/main/linux-64::mkl-2021.3.0-h06a4308_520
  mkl-service        pkgs/main/linux-64::mkl-service-2.4.0-py39h7f8727e_0
  mkl_fft            pkgs/main/linux-64::mkl_fft-1.3.0-py39h42c9631_2
  mkl_random         pkgs/main/linux-64::mkl_random-1.2.2-py39h51133e4_0
  numpy              pkgs/main/linux-64::numpy-1.20.3-py39hf144106_0
  numpy-base         pkgs/main/linux-64::numpy-base-1.20.3-py39h74d4b33_0
  six                pkgs/main/noarch::six-1.16.0-pyhd3eb1b0_0


Proceed ([y]/n)? y
...
...
...
$


PostgreSQL 드라이버 설치

$ conda install psycopg2                                                              ...
...
...
  added / updated specs:
    - psycopg2


The following NEW packages will be INSTALLED:

  krb5               pkgs/main/linux-64::krb5-1.19.2-hac12032_0
  libedit            pkgs/main/linux-64::libedit-3.1.20210714-h7f8727e_0
  libpq              pkgs/main/linux-64::libpq-12.2-h553bfba_1
  psycopg2           pkgs/main/linux-64::psycopg2-2.8.6-py39h3c74f83_1


Proceed ([y]/n)? y
...
...
$


Note: I use conda for package management, but you don't need to. You can also use pip, in this case just pip install psycopg2 and pip install cassandra-driver.



코딩하자!



SQL 데이터 액세스




# code-sql.py
import psycopg2

conn = psycopg2.connect(
    host="localhost",
    database="northwind",
    user="yugabyte",
    port="5433",
    password="yugabyte")

# Open a cursor to perform database operations
cur = conn.cursor()

# Execute a query
cur.execute("SELECT * FROM products")

# Retrieve query results
records = cur.fetchall()
print(records[0])


결과:

$ python code-sql.py
(4, "Chef Anton's Cajun Seasoning", 2, 2, '48 - 6 oz jars', 22.0, 53, 0, 0, 0)
$


Cassandra 데이터 모델 액세스




from cassandra.cluster import Cluster

cluster = Cluster()
session = cluster.connect('zimera')

rows = session.execute('SELECT e_fullname, e_address, e_dept, e_role FROM employees')
for row in rows:
    print(row.e_fullname, row.e_address, row.e_dept, row.e_role)


결과:

$ python code-cassandra.py 
Zaky A. Aditya Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia Information Technology Machine Learning Developer
$


하나의 파이썬 소스 코드에서 두 데이터 모델을 모두 사용하려면 어떻게 해야 할까요? 여기 있습니다:

# code-all.py
import psycopg2
from cassandra.cluster import Cluster

conn = psycopg2.connect(
    host="localhost",
    database="northwind",
    user="yugabyte",
    port="5433",
    password="yugabyte")

# Open a cursor to perform database operations
cur = conn.cursor()

# Execute a query
cur.execute("SELECT * FROM products")

# Retrieve query results
records = cur.fetchall()
print(records[0])

cluster = Cluster()
session = cluster.connect('zimera')

rows = session.execute('SELECT e_fullname, e_address, e_dept, e_role FROM employees')
for row in rows:
    print(row.e_fullname, row.e_address, row.e_dept, row.e_role)


결과:

$ python code-all.py
(4, "Chef Anton's Cajun Seasoning", 2, 2, '48 - 6 oz jars', 22.0, 53, 0, 0, 0)
Zaky A. Aditya Dusun Medelan, RT 01, Umbulmartani, Ngemplak, Sleman, DIY, Indonesia Information Technology Machine Learning Developer
$


멋지지 않아? 즐거운 코딩!

좋은 웹페이지 즐겨찾기