Die Performance von Nextcloud kann durch einen Redis Cache erhöht werden. Redis sollte als Cluster betrieben werden.

Als System kommt wieder ein Oracle Linux 8.6 zum Einsatz.
Die Installation erfolgt per
1
dnf -y install redis
Standalone
Anschließend muss die /etc/redis.conf angepasst werden, damit der Server Verbindungen annehmen kann und nicht nur auf 127.0.0.1 lauscht.
Folgende Einstellungen müssen unkommentiert werden:
1
2
3
4
5
6
7
8
9
10
11
12
bind 127.0.0.1 ::1
port 6379
unixsocket /var/run/redis/redis.sock
unixsocketperm 700
daemonize yes
supervised systemd
pidfile /var/run/redis-server.pid
loglevel notice
logfile /var/log/redis/redis.log
dbfilename dump-nextcloud.rdb
requirepass xxx
protected-mode no
Anschließend werden einige Verzeichnisse erstellt.
1
2
3
4
cd /var/run
mkdir redis
chown redis:redis redis/
chmod 750 redis/
Die /etc/sysctl.conf wird angepasst.
1
2
vm.overcommit_memory = 1
net.core.somaxconn=65535
Die /etc/rc.d/rc.local wird ebenfalls angepasst.
1
2
3
echo never > /sys/kernel/mm/transparent_hugepage/enabled
chmod +x /etc/rc.d/rc.local
reboot
Nach dem Neustart sollte Redis fehlerfrei starten.
Um alle PHP-Sessions zum Redis zu senden wird die /etc/php-fpm.d/www.conf angepasst.
1
2
3
4
5
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://172.23.241.60:6379?auth=xxx&database=1&weight=1"
php_value[redis.session.locking_enabled]=1
php_value[redis.session.lock_retries]=-1
php_value[redis.session.lock_wait_time]=10000
Anschließend kann der Zugriff auf dem Redis Server mit
1
2
3
redis-cli -h 172.23.241.60
auth <password>
monitor
geprüft werden. Damit ist der Cache fertig eingerichtet.
Cluster
Redis sollte bei einer HA Nextcloud als Cluster betrieben werden. Die Einstellungen der /etc/sysctl.conf sind hier die Gleichen, wie bei einem Standalone System.
Die Installation benötigt drei Server (alle drei Master und Slave). Es müssen Verzeichnisse erstellt werden.
1
2
mkdir /etc/redis/cluster/master -p
mkdir /etc/redis/cluster/slave -p
Anschließend müssen die Systeme als Master und Slave eingerichtet werden. Diese Schritte müssen auf allen drei Servern durchgeführt werden.
/etc/redis/cluster/7000/redis-master.conf
1
2
3
4
5
6
7
8
9
10
11
12
port 7000
dir /var/lib/redis/7000/
appendonly no
protected-mode no
cluster-enabled yes
cluster-node-timeout 5000
cluster-config-file /etc/redis/cluster/7000/nodes_master.conf`*
pidfile /var/run/redis/redis_master.pid
logfile /var/log/redis/redis_master.log
loglevel notice
requirepass xxx
masterauth yyy
/etc/redis/cluster/7001/redis_slave.conf
1
2
3
4
5
6
7
8
9
10
11
12
port 7001
dir /var/lib/redis/7001
appendonly no
protected-mode no
cluster-enabled yes
cluster-node-timeout 5000
cluster-config-file /etc/redis/cluster/7001/nodes_slave.conf
pidfile /var/run/redis/redis_slave.pid
logfile /var/log/redis/redis_slave.log
loglevel notice
masterauth xxx
requirepass yyy
Rechte auf den Verzeichnissen setzen.
1
2
3
chown redis:redis -R /var/lib/redis
chmod 770 -R /var/lib/redis
chown redis:redis -R /etc/redis
Die Dienste sollen automatisch beim Reboot starten.
/etc/systemd/system/redis_7000.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Redis key-value database on 7000
After=network.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis/cluster/7000/redis_master.conf --supervised systemd
ExecStop=/bin/redis-cli -h 127.0.0.1 -p 7000 shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
/etc/systemd/system/redis_7001.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Redis key-value database on 7001
After=network.target
[Service]
ExecStart=/usr/bin/redis-server /etc/redis/cluster/7001/redis_slave.conf --supervised systemd
ExecStop=/bin/redis-cli -h 127.0.0.1 -p 7001 shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=/etc/redis/cluster/7001
RuntimeDirectoryMode=0755
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
1
2
3
sudo systemctl enable /etc/systemd/system/redis_7000.service
sudo systemctl enable /etc/systemd/system/redis_7001.service
reboot
Die Ports 7000 und 7001 sollten nach dem Reboot geöffnet sein. Jetzt kann der Cluster erstellt werden.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
redis-cli -a yyy --cluster create 172.23.241.61:7000 172.23.241.62:7000
172.23.241.63:7000 172.23.241.61:7001 172.23.241.62:7001
172.23.241.63:7001 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.23.241.62:7001 to 172.23.241.61:7000
Adding replica 172.23.241.61:7001 to 172.23.241.62:7000
Adding replica 172.23.241.63:7001 to 172.23.241.63:7000
>>> Trying to optimize slaves allocation for anti-affinity
[OK] Perfect anti-affinity obtained!
M: 1c1692ac403c8da52dceba76d2ba214f71be22d6 172.23.241.61:7000
slots:[0-5460] (5461 slots) master
M: 64b29f372233787bf1b59e85b81116a4a7f614e8 172.23.241.62:7000
slots:[5461-10922] (5462 slots) master
M: c7a63afc2730a1d8d011841e6099e6884b01b2d0 172.23.241.63:7000
slots:[10923-16383] (5461 slots) master
S: 3732f12c02aa2bc25629fd5dfc05e6c9b2ee3d3f 172.23.241.61:7001
replicates 64b29f372233787bf1b59e85b81116a4a7f614e8
S: a2add22fcb217f23e784c69a01650c9c60fd9504 172.23.241.62:7001
replicates c7a63afc2730a1d8d011841e6099e6884b01b2d0
S: ba46ab591590afa46cb02aca6333f0e80eed811d 172.23.241.63:7001
replicates 1c1692ac403c8da52dceba76d2ba214f71be22d6
Can I set the above configuration? (type 'yes' to accept): yes
Waiting for the cluster to join
[...]
>>> Performing Cluster Check (using node 172.23.241.61:7000)
M: 1c1692ac403c8da52dceba76d2ba214f71be22d6 172.23.241.61:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: c7a63afc2730a1d8d011841e6099e6884b01b2d0 172.23.241.63:7000
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 64b29f372233787bf1b59e85b81116a4a7f614e8 172.23.241.62:7000
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: a2add22fcb217f23e784c69a01650c9c60fd9504 172.23.241.62:7001
slots: (0 slots) slave
replicates c7a63afc2730a1d8d011841e6099e6884b01b2d0
S: 3732f12c02aa2bc25629fd5dfc05e6c9b2ee3d3f 172.23.241.61:7001
slots: (0 slots) slave
replicates 64b29f372233787bf1b59e85b81116a4a7f614e8
S: ba46ab591590afa46cb02aca6333f0e80eed811d 172.23.241.63:7001
slots: (0 slots) slave
replicates 1c1692ac403c8da52dceba76d2ba214f71be22d6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
Mit dem Cluster kann sich folgendermaßen verbunden werden:
1
redis-cli -c -h 172.23.241.62 -p 7000 -a yyy
Die PHP Einstellungen müssen jetzt entsprechend angepasst werden.
1
2
3
4
5
6
/etc/php-fpm.d/www.conf
php_value[session.save_handler] = rediscluster
php_value[session.save_path] = "seed[]=172.23.241.61:7000&seed[]=172.23.241.62:7000&seed[]=172.23.241.63:7000&timeout=2&read_timeout=2&failover=error&persistent=1&auth=yyy"
php_value[redis.session.locking_enabled]=1
php_value[redis.session.lock_retries]=-1
php_value[redis.session.lock_wait_time]=10000
Damit ist Redis als Cluster fertiggestellt.