一、redis5搭建集群
1.1、案例:搭建6台redis主机,配置如下
redis并发量:https://www.gxlcms.com/redis-350423.html 主机IP:192.168.168.60~65 修改redis配置文件 hash槽移动,槽内的数据也随之移动
[ root@60 ~]
port 6360
bind 192.168 .168.60 //本机iP
cluster-enabled yes //启用集群功能
cluster-config-file nodes-6360.conf //存储集群信息文件
cluster-node-timeout 5000 //和其他主机连接超时时间( 毫秒)
[ root@60 ~]
[ root@60 ~]
[ root@60 ~]
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 ~]
> 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、查看集群信息
[ root@60 ~]
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 ~]
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
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size: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存储
使用cluster info 可查看hash槽的个数,cluster nodes 可查看每个主节点的hash槽范围
使用key存储时,key值与CRC16算法取到一个值,该值与hash槽数取余(值/16384)得到的结果便为存放在hash槽的槽号
[ root@60 ~]
192.168 .168.60:6360 >
192.168 .168.60:6360 > set name bob
( error) MOVED 5798 192.168 .168.74:6374
使用 "-c" 启用集群模板
[ root@60 ~]
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 添加从节点,需要指定主节点
添加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 ~]
[ root@74 ~]
.. .
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
.. .
[ root@74 ~]
[ root@74 ~]
[ root@74 ~]
a042887465d75de9b5dc022161f9072f58479880 192.168 .168.67:6367@16367 master - 0 1614596970036 10 connected 0 -1364 5461 -6826 10923 -12287
[ root@62 ~]
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
OK Already connected to specified master
192.168 .168.68:6368 > info 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 ~]
508 :requirepass 123456
[ root@68 ~]
replicaof 192.168 .168.67 6367
masterauth 123456
[ root@73 ~]
replicaof 192.168 .168.68 6368
简介:slave节点监视master节点,发现master节点宕机后,slave节点选举出一个新的master,原来的master节点恢复后自动变成从,但是要注意密码。
哨兵模式适用于主从从,一主多从
主库配置:
[ root@67 ~]
bind 192.168 .168.67
port 6367
requirepass "123456"
masterauth 123456
从库配置1
[ root@68 ~]
bind 192.168 .168.68
port 6368
replicaof 192.168 .168.68 6368
requirepass "123456"
masterauth 123456
[ root@68 ~]
sentinel monitor host-minoter 192.168 .168.68 6368 1
sentinel auth-pass host-minoter 123456
[ root@68 ~]
.. ..
在终端输出
四、数据持久化
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 ""
数据从内存报错到硬盘的频率
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
appendfilename "appendonly.aof"
appendfsync always
appendfsync everysec
appendfsync no
auto-aof-rewrite-min-size 64mb //首次重写触发值
auto-aof-rewrite-percentage 100 //再次重写,增长100%
解释:首次瘦身为64mb 当第二次数据达到64mb时,进行瘦身,将第一次和第二次的数据把有相同命令的数据合并,
最后瘦身剩下一个数值A( 50 ) ,当第三次数据达到A( 50 ) 时,A与A对比,把有相同的数据合并剩余B( 80 )
把文件恢复到最后一次的正确操作
redis-check-aof --fix appendonly.aof
优点:
可以灵活设置持久化方式,同步持久化appendfsync alwayls 或 异步持久化 appendfsync verysec
出现意外宕机时:仅可能丢失1秒的数据
缺点:
持久化文件的体积通常会大于RDB方式
执行fsync策略时的速度可能会比RDB方式慢