在 CentOS 上安装 Redis 4.0 集群版涉及多个步骤,包括安装 Redis、配置集群并启动它。下面将详细介绍整个过程:
1. 系统更新
首先,保证系统是最新的。
sudo yum update
2. 安装依赖项
安装构建 Redis 所必需的依赖:
sudo yum install -y gcc tcl
3. 下载并解压 Redis
到 Redis 的官方网站找到 4.0 版本的源代码下载链接。下载并解压:
wget http://download.redis.io/releases/redis-4.0.14.tar.gz
tar xzf redis-4.0.14.tar.gz
cd redis-4.0.14
4. 编译 Redis
在 Redis 源代码目录中编译:
make distclean # 如果之前尝试编译过,可执行此命令清理
make
5. 运行安装脚本
sudo make install
6. 配置 Redis 集群
为便于管理,创建一个文件夹用以保存所有集群节点的配置和数据文件:
mkdir -p ~/redis-cluster
cd ~/redis-cluster
创建配置文件 7000.conf
, 7001.conf
等(一般为集群的每个节点创建一个配置文件)。配置文件示例如下:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
appendfilename "appendonly.aof"
dbfilename dump.rdb
dir ./
复制此配置文件,更改端口号和其他相应设置,创建多个实例(通常Redis 集群要求至少有三个主节点和对应的副本节点(每个节点要有一个副本
),因此需要至少六个节点
来满足这种配置)。
7. 启动 Redis 集群节点
启动六个 Redis 实例:
redis-server ./7000.conf
redis-server ./7001.conf
redis-server ./7002.conf
redis-server ./7003.conf
redis-server ./7004.conf
redis-server ./7005.conf
...
8. 创建 Redis 集群
使用Redis 的另一个工具 redis-trib.rb
来创建和管理集群。这是一个 Ruby 脚本,您需要先安装 Ruby 环境,再使用该脚本创建集群。
首先确保安装了 Ruby
和 redis
的 gem
:
sudo yum install ruby
gem install redis
然后使用 redis-trib.rb
来创建集群,你可以在 Redis 源码的 src
目录中找到此脚本。以下是创建集群的基本命令:
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
如图:
确保你在调用此脚本时提供了正确的参数。--replicas 1
表示每个主节点将有一个相应的副本节点。后面的 IP 和端口对应于你的集群节点。
如果 redis-trib.rb
脚本不存在,您可能需要从 Redis 的 GitHub 仓库或其他可靠来源下载 Redis 的相应版本源码包,以获得这个脚本。
在使用 redis-trib.rb
或任何集群操作之前,别忘了确保配置文件设置正确,并且相应的端口在防火墙中是开放的。
很好,现在你已经成功创建了 Redis 集群。下面是你所执行操作的总结和下一步的建议:
集群配置确认
在最后的提示中,系统要求你确认上述配置。输入 yes
来确认并完成集群的创建:
Can I set the above configuration? (type 'yes' to accept): yes
集群启动和验证
完成配置后,Redis 集群会正式启动。你可以通过以下命令验证集群是否正常工作:
redis-cli -c -p 7000
进入 Redis CLI 后,可以使用一些命令来检查集群状态:
cluster nodes
cluster info
集群管理
你可以使用以下命令来管理和监控集群:
-
查看集群节点信息:
redis-cli -c -p 7000 cluster nodes
-
检查集群状态:
redis-cli -c -p 7000 cluster info
-
手动添加节点:
redis-cli --cluster add-node <new-node-ip>:<new-node-port> <existing-node-ip>:<existing-node-port>
-
删除节点:
redis-cli --cluster del-node <existing-node-ip>:<existing-node-port> <node-id>
配置优化
确保集群配置文件中包含以下配置,以优化性能和安全性:
# 在所有配置文件中启用集群模式
cluster-enabled yes# 集群配置文件路径
cluster-config-file nodes.conf# 节点超时时间,根据需求调整
cluster-node-timeout 5000# 启用持久化
appendonly yes
appendfilename "appendonly.aof"
dbfilename dump.rdb# 安全设置(可选)
requirepass your-password
日常维护
定期检查集群状态和日志,确保集群的健康运行。对数据进行备份,以防数据丢失。
故障排除
如果遇到任何问题,检查 Redis 日志文件,并根据错误信息进行相应的修复。如果无法解决,可以查阅 Redis 官方文档或在社区寻求帮助。
通过这些步骤,你应该能够成功地在 CentOS 上部署和管理一个 Redis 4.0 集群。如果有进一步的问题或需要更多的帮助,请随时联系我。
9. 测试集群
使用 redis-cli
测试集群功能:
redis-cli -c -p 7000
如图:
详解:
根据 cluster info
和 cluster nodes
命令的输出,集群已经成功启动并正常运行。以下是对这些输出的解释:
cluster info 输出解释
cluster_state:ok
:集群状态为正常。cluster_slots_assigned:16384
:所有 16384 个槽位已被分配。cluster_slots_ok:16384
:所有槽位状态正常。cluster_slots_pfail:0
:没有部分失败的槽位。cluster_slots_fail:0
:没有完全失败的槽位。cluster_known_nodes:6
:集群中已知的节点数为 6 个。cluster_size:3
:集群的大小(主节点数)为 3 个。cluster_current_epoch:6
和cluster_my_epoch:1
:这些是集群的纪元值,用于管理集群配置变化的版本。cluster_stats_messages_ping_sent:285
和cluster_stats_messages_pong_sent:277
:这些是集群节点之间发送和接收的 ping 和 pong 消息统计。cluster_stats_messages_meet_received:5
:这些是节点初次相遇时的 meet 消息统计。
cluster nodes 输出解释
95b7166f2f43de82aacc84ffd0bfa3fa0d1c3e42 127.0.0.1:7002@17002 master
:此行表示节点127.0.0.1:7002
是一个主节点,其节点 ID 为95b7166f2f43de82aacc84ffd0bfa3fa0d1c3e42
,负责槽位10923-16383
。06e4a7bf40eb9b8343c3ed4ef1aa177167255330 127.0.0.1:7004@17004 slave
:此行表示节点127.0.0.1:7004
是一个从节点,复制主节点7bd529eae8583f4b8aae85023f926efd8bbd9d5d
。7bd529eae8583f4b8aae85023f926efd8bbd9d5d 127.0.0.1:7001@17001 master
:此行表示节点127.0.0.1:7001
是一个主节点,其节点 ID 为7bd529eae8583f4b8aae85023f926efd8bbd9d5d
,负责槽位5461-10922
。d2a2913b12e4995f8dc04e0d5f51c2d2d904d197 127.0.0.1:7005@17005 slave
:此行表示节点127.0.0.1:7005
是一个从节点,复制主节点95b7166f2f43de82aacc84ffd0bfa3fa0d1c3e42
。ec3a07bb418cd2110536159e8138326d6ebfe27b 127.0.0.1:7003@17003 slave
:此行表示节点127.0.0.1:7003
是一个从节点,复制主节点11cc0b7e0d4cc20746c2e5027c270d3faef29db3
。11cc0b7e0d4cc20746c2e5027c270d3faef29db3 127.0.0.1:7000@17000 myself,master
:此行表示节点127.0.0.1:7000
是一个主节点,其节点 ID 为11cc0b7e0d4cc20746c2e5027c270d3faef29db3
,负责槽位0-5460
,且当前处于自身状态(myself)。
后续步骤
- 持续监控:继续使用
cluster info
和cluster nodes
命令监控集群状态。任何异常或失败节点都需要及时处理。 - 数据备份:配置 AOF(Append-Only File)和 RDB(Redis DataBase)持久化策略,确保数据安全。
- 安全配置:设置访问密码并限制 IP,以提高集群的安全性。
- 性能优化:根据工作负载调整 Redis 配置参数,例如最大内存、最大客户端连接数等。
通过这些措施,确保 Redis 集群持续稳定运行,并在实际应用中能够提供高效的缓存和数据存储服务。如果有进一步的疑问或问题,请随时联系我。
10. 配置持久化,安全和优化
确保集群配置文件正确设置了持久化选项、安全设置(如密码保护),并根据需要进行系统优化。
这些步骤应能帮你在 CentOS 上安装和配置 Redis 4.0 集群。配置集群时,请适当调整配置文件中的参数以适应你的具体需求和资源。如果遇到任何问题,请根据错误消息进行调查和调整。
11.授权
修改各个节点配置文件
需要确保以下几点:
masterauth
参数在从节点的配置文件中设置正确。- 主节点和从节点都已正确加载了带有密码的配置文件。
- 重启节点时严格按照步骤进行。
以下是详细的解决步骤:
步骤一:确保配置文件修改正确
主节点配置
在主节点的 redis.conf
文件中,确保设置了 requirepass
:
masterauth mysecurepassword
requirepass mysecurepassword
从节点配置
在从节点的 redis.conf
文件中,确保设置了 masterauth
和 requirepass
:
masterauth mysecurepassword
requirepass mysecurepassword
步骤二:手动配置并验证
对于每个从节点:
-
登录从节点:
redis-cli -h <slave-node-ip> -p <slave-node-port> -a mysecurepassword
-
设置从节点的
masterauth
参数:CONFIG SET masterauth mysecurepassword
-
设置从节点的
requirepass
参数:CONFIG SET requirepass mysecurepassword
-
重启从节点:
SHUTDOWN NOSAVE redis-server /path/to/redis.conf
对于主节点:
-
登录主节点:
redis-cli -h <master-node-ip> -p <master-node-port> -a mysecurepassword
-
设置主节点的
requirepass
参数:CONFIG SET requirepass mysecurepassword
-
重启主节点:
SHUTDOWN NOSAVE redis-server /path/to/redis.conf
验证设置
-
确认所有节点的认证设置已经生效:
redis-cli -h <node-ip> -p <node-port> -a mysecurepassword ping
预期输出:
PONG
-
确认从节点和主节点之间的复制关系正常,可以通过从节点执行以下命令来检查:
redis-cli -h <slave-node-ip> -p <slave-node-port> -a mysecurepassword info replication
预期输出应包含
slave0
同步状态(如state:online
)。
故障排查
- 确保所有节点的配置文件路径和配置内容正确一致,避免配置文件路径错误等问题。
- 使用Redis日志文件检查任何可能的错误消息。日志文件路径通常可以在
redis.conf
文件中指定,例如:logfile /var/log/redis/redis.log
通过以上步骤应能确保主从节点正确配置了密码,并正常进行数据同步。如果仍有问题,可以一一检查配置文件和步骤来确认无误。
使用集群模式
-
追踪所有节点: 一般来说,在Redis集群环境中,应该有多个节点协作。要确认集群中是否真的只有这一个节点,您可以检查每个节点的配置文件,确保它们配置了正确的
cluster-config-file
和cluster-enabled yes
。 -
节点连接:确保每个节点的
redis.conf
配置文件中配置了所有其他节点的地址和端口,这样他们才能彼此发现并连接。
配置集群节点
如果您需要设置或调整集群,比如添加更多节点来分担负载或实现高可用性,您可以按照以下步骤来操作:
- 修改配置文件:确保每个节点的
redis.conf
文件中都有以下行:
#设置绑定的外部IP地址和端口
bind 0.0.0.0
port 7002#设置集群相关的配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 外部IP地址
cluster-announce-port 7002
cluster-announce-bus-port 17002#设置密码(假设所有节点的密码相同)
masterauth mysecurepassword
requirepass mysecurepassword
适当调整其他配置以符合网络和业务需要。
-
启动其他节点:如果您有其他机器预备作为节点,可以在这些机器上安装并配置Redis,然后启动Redis服务。
-
加入集群:通过使用
CLUSTER MEET
命令将新节点加入到现有集群中。例如,如果您要将新的Redis节点(IP地址为192.168.1.5, 端口为7005)加入到集群:redis-cli -c -h 127.0.0.1 -p 7004 CLUSTER MEET 192.168.1.5 7005
修复故障节点
-
修复或移除有问题的从节点:对于那个处于
fail
状态的节点,您需要决定是试图修复它(如果可能),还是从集群中移除它。如果该节点因为网络问题或是其他暂时性问题而无法连接,您可以尝试重新启动该节点的Redis服务,并确保网络设置正确无误。如果这个节点不能恢复,您可能需要从集群中移除这个节点。 -
手动移除失败的节点:如果决定移除,可以使用以下命令:
redis-cli -c -h xx.xxx.xxx.xx -p 7001 -a 'qax@123!' CLUSTER FORGET 06e4a7bf40eb9b8343c3ed4ef1aa177167255330
这个命令需要在集群中的每个其他节点上执行以确保完全移除。
确保哈希槽完整
- 检查哈希槽是否完整。由于您的集群哈希槽已正确分配,这一步可能不需要。但若在
CLUSTER INFO
或CLUSTER NODES
输出中出现哈希槽未完全覆盖的情况,则需手动或使用命令再分配未覆盖的槽。
确认集群状态恢复
- 查看集群状态:确认集群已经恢复正常运行,运行
CLUSTER INFO
和CLUSTER NODES
命令再次检查集群的状态和节点的信息。
如果集群状态没有立即恢复,可能需要一点时间让集群重新完成选举和同步。监控集群的状态和日志,确保所有问题都已经被解决。
添加新的从节点(如果需要)
- 如果您从集群中移除了故障节点,并且希望保持原来的高可用配置,您可能需要添加新的节点作为从节点。使用
CLUSTER MEET
命令将新节点加入集群,然后根据需要使用CLUSTER REPLICATE <master-node-id>
来指定它复制的主节点。
处理Redis集群中的问题通常需要仔细分析现有的配置和状态。在多数情况下,问题可以通过配置调整、网络问题解决或是节点重启来解决。确保在操作集群时认真谨慎,避免造成数据丢失或服务中断。
- 检查集群状态:使用
CLUSTER NODES
或CLUSTER INFO
命令检查集群的状态和节点的健康状况。
登入其他机器进行远程连接:
上图可以发现集群状态是:Redis集群当前状态fail
失败的。这说明集群无法正常工作,但是没有指定的槽位处于pfail
(可能失败)或fail
(失败)状态。这种情况可能是由于集群的一部分节点不可达或出现了其他问题导致的。以下是一些可能的解决步骤:
检查和解决集群问题
-
检查所有节点和网络:首先,您需要确保集群中所有节点的Redis服务都在正常运行,并且网络之间能够互相通信。对于集群中的每个节点,您可以尝试使用
ping
来确认网络连通性。 -
检查每个节点的CLUSTER NODES:对于集群中的每个节点,使用类似下面的命令来获取更详细的节点状态信息:
redis-cli -c -h <节点IP> -p <端口> -a 'qax@123!' CLUSTER NODES
检查输出中是否有节点的状态是
fail
或pfail
。
-
重新配置失联节点:如果找到了失联的节点,您可能需要重新加入这些节点到集群中。您可以使用
CLUSTER MEET
命令使得节点重新加入集群。例如,如果有一个节点的IP是x.xx.xx.xxx
,端口是7001
,您可以在任何一个集群节点上执行:redis-cli -c -h 8.xx.xx.174 -p 7000 -a 'xxx!' CLUSTER MEET x.xx.xx.xxx 7001
这会让当前节点邀请这个新的节点加入Redis集群。
-
检查和分配未覆盖的哈希槽:根据您的输出,存在一些未被分配的哈希槽(
cluster_slots_assigned:10924
),Redis集群需要所有16384个哈希槽都被分配和覆盖。您可能需要手动或使用脚本来分配这些槽到集群节点上,确保所有槽都被覆盖。 -
使用Redis Cluster Manager修复集群:Redis集群提供了一个命令行工具
redis-cli --cluster
,可以用来帮助修复集群,包括分配槽位等。例如,您可以使用下面的命令尝试自动修复集群:redis-cli --cluster fix <任一节点IP>:<端口>
按照提示进行操作,这个命令会尝试自动修复集群的问题,包括分配未覆盖的槽位等。
修复Redis集群通常需要根据集群的实际状态来采取相应的措施。以上提供的是一些通用的解决方法和建议,希望能够帮助您解决问题。
确认复制和数据分发
-
如果打算使用复制(主从架构)来增加数据的安全性,您需要配置从节点并指定它们复制的主节点。
-
检查数据的分布和键的分配,可以使用
CLUSTER SLOTS
命令来查看键的分布情况。
以上是关于如何维护和扩展Redis集群的基本指导。确保您根据实际情况调整和应用配置。如果需要进一步帮助,您可以查阅官方的Redis集群文档或提出具体问题。
12.造数据
vim redis.go
package mainimport ("context""fmt""github.com/go-redis/redis/v8""math/rand""time"
)var ctx = context.Background()func main() {rand.Seed(time.Now().UnixNano())// 连接到Redis集群rdb := redis.NewClusterClient(&redis.ClusterOptions{Addrs: []string{"xxx.xxx.xxx.xxx:7001"}, // 用实际的节点地址替换Password: "xxxx!", // 设置密码,如果没有密码则留空})// 测试连接err := rdb.Ping(ctx).Err()if err != nil {panic(err)}// 插入数据for i := 0; i < 10000; i++ {key := fmt.Sprintf("key%d", i)value := rand.Intn(100)err := rdb.Set(ctx, key, value, 0).Err()if err != nil {panic(err)}}fmt.Println("10000 keys set.")
}
执行go
脚本批量生成数据
go mod init redis
go mod tidy
go mod vendor
go run redis.go
运行完毕,生成10000条测试数据: