在Linux中搭建高可用的Redis数据库集群

Redis是最常用的内存数据库之一,它使用键值对的方式来储存数据,经常被用来作为内存缓存与信息中转来提升性能。如今,大量的服务都会用到Redis来作为缓存与数据的临时储存。

Redis也支持集群部署。今天,我将介绍如何在Linux系统中部署高可用的Redis数据库集群。本文也是“搭建高可用的邮件服务器集群”系列文章的第四篇。在这个邮件服务器集群中,Redis数据库将作为内存数据库,存储邮件服务器的各种临时信息,包括队列、状态,以及一些非临时信息,比如垃圾邮件的贝叶斯机器学习参数等。

  1. 邮件服务器集群的架构与基本设置
  2. FoundationDB数据库集群的部署
  3. ElasticSearch全文索引数据库集群的部署
  4. Redis缓存数据库集群的部署(本文)
  5. Stalwart Mail Server的集群部署与配置
  6. HAProxy均衡负载节点的部署

本文作者为香菇肥牛,原文链接为 https://qing.su/article/setup-up-redis-server-cluster-linux.html, 转载请注明原文链接。谢谢!


1. Redis的安装

在开始之前,我们默认您已经按照前一篇文章的描述,设置好了防火墙,仅允许节点机之间的互相通信。

本文将使用3台节点机搭建Redis集群,每台服务器的地址为 mxa.qing.su (77.77.77.77), mxb.qing.su (88.88.88.88), mxc.qing.su (99.99.99.99).

我们可以直接使用包管理器安装Redis.

1
apt-get install redis-server -y

从包管理器直接安装的Redis运行于6379端口。这样的运行方式仅适合本地运行,不适合集群部署。我们需要关闭默认的SystemD服务。

1
2
systemctl disable redis-server
service redis-server stop

请在每台服务器中安装好Redis.


2. Redis的持久化配置

默认的Redis数据库驻留在内存,不会储存在硬盘上。因此,重启Redis服务或者重启服务器后,数据库里的信息就丢失了。一般来说,这并不是什么问题 – Redis大多数情况下只是数据的临时储存,并不需要永久驻留数据。

对于我们的邮件服务器集群来说,绝大多数储存在Redis中的数据也是临时的,不需要驻留。不过,Stalwart会将垃圾邮件贝叶斯分析的学习与识别数据也存在Redis中,这部分信息最好是能够一直驻留在服务器中。因此,我们有必要配置Redis数据库的持久化 (Persistence).

Redis的持久化(Persistence)一般有两种方式,RDB和AOF.  关于这两种方式具体的区别您可以自行研究;对于我们的邮件服务器来说,两种持久化方式都是可行的。如果使用RDB,下面是相关的配置信息。

1
2
3
4
5
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/YOUR_REDIS_INSTANCE_DIR

如果使用AOF,可以使用下面的配置信息。

1
2
3
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

3. Redis集群的架构与进程配置

以我们三台服务器组件的Redis集群,一般的配置是每台服务器运行两个Redis进程,这样一共有6个Redis进程,包括3个主进程与3个镜像进程。

对于每台服务器,我们设置两个进程运行在7000与7001这两个端口。每个进程都需要单独的配置文件和数据存储地址。

1
2
3
4
5
6
7
cd /etc/redis
mkdir 7000
mkdir 7001
mkdir /var/lib/redis/7000
mkdir /var/lib/redis/7001
cp redis.conf 7000
cp redis.conf 7001

以运行于7000端口的进程为例,编辑文件 /etc/redis/7000/redis.conf,

默认的redis仅监听本地。我们需要改成监听全部IP或者服务器通信IP:

1
bind 0.0.0.0

加入刚刚的RDB持久化设置:

1
2
3
4
5
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir /var/lib/redis/7000

配置实例的通信信息:

1
2
3
4
5
6
7
port 7000
cluster-enabled yes
cluster-config-file /etc/redis/7000/nodes.conf
cluster-node-timeout 5000
protected-mode no
requirepass YOUR_SECRET_CODE
masterauth YOUR_SECRET_CODE

请注意,每个进程的YOUR_SECRET_CODE都需要保持一致

按照上面的格式,依次配置好每台服务器上的两个Redis进程。

最后,配置好文件和目录权限。

1
2
3
chown redis:redis -R /var/lib/redis
chmod 770 -R /var/lib/redis
chown redis:redis -R /etc/redis

4. 配置SystemD服务

在本文第一部分中,我们禁用了Redis自带的、运行于6379端口的SystemD服务。由于是集群配置,每台服务器上都需要运行两个Redis实例,因此我们要分别为这两个进程配置SystemD服务。

