Redis是最常用的内存数据库之一,它使用键值对的方式来储存数据,经常被用来作为内存缓存与信息中转来提升性能。如今,大量的服务都会用到Redis来作为缓存与数据的临时储存。
Redis也支持集群部署。今天,我将介绍如何在Linux系统中部署高可用的Redis数据库集群。本文也是“搭建高可用的邮件服务器集群”系列文章的第四篇。在这个邮件服务器集群中,Redis数据库将作为内存数据库,存储邮件服务器的各种临时信息,包括队列、状态,以及一些非临时信息,比如垃圾邮件的贝叶斯机器学习参数等。
- 邮件服务器集群的架构与基本设置
- FoundationDB数据库集群的部署
- ElasticSearch全文索引数据库集群的部署
- Redis缓存数据库集群的部署(本文)
- Stalwart Mail Server的集群部署与配置
- 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, 转载请注明原文链接。谢谢!