YugabyteDB Nedir ? YugabyteDB Cluster Kurulumu (With Node to Node TLS)
YugaByteDB, yüksek verimli, ölçeklenebilir ve dağıtık bir veritabanı yönetim sistemidir (DBMS). Özellikle modern bulut uygulamaları için tasarlanmış olup, SQL ve NoSQL özelliklerini bir arada sunar. YugaByteDB, PostgreSQL uyumlu bir veritabanı sunmakta ve aynı zamanda NoSQL özelliklerini de entegre ederek esnek veri modellemesi sağlar.
Bu yazıda YugabyteDB’nin node-to-node ssl sertifikası ile 3 master ve 3 adet tablet server olarak kurulum yapılacaktır. Önce root ve node sertifikaları oluşturulacak ardından server kurulum adımlarına geçilecektir.
Sunucu Mimarisi ve Ön Gereksinimler
CPU | 2 Core |
RAM | 4 GB |
DISK | 70 GB |
- Sunucularda yugabyte adında bir user tanımlaması yapılmalıdır.
SSL Sertifikaların Olusturulması
SSL sertifika dosyalarını saklamak için secure-data adında bir dosya oluşturulmalıdır.
mkdir secure-data
Node sertifikalarını geçici olarak saklamak için aşağıdaki directory’ler oluşturulur.
mkdir -p secure-data/node.192.168.1.39 secure-data/node.192.168.1.40 secure-data/node.192.168.1.41
Root Sertifikanın Olusturulması
Root sertifikasını oluşturmak için ca.conf adında bir dosya oluşturulur. (CA=Certificate Authority) Bu dosya sertifikanın ihtiyaç duyduğu parametreleri barındırmaktadır.
cat > secure-data/ca.conf <<EOF
[ ca ]
default_ca = my_ca
[ my_ca ]
# Validity of the signed certificate in days
default_days = 3650
# Text file with next hex serial number to use
serial = secure-data/serial.txt
# Text database file to use, initially empty
database = secure-data/index.txt
# Message digest algorithm. Do not use MD5
default_md = sha256
# Section with a set of variables corresponding to DN fields
policy = my_policy
[ my_policy ]
# Policy for nodes and users. If the value is "match", then
# field value must match the same field in the CA certificate.
# If the value is "supplied", then it must be present. Optional
# means it may be present
organizationName = supplied
commonName = supplied
[req]
prompt=no
distinguished_name = my_distinguished_name
x509_extensions = my_extensions
[ my_distinguished_name ]
organizationName = example.com
commonName = yb-prod-tb-prod-yb
[ my_extensions ]
keyUsage = critical,digitalSignature,nonRepudiation,keyEncipherment,keyCertSign
basicConstraints = critical,CA:true,pathlen:1
EOF
index.txt ve serial.txt adında iki adet dosya aşağıdaki komut ile oluşturulur.
touch secure-data/index.txt
echo '01' > secure-data/serial.txt
Root CA için key üretilir.
openssl genrsa -out secure-data/ca.key
Oluşturulan key dosyasının yetkisi aşağıdaki komut ile değiştirilir.
chmod 755 secure-data/ca.key
Artık elimizde ca.conf ve ca.key dosyası mevcut sırada root sertifikasını oluşturmak kalıyor. Aşağıdaki komut ile root sertifikası oluşturulur.
openssl req -new \
-x509 \
-days 3650 \
-config secure-data/ca.conf \
-key secure-data/ca.key \
-out secure-data/ca.crt
Bu aşamadan sonra secure-data dosyasının altında ca.crt ca.key ca.conf dosyaları bulunmalıdır. Sırada node sertifikalarının oluşturulması kalıyor.
1. Node İçin Sertifika Oluşturma (192.168.1.39)
İlk aşamada oluşturduğumuz secure-data/node.192.168.1.39 altına node.conf dosyası oluşturulur. Bu aşamada dikkat edilmesi gereken CommonName ve alt_names altında bulunan IP.1 parametrelerinin node ip adresinde olmasıdır.
cat > /home/yugabyte/secure-data/node.192.168.1.39/node.conf <<EOF
[ req ]
prompt=no
distinguished_name = my_distinguished_name
[ my_distinguished_name ]
organizationName = Yugabyte
# Required value for commonName, do not change
commonName = 192.168.1.39
# Multiple subject alternative names (SANs) such as IP Address,
# DNS Name, Email, URI, and so on, can be specified under this section
[ req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.39
EOF
Node için key dosyası üretilir ve dosya yetkisi verilir.
openssl genrsa -out secure-data/node.192.168.1.39/node.192.168.1.39.key
chmod 755 secure-data/node.192.168.1.39/node.192.168.1.39.key
Node sertifikalarının oluşturulması için Certificate Signing Request dosyasının oluşturulması gerekmektedir. Bu request dosyası ile beraber sertifika oluşmaktadır. Bu dosya aşağıdaki komut ile oluşturulur.
openssl req -new \
-config secure-data/node.192.168.1.39/node.conf \
-key secure-data/node.192.168.1.39/node.192.168.1.39.key \
-out secure-data/node.192.168.1.39/node.csr
Oluşturulan Root CA dosyaları ve konfigürasyon dosyaları node sertifikası aşağıdaki komut ile oluşturulur. Bu sayede SelfSinged olarak ilk aşamada oluşturduğumuz kök sertifikası ile node sertifikasını imzalamış oluyoruz.
openssl ca -config secure-data/ca.conf \
-keyfile secure-data/ca.key \
-cert secure-data/ca.crt \
-policy my_policy \
-out secure-data/node.192.168.1.39/node.192.168.1.39.crt \
-outdir secure-data/node.192.168.1.39/ \
-in secure-data/node.192.168.1.39/node.csr \
-days 3650 \
-batch \
-extfile secure-data/node.192.168.1.39/node.conf \
-extensions req_ext
Komut hatasız çalıştığında aşağıdaki çıktıya benzer bir çıktı elde edilmesi gerekmektedir.
Using configuration from secure-data/ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName :ASN.1 12:'Yugabyte'
commonName :ASN.1 12:'192.168.1.39'
Certificate is to be certified until Feb 11 04:53:11 2030 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
2. Node İçin Sertifika Oluşturma (192.168.1.40)
İlk aşamada oluşturduğumuz secure-data/node.192.168.1.40 altına node.conf dosyası oluşturulur. Bu aşamada dikkat edilmesi gereken CommonName ve alt_names altında bulunan IP.1 parametrelerinin node ip adresinde olmasıdır.
cat > /home/yugabyte/secure-data/node.192.168.1.40/node.conf <<EOF
[ req ]
prompt=no
distinguished_name = my_distinguished_name
[ my_distinguished_name ]
organizationName = Yugabyte
# Required value for commonName, do not change
commonName = 192.168.1.40
# Multiple subject alternative names (SANs) such as IP Address,
# DNS Name, Email, URI, and so on, can be specified under this section
[ req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.40
EOF
Node için key dosyası üretilir ve dosya yetkisi verilir.
openssl genrsa -out secure-data/node.192.168.1.40/node.192.168.1.40.key
chmod 755 secure-data/node.192.168.1.40/node.192.168.1.40.key
Node sertifikalarının oluşturulması için Certificate Signing Request dosyasının oluşturulması gerekmektedir. Bu request dosyası ile beraber sertifika oluşmaktadır. Bu dosya aşağıdaki komut ile oluşturulur.
openssl req -new \
-config secure-data/node.192.168.1.40/node.conf \
-key secure-data/node.192.168.1.40/node.192.168.1.40.key \
-out secure-data/node.192.168.1.40/node.csr
Oluşturulan Root CA dosyaları ve konfigürasyon dosyaları node sertifikası aşağıdaki komut ile oluşturulur. Bu sayede SelfSinged olarak ilk aşamada oluşturduğumuz kök sertifikası ile node sertifikasını imzalamış oluyoruz.
openssl ca -config secure-data/ca.conf \
-keyfile secure-data/ca.key \
-cert secure-data/ca.crt \
-policy my_policy \
-out secure-data/node.192.168.1.40/node.192.168.1.40.crt \
-outdir secure-data/node.192.168.1.40/ \
-in secure-data/node.192.168.1.40/node.csr \
-days 3650 \
-batch \
-extfile secure-data/node.192.168.1.40/node.conf \
-extensions req_ext
Komut hatasız çalıştığında aşağıdaki çıktıya benzer bir çıktı elde edilmesi gerekmektedir.
Using configuration from secure-data/ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName :ASN.1 12:'Yugabyte'
commonName :ASN.1 12:'192.168.1.40'
Certificate is to be certified until Feb 11 04:53:11 2030 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
3. Node İçin Sertifika Oluşturma (192.168.1.41)
İlk aşamada oluşturduğumuz secure-data/node.192.168.1.41altına node.conf dosyası oluşturulur. Bu aşamada dikkat edilmesi gereken CommonName ve alt_names altında bulunan IP.1 parametrelerinin node ip adresinde olmasıdır.
cat > /home/yugabyte/secure-data/node.192.168.1.41/node.conf <<EOF
[ req ]
prompt=no
distinguished_name = my_distinguished_name
[ my_distinguished_name ]
organizationName = Yugabyte
# Required value for commonName, do not change
commonName = 192.168.1.41
# Multiple subject alternative names (SANs) such as IP Address,
# DNS Name, Email, URI, and so on, can be specified under this section
[ req_ext]
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.41
EOF
Node için key dosyası üretilir ve dosya yetkisi verilir.
openssl genrsa -out secure-data/node.192.168.1.41/node.192.168.1.41.key
chmod 755 secure-data/node.192.168.1.41/node.192.168.1.41.key
Node sertifikalarının oluşturulması için Certificate Signing Request dosyasının oluşturulması gerekmektedir. Bu request dosyası ile beraber sertifika oluşmaktadır. Bu dosya aşağıdaki komut ile oluşturulur.
openssl req -new \
-config secure-data/node.192.168.1.41/node.conf \
-key secure-data/node.192.168.1.41/node.192.168.1.41.key \
-out secure-data/node.192.168.1.41/node.csr
Oluşturulan Root CA dosyaları ve konfigürasyon dosyaları node sertifikası aşağıdaki komut ile oluşturulur. Bu sayede SelfSinged olarak ilk aşamada oluşturduğumuz kök sertifikası ile node sertifikasını imzalamış oluyoruz.
openssl ca -config secure-data/ca.conf \
-keyfile secure-data/ca.key \
-cert secure-data/ca.crt \
-policy my_policy \
-out secure-data/node.192.168.1.41/node.192.168.1.41.crt \
-outdir secure-data/node.192.168.1.41/ \
-in secure-data/node.192.168.1.41/node.csr \
-days 3650 \
-batch \
-extfile secure-data/node.192.168.1.41/node.conf \
-extensions req_ext
Komut hatasız çalıştığında aşağıdaki çıktıya benzer bir çıktı elde edilmesi gerekmektedir.
Using configuration from secure-data/ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
organizationName :ASN.1 12:'Yugabyte'
commonName :ASN.1 12:'192.168.1.41'
Certificate is to be certified until Feb 11 04:53:11 2030 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated
Sertifika oluşturma işlemini başarılı bir şekilde yaptık sırada bu sertifikaları sunuculara kopyalama kalıyor. Aşağıdaki komut ile ilgili dosyaları sunuculara kopyalayabiliriz.
scp secure-data/ca.crt 192.168.1.39:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.39/*.crt 192.168.1.39:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.39/*.key 192.168.1.39:/home/yugabyte/yugabyte-tls-config
scp secure-data/ca.crt 192.168.1.40:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.40/*.crt 192.168.1.40:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.40/*.key 192.168.1.40:/home/yugabyte/yugabyte-tls-config
scp secure-data/ca.crt 192.168.1.41:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.41/*.crt 192.168.1.41:/home/yugabyte/yugabyte-tls-config
scp -R secure-data/node.192.168.1.41/*.key 192.168.1.41:/home/yugabyte/yugabyte-tls-config
YugabyteDB Cluster Kurulumu
Yugabyte home directory’sine gidilir ve ardından kurulum dosyaları indirilir. Bu işlemler TÜM NODE’larda yapılmalıdır.
cd /home/yugabyte
wget https://downloads.yugabyte.com/releases/2.23.0.0/yugabyte-2.23.0.0-b710-linux-x86_64.tar.gz
İndirilen dosya açılır. Kurulum öncesi hazırlıklar için post_install.sh dosyası çalıştırılır.
tar xvf yugabyte-2.23.0.0-b710-linux-x86_64.tar.gz
cd yugabyte-2.23.0.0 && ./post_install.sh
Cluster Olusturma
Cluster oluşturmadan önce bazı ortam değişkenlerinin ayarlanması gerekmektedir. Bu ortam değişkenleri aşağıdaki komutlar ile ayarlanabilir. Buradaki işlemler her bir node üzerinde teker teker yapılmalıdır.
export IP=$(hostname -I |awk '{print $1}')
export MASTERS=192.168.1.39:7100,192.168.1.40:7100,192.168.1.41:7100
export DATA_DIR_MASTER=/mnt/yugabytedb
export DATA_DIR_TSERVER=/mnt/yugabytedb/tserver
Ardından master node’u başlatalım. Bu komut her bir master’da teker teker yapılmalıdır.
./bin/yb-master --master_addresses=$MASTERS \
--fs_data_dirs=$DATA_DIR_MASTER \
--rpc-bind-addresses=$IP:7100 \
--replication_factor=3 \
--webserver_interface=$IP \
--use_node_to_node_encryption=yes \
--allow_insecure_connections=false \
--certs_dir=/home/yugabyte/yugabyte-tls-config >& /home/yugabyte/yb-masters.out &
Sorunsuz başladıktan sonra aşağıdaki komut ile tablet server’lar başlatılır.
./bin/yb-tserver --tserver_master_addrs=$MASTERS \
--fs_data_dirs=$DATA_DIR_TSERVER \
--rpc-bind-addresses=$IP:9100 \
--cql_proxy_bind_address=$IP:9042 \
--redis_proxy_bind_address=$IP:6379 \
--webserver_interface=$IP \
--use_node_to_node_encryption=yes \
--allow_insecure_connections=false \
--certs_dir=/home/yugabyte/yugabyte-tls-config >& /home/yugabyte/yb-tserver.out &
Arayüzüne aşağıdaki adresten ulaşılabilmektedir.
http://192.168.1.39:7000
Master node’u reboot ettiğimizde Leader’ın değiştiğini test edelim.
Görüldüğü gibi leader sunucu 192.168.1.41 IP adresli sunucuya geçti.
TLS Durumunu Aşağıdaki sayfadan görüntüleyebiliriz.
- Node to node encryption enabled: true
- Client to server encryption enabled: false
- Allow insecure connections: off
- SSL Protocols: default – TLS only
- Cipher list: default
- Ciphersuites: default
Sertifika Detaylarına baktığımızda;
Node certificate details:
Issuer: /O=example.com/CN=yb-prod-tb-prod-yb
Serial Number: 1
Validity:
Not Before: Nov 10 16:42:18 2024 GMT
Not After: Nov 8 16:42:18 2034 GMT
Subject: /O=Yugabyte/CN=192.168.1.39
Tebrikler artık Node to Node encripytion’a sahip dağıtık mimaride bir SQL veritabanı clusterına sahip oldunuz!