Implementasi Penggunaan Redis Cache Memori di server Linux | UNIX LINUX EXPLORE
Edit

Implementasi Penggunaan Redis Cache Memori di server Linux

Redis adalah basis data nilai-kunci yang cepat dan persisten dengan antarmuka jaringan. Sebagai basis data nilai-kunci, Redis mirip dengan Memcache, tetapi kumpulan data tidak hanya disimpan seluruhnya dalam memori, tetapi juga di-flush ke disk secara berkala. Dengan cara ini, kumpulan data tetap persisten saat restart dan tidak lagi hanya bersifat fluktuatif.

Redis mendukung berbagai jenis struktur data seperti string, hash, daftar, set, set yang diurutkan dengan kueri rentang, bitmap, dan banyak lagi. Redis memiliki replikasi bawaan, skrip LUA, pengusiran LRU, transaksi, dan berbagai tingkat persistensi pada disk, serta menyediakan ketersediaan tinggi melalui Redis Sentinel dan partisi otomatis dengan Redis Cluster.


1. Topology

Untuk mempermudah cara memahami penggunaan Redis kami akan jelaskan topologi Redis pada sistem Linux untuk menyimpan dan mengambil data dengan cepat di memori:

a. Filter Spam
Rspamd untuk plugin Ratelimit menggunakan Redis untuk menyimpan bucket yaitu batas Modul Greylisting untuk menyimpan data dan hash meta di dalam Redis. Sedangkan modul DMARC dapat menyimpan laporan DMARC di dalam kunci Redis, dengan menggunakan plugin balasan mengharuskan Redis untuk menyimpan hash id pesan untuk pesan keluar. Sedangkan lugin skor IP menggunakan Redis untuk menyimpan data tentang negara, dan reputasi jaringan. Modul Multimap dapat menggunakan Redis sebagai basis data hanya baca untuk peta, dan modul MX Check menggunakan Redis untuk caching.

b. Modul statistik Filter Spam digunakan oleh Rspamd untuk menyimpan token Bayes.
c. Penyimpanan Filter Spam Rspamd untuk hash fuzzy.
d. Kebijakan TLS Postfix dari domain yang menerbitkan kebijakan MTA-STS.
e. Nextcloud untuk penguncian file transaksional.

Untuk Rspamd, kami menyiapkan replikasi master/slave. Dengan cara ini, semua server email dapat berbagi pengetahuan mereka tentang cara menghubungkan server SMTP dan spam pada pesan. Server email akan bertindak sebagai master, sementara host MX jarak jauh akan bertindak sebagai slave.



Host

Role

IPv4 VPN Address

IPv6 VPN Address

Charlotte

Master

10.195.171.241

fdc1:d89e:b128:6a04::29ab

Dolores

Slave

10.195.171.142

fdc1:d89e:b128:6a04::7de4

Maeve

Slave

10.195.171.47

fdc1:d89e:b128:6a04::961

Sangat disarankan untuk tidak berbagi database Redis di antara aplikasi yang berbeda dan meskipun Redis memiliki dukungan terbatas untuk beberapa database, sangat disarankan oleh pembuatnya untuk tidak menggunakan fitur ini. Sebaliknya, seseorang harus menjalankan instance Redis khusus dengan satu database khusus untuk setiap aplikasi.

Mempertimbangkan daftar aplikasi di atas, kita memerlukan lima instance Redis, yang empat di antaranya akan direplikasi di tiga server. Total 13 instance harus disiapkan di semua server.

Application

Instance

TCP Port

Mode of Operation

Nextcloud Server

nextcloud

6380

Standalone

Rspamd

rspamd

6381

Master/Slave

Rspamd Statistics Module

rspamd-bayes

6382

Master/Slave

Rspamd Fuzzy Storage Worker

rspamd-fuzzy

6383

Master/Slave

Postfix MTA-STS TLS policy

postfix-tls

