首页 > 数据库 >redis集群-Cluser

redis集群-Cluser

时间:2023-08-29 15:00:30浏览次数:35  
标签:Cluser 0.1 redis cluster 集群 conf 7000 节点

目录

一 Redis Cluser介绍背景

https://www.cnblogs.com/liuqingzheng/articles/17324393.html

1.1问题

# 存在问题 
1 并发量:单机redis qps为10w/s,但是我们可能需要百万级别的并发量
2 数据量:机器内存16g--256g,如果存500g数据呢?

1.2 解决

# 集群解决上述问题
# 解决:加机器,分布式
redis cluster 在2015年的 3.0 版本加入了,满足分布式的需求

二 数据分布(分布式数据库)

2.1 存在问题

假设全量的数据非常大,500g,单机已经无法满足,我们需要进行分区,分到若干个子集中

2.2 分区方式

分布方式 特点 产品
哈希分布 数据分散度高,建值分布于业务无关,无法顺序访问,支持批量操作 一致性哈希memcache,redis cluster,其他缓存产品
顺序分布 数据分散度易倾斜,建值业务相关,可顺序访问,支持批量操作 BigTable,HBase

2.2.1 顺序分区

# 原理:100个数据分到3个节点上 1--33第一个节点;34--66第二个节点;67--100第三个节点(很多关系型数据库使用此种方式)

2.2.2 哈希分区

有3终方式:节点取余分区、一致性哈希分区、虚拟槽分区

节点取余分区

# 原理:hash分区: 节点取余 ,假设3台机器, hash(key)%3,落到不同节点上

节点扩容,添加一个节点,存在问题,很多数据需要偏移,总偏移量要大于80%

推荐翻倍扩容,由3变成6,数据量迁移为50%,比80%降低

# 总结:
客户端分片,通过hash+取余
节点伸缩,数据节点关系发生变化,导致影响数据迁移过大
迁移数量和添加节点数量有关:建议翻倍扩容

一致性哈希分区
每个节点负责一部分数据,对key进行hash,得到结果在node1和node2之间,就放到node2中,顺时针查找

假设添加一个新节点node5,现在只需要迁移一小部分数据,不会影响node3和node4的数据,只会迁移node1和node2的数据

节点比较多的话合适,假设有1000个节点,加一个只要迁移千分之一的数据

#总结:
客户端分片:哈希+顺时针(优化取余)
节点伸缩:只影响临近节点,但是还有数据迁移的情况
伸缩:保证最小迁移数据和无法保证负载均衡(这样总共5个节点,数据就不均匀了),翻倍扩容可以实现负载均衡

虚拟槽分区
预设虚拟槽:每个槽映射一个数据子集,一般比节点数大
良好的哈希函数:如CRC16
服务端管理节点、槽、数据:如redis cluster(槽的范围0–16383)

5个节点,把16384个槽平均分配到每个节点,客户端会把数据发送给任意一个节点,通过CRC16对key进行哈希对16383进行取余,算出当前key属于哪部分槽,属于哪个节点,每个节点都会记录是不是负责这部分槽,如果是负责的,进行保存,如果槽不在自己范围内,redis cluster是共享消息的模式,它知道哪个节点负责哪些槽,返回结果,让客户端找对应的节点去存
服务端管理节点,槽,关系

三 集群搭建

搭建redis集群 --->6台机器(一主一从:3个节点)--->扩容成:8台机器,4个节点---->再缩容:恢复成6台机器3个节点

# 集群配置
#masterauth  集群搭建时,如果主库设置了密码,需要填写主库的密码
cluster-enabled yes  # 开启cluster,丛集,群集
cluster-node-timeout 15000 # 故障转移,超时时间 15s
cluster-config-file nodes-${port}.conf  # 自动生成的,cluster节点增加一个自己的配置文件
cluster-require-full-coverage yes  # 只要集群中有一个故障了,整个就不对外提供服务了,这个实际不合理,假设有50个节点,一个节点故障了,所有不提供服务了,需要设置成no

# 1 写一个配置文件
vim redis-7000.conf
# 写入
port 7000
daemonize yes
dir "/root/lqz/redis/data/"
logfile "7000.log"
dbfilename "dump-7000.rdb"

cluster-enabled yes
cluster-config-file nodes-7000.conf  
cluster-require-full-coverage yes 

# 2 快速造出6个
# 快速生成其他配置
# sed读取文本并进行替换
# sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf 把文本中的7000换成7001,并把新文件命令为7001。
sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
sed 's/7000/7004/g' redis-7000.conf > redis-7004.conf
sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf



# 3 启动起6个节点
./src/redis-server ./redis-7000.conf
./src/redis-server ./redis-7001.conf
./src/redis-server ./redis-7002.conf
./src/redis-server ./redis-7003.conf
./src/redis-server ./redis-7004.conf
./src/redis-server ./redis-7005.conf
ps -ef |grep redis  # 查看进程

# 4  查看集群命令(暂时没配好)
cluster nodes
cluster info

# 5  集群不能运行,运行如下命令
./src/redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 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
                        
#####################命令解释###################
./src/redis-cli --cluster 
create # 创建集群命令
--cluster-replicas 1 # 每个主节点,有一个从节点,代表--replicas 1
127.0.0.1:7000 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
# # 集群自动分配主从关系  7000、7001、7002为主(M) 7003、7004、7005为从(S),

