首页
Linux教程
MongoDB教程
FTP教程
Apache教程
Nginx
jQuery
Redis
MySQL
PostgreSQL教程
PHP教程
Elasticsearch

Redis

目录
Redis实例

redis集群搭建


通常情况下为了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的集群的搭建以及简单的维护就搭建好了。