6384

Master/Slave



2. Persyaratan Sistem

a. WireGuard VPN

Data yang disimpan di Redis oleh Rspamd akan direplikasi di seluruh server yang terhubung dari jarak jauh. Karena Redis sendiri tidak menyediakan keamanan apa pun, kami menggunakan koneksi Jaringan Pribadi Virtual antara master dan slave.

b. System Control

Penyimpanan latar belakang mungkin gagal jika memori rendah. Oleh karena itu, ada baiknya memberi tahu Linux untuk mengalokasikan memori secara lebih agresif.

Pengalokasian memori
$ sudo sysctl vm.overcommit_memory=1
Agar pengalokasian memori dapat terus berlanjut, meskipun setelah server di-boot ulang, jalankan perintah di bawah ini.

Buat Pengalokasian memori berlangsung terus menerus
$ echo "vm.overcommit_memory=1" | sudo tee /etc/sysctl.d/60-overcommit-mem.conf
$ sudo systemctl restart procps.service
c. Konfigurasi Kernel

Fitur Kernel Linux “Transparent Huge Pages (THP)” memiliki efek negatif pada penggunaan memori dan latensi Redis. Oleh karena itu, fitur tersebut harus dinonaktifkan.

Non aktifkan fitur THP
$ echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled


3. Proses Instalasi dan Konfigurasi

Sebagai langkah pertama kita harus menginstall Redis.

Install redis
$ sudo apt install redis-server

a. Konfigurasi Redis

Konfigurasi Redis disimpan di /etc/redis.conf. Sebagian besar pengaturan dapat dibiarkan pada pengaturan default. Kami menggunakan pernyataan include untuk menambahkan sejumlah kecil pengaturan yang membedakan setiap instance.

Dalam file /etc/redis/common.conf kami menetapkan semua pengaturan default, yang umum untuk semua instance Redis kami. File ini kemudian dapat disertakan pada setiap file konfigurasi instance, yang membuat semuanya lebih mudah dikelola dan tidak berantakan. Kami menggunakan file default sebagai template.

Ubah redis.conf menjadi common.conf
$ sudo mv /etc/redis/redis.conf /etc/redis/common.conf
Pastikan nama file tidak mengandung string redis, karena jika mengandung string tersebut, systemd akan mencoba memulai instance dengan file ini sebagai konfigurasi.

Hal yang perlu anda lakukan adalah:
  • Berikan komentar pada pernyataan “bind”, sebagaimana yang didefinisikan dalam file konfigurasi instance.
  • Berikan komentar pada pernyataan “unixsocket”.
  • Matikan mode terproteksi, karena kita akan menggunakan jaringan dan proteksi kata sandi nanti;
Edit file common.conf
#bind 127.0.0.1 ::1
# unixsocket /var/run/redis/redis-server.sock
# unixsocketperm 700
protected-mode no

b. Nextcloud Standalone Instance

Pada proses ini Hal-hal yang perlu anda lakukan adalah:
  • Pernyataan include konfigurasi umum.
  • Menetapkan batas memori.
  • Menetapkan alamat localhost dan port TCP.
  • Menetapkan kata sandi untuk klien lokal.
Setelah itu, anda buat password untuk Nextcloud dengan perintah berikut.

Buat password Nextcloud
$ pwgen --secure 32 1
Wk7H302Kx4JxW0Beb2WIcvHbLbpRnkse
Di bawah ini adalah contoh script file redis-nextcloud.conf.

/etc/redis/redis-nextcloud.conf
#
# Redis configuration file on Charlotte
# for Nextcloud server transactional file locking.
#

include /etc/redis/redis.conf
# Localhost
bind 127.0.0.1 ::1
port 6380
unixsocket /var/run/redis-nextcloud/redis-server.sock
unixsocketperm 700
daemonize yes
supervised systemd
pidfile /var/run/redis-nextcloud/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-nextcloud.log
dbfilename dump-nextcloud.rdb
requirepass Wk7H302Kx4JxW0Beb2WIcvHbLbpRnkse
# maxmemory <bytes>
# maxmemory-policy noeviction
# maxmemory-samples 5