# 分好主库的槽了
7000M  {0...5461}
7001M  {5462...10922}
7002M  {10923...16383}
################################################

# 6 演示,连接一个数据库
./src/redis-cli -c -p 7005
# 只能查看本节点中的数据,其他库中的数据,需要连接好所在的数据库才能查看,这种方式不好,需要使用集群模式连接
# -c,集群模式连接
./src/redis-cli -c -p 7005  # 自动找到不同节点,去操作数据(查值,放值)

# 7 故障转移
-把主库,7000停止--->7005从库--->升级为主库
-再启动7000,7000就变成了从库
ps aux |grep redis
kill -9 24537  # 杀死进程,shutdown是关闭进程,是需要进入进程中的
ps aux |grep redis
cluster nodes  # 7000 fail,7005 master,此时还是可以对外提供服务,因为整个数据是完整的
./srcc/redis-sever ./redis-7000.conf  # 把7000启动起来
cluster slave

四 python 操作集群

# rediscluster
# pip3.9 install redis-py-cluster
from rediscluster import RedisCluster
startup_nodes = [{"host":"127.0.0.1", "port": "7000"},{"host":"127.0.0.1", "port": "7001"},{"host":"127.0.0.1", "port": "7002"}]
# conn = RedisCluster(startup_nodes=startup_nodes,decode_responses=True)
conn = RedisCluster(startup_nodes=startup_nodes)
conn.set("foo", "bar")
print(conn.get("foo"))

标签:Cluser,0.1,redis,cluster,集群,conf,7000,节点
From: https://www.cnblogs.com/zjyao/p/17664789.html

相关文章

  • redis哨兵Sentinel
    目录一主从复制高可用二哨兵三安装配置四python操作哨兵一主从复制高可用#主从复制存在的问题:1主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master---->哨兵做高可用2主从复制,只能主写数据,所以写能力和存储能力有限----->使用集群解决#......
  • 一台服务器上部署 Redis 伪集群
    哈喽大家好,我是咸鱼今天这篇文章介绍如何在一台服务器(以CentOS7.9为例)上通过redis-trib.rb工具搭建Rediscluster(三主三从)redis-trib.rb是一个基于Ruby编写的脚本,其功能涵盖了创建、管理以及维护Redis集群的各个方面值得注意的是,随着时间的推移,一些较新版本的Redi......
  • redis主从复制
    目录一什么是主从复制1.1主从复制:一主一从,一主多从1.2特点1.3Redis主从复制的作用二主从原理2.1主库是否要开启持久化(一般情况要开启)3.2方式一3.3方式二:配置文件方式一什么是主从复制redis单实例--->容易产生机器故障;容量瓶颈;QPS(每秒查询率)瓶颈1.1主从复制:一主一......
  • Kubernetes集群部署三节点yum部署
    一、修改主机名(三个节点都操作)vi/etc/hostname#跟换主机名systemctlrestartsystemd-hostnamed#修改完成后重新链接服务二、同步时间(三个节点都操作)yuminstallntpdate-yntpdatetime.windows.com#时区设置cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime#最......
  • redis分布式锁,setnx+lua脚本的java实现
    1前言在现在工作中,为保障服务的高可用,应对单点故障、负载量过大等单机部署带来的问题,生产环境常用多机部署。为解决多机房部署导致的数据不一致问题,我们常会选择用分布式锁。目前其他比较常见的实现方案我列举在下面:基于缓存实现分布式锁(本文主要使用redis实现)基于数据库实......
  • 连接redis后 ,报错: ERR wrong number of arguments for ‘hset‘ command“怎么解决
    原因:ERRwrongnumberofargumentsfor‘hset‘command触发代码 解决方法:可能是java不匹配我本地3.2版本的redis,我换一个更大版本的redis就解决了 ......
  • redis持久化
    目录一持久化1.1什么是持久化1.2持久化的实现方式二rdb方案2.1使用2.2RDB问题三AOF3.1AOF介绍3.2#AOF的三种策略3.3AOF重写实现方式AOF重写配置:自动触发时机(两个条件同时满足):重写流程aof配置7.3混合持久化一持久化1.1什么是持久化redis的所有数据保存在内存中,对数......
  • Redis简介
    文章目录一、Redis是什么?二、Redis优缺点?三、Redis应用场景四、Redis安装和使用五、Redis为什么这么快?1、为什么采用单线程2、Redis的I/O多路复用一、Redis是什么?Redis(RemoteDictionaryServer:远程字典服务)是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于......
  • redis高级用法:慢查询、pipline与事务、发布订阅、bitmap位图、HyperLogLog、GEO地理位
    目录一高级用法之慢查询1.1生命周期1.2两个配置1.2.1slowlog-max-len1.2.2slowlog-max-len1.3设置慢查询1.5作用二pipline与事务2.1什么是pipeline(管道)2.2python客户端实现pipline2.3与原生操作对比2.4使用建议2.5原生redis操作操作事务三发布订阅3.1角色3.2模......
  • redis数据类型和使用命令
    目录一通用命令1.1通用命令1.2数据结构和内部编码1.3单线程架构,二字符串类型2.1字符串键值结构2.2常用命令三hash类型3.1哈希值结构3.2常用命令3.3hashvsstring四列表类型4.1列表特点常用命令五集合类型5.1特点5.2常用命令六有序集合类型6.1特点6.2常用命令......