当前位置: 首页 > news >正文

Redis-02-集群

一、redis5搭建集群

1.1、案例:搭建6台redis主机,配置如下

  • redis并发量:https://www.gxlcms.com/redis-350423.html
  • 主机IP:192.168.168.60~65
  • 修改redis配置文件
  • hash槽移动,槽内的数据也随之移动
[root@60 ~]# vim /etc/redis/6379.confport 6360								bind 192.168.168.60						//本机iPcluster-enabled yes						//启用集群功能cluster-config-file nodes-6360.conf		//存储集群信息文件cluster-node-timeout 5000				//和其他主机连接超时时间(毫秒)
  • 重启并查看端口
[root@60 ~]# /etc/init.d/redis_6379 restart
[root@60 ~]# 
[root@60 ~]# netstat -ntpl |grep redis
tcp        0      0 192.168.168.60:16360    0.0.0.0:*               LISTEN      3394/redis-server 1 
tcp        0      0 192.168.168.60:6360     0.0.0.0:*               LISTEN      3394/redis-server 1 
# 有两个端口,另一个是集群端口
  • 创建集群,redis5创建集群的命令是用C语言写的,固直接使用redis-cli创建
[root@60 ~]# redis-cli --cluster  create  \
>192.168.168.60:6360 \
>192.168.168.61:6361 \
>192.168.168.62:6362 \
>192.168.168.63:6363 \
>192.168.168.64:6364 \
>192.168.168.74:6374 \
--cluster-replicas 1~~~
[OK] All 16384 slots covered.

1.2、查看集群信息

  • 可通过ID号来分辨谁是主谁是从
[root@60 ~]# cat /var/lib/redis/6379/nodes-6360.conf 
a8d25a9390b1fabc2c71066a421f75ca83164068 192.168.168.74:6374@16374 slave ce4577b185a1de74f19336ea097cfaba7287a6db 0 1614424935501 6 connected
96b11bcc1a22f00196990dd98c9ba10977b15853 192.168.168.60:6360@16360 myself,master - 0 1614424934000 1 connected 0-5460
46d9b27d6a5ae7404f5d3a9d237838d20d40eddb 192.168.168.62:6362@16362 master - 0 1614424934498 3 connected 10923-16383
3afa277b144f764cdab7001666332de6e84319d6 192.168.168.64:6364@16364 slave 96b11bcc1a22f00196990dd98c9ba10977b15853 0 1614424934000 5 connected
0b5db3a2284d6f76ed7926f0da7619a175f66886 192.168.168.63:6363@16363 slave 46d9b27d6a5ae7404f5d3a9d237838d20d40eddb 0 1614424936003 4 connected
ce4577b185a1de74f19336ea097cfaba7287a6db 192.168.168.61:6361@16361 master - 0 1614424934000 2 connected 5461-10922
vars currentEpoch 6 lastVoteEpoch 0
[root@60 ~]# redis-cli -h 192.168.168.60 -p 6360 -c
192.168.168.60:6360> 
192.168.168.60:6360> cluster nodes
192.168.168.60:6360> cluster info
cluster_state:ok
cluster_slots_assigned:16384		#总共16384个hash槽
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6				#总共6个节点
cluster_size:3						# 3个主节点
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1937
cluster_stats_messages_pong_sent:1910
cluster_stats_messages_sent:3847
cluster_stats_messages_ping_received:1905
cluster_stats_messages_pong_received:1937
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:3847

1.3、hash槽以及key存储

  • hash槽分配
使用cluster info 可查看hash槽的个数,cluster nodes 可查看每个主节点的hash槽范围
使用key存储时,key值与CRC16算法取到一个值,该值与hash槽数取余(值/16384)得到的结果便为存放在hash槽的槽号
  • 排错
[root@60 ~]# redis-cli -h 192.168.168.60 -p 6360
192.168.168.60:6360> 
192.168.168.60:6360> set name bob
(error) MOVED 5798 192.168.168.74:6374			#该错误代表没有启用集群模板所致
  • 解决方案
使用 "-c" 启用集群模板
[root@60 ~]# redis-cli -c -h 192.168.168.60 -p 6360 
192.168.168.60:6360> keys *
(empty list or set)
192.168.168.60:6360> set name bob
-> Redirected to slot [5798] located at 192.168.168.74:6374
OK
192.168.168.74:6374> 

二、集群参数

2.1、集群命令

  • add-node #添加节点
  • del-node #删除节点,
  • reshard #重新划分槽
  • info #查看集群主从
  • check #检查集群状态

2.2、集群内部命令

  • cluster reset #重置当前集群主机并重置集群文件
  • info replication #查看集群信息和当前角色
  • 案例