c. Rspamd Master Instance

Pada proses ini ada beberapa hal yang perlu anda perhatikan, diantaranya adalah:
  • Pernyataan include konfigurasi umum.
  • Tetapkan batas memori.
  • Tetapkan alamat antarmuka Wireguard VPN dan port TCP.
  • Tetapkan kata sandi untuk slave dan klien lokal.
Kemudian anda lanjutkan dengan membuat kata sandi untuk Rspamd dengan perintah berikut:

Buat password untuk Rspamd
$ pwgen --secure 32 1
CyJGIROS8CA15qITGd1vZKsPQb6ESwYV
Di bawah ini adalah contoh script file redis-rspamd.conf

/etc/redis/redis-rspamd.conf
#
# Redis Master configuration on Charlotte
# for Rspamd Modules
# 	Ratelimit, Greylisting, DMARC, Replies, IP score, Multimap, MX Check
#

include /etc/redis/redis.conf
# Listen on localhost and WireGuard VPN Interface
bind 127.0.0.1 ::1 10.195.171.241 fdc1:d89e:b128:6a04::29ab
port 6381
unixsocket /var/run/redis-rspamd/redis-server.sock
unixsocketperm 700
daemonize yes
supervised systemd
pidfile /var/run/redis-rspamd/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-rspamd.log
dbfilename dump-rspamd.rdb
requirepass CyJGIROS8CA15qITGd1vZKsPQb6ESwYV
# maxmemory <bytes>
# maxmemory-policy noeviction
# maxmemory-samples 5

d. Rspamd Slave Instance

Hal-hal yang perlu anda lakukan adalah:
  • Pernyataan include konfigurasi umum.
  • Tetapkan batas memori.
  • Tetapkan alamat antarmuka VPN Wireguard dan port TCP.
  • Tetapkan kata sandi untuk klien lokal.
  • Tetapkan alamat master.
  • Tetapkan kata sandi untuk mengakses master.
/etc/redis/redis-rspamd.conf
#
# Redis Slave configuration on Dolores
# for Rspamd Modules
# 	Ratelimit, Greylisting, DMARC, Replies, IP score, Multimap, MX Check
#

include /etc/redis/redis.conf
# Listen on localhost and WireGuard VPN Interface
bind 127.0.0.1 ::1 10.195.171.142 fdc1:d89e:b128:6a04::7de4
port 6381
unixsocket /var/run/redis-rspamd/redis-server.sock
unixsocketperm 700
daemonize yes
supervised systemd
pidfile /run/redis-rspamd/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-rspamd.log
dbfilename dump-rspamd.rdb
requirepass CyJGIROS8CA15qITGd1vZKsPQb6ESwYV
# maxmemory <bytes>
# maxmemory-policy noeviction
# maxmemory-samples 5
slaveof charlotte.vpn.example.net 6381
masterauth CyJGIROS8CA15qITGd1vZKsPQb6ESwYV

e. Rspamd Bayesian Master Instance

Hal-hal yang perlu anda lakukan adalah
  • Pernyataan include konfigurasi umum.
  • Tetapkan batas memori.
  • Tetapkan alamat antarmuka VPN Wireguard dan port TCP.
  • Tetapkan kata sandi untuk slave dan klien lokal.
Kemudian anda lanjutkan dengan membuat kata sandi untuk Rspamd.

Buat password untuk Rspamd
$ pwgen --secure 32 1
WRTgpIv6Xz6i7lNNMQ13bijAj5ghPR7p
Di bawah ini adalah contoh script file redis-rspamd-bayes.conf

/etc/redis/redis-rspamd-bayes.conf
#
# Redis Master configuration on Charlotte
# for Rspamd Bayesian statistic Module
#

