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.conf
	port 6360								
    bind 192.168.168.60						//本机iP
	cluster-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:6367
	1:hash槽增加个数,
	2:要划分槽的master主机的ID号,
	3:all/masterID号	all代表所有,masterID 需回车后数 done
	4: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.67
 port 6367
 requirepass "123456"
 masterauth 123456
从库配置1
[root@68 ~]# vim /etc/redis/6379.conf 
 bind 192.168.168.68
 port 6368
 replicaof 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方式慢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值