---
# System prepended metadata

title: CockroachDB

---

# CockroachDB

**Autor:** Tvrtko Kaurinović, Antonio Zelenika

**Datum:** 15. siječnja 2023.

## Izmjerene performanse

CockroachDB dolazi sa ugrađenim alatom za mjerenje performansi opterećenja kako bismo simulirali promet klijenata. Donjim naredbama pokrećemo simulaciju opterećenja koristeći Cockroachevu aplikaciju MovR.

Učitavanje dataseta na mreza1:
```shell
$ sudo docker exec -it mreza1 ./cockroach workload init movr 'postgresql://root@mreza1:26257?sslmode=disable'
```

Držati pokrenuto 10 minuta:
```shell
$ sudo docker exec -it mreza1 ./cockroach workload run movr --duration=10m 'postgresql://root@mreza1:26257?sslmode=disable'
```

DB Console je odvojena sekcija koja nam pokazuje zdravlje i performanse klastera. Na stranici domaćina na kojem smo specificirali port nalazi se sekcija **Cluster Overview** na kojoj vidimo sve čvorove. Na podsekcijama možemo pregledavati stvari poput *Network latency*, *Databases* ili *Metrics*.

## Izmjerene performanse
Mjerenja su obavljena na virtualnoj mašini pa prilikom naredbe ```top``` možemo vidjeti da je procesor pod velikim opterećenjem prilikom izvođenja testnog opterećenja sustava za pohranu.


