redis单机、单节点、单实例
问题:
1.单点故障
2.容量有限
3.压力
看图复习
解决办法:AKF
X: 全量、镜像
Y: 业务、功能
Z: 优先级、逻辑再拆分
x: x轴解决压力问题,x轴增加多台主从机器,主机写,从机读取,环节了压力
Y: y轴解决容量问题,相当于微服务分库,按照业务进行拆分
z: Z轴是数据无法在进行拆分时,那么就进行数据范围拆分,比如1-1000万一个redis,一千万到两千万一个reids,以此类推等等
一变多会遇到的问题?
1.数据一致性问题 a.所有节点阻塞直到数据一致、强一致性、破坏可用性 b.本来一边多的目的就是解决可用性,为了数据一致性又破坏可用性,矛盾 c.容忍数据丢失一部分 d.异步发送、第一个redis发送kafka(可靠、集群、响应速度快)、当地一个挂掉、另外备用的顶上去、数据从kafka中拿(最终数据一致性)
主备和主从概念:
https://www.cnblogs.com/tankblog/p/11190598.html
通过AKF、一变多(主备)
问题:怎么保持数据一致性?
强一致性破坏可用性。原:为什么一变多,解决可用性。(矛盾)
1.容忍数据丢失一部分
2.异步发送、第一个redis发送kafka(可靠、集群、响应速度快)、当第一个挂掉、另外备用的顶上去,数据从kafka中拿
redis一般使用主从、那么主又有单点故障、所以需要对主做HA(高可用)
主:并不是不允许挂掉、而是当主挂掉、来一个服务顶掉挂掉的主,对外是一种没有挂掉的感觉。
所以主需要一个程序监控。
一个程序:也有单点故障的问题。
监控:只需要一部分决策成功即可(弱一致性 1或2个) 1:统计不准确,比如网络不通、出现脑裂现象,因为一个决策,一说ok,一个说不ok,第三个已经不重要了
2:解决脑裂问题、
集群配置
条件:在utils目录下执行 ./install_server.sh
第一次: 选择默认6379
第二次: 输入6380
第三次: 输入6381
目录:/etc/redis 生成三个配置文件:6379.conf、6380.conf、6381.conf
为了查看日志方便修改: 1.daemonize no 2.禁止日志路径
启动:
redis-server ./6379.conf
redis-server ./6380.conf
redis-server ./6381.conf
人工选主:redis-cli -p 6379、6380、6381 进入三台redis
5.0以前是:slaveof 127.0.0.1 6379 5.0以后是:replicaof 1270.0.1 6379
现象:
1. 6380和6381的redis内容和6379内容一致
2. 6380和6381的redis启动日志 a.flush本地内容、b.生成唯一id c.copy on write数据
当主6380挂掉
6381和6382一直循环出现: Connecting to MASTER 127.0.0.1:6380 MASTER <-> REPLICA sync started Error condition on socket for SYNC: Connection refused
so:需要哨兵进行维护
其他:
replica-serve-stale-data yes 数据同步完才可以处理 replica-read-only yes 同步后,从机仅读取数据 repl-diskless-sync no 数据同步走网络IO,还是磁盘IO(网络IO直接通过网络发送,磁盘IO是先写到rdb文件,在通过网络IO发送) repl-backlog-size 1mb 每次复制数据的大小 #增量复制 min-replicas-to-write 3 min-replicas-max-lag 10 最少3台写成功、最多10台写成功(默认注掉的,这个配置项数据一致性靠拢)
哨兵1: 26379.conf port 26379 sentinel monitor mymaster 127.0.0.1 6379 1 哨兵2: 26380.conf port 26380 sentinel monitor mymaster 127.0.0.1 6380 2 哨兵3: 26381.conf port 26381 sentinel monitor mymaster 127.0.0.1 6381 3 开启主从集群: 1.redis-server ./6379.conf 2.redis-server ./6380.conf --replicaof 127.0.0.1 6380 3.redis-server ./6381.conf --replicaof 127.0.0.1 6381 开启监控: redis-server ./26379.conf --sentinel redis-server ./26380.conf --sentinel redis-server ./26381.conf --sentinel 结论: 1.哨兵监控到了6379、6380、6381 2.也监控到了其他哨兵 3.哨兵会动配置文件,往26379、26380、26381配置文件加入监控到的其他哨兵信息 4.通过发布订阅发现其他哨兵( PSUBSCRIBE *可以查看) "127.0.0.1,26381,e48a67a20bb64588c9bbc98826cae61dd2906b3e,6,mymaster,127.0.0.1,6381,0" 1) "pmessage" 2) "*" 3) "__sentinel__:hello" 4) "127.0.0.1,26380,ec6e1806cf9c782acec81397aa65b3870b7900f6,6,mymaster,127.0.0.1,6380,0" 1) "pmessage" 2) "*" 3) "__sentinel__:hello" 一直在相互发送信息hello