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集群进行合理的配置和优化,以达到最佳的性能和可靠性。