消息队列
消息队列分为两种
生产者/消费者模式
发布者/订阅者模式
生产者生成消息
LPUSH name message1 (从左往右写入消息)
消费者取出消费信息
RPOP name (从右开始取消息)
列出消息队列
127.0.0.1:6379> lrange name 0 -1
1) "zhao"
2) "wang"
3) "li"
一个消息只能被一个消费者消费
订阅者订阅消息
SUBSCRIBE 103.9
发布者发布消息,此时之前订阅者可以收到消息
PUBLISH 103.9 duchele
批量订阅频道,以1开头的
PSUBSCRIBE 1*
取消订阅
UNSUBSCRIBE 103.9
Redis主从、集群与高可用
主从复制配置:
临时配置分两步:重启无效
在从服务器写主的IP和端口号
SLAVEOF 10.0.0.100 6379
在从服务器输入主的密码
config set masterauth 123456
写入配置文件配置:
[root@ubuntu2004 ~]#vim /etc/redis/redis.conf
masterauth 123456 #主节点密码
replicaof 10.0.0.100 6379 #主节点IP和端口号
requirepass 123456 #本机从节点密码,用于将来提升为主节点用
重启
[root@ubuntu2004 ~]#systemctl restart redis
#注意:从服务器的密码要和主服务器密码一致
取消主从同步关系
replIcaof no one
master节点故障和恢复
1.停止主节点
systemctl stop redis6379.service
2.从节点取消主从复制关系,提升从节点为新的主节点
replicaof no one
3.在其他从节点配置新的从节点IP和端口号
实现redis的级联复制
就是主从后面再跟个从节点,第二个从节点从第一个从节点复制
第一个从配置:
SLAVEOF 10.0.0.100 6379
config set masterauth 123456
第二个从配置:
SLAVEOF 10.0.0.101 6379
config set masterauth 123456
主从复制优化
全量复制
增量复制
复制缓存区配置参数:
缓存区大小可以适当设大点,缓存区一旦满了被覆盖了,就会触发全量复制
repl-backlog-size 1mb
如果从节点断开一个小时,也会触发全量复制
repl-backlog-ttl 3600
避免全量复制
1.第一次全量复制不可避免,可以利用小节点
2.节点重启后run ID 会变,可能触发全量复制
3.复制挤压缓存区不足:当主节点新数据大于缓冲区大小,会触发全量复制
避免复制风暴
1.单主节点复制风暴:
解决方法:更换复制拓补,变成级联复制
2.单机器多实例复制风暴:
机器宕机后,大量全量复制
解决方法:主节点分散多机器
主从同步优化配置
● repl-diskless-sync no # 是否使用无盘方式进行同步RDB文件,默认为no,no表示不使用无盘,需要将 RDB文件保存到磁盘后再发送给slave,yes表示使用无盘,即RDB文件不需要保存至本地磁盘,而且直接通过网络发送给slave
● repl-diskless-sync-delay 5 #无盘时复制的服务器等待的延迟时间
● repl-ping-slave-period 10 #slave向master发送ping指令的时间间隔,默认为10s
● repl-timeout 60 #指定ping连接超时时间,超过此值无法连接,master_link_status显示为down状态,并记录错误日志
● repl-disable-tcp-nodelay no #是否启用TCP_NODELAY
#设置成yes,则redis会合并多个小的TCP包成一个大包再发送,此方式可以节省带宽,但会造成同步延迟时 长的增加,导致master与slave数据短期内不一致
#设置成no,则master会立即同步数据
● repl-backlog-size 1mb #master的写入数据缓冲区,用于记录自上一次同步后到下一次同步前期间的写 入命令,计算公式:repl-backlog-size = 允许slave最大中断时长 * master节点offset每秒写入 量,如:master每秒最大写入量为32MB,最长允许中断60秒,就要至少设置为32*60=1920MB,建议此值是设 置的足够大,如果此值太小,会造成全量复制
● repl-backlog-ttl 3600 #指定多长时间后如果没有slave连接到master,则backlog的内存数据将会过 期.如果值为0表示永远不过期.
● slave-priority 100 #slave参与选举新的master的优先级,此整数值越小则优先级越高.当master故 障时将会按照优先级来选择slave端进行选举新的master,如果值设置为0,则表示该slave节点永远不会被 选为master节点.
● min-replicas-to-write 1 #指定master的可用slave不能少于个数,如果少于此值,master将无法执 行写操作,默认为0,生产建议设为1
● min-slaves-max-lag 20 #指定至少有min-replicas-to-write数量的slave延迟时间都大于此秒数 时,master将不能执行写操作,默认10S
常见主从复制故障
1.主从硬件和软件配置不一致
2.master密码错误
3.Redis版本不一致
4.安全模式下无法远程连接
redis哨兵sentinel
每个sentinel进程利用流言协议,用来判断主节点是否存活,主观宕机,简称sdown
哨兵集群多数sentinel进程认为master存在sdown,则认为客观宕机,简称odown
实现哨兵架构
准备三台实例
一主两从,分别再复用,每个实例上再配一个sentinel
编译安装redis的不用再安装sentinel
包安装的需要单独安装sentinel
apt install -y redis-sentinel
实现主从关系:
10.0.0.100为主
10.0.0.101/102 为从
配置命令:
127.0.0.1:6379> SLAVEOF 10.0.0.100 6379
OK
127.0.0.1:6379> config set masterauth 123456
OK
sentinel配置: 端口26379
编译安装sentinel配置文件目录:/usr/local/src/redis-5.0.14
三个哨兵配置如下:
将配置文件拷到redis编译安装的路径下:
[root@ubuntu2004 redis-5.0.14]#cp sentinel.conf /apps/redis/etc/
修改权限
[root@ubuntu2004 etc]#chown redis.redis sentinel.conf
修改配置文件:
[root@ubuntu2004 redis-5.0.14]#cd /apps/redis/etc/
[root@ubuntu2004 etc]#vim sentinel.conf
[root@ubuntu2004 etc]#grep -vE "^#|^$" sentinel.conf
port 26379
daemonize no
pidfile /apps/redis/run/redis-sentinel.pid
logfile "/apps/redis/log/redis-sentinel.log"
dir /tmp
sentinel monitor mymaster 10.0.0.100 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
配置service文件:里面路径一定要对
[root@ubuntu2004 redis]#vim /lib/systemd/system/sentinel.service
[Unit]
Description=Redis
SentinelAfter=network.target
[Service]
ExecStart=/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf --supervised
systemdExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
加载重启
[root@ubuntu2004 etc]#systemctl daemon-reload
[root@ubuntu2004 etc]#systemctl start sentinel.service
此时sentinel配置文件里多了6行
[root@ubuntu2004 etc]#vim /apps/redis/etc/sentinel.conf
protected-mode no
supervised systemd
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 10.0.0.102 6379
sentinel known-replica mymaster 10.0.0.101 6379
sentinel current-epoch 0
将sentinel.conf和sentinel.service文件拷到其他两个节点,删除配置文件里的最后六行,重新加载重启
[root@ubuntu2004 etc]#scp -p sentinel.conf 10.0.0.102:/apps/redis/etc/
[root@ubuntu2004 etc]#scp /lib/systemd/system/sentinel.service 10.0.0.102:/lib/systemd/system/sentinel.service
远程登录sentinel:
[root@ubuntu2004 ~]#redis-cli -h 10.0.0.100 -p 26379
执行info命令,最下面一行出现此信息,表示配置sentinel成功:
master0:name=mymaster,status=ok,address=10.0.0.100:6379,slaves=2,sentinels=3
如果是低版本,那么配置文件里的id要写成不冲突的
此时,如果主节点宕机,那么会自动选举一个从为主,并将另一个从的配置文件修改成新主的IP,当旧的主节点恢复后,会变成从节点
修改优先级,数字越小优先级越高:
[root@ubuntu2004 etc]#vim /apps/redis/etc/redis6379.conf
replica-priority 80
重启
[root@ubuntu2004 etc]#systemctl restart redis6379.service
此时,当主宕机时,优先级高的会自动被选为新主
Redis cluster架构
Redis cluster 需要至少 3个master节点才能实现,slave节点数量不限,当然一般每个master都至少对应的有一个slave节点
如果有三个主节点采用哈希槽 hash slot 的方式来分配16384个槽位 slot
此三个节点分别承担的slot 区间可以是如以下方式分配
节点M1 0-5460
节点M2 5461-10922
节点M3 10923-16383
Redis cluster搭建
准备六个实例:三主三从
修改配置文件:/apps/redis/etc/redis.conf
sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' /apps/redis/etc/redis.conf
重启服务
systemctl restart redis
集群内部通讯端口16379
创建集群:任何一个机器都可以执行
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster create 10.0.0.100:6379 10.0.0.101:6379 10.0.0.102:6379 10.0.0.103:6379 10.0.0.104:6379 10.0.0.105:6379 --cluster-replicas 1
自动生成以下分配内容:
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.0.0.104:6379 to 10.0.0.100:6379
Adding replica 10.0.0.105:6379 to 10.0.0.101:6379
Adding replica 10.0.0.103:6379 to 10.0.0.102:6379
M: 8b6746438cbee80d5aff758021feca735aa2e346 10.0.0.100:6379
slots:[0-5460] (5461 slots) master
M: 9ad6c665703d11f4d1ab972e9f8b41c3c14dc668 10.0.0.101:6379
slots:[5461-10922] (5462 slots) master
M: f59415a16c6d9a1ea98ec2c023e0497c57ca8249 10.0.0.102:6379
slots:[10923-16383] (5461 slots) master
S: dc7e00ce799d2109be760f2832e8fa8612e9fd43 10.0.0.103:6379
replicates f59415a16c6d9a1ea98ec2c023e0497c57ca8249
S: 0a84fd218e8848fd801815e4896bdd759f304692 10.0.0.104:6379
replicates 8b6746438cbee80d5aff758021feca735aa2e346
S: 97610acb92a2571096d4093d50d0b42c6d5f176d 10.0.0.105:6379
replicates 9ad6c665703d11f4d1ab972e9f8b41c3c14dc668
敲yes后
出现分配详情:
M: 8b6746438cbee80d5aff758021feca735aa2e346 10.0.0.100:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 97610acb92a2571096d4093d50d0b42c6d5f176d 10.0.0.105:6379
slots: (0 slots) slave
replicates 9ad6c665703d11f4d1ab972e9f8b41c3c14dc668
S: dc7e00ce799d2109be760f2832e8fa8612e9fd43 10.0.0.103:6379
slots: (0 slots) slave
replicates f59415a16c6d9a1ea98ec2c023e0497c57ca8249
M: f59415a16c6d9a1ea98ec2c023e0497c57ca8249 10.0.0.102:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 9ad6c665703d11f4d1ab972e9f8b41c3c14dc668 10.0.0.101:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 0a84fd218e8848fd801815e4896bdd759f304692 10.0.0.104:6379
slots: (0 slots) slave
replicates 8b6746438cbee80d5aff758021feca735aa2e346
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
信息查询:
127.0.0.1:6379> role
1) "master"
2) (integer) 700
3) 1) 1) "10.0.0.104"
2) "6379"
3) "700"
查看集群信息:
[root@ubuntu2004 ~]#cat /apps/redis/data/nodes-6379.conf
97610acb92a2571096d4093d50d0b42c6d5f176d 10.0.0.105:6379@16379 slave 9ad6c665703d11f4d1ab972e9f8b41c3c14dc668 0 1667390150297 2 connected
dc7e00ce799d2109be760f2832e8fa8612e9fd43 10.0.0.103:6379@16379 slave f59415a16c6d9a1ea98ec2c023e0497c57ca8249 0 1667390149284 3 connected
f59415a16c6d9a1ea98ec2c023e0497c57ca8249 10.0.0.102:6379@16379 master - 0 1667390148275 3 connected 10923-16383
9ad6c665703d11f4d1ab972e9f8b41c3c14dc668 10.0.0.101:6379@16379 master - 0 1667390149000 2 connected 5461-10922
0a84fd218e8848fd801815e4896bdd759f304692 10.0.0.104:6379@16379 slave 8b6746438cbee80d5aff758021feca735aa2e346 0 1667390147000 1 connected
8b6746438cbee80d5aff758021feca735aa2e346 10.0.0.100:6379@16379 myself,master - 0 1667390147000 1 connected 0-5460
vars currentEpoch 6 lastVoteEpoch 0
工作在集群模式:-c 会自动跳转合适的节点,将数据放到槽位里或者从对应的槽位获取数据
[root@ubuntu2004 ~]#redis-cli -a 123456 -c
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set k1 v1
-> Redirected to slot [12706] located at 10.0.0.102:6379
OK
从节点只负责备用工作,无法读写,不做性能分担,读写只在主节点
集群扩容
其他三台实例需要各分出自身的四分之一槽位给新节点
新节点配置文件要具备加入集群的条件
将10.0.0.106加入集群作为主,后面跟当前集群的任意节点
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster add-node 10.0.0.106:6379 10.0.0.100:6379
可以查询到已经加入了集群
[root@ubuntu2004 ~]#redis-cli -a 123456 cluster nodes
均摊槽位:集群内任意节点
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster reshard 10.0.0.100:6379
根据提示,输入要分配的槽位数:4096;接收槽位的id;由谁分配:all;同意分配:yes
再加入新节点作为10.0.0.106的从
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster add-node 10.0.0.107:6379 10.0.0.100:6379 --cluster-slave --cluster-master-id a934a9c06c5965c96d36f7091d235a92aa9c3c25
集群缩容
根据目前分配情况进行缩容:
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster check 10.0.0.100:6379
>>> Performing Cluster Check (using node 10.0.0.100:6379)
S: 8b6746438cbee80d5aff758021feca735aa2e346 10.0.0.100:6379
slots: (0 slots) slave
replicates 0a84fd218e8848fd801815e4896bdd759f304692
S: bfcf37f26ebe7879ab49878c5f4cd50bed8bcd81 10.0.0.107:6379
slots: (0 slots) slave
replicates a934a9c06c5965c96d36f7091d235a92aa9c3c25
S: dc7e00ce799d2109be760f2832e8fa8612e9fd43 10.0.0.103:6379
slots: (0 slots) slave
replicates f59415a16c6d9a1ea98ec2c023e0497c57ca8249
M: f59415a16c6d9a1ea98ec2c023e0497c57ca8249 10.0.0.102:6379
slots:[12288-16383] (4096 slots) master
1 additional replica(s)
M: a934a9c06c5965c96d36f7091d235a92aa9c3c25 10.0.0.106:6379
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
1 additional replica(s)
S: 97610acb92a2571096d4093d50d0b42c6d5f176d 10.0.0.105:6379
slots: (0 slots) slave
replicates 9ad6c665703d11f4d1ab972e9f8b41c3c14dc668
M: 9ad6c665703d11f4d1ab972e9f8b41c3c14dc668 10.0.0.101:6379
slots:[6827-10922] (4096 slots) master
1 additional replica(s)
M: 0a84fd218e8848fd801815e4896bdd759f304692 10.0.0.104:6379
slots:[1365-5460] (4096 slots) master
1 additional replica(s)
分三笔还:同一个命令
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster reshard 10.0.0.100:6379
根据数字,借谁的还谁
将10.0.0.106/107从集群中删除
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster del-node 10.0.0.100:6379 a934a9c06c5965c96d36f7091d235a92aa9c3c25
[root@ubuntu2004 ~]#redis-cli -a 123456 --cluster del-node 10.0.0.100:6379 bfcf37f26ebe7879ab49878c5f4cd50bed8bcd81
导入现有redis数据至集群
将配置文件修改:新版需要关闭保护模式
sed -i '/^protected-mode/c protected-mode no' /apps/redis/etc/redis.conf
重启redis
取消需要导入的主机的密码:
redis-cli -h 127.0.0.1 -p 6379 -a 123456 --no-auth-warning CONFIG SET requirepass ""
导入数据:
redis-cli --cluster import 10.0.0.101:6379 --cluster-from 10.0.0.200:6379 --cluster-copy --cluster-replace