include /etc/redis/common.conf
# Listen on localhost and WireGuard VPN Interface
bind 127.0.0.1 ::1 10.195.171.241 fdc1:d89e:b128:6a04::29ab
port 6382
unixsocket /var/run/redis-rspamd-bayes/redis-server.sock
unixsocketperm 700
daemonize yes
supervised systemd
pidfile /var/run/redis-rspamd-bayes/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-rspamd-bayes.log
dbfilename dump-rspamd-bayes.rdb
requirepass WRTgpIv6Xz6i7lNNMQ13bijAj5ghPR7p
# maxmemory <bytes>
# maxmemory-policy noeviction
# maxmemory-samples 5

f. Rspamd Bayesian Slave Instance

Hal-hal yang perlu anda lakukan pada proses ini adalah:
  • Pernyataan include konfigurasi umum.
  • Tetapkan batas memori.
  • Tetapkan alamat antarmuka Wireguard VPN dan port TCP.
  • Tetapkan kata sandi untuk klien lokal.
  • Tetapkan alamat master.
Kemudian anda lanjutkan dengan membuat password untuk mengakses master.

Di bawah ini adalah contoh script file redis-rspamd-bayes.conf setelah dilakukan pengeditan.

/etc/redis/redis-rspamd-bayes.conf
#
# Redis Slave configuration on Dolores
# for Rspamd Bayesian statistic Module
#

include /etc/redis/redis.conf
# Listen on localhost and WireGuard VPN Interface
bind 127.0.0.1 ::1 10.195.171.142 fdc1:d89e:b128:6a04::7de4
port 6382
unixsocket /var/run/redis-rspamd-bayes/redis-server.sock
unixsocketperm 700
daemonize yes
supervised systemd
pidfile /var/run/redis-rspamd-bayes/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-rspamd-bayes.log
dbfilename dump-rspamd-bayes.rdb
requirepass WRTgpIv6Xz6i7lNNMQ13bijAj5ghPR7p
# maxmemory <bytes>
# maxmemory-policy noeviction
# maxmemory-samples 5
slaveof charlotte.vpn.example.net 6382
masterauth WRTgpIv6Xz6i7lNNMQ13bijAj5ghPR7p

g. Konfigurasi Postfix MTA-STS TLS Master

Hal-hal yang perlu anda lakukan untuk mengkonfigurasi Postfix MTA-STS TLS Master adalah:
  • Menetapkan batas memori.
  • Menetapkan alamat antarmuka VPN Wireguard dan port TCP.
  • Menetapkan kata sandi untuk klien lokal.
  • Menetapkan alamat master.
  • Menetapkan kata sandi untuk mengakses master.
Setelah itu anda harus membuat password untuk Postifx, dengan perintah di bawah ini.

Buat kata sandi Postifx
$ pwgen --secure 32 1
ZlsQPlZAwMRpBgzEvwH2J7jsWkcpC7Xr
/etc/redis/redis-postfix-tls.conf
#
# Redis Master configuration on Charlotte
# for Postifx MTA-STS TLS Policy
#

include /etc/redis/common.conf
# Listen on localhost and WireGuard VPN Interface
bind 127.0.0.1 ::1 10.195.171.241 fdc1:d89e:b128:6a04::29ab
port 6384
unixsocket /var/run/redis-postfix-tls/redis-server.sock
unixsocketperm 700
daemonize yes
supervised systemd
pidfile /var/run/redis-postfix-tls/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-postfix-tls.log
dbfilename dump-postfix-tls.rdb
requirepass ZlsQPlZAwMRpBgzEvwH2J7jsWkcpC7Xr
# maxmemory <bytes>
# maxmemory-policy noeviction
# maxmemory-samples 5

h. Konfigurasi Postfix MTA-STS TLS Slave

