通常情况下为了redis的高可用,我们一般不会使用redis的单实例去运行,一般都会搭建一个 redis 的集群去运行。此处记录一下redis5的cluster集群的搭建。
一、需求
1.redis5的安装
2.搭建一个3主3从的集群
3.动态的往集群中增加节点
3.1增加一个主节点
3.2增加一个从节点
4.动态的从集群中删除节点
4.1删除一个从节点
4.2删除一个主节点
二、前置知识
1.在 redis5 之后,redis cluster 的搭建不在需要默认的ruby脚本,使用 redis-cli 命令即可完成搭建。
2.创建集群的这些redis实例中都必须是空的。
3.在一个 redis 的集群中默认存在 16384 个哈希槽,这 16384 个哈希槽会默认分配给集群中的主节点。
4.增加一个主节点,就意味着要从原来的主节点中移动部分哈希槽给新的主节点。
5.删除一个主节点,就需要把该主节点分配到的哈希槽归还给别的主节点。
6.在主节点之间移动哈希槽不需要停止操作,因此对集群没多大影响。
7.一个集群最好有奇数个主节点。
8.集群创建过程中涉及到的命令。
集群创建:redis-cli --cluster create ip:port ip:port ip:port ip:port ip:port ip:port [ip:port…] --cluster-replicas 1
"cluster-replicas 1"表示每个主节点下有一个从节点。
添加一个节点:redis-cli --cluster add-node 127.0.0.1:7006
添加一个节点作为另外一个节点的从节点:redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000 --cluster-slave
删除一个节点 redis-cli --cluster del-node 127.0.0.1:7000 <node-id>
连接到集群:redis-cli -c -p 访问的端口 -h 访问的机器
查看集群中的节点:redis-cli -p 7000 cluster nodes
9.集群中的每个redis节点需要放行2个端口的访问:
正常的客户端通讯端口,比如6379。
集群总线端口,总是 客户端通讯接口+10000,比如:16379,该端口主要是 集群总线进行故障检测、配置更新、故障转移等操作。
10.如果redis集群中的某个主节点和与之相关的所有从节点都宕机了,那么redis集群将无法提供服务,因为我们不能再提供 这个master node 节点上的 哈希槽。
11.redis 集群不保证强一致性,这意味着在某些时候可能丢失某些写数据。
因为集群中从节点的复制是异步的。
redis 集群在绝对需要时也支持同步写入,但是这也不能保证完全的强一致性。
12.配置redis集群的最小配置文件如下:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
13.cluster-config-file 这个配置中指定的配置文件由redis自动维护,我们自己不要随意修改。这个文件由redis集群实例在启动时生成。
14.由于本地机器不够,因此在一台电脑上进行搭建,以不同的端口进行区分。
三、redis5安装
1、进入"/jl"目录
如果没有这个目录,可以新建一个。
2、下载redis5
wget http://src.12cc.com/redis-5.0.7.tar.gz
3、执行解压
tar zxvf redis-5.0.7.tar.gz
4、安装
cd redis-5.0.7
make
5、查看redis是否安装成功
cd src
目录里有一个"redis-server"文件,执行这个文件即可。因为没有执行"make install"命令,所以可用的命令在 src 目录下。
四、redis集群配置清单
IP地址 |
配置文件目录 |
节点端口 |
集群端口 |
主/从 |
从节点 |
10.29.81.105 |
/jl/redis-5.0.7/cluster/7001 |
7001 |
17001 |
主 |
10.29.81.105:7004 |
10.29.81.105 |
/jl/redis-5.0.7/cluster/7002 |
7002 |
17002 |
主 |
10.29.81.105:7005 |
10.29.81.105 |
/jl/redis-5.0.7/cluster/7003 |
7003 |
17003 |
主 |
10.29.81.105:7006 |
10.29.81.105 |
/jl/redis-5.0.7/cluster/7004 |
7004 |
17004 |
从 |
|
10.29.81.105 |
/jl/redis-5.0.7/cluster/7005 |
7005 |
17005 |
从 |
|
10.29.81.105 |
/jl/redis-5.0.7/cluster/7006 |
7006 |
17006 |
从 |
|
10.29.81.105 |
/jl/redis-5.0.7/cluster/7007 |
7007 |
17007 |
主 |
10.29.81.105:7008 |
10.29.81.105 |
/jl/redis-5.0.7/cluster/7008 |
7008 |
17008 |
从 |
|
1、集群中一个节点(7001的配置文件),其余节点的配置文件一样,修改一下相应内容即可。
配置项 |
值 |
备注 |
port |
7001 |
客户端通讯端口,redis服务器启动的端口 |
daemonize |
yes |
以后台的方式运行,守护进程 |
bind |
10.29.81.105 |
节点绑定的IP地址 |
pidfile |
/jl//redis-5.0.7/cluster/7001/redis_7001.pid |
守护进程方式运行的pid文件 |
logfile |
/jl//redis-5.0.7/cluster/7001/redis_7001.logs |
指定日志文件的路径 |
dir |
/jl//redis-5.0.7/cluster/7001/ |
数据库的持久化文件保存的路径,必须是目录 |
appendonly |
yes |
打开aof持久化 |
appendfsync |
everysec |
aof每秒写入一次 |
cluster-enabled |
yes |
启用集群 |
cluster-config-file |
nodes-7001.conf |
此文件由集群自动维护 |
cluster-node-timeout |
15000 |
集群节点超时时间 |
启动7001节点。
redis启动命令:/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7001/redis.conf
查看redis服务是否启动: ps aux | grep redis
2、将节点7001下的redis.conf配置文件拷贝到其它7002-7006目录中,修改相应端口等内容。
因为7001节点已经启动,所以依次启动7002-7006节点。
/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7002/redis.conf
/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7003/redis.conf
/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7004/redis.conf
/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7005/redis.conf
/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7006/redis.conf
五、创建集群
1、集群创建命令
redis-cli cluster create host1:port1 ... hostN:portN --cluster-replicas
/jl/redis-5.0.7/src/redis-cli --cluster create 10.29.81.105:7001 10.29.81.105:7002 10.29.81.105:7003 10.29.81.105:7004 10.29.81.105:7005 10.29.81.105:7006 --cluster-replicas 1
2、集群创建(3主3从-注意节点的顺序)
可以看到:16384个哈希槽平均分配给了3个主节点,从节点没有分配哈希槽。
3、向集群中设置值测试一下
/jl/redis-5.0.7/src/redis-cli -c -h 10.29.81.105 -p 7001
set jl abc
OK
get jl
"abc"
-c 表示的是连接集群。
从上图可以看到,我们连接的是 7001 端口,但是设置值的时候,由于key(cluster)对应的哈希槽的值是14041,所以重定向到了 7003 端口上。
六、动态向集群中添加一个主节点并分片
添加节点命令:redis-cli --cluster add-node 10.29.81.105:7007 10.29.81.105:7001
分片命令:redis-cli --cluster reshard 10.29.81.105:7007
1、从7001目录中复制一份redis.conf配置,并创建目录7007和7008,将7007和7008中的redis.conf中的7001都替换成7007和7008
2、启动 7007和7008
/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7007/redis.conf
/jl/redis-5.0.7/src/redis-server /jl/redis-5.0.7/cluster/7008/redis.conf
3、将7007添加到集群中
命令:/jl/redis-5.0.7/src/redis-cli --cluster add-node 10.29.81.105:7007 10.29.81.105:7001
7007 为要添加的节点
7001 为已经存在的节点
注意:此时该节点只是作为主节点添加到了集群中,但是没有进行分片,是不可存储数据的,如果要存储数据,需要进行分片操作。
查看新加入的这个节点的信息。
/jl/redis-5.0.7/src/redis-cli -c -p 7001 -h 10.29.81.105 cluster nodes
图可以看到,新增加的主节点7007是没有数据槽的,我们要为它分配数据槽。
4、为7007节点分配槽
命令:redis-cli --cluster reshard 10.29.81.105:7007
命令执行过程会问您要给7007分配多少个数据槽,我们输入:300
还会问您这300个槽是如何从7001、7002和7003那里抽出来给7007。
"all"表示从7001、7002和7003里随机抽出来,"done"表示从7001、7002和7003哪一个节点抽出来。
我们选择"all"。
七、添加一个从节点
经过上一步操作,7007成为了一个主节点,但是目前还没有从节点,现在给它增加一个从节点7008。
第一步:将7008节点添加到集群中
命令:/jl/redis-5.0.7/src/redis-cli --cluster add-node 10.29.81.105:7008 10.29.81.105:7001
第二步:进入"7008这个节点,执行命令 cluster replicate "7007节点的id"
命令:1、/jl/redis-5.0.7/src/redis-cli -c -p 7008 -h 10.29.81.105
2、cluster replicate faa559756ced39175d9aa2ef3850f89de61c1eb1
"faa559756ced39175d9aa2ef3850f89de61c1eb1"是7007节点id。
经过上面2步,7008就作为了7007节点的从节点,可以执行 cluster nodes 命令查看。
八、删除一个从节点
删除从从节点:10.29.81.105:7008
命令:
/jl/redis-5.0.7/src/redis-cli --cluster del-node 10.29.81.105:7008 4b6dcc1a047ab83df798f1bfcfe7394425cc9964
"4b6dcc1a047ab83df798f1bfcfe7394425cc9964"是被删除节点的id。
九、删除一个主节点
删除主节点稍微麻烦一点,如果主节点中存在槽,那么需要先将槽分配给其它的主节点。
删除主节点:10.29.81.105:7007
1、归还槽
命令:/jl/redis-5.0.7/src/redis-cli --cluster reshard 10.29.81.105:7007
命令执行过程会询问删除多个数据槽,因为7007节点有300个槽,所以输入300。
然后会询问那个节点接收这300个数据槽,我们准备要7001节点接收这300个槽,所以输入7001节点id:37959543e99b0766a420d557750c99b51ada78d3。
最后命令会询问这300个删除的槽是来自那些节点,因为我们是要删除7007节点的所有300个槽,所以输入7007节点id:faa559756ced39175d9aa2ef3850f89de61c1eb1,然后按"done"就可以执行命令了。当然你也可以输入多个节点id,再按"done"执行命令,也可以直接按"all",让这300个要删除的节点随机从所有节点中选取。
2、删除节点
命令:
/jl/redis-5.0.7/src/redis-cli --cluster del-node 10.29.81.105:7007 faa559756ced39175d9aa2ef3850f89de61c1eb1
至此,一个redis5的集群的搭建以及简单的维护就搭建好了。