超详细的 Redis Cluster 官方集群搭建指南,适用于 redis 5.x, 6.x
今天从 0 开始搭建 Redis Cluster 官方集群,解决搭建过程中遇到的问题,超详细。
旧版本使用
redis-trib.rb
ruby 脚本安装集群,5.0版本redis-cli 已经自带 创建集群功能了
安装redis库
$ yum install redis
搭建集群
1、创建集群目录
首先进入一个新目录,创建六个以端口号为名字的子目录。
$ mkdir redis-cluster$ cd redis-cluster$ mkdir 9001 9002 9003 9004 9005 9006
2、添加集群配置文件
在文件夹9001~9006中各建一个redis.conf文件,修改对应文件夹的端口,内容如下:
daemonize yesport 9001cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
- cluster-enabled:用于开实例的集群模式
- cluster-conf-file:设定了保存节点配置文件的路径,默认值为nodes.conf,节点配置文件无须人为修改,它由 Redis集群在启动时创建, 并在有需要时自动进行更新。
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。
配置文件示例
3、添加redis服务文件
把编译好的redis-server文件复制到redis-cluster文件夹中。
4、启动集群实例
进入到9001~90066每个目录下,启动每个实例:
cd 9001 && redis-server redis.confcd ../9002 && redis-server redis.confcd ../9003 && redis-server redis.confcd ../9004 && redis-server redis.confcd ../9005 && redis-server redis.confcd ../9006 && redis-server redis.confcd ..
5、创建集群
现在我们已经有了六个正在运行中的Redis实例,接下来我们需要使用这些实例来创建集群,并为每个节点编写配置文件。通过使用Redis集群命令行工具redis-trib,编写节点配置文件的工作可以非常容易地完成:redis-trib位于Redis源码的src文件夹中,它是一个Ruby程序,这个程序通过向实例发送特殊命令来完成创建新集群,检查集群,或者对集群进行重新分片(reshared)等工作。
redis-cli --cluster create 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006 --cluster-replicas 1
这表示集群中的 16384 个槽都有至少一个主节点在处理, 集群运作正常。
运行结果
6、查看集群节点
连接使用集群
$ ./redis-cli -c -h 192.168.1.8 -p 9002 -a 123456
-c:cluster,连接到集群模式,否则key不落在本实例将会报错。
-h:host,指定连接主机。
-p:port,指定连接端口。
-a:auth,指定密码,集群模式需要指定,不然移动会认证失败。
$ ./redis-cli -c -h 192.168.1.8 -p 9002 -a 123456127.0.0.1:9002> set hnad 21233-> Redirected to slot [2114] located at 127.0.0.1:9001OK
如上,键hnad被转移到实例9001。
主从复制不能同步问题解决
搭建一个3主3从的Redis Cluster集群发现从实例不能同步主实例的数据,但确认搭建的步骤和参数都没啥问题啊,官网也没有给出对应的问题解决方案。
解决方案
后来查各种资料发现,是因为主实例设置了密码,从实例配置中需要配置主实例的连接密码才能实现主从复制同步。
就是下面这个配置:
# If the master is password protected (using the "requirepass" configuration# directive below) it is possible to tell the slave to authenticate before# starting the replication synchronization process, otherwise the master will# refuse the slave request.## masterauth
翻译:
如果master是密码保护的,下面的配置就是可以告诉从实例在启动集群同步复制进程之前要经过认证,否则主实例会拒绝从实例的请求。
解决流程
所以,要解决不同步问题,先停止6个从实例,然后在每个实例的redis.conf文件中加入对应主备实例的认证密码,然后再启动各个从实例。如:
masterauth 123456
然后主实例上的数据实时变化都会同步到从实例,问题解决。
官方集群创建实例
实例位置 redis\utils\create-cluster
#!/bin/bash# SettingsPORT=30000TIMEOUT=2000NODES=6REPLICAS=1# You may want to put the above config parameters into config.sh in order to# override the defaults without modifying this script.if [ -a config.sh ]then source "config.sh"fi# Computed varsENDPORT=$((PORT+NODES))if [ "$1" == "start" ]then while [ $((PORT < ENDPORT)) != "0" ]; do PORT=$((PORT+1)) echo "Starting $PORT" ../../src/redis-server --port $PORT --cluster-enabled yes --cluster-config-file nodes-${PORT}.conf --cluster-node-timeout $TIMEOUT --appendonly yes --appendfilename appendonly-${PORT}.aof --dbfilename dump-${PORT}.rdb --logfile ${PORT}.log --daemonize yes done exit 0fiif [ "$1" == "create" ]then HOSTS="" while [ $((PORT < ENDPORT)) != "0" ]; do PORT=$((PORT+1)) HOSTS="$HOSTS 127.0.0.1:$PORT" done ../../src/redis-cli --cluster create $HOSTS --cluster-replicas $REPLICAS exit 0fiif [ "$1" == "stop" ]then while [ $((PORT < ENDPORT)) != "0" ]; do PORT=$((PORT+1)) echo "Stopping $PORT" ../../src/redis-cli -p $PORT shutdown nosave done exit 0fiif [ "$1" == "watch" ]then PORT=$((PORT+1)) while [ 1 ]; do clear date ../../src/redis-cli -p $PORT cluster nodes | head -30 sleep 1 done exit 0fiif [ "$1" == "tail" ]then INSTANCE=$2 PORT=$((PORT+INSTANCE)) tail -f ${PORT}.log exit 0fiif [ "$1" == "call" ]then while [ $((PORT < ENDPORT)) != "0" ]; do PORT=$((PORT+1)) ../../src/redis-cli -p $PORT $2 $3 $4 $5 $6 $7 $8 $9 done exit 0fiif [ "$1" == "clean" ]then rm -rf *.log rm -rf appendonly*.aof rm -rf dump*.rdb rm -rf nodes*.conf exit 0fiif [ "$1" == "clean-logs" ]then rm -rf *.log exit 0fiecho "Usage: $0 [start|create|stop|watch|tail|clean]"echo "start-- Launch Redis Cluster instances."echo "create -- Create a cluster using redis-cli --cluster create."echo "stop -- Stop Redis Cluster instances."echo "watch-- Show CLUSTER NODES output (first 30 lines) of first node."echo "tail -- Run tail -f of instance at base port + ID."echo "clean-- Remove all instances data, logs, configs."echo "clean-logs -- Remove just instances logs."
-
start 启动本地的6个测试实例 port 30000 自增
-
create 创建redis集群
springboot配置Redis哨兵主从服务 以及 Redis 集群
参考:
https://andyoung.blog.csdn.net/article/details/114069945