redis集群:一个主宕掉之后,从会升级成主
add-nodes: 默认添加主节点,--cluster-slave 添加从节点,需要指定主节点#添加为主库后默认是没有hash槽,需要划分hash槽
  • 案例
添加67主机为master服务器:
添加时不指定主机角色,默认新主机被选为master;且需要手动分配hash槽(slots):::
1:添加master
2:手动分配hash槽
(1):add-node  添加主机,默认为master		redis-cli --cluster add-node 192.168.168.67:6367 集群任意一台masterip:端口
(2):reshard  重新分配hash槽redis-cli --cluster reshard	192.168.168.67:63671:hash槽增加个数,2:要划分槽的master主机的ID号,3:all/masterID号	all代表所有,masterID 需回车后数 done4:yes完成
(3):hash槽查看redis-cli --cluster info 集群任意一台主机IP:端口
3:添加slave节点redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave
4:移除slave节点:
5:移除master节点:需要先移除hash槽,
[root@74 ~]# redis-cli --cluster add-node 192.168.168.67:6367 192.168.168.74:6374
[root@74 ~]# cat /var/lib/redis/6379/nodes-6374.conf 
...
0b5db3a2284d6f76ed7926f0da7619a175f66886 192.168.168.63:6363@16363 master - 0 1614596774544 9 connected 10923-16383
a042887465d75de9b5dc022161f9072f58479880 192.168.168.67:6367@16367 master - 0 1614596774749 0 connected 	
#添加集群成功,但是没有hash槽,默认为master
...
[root@74 ~]# redis-cli --cluster reshard 192.168.168.67:6367	
[root@74 ~]#
[root@74 ~]# cat /var/lib/redis/6379/nodes-6374.conf 
a042887465d75de9b5dc022161f9072f58479880 192.168.168.67:6367@16367 master - 0 1614596970036 10 connected 0-1364 5461-6826 10923-12287
[root@62 ~]# redis-cli --cluster info 192.168.168.62:6362
192.168.168.63:6363 (0b5db3a2...) -> 1 keys | 4096 slots | 1 slaves.
192.168.168.74:6374 (a8d25a93...) -> 0 keys | 4096 slots | 1 slaves.
192.168.168.67:6367 (a0428874...) -> 2 keys | 4096 slots | 0 slaves.
192.168.168.64:6364 (3afa277b...) -> 1 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
移除从库时,会停掉从库,该从库目录下集群文件不变,所以启动时会自动加载集群文件
移除主库时,先移除的主库Hash槽1:移除多少个hash slots
2:接收hash槽主机的ID
3:移除hash槽主机的ID all/id+done
4:yes

三、Redis主从同步

  • 主从架构:一主一从,一主多从,主从从

3.1、临时设置成主从

  • info replication #登录后查看角色信息
  • slaveof 主库ip 端口 #从库指定谁是主库,适用于一主一从,一主多从,主从从,临时生效
  • slaveof on one #主库宕机后,从库恢复成主库
192.168.168.68:6368> SLAVEOF 192.168.168.67 6367	#指定67为68的主库
OK Already connected to specified master
192.168.168.68:6368> info replication
# Replication
role:slave
master_host:192.168.168.67
master_port:6367
master_link_status:up
192.168.168.73:6373> SLAVEOF 192.168.168.68 6368	#主从从结构配置

3.2、永久配置主从

  • 主库配置:开启密码验证
[root@67 ~]# grep -n requirepass /etc/redis/6379.conf 
508:requirepass 123456		
  • 从库配置:指定主库与主库密码
[root@68 ~]# sed -n "287p;294p" /etc/redis/6379.conf 
replicaof 192.168.168.67 6367	#主库IP 端口
masterauth 123456				#主库密码
  • 主从从配置,从库的从库配置
[root@73 ~]# sed -n "287p" /etc/redis/6379.conf 
replicaof 192.168.168.68 6368
  • 哨兵模式
简介:slave节点监视master节点,发现master节点宕机后,slave节点选举出一个新的master,原来的master节点恢复后自动变成从,但是要注意密码。
哨兵模式适用于主从从,一主多从
主库配置:
[root@67 ~]# vim /etc/redis/6379.conf bind 192.168.168.67port 6367requirepass "123456"masterauth 123456
从库配置1
[root@68 ~]# vim /etc/redis/6379.conf bind 192.168.168.68port 6368replicaof 192.168.168.68 6368	#指定主库requirepass "123456"masterauth 123456
# 从库配置2,创建监视文件,启用哨兵服务
[root@68 ~]# vim /etc/sentinel.conf 	#新建conf文件
sentinel monitor host-minoter 192.168.168.68 6368 1		#Hhost-minoter给监视的主机起名字,主机+端口,1代表投票的票数
sentinel auth-pass host-minoter 123456					#主库密码
# 从库启动监视器
[root@68 ~]# redis-sentinel /etc/sentinel.conf 
....
在终端输出

