# Dynamic Scaling - Agregar y quitar cpus según la carga que tengan los servidores

### ¿Cómo funciona el Dynamic Scaling?

Este componente puede ser ejecutado como daemon en uno o más nodos del VM Cluster (a mi me parece mejor tenerlo en todos los nodos) del Exadata (en la nube o cloud at customer). Lo que hace es monitorear cada cierto tiempo el uso de la cpu y si la carga de la cpu supera un umbral determinado durante un periodo de tiempo, este componente automáticamente incrementará la cantidad de cpu del VM Cluster y lo hará respetando una cantidad máxima definida por vos.

Luego si la carga de la cpu disminuye por sobre un umbral determinado durante un periodo de tiempo, este componente reducirá automáticamente la cantidad de cpu del VM Cluster y lo hará hasta una cantidad mínima definida por vos.

Incluso, si tenés un ACFS configurado, el Dynamic Scaling tendrá en consideración la carga de todos los nodos del cluster y realizará el aumento o disminución de cpu en base a la carga del cluster completo.

### ¿Cuáles son los requerimientos para que funcione?

* OCI-client o REST-API (Yo uso REST-API porque me parece más sencillo): Para usar la REST-API necesitas descargar desde OCI una API KEY y un API KEY FINGERPRINT. Esto te lo explico en este post: [¿Cómo obtener la API KEY de un usuario en OCI?](https://hashnode.com/post/cm1rv234a000c09lb9dy47pxs)
    
* Los servidores deben tener acceso a internet para poder interactuar con la API. El acceso puede ser a través de un proxy que tenga tu empresa.
    

### ¿Cómo instalar esta funcionalidad?

1. Descargar el archivo .zip correspondiente a tu sistema operativo de la nota 2719916.1
    
2. Transferir el archivo .zip a todos los servidores del VM Cluster en el directorio /tmp
    
3. Descomprimir el archivo .zip
    
4. Instalar el archivo rpm:
    
    ```bash
    rpm -ivh /tmp/dynamicscaling-2.0.2-5.el7.x86_64.rpm
    ```
    
5. Crear un directorio compartido bajo el ACFS:
    
    ```bash
    mkdir /acfs01/.dynamicscaling
    chown opc.opc /acfs01/.dynamicscaling
    ```
    
6. Crear el directorio oculto .oci dentro del home del usuario opc, donde estarán los archivos de configuración:
    
    ```bash
    mkdir /home/opc/.oci
    ```
    
7. Conectarse a OCI y descargar la API KEY del usuario y el archivo config. Esta tarea la explico paso a paso en este post: [¿Cómo obtener la API KEY de un usuario en OCI?](https://hashnode.com/post/cm1rv234a000c09lb9dy47pxs)
    
8. Copiar la API KEY al directorio ***/home/opc/.oci*** y ejecutar lo siguiente:
    
    ```bash
    chmod go-rwx <nombre_key>.pem
    ```
    
9. En el directorio ***/home/opc/.oci*** crear el archivo config con las lineas obtenidas en el punto 7 y en el parámetro ***key\_file*** asignarle el directorio ***/home/opc/.oci***
    

### Factores de incremento - Clásico vs Incremental

Esto se refiere a la velocidad con la cual el Dynamic Scaling aumentará la cantidad de cpus de tu VM Cluster.

Con el factor clásico (es el default) uno le define un valor y todas las veces que el Dynamic Scaling aumente la cantidad de cpus, lo hará con ese valor. Por ejemplo, si el valor es 4, se sumarán 4 cpus cada vez que se necesite aumentar la cantidad.

|  | Valor del Factor Clásico | Cantidad de OCPUs a agregar |
| --- | --- | --- |
| Primera vez | 8 | 8 |
| Segunda vez | 8 | 8 |
| Tercera vez | 8 | 8 |

Con el factor incremental, uno le define un valor y cuando el Dynamic Scaling deba aumentar la cantidad de cpus, la primera vez lo hará con ese valor, pero la segunda vez, lo hará con el doble de ese valor, la tercera vez, lo hará con el triple de ese valor y así sucesivamente.

|  | Valor del Factor Incremental | Cantidad de OCPUs a agregar |
| --- | --- | --- |
| Primera vez | 8 | 8 |
| Segunda vez | 8 | 16 |
| Tercera vez | 8 | 24 |

Es resumen, si tu VM Cluster de repente tiene mucha carga, el Factor Incremental llegará más rápido al máximo de cpu definido por vos. Pero cuidado, porque cuanto más cpu se agregue, mayor será el costo que deba pagar tu empresa. A usarlo con responsabilidad 😉.

### ¿Cómo registrarla como servicio de sistema operativo para que inicie automáticamente luego de un reinicio?

Sencillo, se debe crear el archivo ***/etc/systemd/system/dynamicscaling.service*** con este contenido, adaptando los valores entre &lt;&gt; a tu entorno:

```bash
# Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.
#
# Oracle dynamicscaling.service
[Unit]
Description=Dynamicscaling - Scale-up and Scale-down automation utility for OCI DB System
Wants=network-online.target local-fs.target
After=network-online.target local-fs.target

[Service]
User=opc
Type=simple
Environment="HTTPS_PROXY=https://<IP>:<puerto>"
Environment="https_proxy=https://<IP>:<puerto>"
Environment="PATH=/sbin:/bin:/usr/sbin:/usr/bin:/opt/dynamicscaling"
ExecStart=/bin/sh -c "/opt/dynamicscaling/dynamicscaling.bin --vm-cluster-id <ocid_vm_cluster> --ociregion <nombre_region> --tenancy-id <ocid_tenant> --user-id <ocid_usuario> --keyfingerprint <key_fingerprint> --privatekey /home/opc/.oci/<nombre_key>.pem --proxyhost <ip> --proxyport <puerto> --maxocpu 10 --minocpu 2 --ocpu 2 --acfs /acfs01/.dynamicscaling --mailx <dirección_mail> --subject <palabra de referencia> --sopnum 3"

TimeoutStartSec=300
PIDFile=/tmp/.dynamicscaling.pid
Restart=on-failure
RestartSec=5s
ExecStop=/bin/kill -s SIGINT $MAINPID

[Install]
WantedBy=multi-user.target
```

Luego ejecutar como root estos comandos:

```bash
systemctl daemon-reload
systemctl enable dynamicscaling.service
systemctl start dynamicscaling.service
systemctl status dynamicscaling.service
```

¡¡¡Y listo!!!!

Hasta el próximo post 🙂

Saludos desde Buenos Aires, Argentina.
