通常情况下为了redis的高可用,我们一般不会使用redis的单实例去运行,一般都会搭建一个 redis 的集群去运行。此处记录一下 redis5 以后 cluster 集群的搭建。
搭建一个3主3从的集群
增加节点
删除节点
redis-cli
命令即可完成搭建16384
个哈希槽,这 16384 个哈希槽会默认分配
给集群中的主节点
4、
增加一个主节点
,就意味着要从原来的主节点中移动部分哈希槽给新的主节点5、
删除一个主节点
,就需要把该主节点分配到的哈希槽归还给别的主节点2
个端口的访问:集群总线端口
,总是 客户端通讯接口+10000
,比如:16379,该端口主要是 集群总线进行故障检测、配置更新、故障转移等操作不保证
强一致性,这意味着在某些时候可能丢失某些写数据
。集群
的最小配置
文件如下: port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
cluster-config-file
这个配置中指定的 配置文件 由redis自动维护,我们自己不要随意修改。这个文件有redis集群实例在启动时生成14、
由于本地机器不够,因此在一台电脑上进行搭建,以不同的端口进行区分。
没有这个目录可以新建一个
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar zxvf redis-5.0.3.tar.gz
cd redis-5.0.3 && make
cd src 里面有一个 redis-server
执行这个命令即可。因为我没有执行 make install 命令所以可用的命令是在 src 目录下。
机器 | 配置文件目录 | 客户端端口 | 集群端口 (自动维护) |
主/从 | 从节点 | 备注 |
172.19.206.207 | /usr/local/redis/cluster/7001 | 7001 | 17001 | 主 | 172.19.206.207:7004 | 集群总线接口我们不要去访问,此接口是集群内部通讯接口 |
172.19.206.207 | /usr/local/redis/cluster/7002 | 7002 | 17002 | 主 | 172.19.206.207:7005 | |
172.19.206.207 | /usr/local/redis/cluster/7003 | 7003 | 17003 | 主 | 172.19.206.207:7006 | |
172.19.206.207 | /usr/local/redis/cluster/7004 | 7004 | 17004 | 从 | ||
172.19.206.207 | /usr/local/redis/cluster/7005 | 7005 | 17005 | 从 | ||
172.19.206.207 | /usr/local/redis/cluster/7006 | 7006 | 17006 | 从 | ||
172.19.206.207 | /usr/local/redis/cluster/7007 | 7007 | 17007 | 主 | 172.19.206.207:7008 | 集群搭建好之后加入的节点,后期会删除 |
172.19.206.207 | /usr/local/redis/cluster/7008 | 7008 | 17008 | 从 | 集群搭建好之后加入的节点,后期会删除 |
配置项 | 值 | 解释 |
port | 7001 | 客户端通讯端口,redis服务器启动的端口 |
daemonize | yes | 以后台的方式运行 |
bind | 172.19.206.207 | 修改成机器的ip地址,如果是在保护模式下 |
pidfile | /usr/local/redis/cluster/7001/redis_7001.pid | 当是以后台方式运行时,会产生一个pid文件 |
logfile | /usr/local/redis/cluster/7001/redis_7001.logs | 指定日志文件的路径 |
dir | /usr/local/redis/cluster/7001/ | 数据库的持久化文件保存的路径,必须是目录 |
appendonly | yes | 打开aof持久化 |
appendfsync | everysec | aof每秒写入一次 |
cluster-enabled | yes | 启用集群 |
cluster-config-file | nodes-7001.conf | 此文件由集群自动维护 |
cluster-node-timeout | 15000 | 集群节点超时时间 |
启动当前节点,看是否启动成功
redis启动命令:/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7001/redis.conf
查看redis服务是否启动: ps aux | grep redis
集群操作
依次启动7001-7006这6个节点
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7001/redis.conf
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7002/redis.conf
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7003/redis.conf
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7004/redis.conf
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7005/redis.conf
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7006/redis.conf
redis-cli cluster create host1:port1 ... hostN:portN --cluster-replicas
可以看到:
16384个哈希槽平均分配给了3个主节点,从节点没有分配哈希槽。
-c
表示的是连接集群.
从上图可以看到,我们连接
的是 7001
端口,但是设置值的时候,由于key(cluster)
对应的哈希槽的值是14041
,所以重定向
到了 7003
端口上。
添加节点命令:redis-cli --cluster add-node 新节点ip:新节点port 集群中以存在的节点ip:集群中已存在的节点port
分片命令:redis-cli --cluster reshard 需要分片的节点ip:需要分片的节点端口
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7007/redis.conf
/usr/local/redis/redis-5.0.3/src/redis-server /usr/local/redis/cluster/7008/redis.conf
命令:/usr/local/redis/redis-5.0.3/src/redis-cli add-node 172.19.206.207:7007 172.19.206.207:7001
7007 为要添加的节点
7001 为已经存在的节点
注意:此时该节点只是作为主节点添加到了集群中,但是没有进行分片,是不可存储数据的,如果要存储数据,需要进行分片操作。
查看新加入的这个节点的信息。
命令:redis-cli --cluster reshard 需要分配槽的ip:需要分配槽的port
需要注意的事项见上图中
经过上一步操作,7007成为了一个主节点,但是目前还没有从节点,现在给它增加一个从节点7008。
第一步:将7008节点添加到集群中
命令:/usr/local/redis/redis-5.0.3/src/redis-cli --cluster add-node 172.19.206.207:7008 172.19.206:207:7001
第二步:进入 7008 这个节点,执行命令 cluster replicate 7007节点的id
命令:1、/usr/local/redis/redis-5.0.3/src/redis-cli -c -p 7008 -h 172.19.206.207
2、cluster replicate 0197892b29048155077ee4d23dd5517737f40377 0197892b29048155077ee4d23dd5517737f40377为7007的节点id
经过上面2步,7008就作为了7007节点的从节点,可以执行 cluster nodes 命令查看。
删除从从节点:172.19.206.207:7008
命令:/usr/local/redis/redis-5.0.3/src/redis-cli --cluster del-node 172.19.206.207:7008 64805713b278b00282dda3424f962d6f9e5be298 64805713b278b00282dda3424f962d6f9e5be298这个为7008节点的节点id的值
删除主节点稍微麻烦一点,如果主节点中存在槽,那么需要先将槽分配给其它的主节点。
删除主节点:172.19.206.207:7007
命令: /usr/local/redis/redis-5.0.3/src/redis-cli --cluster del-node 172.19.206.207:7007 0197892b29048155077ee4d23dd5517737f40377
至此,一个redis5的集群的搭建以及简单的维护就搭建好了。