文章目录
Redis集群的搭建
以下信息含有官网内容,也包含了自己理解和增改
1、Redis中文官网
http://www.redis.cn/
2、Redis集群简述
(1)Redis集群基本概念
Redis 集群是一个提供在多个Redis节点间共享数据的程序集,并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到单个Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。Redis集群是一个分布式、容错的Redis实现,集群采用的是P2P(个人对个人、点对点)模式,不存在中心节点或者代理节点。
(2)部署Redis集群的目的
单个Redis存在不稳定性,当服务出现问题时,无法正常使用,且单个Redis的读写能力是有限的。Redis集群是Redis官方提供的分布式解决方案,当一个Redis节点挂了之后可以快速的切换到另一个节点,当遇到单机内存、并发等瓶颈时,可以有效解决此类问题。Redis集群可以自动分割数据到不同的节点上,整个集群的部分节点失败或不可达的情况下能够继续处理命令。
(3)Redis集群的主从复制
为何要做Redis集群的主从复制
若一个集群中的某个节点出现故障,且没有复制模型的情况,会导致集群中某个范围内的哈希槽不可用,从而导致集群不可用。为了避免这样的情况,需要做Redis集群的主从复制。
如何做Redis集群的主从复制
在集群创建(或过一段时间)的时候,为每个节点添加一个从节点,那么整个集群则由N个主节点和N个从节点组成,这样在某个节点失败时,集群便会选举该节点的从节点成为新的主节点,继续提供服务。(注:但当该节点及该节点的所有从节点都失败时,集群不可用)
(4)Redis集群的一致性
Redis并不能保证数据的强一致性,在实际中某些条件下可能会丢失写操作。
原因一
集群为了保证处理命令请求的速度,使用的是异步复制(客户端向主节点写入一条命令,主节点向客户端回复后,再将写操作复制给从节点)。
原因二
集群出现了网络分区,并且一个客户端与至少包括一个主节点在内的少数实例被孤立。
当出现网络分区后,如果发生时间较短,集群将正常运行。
如果发生时间的长度足够让大部分的一方将不在本区的主节点的从节点选举为新的主节点,那么另一方客户端写入主节点中的数据便丢失了。(例如,分区1中含有主节点B,C,从节点A1,B1,C1;分区2中含有主节点A,客户端Z,当分区1将A1推选为新的主节点时,分区2中客户端Z写入主节点A的数据将丢失)
节点超时时间:超过该时间后,分区将会推选主节点不在该区的从节点为新的主节点。
3、如何搭建并使用Redis集群
(1)建立测试目录
命令 | 功能 |
---|---|
mkdir cluster | 创建一个用于测试的目录cluster |
cd cluster | 进入该目录中进行操作 |
mkdir 700{1…6} | 创建6个子测试目录,代表6个节点,名为700x,目录名为端口号 |
(2)在子测试目录中放入配置文件
在测试目录中放入集群的配置文件,配置文件内容如下
port 7001 #此处的端口号与目录名称对应
cluster-enabled yes #开启实例的集群模式
cluster-config-file nodes.conf #设定保存节点配置文件的路径
cluster-node-timeout 5000 #设置节点超时时间
appendonly yes
daemonize yes #意为打入后台运行
(3)开启每一个实例
在给每个子测试目录都放好对应端口的配置文件后,开启每一个实例
命令 | 功能 |
---|---|
cd 700x | 进入各个子测试目录中 |
redis-server redis.conf | 打开实例,每个实例都要开启 |
ps ax | 查看进程,看实例是否开启,若能查询到则为开启 |
(4)搭建集群
经过上述的配置后,现在已经有了6个运行中的实例,接下来使用这些实例来创建一个集群,并且为每个集群编写配置文件。
编写节点配置文件的工作可以使用Redis集群命令行工具redis-trib,该工具位于Redis源码的src目录中,是一个Ruby程序,这个程序通过向实例发送特殊的命令,完成创建新的集群、检查集群、或者对集群进行重新分片等工作。
命令 | 功能 |
---|---|
yum install ruby -y | 先安装一个ruby,用来运行ruby程序(redis-trib工具) |
cd redis源码的src目录中 | 到此目录中才可运行程序 |
./redis-trib.rb create --replicas 1 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 127.0.0.1:7006 | 用工具创建集群 |
此处的 --replicas 1 表示的是希望为集群中的每个主节点创建一个从节点,后面的参数是这个集群实例的地址列表,三个master,三个slave,redis-trib会打印出一份预想配置给你看,如果觉得没问题则输入yes,redis-trib就会将这份配置应用到集群当中,让各个节点互相通讯。
完成后可以得到反馈:
[OK] All 16384 slots covered
表示集群中的每个哈希槽都至少有一个主节点在处理,集群的运作正常。
注意:此时用redis-trib报了错,可以按照报错提示修改命令,即可使用。
这里我按照提示使用了新的命令:
redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1
我看到了打印出的一份预想配置,我觉得可以,所以输入了**yes**。
这显示集群已经添加成功了,并且哈希槽已经分配好。
(5)使用集群
命令 | 功能 |
---|---|
redis-cli --cluster info 127.0.0.1:7001 | 使用该命令查看集群信息,可查看到集群的现主节点、分配的哈希槽数量,从节点个数等 |
redis-cli -c -p 7002 | 使用工具登陆7002节点 |
127.0.0.1:7002> info | 输入info查看该节点的详细信息(从节点也可进行查看),再info后也可以输入想要专门查询的某个分类 |
redis-cli --cluster check 127.0.0.1:7003 | 查看各节点状态 |
可以看到有各种分类下的信息,此为replication分类下信息,其余较多,在此不一一列举。
命令 | 功能 |
---|---|
redis-cli -c -p 7001 | 使用工具登陆7001节点 |
set key value | 写入key值(此时会反馈你该值被分配存入哪个节点(不一定是当前登陆节点),并且跳转到分配的节点) |
命令 | 功能 |
---|---|
redis-cli -c -p 7005 | 随便用哪个节点登陆 |
get key | 登陆后获取key值,都能得到反馈,且会跳转到存放该key值的节点 |
4、Redis集群高可用的测试
(1)逐步down掉主次节点进行测试
先down掉存放key值的主节点,再查看key值,此时应能获取到由该节点的从节点提供的值。
再down掉该主节点的从节点,再查看key值,此时不能获取到key值。
命令 | 功能 |
---|---|
redis-cli -c -p 7003 | 进入存放key值的主节点 |
shutdown | 将节点down掉 |
redis-cli -c -p 7002 | 任意进入另一节点 |
get key | 还可获取到value值,由存放key值的主节点的从节点提供 |
shutdown | 将该从节点也down掉 |
redis-cli -c -p 7002 | 任意进入另一节点 |
get key | 无法获得value值,因为存放key值的主节点和从节点都以及down掉 |
(2)恢复主次节点进行测试
恢复存放key值的主节点及其从节点的实例,查看key值,此时应能获取到,因为实例已经恢复,功能正常。
命令 | 功能 |
---|---|
cd 7003/7005 | 进入down掉节点的子测试目录中 |
redis-server redis.conf | 打开实例,使节点功能恢复 |
ps ax | 查看是否恢复成功,有实例的出现说明功能已经恢复 |
redis-cli -c -p 7002 | 进入任意节点 |
get key | 查看key值,此时可以获取到key值,恢复正常 |