Rsync ile CentOS8 Üzerinde Dizin Senkronizasyonu
Tags: rsync, linux, filesync
Published: 2021-09-30 10:38:42

Rsync ile dizin senkronizasyonu yapmak için öncelikle sunucular arasında parolasız erişimi sağlamak gerekmektedir. 

### 1- SSH Paketinin Kurulması

Senkronizasyon yapılacak sunucuların her ikisine gidilerek,

```bash
yum install ssh
```

komutu ile SSH paketi kurulur.

### 2- SSH Konfigürasyon Ayarlarının Yapılması

Her ikisi sunucuda da,

```bash
cd ~
mkdir .ssh
touch .ssh/config .ssh/known_hosts .ssh/authorized_keys
```

komutları ile gerekli SSH dizin yapısı oluşturulur. Daha sonra ilk sunucuda,

```bash
nano .ssh/config
```

ile konfigürasyon dosyası açıldıktan sonra,

```bash
Host server02 # İkinci sunucu kısa adı
	HostName 10.0.0.2 # İkinci sunucu ip adresi
	User root # Rsync için kullanılacak user
	Port 22
```

ikinci sunucunun bilgileri girilir. Aynı işlem ikinci sunucuda da, birinci sunucunun bilgileri girilerek uygulanır.

### 3- SSH Anahtarının Oluşturulması

SSH anahtarı oluşturmak için her iki sunucuda da,

```bash
ssh-keygen
```

komutu çalıştırılır. Gelen sorular boş geçilerek anahtar ikilisi oluşturulur.

```bash
ssh-keygen
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter same passphrase again:
Your public key has been saved in /root/.ssh/id_rsa.pub.
SHA256:*************************** username@pc
+---[RSA 3072]----+
|..B+             |
|                 |
|o.o..            |
|+* ..         o  |
|+.o.    S.   . + |
|.  ... oo o . E o|
|..         . . + |
|+o +sssss     o  |
|+o*o.  *+o       |
+----[SHA256]-----+
```

Her iki sunucuda da anahtar ikilisi oluşturulduktan sonra birinci sunucuda,

```bash
ssh-copy-id server02
```

ve ikinci sunucuda,

```bash
ssh-copy-id server01
```

komutları çalıştırılarak anahtarlar birbirlerine kopyalanır. Kopyalama işleminden sonra birinci sunucuda,

```bash
ssh server02
exit
```

ve ikinci sunucuda,

```bash
ssh server01
exit
```

komutları çalıştırıldığında parolasız erişimin sağlandığı görülmelidir. SSH bağlantılarının sonlandırılması için her bağlantı sonrasında exit komutu çalıştırılmalıdır.

### 4- Betiğin Sisteme Eklenmesi

## 4.1. - Gerekli Paketlerin Kurulması

```bash
yum install inotify-tools
```
ile gerekli paketler kurulur.

## 4.2. - Dosya Senkronizasyonu Betiğinin Sisteme Yerleştirilmesi
Gerekli dizini oluşturmak için,

```bash
mkdir /usr/share/rsync
```

komutu kullanıldıktan sonra,

```bash
nano /usr/share/rsync/file-sync.sh
```

komutu ile ilgili dosya açılır ve içerisine,

```bash
while inotifywait -r -e modify,attrib,close_write,move,create,delete /bu/sunucuda/esitlenecek/dizin/; do
    rsync -aAXru --progress --delete /bu/sunucuda/esitlenecek/dizin/ server02:/karsi/sunucuda/esitlenecek/dizin/
done
```

betiği yerleştirilir. 

Bu betikte, **/bu/sunucuda/esitlenecek/dizin/** yerine betiğin yerleştirileceği sunucuda eşitlenmesi istenen dizinin yolu verilmelidir.

**/karsi/sunucuda/esitlenecek/dizin/** yerine ise, karşı sunucuda eşitlenmesi istenen dizinin yolu verilmelidir.

**Bu uygulama her iki sunucuya da çapraz olarak yapılmalıdır.**

### 5- Servis Dosyalarının Oluşturulması

Yukarıda hazırlanan betiklerin servis haline getirilip sürekli olarak senkronizasyonun sağlanması gerekmektedir. Bunun için,

```bash
nano /etc/systemd/system/rsync-client.service
```

komutu ile servis dosyası açılır ve içerisine,

```bash
[Unit]
Description = SyncService
After = network.target
[Service]
PIDFile = /run/syncservice/syncservice.pid
User = root
Group = root
ExecStartPre = /bin/mkdir /run/syncservice
ExecStart = /bin/bash /usr/share/rsync/file-sync.sh
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
ExecStopPost = /bin/rm -rf /run/syncservice
PrivateTmp = true
[Install]
WantedBy = multi-user.target
```

dosyası eklenir. 

**Bu dosyanın değiştirilmesine gerek yoktur. Her iki sunucuya da aynı şekilde eklenmelidir.**

### 6- Servislerin Başlatılması

Servisler hazırlandıktan sonra,

```bash
systemctl daemon-reload
systemctl start rsync-client.service
systemctl enable rsync-client.service
```

**işlemleri her iki sunucuda da yapılmalıdır.** 

Servisin doğru çalıştığı, çıktının aşağıda yer alan çıktıya benzerliği ile kontrol edilebilir.

```bash
[root@localhost ~]# systemctl status rsync-client.service
● rsync-client.service - SyncService
   Loaded: loaded (/etc/systemd/system/rsync-client.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2021-09-28 06:10:30 EDT; 13s ago
  Process: 8286 ExecStopPost=/bin/rm -rf /run/syncservice (code=exited, status=0/SUCCESS)
  Process: 8284 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)
  Process: 8289 ExecStartPre=/bin/mkdir /run/syncservice (code=exited, status=0/SUCCESS)
 Main PID: 8291 (bash)
    Tasks: 2 (limit: 4755)
   Memory: 592.0K
   CGroup: /system.slice/rsync-client.service
           ├─8291 /bin/bash /usr/share/rsync/file-sync.sh
           └─8294 inotifywait -r -e modify,attrib,close_write,move,create,delete /root/yedek/

Sep 28 06:10:30 localhost.localdomain systemd[1]: rsync-client.service: Succeeded.
Sep 28 06:10:30 localhost.localdomain systemd[1]: Stopped SyncService.
Sep 28 06:10:30 localhost.localdomain systemd[1]: Starting SyncService...
Sep 28 06:10:30 localhost.localdomain systemd[1]: Started SyncService.
Sep 28 06:10:30 localhost.localdomain bash[8291]: Setting up watches.  Beware: since -r was given, th>
Sep 28 06:10:30 localhost.localdomain bash[8291]: Watches established.

```

**NOT : Senkronizasyonda yaşanan gecikmeler veri kaybına sebep olabilir !**