首页 > 数据库 >Redis(六)集群

Redis(六)集群

时间:2022-12-09 15:57:43浏览次数:50  
标签:00 Redis redis cluster 集群 conf root

Redis集群

1.1 存在的问题

  • 容量不够Redis如何扩容

  • 并发写操作,Redis如何分摊

  • 当主机或者从机宕机,薪火相传、反客为主等主从模式都会导致ip发生变化,应用程序中的配置需要对应修改主机地址以及端口号等信息。

主机代理方式

主机代理方式指的是不需要客户端去寻找需要的服务,而是只暴露一个代理服务器,由代理服务器转发服务请求,并且代理服务器也可以向其他服务的主机一样,添加一个从机防止主机宕机。

类似nginx以及前端的跨域代理,这样做的缺点是总共需要八台服务器,后期维护也很不方便

无中心化集群方式

无中心化的集群方式,则是任意的服务都可以作为集群的入口,并且各个服务之间能够相互连通调用,同样的功能无中心化集群配置只需要六台服务器即可实现了。

1.2 简介

Redis集群实现了对Redis的水平扩容,即总共启动N个Redis节点,将整个数据库分布存储在这N个节点中,每个节点存储的数据占总的数据的1/N。

Redis集群通过分区(partition)来提供一定程度的可用性(aviability),即使集群中有一部分节点失效无法进行通讯,redis集群也能够继续处理请求命令。

1.3 Redis集群的搭建

删除原有的RDB文件以及其他的配置文件
[root@hadoop100 myredis]# rm -rf redis6381.conf redis6382.conf
配置集群节点
6380
include /myredis/redis.conf
pidfile "/var/run/redis_6380.pid"
port 6380
dbfilename "dump6380.rdb"
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
制作6个实例:6381 6382 6383 6384 6385

81为80的从机,83为82的,85为84的

[root@hadoop100 myredis]# cp redis6380.conf redis6381.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6382.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6383.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6384.conf
[root@hadoop100 myredis]# cp redis6380.conf redis6385.conf
[root@hadoop100 myredis]# ls
redis6380.conf  redis6381.conf  redis6382.conf  redis6383.conf  redis6384.conf  redis6385.conf  redis.conf  sentinel.conf

然后修改里面的端口号、RDB文件名称以及集群节点名,这里就不赘述了

启动redis
[root@hadoop100 myredis]# ls /var/lib/redis/
dump6380.rdb  dump6381.rdb  dump6382.rdb  dump.rdb  nodes-6379.conf  nodes-6381.conf  nodes-6382.conf  nodes-6383.conf  nodes-6384.conf  nodes-6385.conf
[root@hadoop100 myredis]# ps -ef | grep redis
root       2476      1  0 11月08 ?      00:01:37 redis-server 127.0.0.1:6378
polkitd   16606  16545  0 13:04 ?        00:00:42 redis-server *:6379
root     121480      1  0 23:03 ?        00:00:00 redis-server 127.0.0.1:6380 [cluster]
root     121628      1  0 23:03 ?        00:00:00 redis-server 127.0.0.1:6381 [cluster]
root     121743      1  0 23:03 ?        00:00:00 redis-server 127.0.0.1:6382 [cluster]
root     121814      1  0 23:03 ?        00:00:00 redis-server 127.0.0.1:6383 [cluster]
root     121885      1  0 23:03 ?        00:00:00 redis-server 127.0:6384 [cluster]
root     121957      1  0 23:03 ?        00:00:00 redis-server 127.0.0.1:6385 [cluster]
root     126306  21149  0 23:06 pts/4    00:00:00 grep --color=auto redis

然后可以在生成rdb文件的目录下发现生成的集群节点配置文件

[root@hadoop100 myredis]# ls /var/lib/redis/
dump6380.rdb  dump6381.rdb  dump6382.rdb  dump.rdb  nodes-6379.conf  nodes-6381.conf  nodes-6382.conf  nodes-6383.conf  nodes-6384.conf  nodes-6385.conf
将六个节点合成集群
切换到安装目录下的src
执行合成集群命令
redis-cli --cluster create --cluster-replacas 1 X X X X X X

这里不能使用127.0.0.1,需要使用真实的IP地址

主从的分配原则尽量保证两个服务器运行在不同的IP地址

--cluster-replacas 1表示使用一台主机一个从机的模式

使用集群方式连接 redis-cli -c -p

使用任何一个端口号都可以连接到集群

cluster nodes查看集群信息

1.4 Redis集群slots插槽

在上面合成集群的命令执行后,会有一行All 16384 slots covered,slots即是redis插槽,集群使用CRCkey(16)%16384来计算键key属于哪一个插槽,集群的每一个节点只负责一部分插槽,如上面的几个主机分别负责0-5460,5461-10922,10923-16383插槽

