Redis集群

单机的问题

容量不够,redis如何进行扩容?
并发写操作, redis如何分摊?
另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端口等信息。
之前通过代理主机来解决,但是redis3.0中提供了解决方案。就是无中心化集群配置。

什么是集群

Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

默认情况下,每台Redis服务器都是主节点;

环境配置

只配置从库,不用配置主库!

127.0.0.1:6379> info replication # 查看当前库的信息
# Replication
role:master # 角色 master
connected_slaves:0 # 没有从机
master_replid:830db770838383cbb0ce503ba2c10df04e309250
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>

开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
Appendonly 关掉或者换名字

主节点配置(6379)

#表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
# 允许redis后台运行
daemonize yes
#设置redis日志存放路径
logfile ./log/redis_6379.log 
# requirepass "manager"        设置redis密码
# 设置为no,允许外部网络访问
protected-mode no
# 开启集群
cluster-enabled yes
# 修改redis监听端口(可以自定义)
port 6379
# pid存放目录
pidfile ./pid/redis_6379.pid
# 工作目录,需要创建好目录,可自定义
dir ./data 
# requirepass 123456     设置redis密码
# masterauth 123456    主从同步master的密码

在这里插入图片描述
从节点配置(6380)

#表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
# 允许redis后台运行
daemonize yes
#设置redis日志存放路径
logfile ./log/redis_6380.log 
# requirepass "manager"        设置redis密码
# 设置为no,允许外部网络访问
protected-mode no
# 开启集群
# cluster-enabled yes
# 修改redis监听端口(可以自定义)
port 6380
# pid存放目录
pidfile ./pid/redis_6380.pid
# 工作目录,需要创建好目录,可自定义
dir ./data 
# requirepass 123456     设置redis密码
# masterauth 123456    主从同步master的密码

从节点配置(6381)

#表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
bind 0.0.0.0
# 允许redis后台运行
daemonize yes
#设置redis日志存放路径
logfile ./log/redis_6381.log 
# requirepass "manager"        设置redis密码
# 设置为no,允许外部网络访问
protected-mode no
# 开启集群
# cluster-enabled yes
# 修改redis监听端口(可以自定义)
port 6381
# pid存放目录
pidfile ./pid/redis_6381.pid
# 工作目录,需要创建好目录,可自定义
dir ./data 
# requirepass 123456     设置redis密码
# masterauth 123456    主从同步master的密码

启动三个redis:

redis-server redis.config
redis-server redis_6380.config
redis-server redis_6381.config

在这里插入图片描述

一主二从

默认情况下,每台Redis服务器都是主节点; 我们一般情况下只用配置从机就好了!
认老大! 一主 (79)二从(80,81)

连接6380端口

redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379 # SLAVEOF host 6379 找谁当自己的老大!
OK
127.0.0.1:6380> info replication
# Replication
role:slave # 当前角色是从机
master_host:127.0.0.1 # 可以的看到主机的信息
master_port:6379 
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:28
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:438467060f515a90219ffbfb7a0fb87933f0fead
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
127.0.0.1:6380> 

在主机中查看

kv@kv:~/桌面/redis/redis-6.0.6/src$ ./redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master 
connected_slaves:1 # 多了从机的配置
slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=0 # 多了从机的配置
master_replid:438467060f515a90219ffbfb7a0fb87933f0fead
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
127.0.0.1:6379> 

在把6381的也加上。

kv@kv:~/桌面/redis/redis-6.0.6/src$ ./redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> 

去主节点查看

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=574,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=574,lag=0
master_replid:438467060f515a90219ffbfb7a0fb87933f0fead
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:574
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:574
127.0.0.1:6379> 

真实的从主配置应该在配置文件中配置,这样的话是永久的,我们这里使用的是命令,暂时的!

细节

主机可以写,从机不能写只能读!主机中的所有信息和数据,都会自动被从机保存!
主机写:

127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> 

有可能报错:
(error) CLUSTERDOWN Hash slot not served :没有分配槽

解决办法,可以修复一下。进入redis/src目录,执行如下操作
redis-cli --cluster fix 127.0.0.1:6379
然后选择yes就OK了。

丛机写:

kv@kv:~/桌面/redis/redis-6.0.6/custer$ ../src/redis-cli -p 6380
127.0.0.1:6380> set k1 v1
(error) READONLY You can't write against a read only replica.  
127.0.0.1:6380> 

丛机只能读取内容

测试:主机断开连接,从机依旧连接到主机的,但是没有写操作,这个时候,主机如果回来了,从机依
旧可以直接获取到主机写的信息!
如果是使用命令行,来配置的主从,这个时候如果重启了,就会变回主机!只要变为从机,立马就会从
主机中获取值!

复制原理

Slave 启动成功连接到 master 后会发送一个sync同步命令
Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行
完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步但是只要是重新连接master,一次完全同步(全量复制)将被自动执行! 我们的数据一定可以在从机中看到!

手动选出master
如果主机断开了连接,我们可以使用 SLAVEOF no one 让自己变成主机!其他的节点就可以手动连
接到最新的这个主节点(手动)!如果这个时候老大修复了,那就重新连接!

什么是slots

一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
集群中的每个节点负责处理一部分插槽。 举个例子, 如果一个集群可以有主节点, 其中:

  • 节点 A 负责处理 0 号至 5460 号插槽。
  • 节点 B 负责处理 5461 号至 10922 号插槽。
  • 节点 C 负责处理 10923 号至 16383 号插槽。

在集群中录入值

在redis-cli每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。
redis-cli客户端提供了 –c 参数实现自动重定向。
redis-cli -c –p 6379 登入后,再录入、查询键值对可以自动重定向。
不在一个slot下的键值,是不能使用mget,mset等多键操作。

在这里插入图片描述

可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去。
在这里插入图片描述

查询集群中的值

CLUSTER GETKEYSINSLOT <slot><count> 返回 count 个 slot 槽中的键。
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> cluster keyslot  k1 #查看槽的位置
(integer) 12706
127.0.0.1:6379> cluster countkeysinslot 12706 #返回槽的键数量
(integer) 1
127.0.0.1:6379> cluster getkeysinslot 12706 1 #
1) "k1"
127.0.0.1:6379> 

主节点恢复后,主节点回来变成从机。

如果所有某一段插槽的主从节点都宕掉,redis服务是否还能继续?
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为yes ,那么 ,整个集群都挂掉
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage 为no ,那么,该插槽数据全都不能使用,也无法存储。
redis.conf中的参数 cluster-require-full-coverage

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值