四、数据持久化

  • RDB:dump.rdb(默认),Redis database
  • AOF:*.aof,append only file

4.1、RDB

  • 简介
数据持久化默认方式
按照指定时间间隔,将内存中的数据快照写到硬盘
快照术语叫 Snapshot
恢复时,将快照文件直接写入内存;
  • 优点,缺点
优点:高性能的持久化,创建一个子进程来执行持久化,先将数据写入临时文件,持久化结束后,再将这个临时文件替换上次持久化好的文件;替换过程中主进程不做任何的IO操作;解释:主进程只负责处理客户端的请求,不对磁盘做IO操作。
意外宕机时,丢失最后一次持久化的所有数据
  • 相关配置参数
图片讲解:http://tts.tmooc.cn/ttsPage/VIP/NSDVN201805/NOSQL/DAY03/COURSE/LINUXNSD_V04NOSQLDAY03_019.png
相关配置参数:http://tts.tmooc.cn/ttsPage/VIP/NSDVN201805/NOSQL/DAY03/COURSE/LINUXNSD_V04NOSQLDAY03_020.png
文件名:
dbfilename "dump.rdb"	
save	""		#禁用rdb
数据从内存报错到硬盘的频率
save 900 1		//900s内且有一次修改,
save 300 10		//300s内且有10次修改
save 60 10000	//60s内且有10000次修改

4.2、AOF

  • 简介
追加方式记录写操作的文件
记录redis服务所有写操作
不断的将新的写操作,追加到文件的末尾;
默认没有启用, 在vim +673 /etc/redis/6379.conf(产生的数据文件必须有开启AOF的才能使用)
可以用cat命令查看;
  • 相关配置参数
appendonly no		#aof默认没有开启
appendfilename "appendonly.aof"appendfsync always		#写一次记一次
appendfsync everysec	#默认为每秒一次,并完成磁盘同步
appendfsync no			#写入aof时,不执行磁盘同步
auto-aof-rewrite-min-size 64mb	//首次重写触发值
auto-aof-rewrite-percentage 100	//再次重写,增长100%
解释:首次瘦身为64mb 当第二次数据达到64mb时,进行瘦身,将第一次和第二次的数据把有相同命令的数据合并,最后瘦身剩下一个数值A(50),当第三次数据达到A(50)时,A与A对比,把有相同的数据合并剩余B(80)
  • 修复AOF文件
把文件恢复到最后一次的正确操作
redis-check-aof --fix appendonly.aof
  • 优点、缺点
优点:
可以灵活设置持久化方式,同步持久化appendfsync alwayls 或 异步持久化 appendfsync verysec
出现意外宕机时:仅可能丢失1秒的数据
缺点:
持久化文件的体积通常会大于RDB方式
执行fsync策略时的速度可能会比RDB方式慢
http://www.lryc.cn/news/90137.html

相关文章:

  • 【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第三章——MindSpore云上调试调优
  • python笔记17_实例演练_二手车折旧分析p2
  • android 12.0长按Power弹出关机对话框去掉屏幕截图和紧急呼救功能
  • 2023年下半年软考高级需要报班吗?
  • 使用WordPress提高企业敏捷性
  • SSM编程---Day 07
  • Seata术语
  • 【Axure教程】通过文本框维护下拉列表选项
  • 【C++】基础知识--输入/输出(5)
  • 经典文献阅读之--PIBT(基于可见树的实时规划方案)
  • SAP-MM-计算方案字段解析
  • go-gf框架两个表以事务方式写入示例
  • 2023-5-31第三十一天
  • 什么是MQTT?mqtt协议和http协议区别
  • 平台使用篇 | 批处理(bat)脚本使用教程(四)
  • 接口的讲解
  • G0第21章 :gin框架介绍、RESTful API、Gin渲染
  • python list,dict操作
  • 我有一个页面a,在页面a中调用了一个组件,然后组件中要切换页面a的一块区域,该怎么实现?
  • ChatGPT唤醒AI游戏:AIGC持续走深,游戏或成AI最佳抓手
  • 远程服务和web服务和前端,三方通过socket和websocket进行双向通信传输数据
  • Linux 网络基础(2)应用层(http/https协议、请求格式、响应格式、session、cookie、加密传输)
  • 解决sshfs挂载报错
  • 由于过多的连接错误而被 MySQL服务器 阻止
  • Go语言实现JDBC
  • ubuntu修改环境变量的几种方法
  • 基于html+css的图展示95
  • 数据库基础——5.运算符
  • JMeter 性能测试基本过程及示例
  • 漏洞复现 CVE-2018-2894 weblogic文件上传