搭建Redis集群的方法

1. 简介

Redis是一个开源的,高性能的键值对数据库。它支持丰富的数据结构,包括字符串、哈希、列表、集合、有序集合等。它通常用于解决缓存、队列、计数器等问题,还可以作为数据存储层。

在Redis中,单个节点可能会成为瓶颈,因此我们可以使用Redis集群来扩展数据库。Redis集群是多个Redis节点组成的分布式数据库,它提供高可用性(容错性)和线性扩展性(可扩展性)。在Redis集群中,数据自动分片并分布在不同的节点上,每个节点只存储部分数据,从而达到在多节点间平衡负载和提高性能的目的。

2. 基本概念

2.1 集群节点

节点是Redis集群中的基本组成单位,其管理一部分数据,参与到数据的散列,存储和响应客户端请求。

2.2 集群槽

槽是Redis集群中分片的基本单位,节点通过槽来存储和管理数据。Redis集群默认有16384个槽,每个槽管理一个哈希值范围。

2.3 主节点和从节点

主节点是Redis集群中存储数据并响应客户端请求的节点。一个主节点可以拥有多个从节点,从节点可以复制主节点的数据并参与到散列中,但不能响应客户端请求。主节点和从节点通过复制来实现数据的冗余备份和高可用性。

3. 搭建Redis集群的方法

3.1 安装Redis

首先需要在多个节点上安装Redis,这里以在Ubuntu上安装为例。

sudo apt update

sudo apt install redis-server

查看Redis版本信息。

redis-server -v

3.2 配置Redis集群

每个节点上需要在配置文件中指定节点的IP地址和端口号,以及集群的名称。

创建Redis配置文件。

sudo mkdir /etc/redis

sudo touch /etc/redis/redis.conf

编辑配置文件,添加如下内容。

bind 127.0.0.1 IP_ADDRESS

port 6379

cluster-enabled yes

cluster-config-file /var/lib/redis/nodes.conf

cluster-node-timeout 5000

cluster-announce-ip IP_ADDRESS

cluster-announce-port 6379

cluster-announce-bus-port 6380

IP_ADDRESS是节点的IP地址,需要替换成实际的IP地址。每个节点的IP地址和端口号需要唯一。

启动Redis服务。

sudo systemctl start redis-server.service

查看Redis服务状态。

sudo systemctl status redis-server.service

3.3 创建Redis集群

使用redis-cli命令创建Redis集群。

在其中一个节点上创建Redis集群。

redis-cli --cluster create IP_ADDRESS:6379 IP_ADDRESS:6380 IP_ADDRESS:6381 …

IP_ADDRESS:PORT是各个节点的IP地址和端口号,按顺序排列。可以一次性指定多个节点。当节点数量超过3个时,至少有2个主节点。

例如,创建3个节点的Redis集群,其中2个主节点和1个从节点,命令为:

redis-cli --cluster create 192.168.10.1:6379 192.168.10.2:6379 192.168.10.3:6379 192.168.10.1:6380 192.168.10.2:6380 192.168.10.3:6380 --cluster-replicas 1

其中,--cluster-replicas 1表示每个主节点都有一个从节点。

创建成功后,redis-cli会提示输入yes以确认集群配置。

>>> Performing hash slots allocation on 6 nodes...

Master[0] -> Slots 0 -> 5460

Master[1] -> Slots 5461 -> 10922

Master[2] -> Slots 10923 -> 16383

Adding replica 192.168.10.3:6380 to 192.168.10.2:6379

Adding replica 192.168.10.2:6380 to 192.168.10.1:6379

Adding replica 192.168.10.1:6380 to 192.168.10.3:6379

M: 3bde38a9dbcc72418a8ef32e6ee84205a24d6bbb 192.168.10.1:6379

slots:[0-5460] (5461 slots) master

M: 8b805f8e1e2cfafe0ff8420a45e0b88e0f3df3f9 192.168.10.2:6379

slots:[5461-10922] (5462 slots) master

S: d8e17f074cbe318d28deab55290f26d4efbb506b 192.168.10.3:6379

replicates 8b805f8e1e2cfafe0ff8420a45e0b88e0f3df3f9

M: c86d3f15623ca6e4b67ccdefda4e542ea29a7e9f 192.168.10.1:6380

slots: (0 slots) slave

replicates 3bde38a9dbcc72418a8ef32e6ee84205a24d6bbb

M: c212ceee44986c1980fe0279a41fcb8ad8bfc57f 192.168.10.2:6380

slots: (0 slots) slave

replicates d8e17f074cbe318d28deab55290f26d4efbb506b

M: 95d1ac9ae88a987eb1d5087fc280be1dc8d95a62 192.168.10.3:6380

slots: (0 slots) slave

replicates c86d3f15623ca6e4b67ccdefda4e542ea29a7e9f

Can I set the above configuration? (type 'yes' to accept): yes

>>> 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...

等待集群连接成功,输出如下提示。

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

4. 测试Redis集群

使用redis-cli命令测试Redis集群的读写功能。

连接Redis集群。

redis-cli -c

向Redis集群写入数据。

set key value

从Redis集群读取数据。

get key

在集群中查看某个槽的信息。

cluster nodes

输出样例。

c86d3f15623ca6e4b67ccdefda4e542ea29a7e9f 192.168.10.1:6380@16380 master - 0 1633510245000 0 connected

3bde38a9dbcc72418a8ef32e6ee84205a24d6bbb 192.168.10.1:6379@16379 myself,master - 0 1633510246000 1 connected 0-5460

c212ceee44986c1980fe0279a41fcb8ad8bfc57f 192.168.10.2:6380@16380 master - 0 1633510246000 3 connected

8b805f8e1e2cfafe0ff8420a45e0b88e0f3df3f9 192.168.10.2:6379@16379 master - 0 1633510248000 2 connected 5461-10922

95d1ac9ae88a987eb1d5087fc280be1dc8d95a62 192.168.10.3:6380@16380 master - 0 1633510247000 4 connected

d8e17f074cbe318d28deab55290f26d4efbb506b 192.168.10.3:6379@16379 slave 8b805f8e1e2cfafe0ff8420a45e0b88e0f3df3f9 0 1633510246093 5 connected

可以看到,每个节点的信息都包含了其IP地址、端口号、主从关系和对应的槽信息。

总结

Redis集群是一种高可用、可扩展的分布式数据库方案,可以提高系统的性能和可靠性。在本文中,我们介绍了Redis集群的概念、基本组成单位和创建方法,并通过简单的测试验证了集群的读写功能。需要注意的是,在实际应用中,需要根据业务需求、硬件性能等因素对Redis集群进行合理的配置和优化,以达到最佳的性能和可靠性。

数据库标签