# mydata.semantic.gr

# Μεταφορα απο 20.04 σε 24.04 - steps

#### Τι τρεχει στο παλιο σερβερ και πρεπει να μεταφερθει

1. database server &amp; main app για διαχειριση mydata δεδομενων
2. ergani sync εργασιες ([http://localhost:7000](http://localhost:7000), /workers)
3. salary εργασίες ([http://localhost:7001](http://localhost:7001), /salary)
4. notification για ληξη ssl, λιγος χωρος κτλπ (server monitoring)
5. 


#### Στησιμο νεου σερβερ 178.105.43.239

1. install mysql \[X\]
2. secure mysql και ρυθμιση mysql παραμετρων να δειχνουμε το datadir στον μεγαλο σκληρο (2TB) \[X\]
3. στησιμο apache2 με ρυθμισεις απο το προηγουμενο σερβερ 
    1. Ο προηγουμενος σερβερ ετρεχε prefork με τις παρακατω ρυθμισεις &lt;IfModule mpm\_prefork\_module&gt;  
        ServerLimit 250  
        StartServers 10  
        MinSpareServers 5  
        MaxSpareServers 10  
        MaxRequestWorkers 150  
        MaxConnectionsPerChild 0  
        MaxConnectionsPerChild 10000  
        &lt;/IfModule&gt;
    2. Ο καινουργιος σερβερ δε θα τρεχει prefork αλλα να εχουμε υποψιν τα ορια που μπηκαν \[X\]
4. στησιμο SSL
5. να ξεκινησουνε τα services του 7000, 7001\[X\]
6. **ρυθμιση σωστης ωρας \[X\]**
7. Στησιμο modsecurity \[OPTIONAL\] (ο προηγουμενος δεν ειχε)
8. install gunicorn \[X\]
9. install php \[X\]
10. install php modules used in server \[X\]
11. install cronjobs from previous server \[X\] **ΕΙΝΑΙ ΣΕ ΣΧΟΛΙΑ! (και εχουν επισης php8.2 αντι για 8.3)**
12. install REDIS server \[X\]

Replication φαση

## 1. Step-by-Step Configuration

Πρέπει πρώτα να αλλάξουμε τον main server για να εχει bind-address: 0.0.0.0 ωστε να μπορει να γινει το replication. Επισης για να γινει self-healing το replcaiton ειναι προτιμοτερο να τρεχει με GTIDs:  
  
<span class="hljs-comment">\# Enable GTID mode</span>   
<span class="hljs-attr">gtid\_mode</span> = <span class="hljs-literal">ON</span>

   
<span class="hljs-comment">\# Ensure only GTID-safe statements are allowed</span>   
<span class="hljs-attr">enforce\_gtid\_consistency</span> = <span class="hljs-literal">ON</span>

<span class="hljs-comment">\# Required for GTIDs to work with replication</span>

<span class="hljs-attr">log\_bin</span> = mysql-bin

<span class="hljs-attr">log\_slave\_updates</span> = <span class="hljs-literal">ON</span>

<span class="hljs-literal">Ο λόγος που ειναι καλυτερα τα GTIDs ([https://gemini.google.com/share/aac5bf6e69e6) ](https://gemini.google.com/share/aac5bf6e69e6))επισης δεν χρειαζεται να βαζουμε καθολου τα replication positions που κανει τη διαδικασια πιο ασφαλες</span>

### Phase A: Prepare the Donor (Primary)

Log into your **Primary** server and run:

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-60 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQXg" decode-data-ved="1" id="bkmrk-sql" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3152465465-60 ng-star-inserted"><span class="ng-tns-c3152465465-60">SQL</span><div _ngcontent-ng-c3152465465="" class="buttons ng-tns-c3152465465-60 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger download-button ng-tns-c3152465465-60 mat-unthemed ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3152465465-60 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-60"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-60"></div></div></div>```
-- Install the plugin
INSTALL PLUGIN clone SONAME 'mysql_clone.so';

-- Create a replication user with cloning permissions
CREATE USER 'clone_user'@'%' IDENTIFIED BY 'password';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';

```

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-60 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQXg" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-60"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-60"></div></div></div>### Phase B: Prepare the Recipient (Replica)

Log into your **New Replica** server and run:

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-61 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQXw" decode-data-ved="1" id="bkmrk-sql-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3152465465-61 ng-star-inserted"><span class="ng-tns-c3152465465-61">SQL</span><div _ngcontent-ng-c3152465465="" class="buttons ng-tns-c3152465465-61 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger download-button ng-tns-c3152465465-61 mat-unthemed ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3152465465-61 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-61"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-61"></div></div></div>```
-- Install the plugin
INSTALL PLUGIN clone SONAME 'mysql_clone.so';

-- Allow the recipient to be overwritten by the donor
SET GLOBAL clone_valid_donor_list = 'primary-ip-address:3306';

```

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-61 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQXw" decode-data-ved="1" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-61"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-61"></div></div></div>### Phase C: Execute the Clone

On the **Recipient** server, trigger the data transfer. **Warning:** This will delete all existing data on the recipient and restart the MySQL service automatically after completion.

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-62 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQYA" decode-data-ved="1" id="bkmrk-sql-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3152465465-62 ng-star-inserted"><span class="ng-tns-c3152465465-62">SQL</span><div _ngcontent-ng-c3152465465="" class="buttons ng-tns-c3152465465-62 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger download-button ng-tns-c3152465465-62 mat-unthemed ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3152465465-62 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-62"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-62"></div></div></div>```
CLONE INSTANCE FROM 'clone_user'@'primary-ip-address':3306 IDENTIFIED BY 'password';

```

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-62 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQYA" decode-data-ved="1" id="bkmrk--7" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-62"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-62"></div></div></div>---

## 3. Completing the Replication

The beauty of the Clone plugin is that it automatically captures the **Binary Log** coordinates (GTID or filename/position) during the transfer.

Once the recipient restarts, log back in and check the status:

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-63 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQYQ" decode-data-ved="1" id="bkmrk-sql-3" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3152465465-63 ng-star-inserted"><span class="ng-tns-c3152465465-63">SQL</span><div _ngcontent-ng-c3152465465="" class="buttons ng-tns-c3152465465-63 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger download-button ng-tns-c3152465465-63 mat-unthemed ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3152465465-63 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-63"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-63"></div></div></div>```
SELECT BINLOG_FILE, BINLOG_POS FROM performance_schema.clone_status;

```

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-63 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQYQ" decode-data-ved="1" id="bkmrk--11" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-63"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-63"></div></div></div>### Option 1: If using GTIDs (Recommended)

If your primary uses GTIDs, replication might start automatically or simply require:

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-64 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQYg" decode-data-ved="1" id="bkmrk-sql-4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3152465465-64 ng-star-inserted"><span class="ng-tns-c3152465465-64">SQL</span><div _ngcontent-ng-c3152465465="" class="buttons ng-tns-c3152465465-64 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger download-button ng-tns-c3152465465-64 mat-unthemed ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3152465465-64 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-64"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-64"></div></div></div>```
CHANGE REPLICATION SOURCE TO 
    SOURCE_HOST='primary-ip-address', 
    SOURCE_USER='repl_user', 
    SOURCE_PASSWORD='password', 
    SOURCE_AUTO_POSITION=1;
START REPLICA;

```

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-64 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQYg" decode-data-ved="1" id="bkmrk--14" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-64"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-64"></div></div></div>### Option 2: If using Binary Log Position

<div _ngcontent-ng-c3152465465="" class="code-block ng-tns-c3152465465-65 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahcKEwipjbXDnZWUAxUAAAAAHQAAAAAQYw" decode-data-ved="1" id="bkmrk-sql-5" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_f3284bc5be0effe3","c_9e4a6d487ea664b9",null,"rc_41181f01d082e820",null,null,"en",null,1,null,null,1,1]]"><div _ngcontent-ng-c3152465465="" class="code-block-decoration header-formatted gds-title-s ng-tns-c3152465465-65 ng-star-inserted"><span class="ng-tns-c3152465465-65">SQL</span><div _ngcontent-ng-c3152465465="" class="buttons ng-tns-c3152465465-65 ng-star-inserted"><button aria-label="Download code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger download-button ng-tns-c3152465465-65 mat-unthemed ng-star-inserted"></button><button aria-label="Copy code" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-mdc-tooltip-trigger copy-button ng-tns-c3152465465-65 mat-unthemed ng-star-inserted"></button></div></div><div _ngcontent-ng-c3152465465="" class="formatted-code-block-internal-container ng-tns-c3152465465-65"><div _ngcontent-ng-c3152465465="" class="animated-opacity ng-tns-c3152465465-65"></div></div></div>```
-- Use the coordinates found in performance_schema.clone_status
CHANGE REPLICATION SOURCE TO 
    SOURCE_HOST='primary-ip-address', 
    SOURCE_USER='repl_user', 
    SOURCE_PASSWORD='password', 
    SOURCE_LOG_FILE='binlog.00000X', 
    SOURCE_LOG_POS=123;
START REPLICA;
```

#### Βηματα αφου γινει το replication:

Μολις γινει το replication βρισκομαστε στο τελευταιο βημα θα πρεπει να μεταφερουμε το domain απο το server A, sto B. Σε αυτο το βημα θα πρεπει ο master να γινει READ-ONLY και ο REPLICATION να γινει ο νεος μαστερ.

1. Βαζουμε το master σε READ-ONLY και το REPLICATION γινεται MASTER
2. κανουμε point ολα τα σημεια που συνδεονται στη βαση του mydata.semantic.gr στο 10.0.0.13 που ειναι η εσωτερικη IP του νεου σερβερ
3. Αλλαζουμε το A record του παλιου σερβερ στο νεο σερβερ. Σε αυτη τη φαση καποιοι κοιτανε το παλιο mydata.semantic.gr και καποιοι το καινουργιο. Εφοσον δειχνουμε απο το παλιο στη καινουργια βαση ειναι ακριβως το ιδιο.
4. Περιμενουμε 7 μερες και μετα κλεινουμε τελειως το παλιο σερβερ (ολοι θα βλεπουν πλεον ουτως η αλλος το καινουργιο σερβερ)