Hal-hal yang perlu dilakukan di sini adalah:
  • Tetapkan batas memori.
  • Tetapkan alamat antarmuka VPN Wireguard dan port TCP.
  • Tetapkan kata sandi untuk klien lokal.
  • Tetapkan alamat master.
  • Tetapkan kata sandi untuk mengakses master.
Di bawah ini adalah contoh file /etc/redis/redis-postfix-tls.conf.

/etc/redis/redis-postfix-tls.conf
#
# Redis Slave configuration on Dolores
# for Postifx MTA-STS TLS Policy
#

include /etc/redis/redis.conf
# Listen on localhost and WireGuard VPN Interface
bind 127.0.0.1 ::1 10.195.171.142 fdc1:d89e:b128:6a04::7de4
port 6384
#unixsocket /run/redis-postfix-tls/redis-server.sock
#unixsocketperm 700
daemonize yes
supervised systemd
pidfile /run/redis-postfix-tls/redis-server.pid
loglevel notice
logfile /var/log/redis/redis-postfix-tls.log
dbfilename dump-postfix-tls.rdb
requirepass ZlsQPlZAwMRpBgzEvwH2J7jsWkcpC7Xr
# maxmemory <bytes>
# maxmemory-policy noeviction
# maxmemory-samples 5
slaveof charlotte.vpn.example.net 6384
masterauth ZlsQPlZAwMRpBgzEvwH2J7jsWkcpC7Xr


4. Systemd Services

Systemd memiliki dukungan bawaan untuk memulai beberapa instans layanan secara otomatis. File layanan /lib/systemd/system/redis-server@.service yang diinstal oleh paket perangkat lunak sudah berisi semua hal untuk memulai instans layanan terpisah untuk setiap file redis-*.conf yang ditemukan di direktori /etc/redis/.

Namun, karena beberapa instans Redis kami diatur untuk mereplikasi datanya melalui WireGuard VPN ke server lain, kami perlu memastikan bahwa antarmuka VPN aktif dan berjalan, sebelum instans server Redis ini dimulai.

Instans Redis berikut mereplikasi data melalui VPN:
  • postfix-tls
  • rspamd
  • rspamd-bayes
  • rspamd-fuzzy
Anda dapat membuat file override Systemd dengan mudah dengan bantuan perintah systemctl.

Buat file override Systemd 
$ sudo systemctl edit redis-server@postfix-tls.service
Tambahkan file konfigurasi pada Systemd seperti contoh di bawah ini

Buat file Systemd 
[Unit]
After=sys-devices-virtual-net-wg0.device
BindsTo=sys-devices-virtual-net-wg0.device

[Service]
ProtectSystem=full
Baris After=sys-devices-virtual-net-wg0.device memastikan bahwa antarmuka jaringan wg0 aktif sebelum instans server Redis postfix-tls dimulai.

Baris BindsTo=sys-devices-virtual-net-wg0.device memastikan bahwa jika antarmuka jaringan wg0 mati, instans server Redis ini juga akan dihentikan.

Karena kita tidak menggunakan fitur pengelompokan apa pun dari Redis, kita dapat membatasi layanan systemd sedikit, dengan menjaga konfigurasi hanya-baca. Inilah yang dilakukan baris ProtectSystem=full.

Ulangi prosedur untuk instans server Redis Rspamd:


$ sudo systemctl edit redis-server@rspamd.service
$ sudo systemctl edit redis-server@rspamd-bayes.service
$ sudo systemctl edit redis-server@rspamd-fuzzy.service
Setelah itu anda buat salinan file layanan pra-instal /lib/systemd/system/redis-server@.service.

Salin /lib/systemd/system/redis-server@.service ke folder /etc/systemd/system/
$ sudo cp /lib/systemd/system/redis-server@.service /etc/systemd/system/
Sebagai catatan, pada beberapa sistem, sering kita menemukan file layanan tambahan /etc/systemd/system/redis.service. Jika file tersebut anda temukan, silakan hapus file tersebut.