以运行于7000端口的进程为例,编辑文件 /etc/systemd/system/redis_7000.service, 添加下面的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=redis-server-7000
After=network.target

[Service]
ExecStart=/usr/bin/redis-server /etc/redis/7000/redis.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

配置好每台服务器上的两个SystemD服务。然后,启动相应的进程。

1
2
3
4
5
systemctl daemon-reload
systemctl enable redis_7000
systemctl enable redis_7001
service redis_7000 start
service redis_7001 start

到这里,我们配置好了全部的Redis进程。


5. 组件Redis集群

之前的步骤中,我们配置好了全部Redis进程。接下来的最后一步,我们要联通这些进程,组件一个互相通信的集群。

在任一台服务器上执行:

1
redis-cli --cluster create 77.77.77.77:7000 88.88.88.88:7000 99.99.99.99:7000 77.77.77.77:7001 88.88.88.88:7001 99.99.99.99:7001 --cluster-replicas 1 -a YOUR_SECRET_CODE

如果之前的配置没有问题,系统就会开始自动创建集群。

首先,系统会自动分配哈希槽 (Hash slot).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 77.77.77.77:7001 to 99.99.99.99:7000
Adding replica 88.88.88.88:7001 to 77.77.77.77:7000
Adding replica 99.99.99.99:7001 to 88.88.88.88:7000
M: 65ec6b2572d5c93dbba6cb17747dc511f808352f 99.99.99.99:7000
slots:[0-5460] (5461 slots) master
M: 50c5e02003a8b1d65e67982d9aedc0b1c06da72c 77.77.77.77:7000
slots:[5461-10922] (5462 slots) master
M: a6da12f159f00299d382f445fc9e014bd5250e56 88.88.88.88:7000
slots:[10923-16383] (5461 slots) master
S: 36d349b79a132ac7c2662c6fd97ca8291b405a28 99.99.99.99:7001
replicates a6da12f159f00299d382f445fc9e014bd5250e56
S: 84494fd4ebe039361e2096d3929a2fa5b9d51fd9 77.77.77.77:7001
replicates 65ec6b2572d5c93dbba6cb17747dc511f808352f
S: edc38393cd0cadd9cf1bb1ecd905df5a48d5e9e9 88.88.88.88:7001
replicates 50c5e02003a8b1d65e67982d9aedc0b1c06da72c
Can I set the above configuration? (type 'yes' to accept): yes

输入yes确认哈希槽分配和集群的设置。系统会自动配置剩下来的部分。

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
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 99.99.99.99:7000)
M: 65ec6b2572d5c93dbba6cb17747dc511f808352f 99.99.99.99:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: a6da12f159f00299d382f445fc9e014bd5250e56 88.88.88.88:7000
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 50c5e02003a8b1d65e67982d9aedc0b1c06da72c 77.77.77.77:7000
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 84494fd4ebe039361e2096d3929a2fa5b9d51fd9 77.77.77.77:7001
slots: (0 slots) slave
replicates 65ec6b2572d5c93dbba6cb17747dc511f808352f
S: edc38393cd0cadd9cf1bb1ecd905df5a48d5e9e9 88.88.88.88:7001
slots: (0 slots) slave
replicates 50c5e02003a8b1d65e67982d9aedc0b1c06da72c
S: 36d349b79a132ac7c2662c6fd97ca8291b405a28 99.99.99.99:7001
slots: (0 slots) slave
replicates a6da12f159f00299d382f445fc9e014bd5250e56
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

至此,我们成功部署了三节点的Redis服务器集群。

我们来检查一下。连接上任意一台服务器的redis进程:

1
redis-cli -c -h mxa.qing.su -p 7000 -a YOUR_SECRET_CODE

查看节点状态

1
mxa.qing.su:7000> CLUSTER NODES

可见,三个主进程(master)和三个从进程(slave)全部连接正常,我们可以开始使用了。


综上所述,本文搭建了基于3台服务器节点的Redis内存服务器集群,包含了Redis的安装、持久化配置、集群配置和运行。至此,我们部署完毕了Stalwart邮件服务器集群需要的全部三个基本组件。在本系列的下一篇文章中,我们就来实现集群的最后一步,部署Stalwart集群。

如果您对本文有任何疑问,欢迎在这里留言,我将尽力解答。

本文作者为香菇肥牛,原文链接为 https://qing.su/article/elasticsearch-server-cluster-setup-in-linux.html, 转载请注明原文链接。谢谢!

Leave a Comment