在集群中录入值

在redis每次录入、查询键值,redis都会计算出该key对应的插槽,如果不是当前客户端对应的插槽则会报错并告知应前往对应的插槽的redis实例地址和端口。

redis-cli客户端提供了 -c参数 实现了自动重定向

redis-cli -c -p 6379

不在同一个插槽的键值,不能够使用mget、mset等操作

在集群中以组的形式录入多个值 mset k1{g1} v1 k2{g2} v2

如上面所说,插入多个值的时候由于多个值对应的插槽不同,因此不能进行同时插入,redis提供了一种分组的形式来录入多个值,即将多个值声明为一个组,在计算插槽的时候按照组的名称计算,这样就实现了插入多个值

mset name{user} lucy age{user} 20
cluster keyslot 查询值对应的插槽
cluster countkeysinslot 查询key值对应插槽中的值的个数

注意只能查看当前客户端的插槽

cluster getkeysinslot 4847 10 返回10个指定key插槽中的值

1.5 集群的故障修复

和哨兵模式相同,主机宕机后,经过设置的延时时间15000,从机就变为了主机,这时候主机再连接会变为原来从机的从机。

主从服务器全部宕机的情况

如果某一段插槽的主从全部挂掉了,而cluster-require-full-coverage为yes,那么整个集群都会挂掉。如果cluster-require-full-coverage为no,则仅仅是该主机对应的插槽不能使用。

1.6 集群的Jedis开发

即使连接的不是主机,redis也会自动进行主从切换,实现读写分离

无中心化,能够实现无论是哪个主机上写的数据,其他从机上都能读到

集群类也可以通过一个HostAndPort的集合创建,这样做也可以防止连接的ip宕机导致无法连接集群。

1.7 Redis集合的不足

多键操作不支持,多键的Redis事务是不被支持的,lua脚本(主要用于redis的悲观锁效果)也不支持。

标签:00,Redis,redis,cluster,集群,conf,root
From: https://www.cnblogs.com/tod4/p/16969133.html

相关文章

  • Redis(八)redis新功能
    redis6新功能1ACLRedisACL是AccessControlList(访问控制表)的缩写,该功能允许根据可以执行的命令和访问的键来限制某些连接。2基本命令aclhelp>ACLhelp1)ACL<s......
  • Redis(七)缓存穿透、缓存击穿、缓存雪崩以及分布式锁
    应用问题解决1缓存穿透1.1访问结构正常情况下,服务器接收到浏览器发来的web服务请求,会先去访问redis缓存,如果缓存中存在数据则直接返回,否则会去查询数据库里面的数据,......
  • Redis(一)五种基本数据类型
    1NoSQl数据库1.1技术的发展技术的分类:①解决功能性问题:javase②解决扩展性问题:框架③解决性能问题:redis1.2NoSQL数据库概述NoSQL(NotOnlySQL),不仅仅是SQL,泛指......
  • Redis的数据被删除,占用内存咋还那么大?
    通过CONFIGSETmaxmemory100mb或者在redis.conf配置文件设置maxmemory100mbRedis内存占用限制。当达到内存最大值值,会触发内存淘汰策略删除数据。除此之外,当ke......
  • redis之配置
    一.基本参数1、daemonizedaeonize参数决定了Redis是否会称为一个守护进程,如果该参数值为yes,则表示Redis将会成为一个守护进程,如果该参数为no,则表示Redis不会成为一个守护......
  • 二进制部署高可用k8s集群
    一、k8s高可用架构解析etcd是键值数据库用来存储集群信息apiserver是集群的整个控制中心,所有的流量都会经过他ControllerManager控制器,监控整个集群的状态Scheduler调......
  • redis特性/版本/删除/安装
    Redis是一个开源的高性能键值对数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,并且借助许多高层级的接口使其可以胜任,如缓存、队列系统的不同角色。​​Red......
  • 自己动手基于 Redis 实现一个 .NET 的分布式锁类库
    分布式锁的核心其实就是采用一个集中式的服务,然后多个应用节点进行抢占式锁定来进行实现,今天介绍如何采用Redis作为基础服务,实现一个分布式锁的类库,本方案不考虑Redis集......
  • redis 状态 跟踪 参数值
    1查看客户端连接信息通过执行clientlist命令来查看客户端连接信息,每行都代表一个客户端127.0.0.1:6379>clientlistid=3addr=127.0.0.1:58752fd=7name=age=19951id......
  • Redis配置、优化以及相命令
    一、关系数据库和非关系型数据库1、关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表格模型)基础上,一般面向于记录。SQL语句(标准数据查询语言)就是一......