Langkah selanjutnya adalah edit file /etc/systemd/system/redis-server@.service, seperti berikut:


Edit /etc/systemd/system/redis-server@.service
# Templated service file for redis-server(1)
#
# Each instance of redis-server requires its own configuration file:
#
#   $ cp /etc/redis/redis.conf /etc/redis/redis-myname.conf
#   $ chown redis:redis /etc/redis/redis-myname.conf
#
# Ensure each instance is using their own database:
#
#   $ sed -i -e 's@^dbfilename .*@dbfilename dump-myname.rdb@' /etc/redis/redis-myname.conf
#
# We then listen exlusively on UNIX sockets to avoid TCP port collisions:
#
#   $ sed -i -e 's@^port .*@port 0@' /etc/redis/redis-myname.conf
#   $ sed -i -e 's@^\(# \)\{0,1\}unixsocket .*@unixsocket /var/run/redis-myname/redis-server.sock@' /etc/redis/redis-myname.conf
#
# ... and ensure we are logging, etc. in a unique location:
#
#   $ sed -i -e 's@^logfile .*@logfile /var/log/redis/redis-server-myname.log@' /etc/redis/redis-myname.conf
#   $ sed -i -e 's@^pidfile .*@pidfile /var/run/redis-myname/redis-server.pid@' /etc/redis/redis-myname.conf
#
# We can then start the service as follows, validating we are using our own
# configuration:
#
#   $ systemctl start redis-server@myname.service
#   $ redis-cli -s /var/run/redis-myname/redis-server.sock info | grep config_file
#
#  -- Chris Lamb <lamby@debian.org>  Mon, 09 Oct 2017 22:17:24 +0100
[Unit]
Description=Advanced key-value store (%I)
After=network.target
Documentation=http://redis.io/documentation, man:redis-server(1)
Wants=sys-devices-virtual-net-wg0.device
After=sys-devices-virtual-net-wg0.device

[Service]
Type=forking
ExecStart=/usr/bin/redis-server /etc/redis/redis-%i.conf
ExecStop=/bin/kill -s TERM $MAINPID
PIDFile=/var/run/redis-%i/redis-server.pid
TimeoutStopSec=0
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis-%i
RuntimeDirectoryMode=2755

UMask=007
PrivateTmp=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
ReadWriteDirectories=-/var/lib/redis
ReadWriteDirectories=-/var/log/redis
ReadWriteDirectories=-/var/run/redis-%i

NoNewPrivileges=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
MemoryDenyWriteExecute=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectControlGroups=true
RestrictRealtime=true
RestrictNamespaces=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX

# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
ProtectSystem=true
ReadWriteDirectories=-/etc/redis

[Install]
WantedBy=multi-user.target
Karena kita tidak menggunakan fitur clustering apa pun dari Redis, kita dapat membatasi layanan systemd sedikit, dengan membiarkan konfigurasinya hanya-baca.


# redis-server can write to its own config file when in cluster mode so we
# permit writing there by default. If you are not using this feature, it is
# recommended that you replace the following lines with "ProtectSystem=full".
#ProtectSystem=true
#ReadWriteDirectories=-/etc/redis
ProtectSystem=full
Jika Anda melakukan ini, Anda harus memastikan bahwa berkas konfigurasi selalu dapat dibaca oleh pengguna redis. Yaitu setelah Anda mengedit berkas konfigurasi sebagai root dengan menjalankan perintah chown.

Jalankan perintah chown
$ sudo chown -Rc redis:redis /etc/redis
Dalam tutorial ini, Anda telah menginstal dan mengonfigurasi Redis, memvalidasi bahwa instalasi Redis Anda berfungsi dengan benar, dan menggunakan fitur keamanan bawaannya untuk membuatnya tidak terlalu rentan terhadap serangan dari pelaku kejahatan.