|![Top - u mirovanju](https://cdn.discordapp.com/attachments/667036939701977089/1064308767681941534/top-mirovanje.png) | 
|:--:| 
| *```top``` tijekom mirovanja* |

Radi usporedbe, na slici možemo vidjeti kako rezultati naredbe ```top``` izgledaju tijekom mirovanja.



### Jednoprocesni rad


![Top - single](https://media.discordapp.net/attachments/667036939701977089/1064308737751392296/top-single-active.png?width=881&height=336)

![CPU - single](https://media.discordapp.net/attachments/667036939701977089/1064308738971934760/cpu-single.png?width=881&height=307)

![Disk Write - single](https://media.discordapp.net/attachments/667036939701977089/1064308737302597672/disk-write-single.png?width=881&height=292)

![Disk Read - single](https://media.discordapp.net/attachments/667036939701977089/1064308739584299008/disk-read-single.png?width=881&height=288)

![Memory usage - single](https://media.discordapp.net/attachments/667036939701977089/1064308767874891877/memory-single.png?width=881&height=301)

![Network Bytes Received - single](https://cdn.discordapp.com/attachments/667036939701977089/1064308767472238612/network-single.png)

### Dvoprocesni rad

![Top - double](https://media.discordapp.net/attachments/667036939701977089/1064308738070151218/top-workdload.png)

![slike5](https://media.discordapp.net/attachments/667036939701977089/1064308738619605012/cpu-active2.png?width=881&height=313)

![Disk Write - double](https://media.discordapp.net/attachments/667036939701977089/1064308739991142530/disk-write.png?width=881&height=303)

![Disk Read - double](https://media.discordapp.net/attachments/667036939701977089/1064308739294888037/disk-read.png?width=881&height=314)


![Memory usage-double](https://media.discordapp.net/attachments/667036939701977089/1064308768088788992/memory-usage.png?width=881&height=313)

![Network Bytes Received](https://media.discordapp.net/attachments/667036939701977089/1064308768273354863/network.png?width=881&height=299)

Možemo vidjeti kako prilikom korištenja dvoprocesnog rada iskorištavamo više CPU-a, zapisujemo i čitamo više podataka po sekundi, koristimo više memorije i primamo više podataka na mreži. Možemo zaključiti da je višeprocesni rad bolji jer možemo iskoristiti više dostupnih resursa našeg računala.

## Konfiguracija CockroachDB korištenjem Docker-a 

CockroachDB može se jednostavno instalirati korištenjem Dockera. Nakon instaliranja i pokretanja Dockera potrebno je upisati iduću liniju u terminalu:

```shell
$ sudo docker pull cockroachdb/cockroach:v22.2.2
```
Ovom liniju dohvaćamo sliku za v22.2.2 izdanje CockroachDB sa *Docker Hub*.

> **Napomena:**
> Na Linuxu, Docker treba sudo privilegije.


Koristit ćemo više Docker kotejnera na jednom domaćinu sa jednim CockroachDB čvorom po kontejneru. Za to ćemo koristiti *most mrežu* (eng. bridge network) koja će omogućiti kontejnerima da komuniciraju kao jedan klaster iako su na odvojenim mrežama.

```shell
$ sudo docker network create -d bridge roachnet
```
U idućem koraku koristimo ```docker volume``` koji se preporučuje za očuvanje podataka generiranih i korištenih od strane Docker kontejnera. Bez ovog koraka ne bi mogli pristupiti podacima nakon brisanja kontejnera. Radimo klaster s više čvorova pa ćemo ih kreirati i zatim pokrenuti klaster:

```shell
$ sudo docker volume create mreza1
```
```shell
$ sudo docker volume create mreza2
```

```shell
$ sudo docker run -d --name=mreza1 --hostname=mreza1 --net=mojamreza -p 26257:26257 -p 8080:8080  -v "mreza1:/cockroach/cockroach-data"  cockroachdb/cockroach:v22.2.2 start --insecure --join=mreza1,mreza2
```
Ovim putem smo kreirali kontejner i pokrenuli prvi CockroachDB čvor:
* ```docker run```: naredba za pokretanje novog kontejnera.
* ```-d```: Održava kontejner u pozadini.
* ```--name```: Dodjeljujemo ime kontejneru.
* ```--hostname```: Ime domaćina ovog čvora.
* ```--net```: Most mreža na koju će se kontejner povezati.
* ```-p 26257:26257 -p 8080:8080```: Oznake priključak za komunikaciju među čvorovima i komunikaciju klijent-čvor(26257) i zadani priključak za HTTP zahtjeve konzole baze podataka (8080) od kontejnera za domaćina. To omogućuje komunikaciju među kontejnerima i dohvaćanje konzole baze podataka iz preglednika.
* ```-v "mreza1:/cockroach/cockroach-data```: Montira direktorij kao mjesto za pohranu podataka. To znači da će se podaci ovog čvora pohranjivati u ```mreza1``` i ostat će pohranjeni i nakon brisanja kontejnera.
* ```cockroachdb/cockroach:v22.2.2 start --insecure --join```: Pokretanje čvora u nesigurnom načinu rada. ```--join``` specificira naziv svakog čvora koji će se pri pokretanju povezati u klaster. Budući da je svaki čvor zaseban kontejner, možemo koristiti identični priključak.

Pokrečemo i drugi čvor:
```shell
sudo docker run -d --name=mreza2 --hostname=mreza2 --net=mojamreza -v "mreza2:/cockroach/cockroach-data" cockroachdb/cockroach:v22.2.2 start --insecure --join=mreza1,mreza2
```

Nakon toga izvodimo inicijalizaciju klastera
```shell
sudo docker exec -it mreza1 ./cockroach init --insecure
```

Sad kad je klaster pokrenut, možemo koristiti čvor kao SQL pristupnik. Da bismo to testirali koristimo naredbu ```docker exec``` za pokretanje ugrađene SQL ljuske u ```mreza1``` kontejneru.

Pokretanje SQL ljuske u prvom kontejneru
```shell
$ sudo docker exec -it mreza1 ./cockroach sql --insecure
```
Pokretanje SQL naredbi:
```>CREATE DATABASE pokedex;```
```>CREATE TABLE pokedex.pokemon (number INT PRIMARY KEY, name TEXT);```
```>INSERT INTO pokedex.pokemon VALUES (1, Bulbasaur);```
```>SELECT * FROM pokedex.pokemon;```:
```
  number | name
+--------+-----------+
       1 | Bulbasaur
 (1 row)
```
Naredbom ```\q``` izlazimo iz ljuske na prvom kontejneru, a ```$ sudo docker exec -it mreza2 ./cockroach sql --insecure``` pokreće novu ljusku na mreza2. Ako sada pokrenemo isti upit ```>SELECT * FROM pokedex.pokemon;``` možemo vidjeti da i dalje dohvaćamo iste podatke što znači da su podaci replicirani:

```
  number | name
+--------+-----------+
       1 | Bulbasaur
 (1 row)
```

## Literatura

- https://www.cockroachlabs.com/docs/v22.2/
- https://docs.docker.com/storage/volumes/
- https://docs.docker.com/network/bridge/