redis集群篇一:主从复制以及哨兵

5 篇文章 0 订阅
5 篇文章 0 订阅

redis集群相关了解背景

一、集群知识背景了解

cap规则:只能满足其中两个(ca,cp,ap),不可能同时三个都满足(c 一致性,a 可用性,p 分区容错性),想全面了解可以查下百度:cap 理论

二、单机redis的局限

  • 单点故障
  • 容量有限
  • 压力

为了解决以上问题,可通过akf的拆分思想 解决或缓解redis 的这几个问题
x轴: 加机器延伸,由redis的主从复制落地实施(处理单点故障问题,提高可用性)
y轴: 业务拆分 ,eg: 按用户中心,商品中心等拆分到不同的redis机器 (机器和机器间存储的不同),但是也要考虑单点故障问题,所以y轴每个机器也要向x轴延伸,要有自己的备机
z轴:如果某个业务访问量或者数据量很大,y轴还是会有单机容量不足的问题,对此可以按某些逻辑对y轴进行拆分,比如用户中心信息的存储最后会落到两台机器的某一台上,两台机器userCenterA,userCenterB存储数据不同,属于对用户中心信息存储的扩容,因此容量和连接数问题得到了解决,仍要考虑单机故障问题,所以x轴要加备用机器,y轴不一定只有用户中心要扩容,比如订单也是越来越多,可以按时间拆分,也要做z轴方向扩容。

1、redis的主从和主备都满足可用性:尽管主机会挂掉,但是对于客户端来说访问是没有差异的,仍然可用 。
2、主从主备区别:
主从:客户端可以访问主redis 做读写,也可对 从redis 做读操作,当redis主机挂了,从机变主机
主备:客户端只能访问主机redis,备用机redis待主机redis挂掉, 会从机变主机

三、redis集群:主从复制操练

主从复制集群解决了单点故障问题和访问压力问题(压力只解决读取的压力问题,从机不能写),容量问题还是没有解决。

主机故障需要人为干预维护

1、根目录下新建文件夹test ,拷贝etc/redis下的所有
文件到当前目录 cp /etc/redis/* ./ 可查看下都有什么
在这里插入图片描述
cd /test ,ll然后编辑conf文件, 调整你的配置如下

1、编辑6379.conf,6380.conf,6382.conf文件
# logfile /var/log/redis_6379.log
daemonize no   -- 关闭后台运行
appendonly no  -- 关掉aof日志,只有rdb了

2、持久化目录 cd /var/lib/redis/ ,删除持久化目录下的文件夹内容

[root@localhost redis]# ll
total 12
drwxr-xr-x 2 root root 4096 Jun 25 04:46 6379
drwxr-xr-x 2 root root 4096 Jun 24 08:04 6380
drwxr-xr-x 2 root root 4096 Jul 14 01:14 6382
[root@localhost redis]# rm -rf ./*

[root@localhost redis]# ll
total 0
[root@localhost redis]# pwd
/var/lib/redis
[root@localhost redis]# mkdir 6379   ....分别创建这3个空文件夹

3、 端口6379 ,6380 ,6382 ,一主(6379) 2从 ,依次启动 6379server ,6380server,6382server服务 :

会话6379server
[root@localhost test]# ll
total 192
-rw-r--r-- 1 root root 61874 Jul 14 02:34 6379.conf
-rw-r--r-- 1 root root 61874 Jul 14 01:48 6380.conf
-rw-r--r-- 1 root root 61874 Jul 14 01:50 6382.conf
[root@localhost test]# pwd
/root/test 
当前路径,可直接执行
[root@localhost test]# redis-server ./6379.conf

另开会话 6380server ,非/root/test 路径启动6380server: 
 redis-server ~/test/6380.conf
...
新开会话dBLook查看持久化目录下是否有内容:
[root@localhost 6380]# cd ../6382 & ll
[1] 10657
total 0
[root@localhost 6380]# pwd
/var/lib/redis/6380
[1]+  Done                    cd ../6382
[root@localhost 6380]# 


新开3个会话(client6379,client6380,client6382)分别连这3个机器 redis-cli -p 6379 ... , 在6380client 设置 6380server 跟6379server同步,在6382client也执行下面命令:

127.0.0.1:6380> replicaof locahost 6379
OK

6380server同步6379的形式启动后,6379server日志信息:
在这里插入图片描述
6380服务器日志
在这里插入图片描述
去持久化路径看备机,此时已经有db文件了
在这里插入图片描述
以上主从搭建完成,可以在6379client set k1 abc 到6380client get k1 是可以获取到数据的,说明同步成功,同时redis主从复制,不允许备机redis 做写操作 你可以试试

测试

主从搭好,可以按如下场景进行测试:

1 、如果备机(6382)挂了,主机(6379server)会提示
Connection with replica 127.0.0.1:6382 lost
然后主机  set b bbb
启动方式1:这时候启动备机6382,启动日志里没有flush db,说明采用的是追加,而不是全量同步:
redis-server ./6382.conf --replicaof 127.0.0.1 6379
6382client:  keys *
能看到增加的b
启动方式2:redis-server ./6382.conf --replicaof 127.0.0.1 6379 --appendonly yes
启动日志显示 BGSAVE同步到磁盘,DB saved on disk 

持久化文件里多了aof文件
[root@localhost 6382]# pwd
/var/lib/redis/6382
[root@localhost 6382]# ll
total 8
-rw-r--r-- 1 root root 104 Jul 14 04:05 appendonly.aof
-rw-r--r-- 1 root root 188 Jul 14 04:05 dump.rdb

按启动方式2再同步启动一次,发现启动日志里
Flushing old data
Loading DB in memory
出现上面的日志内容,因为  redis只要开启了aof,就从aof读取,即便是混合模式(上半段rdb,后面aof  可以记录增量日志),也不会碰rdb ,他俩也存在区别:rdb记录曾经同步过谁以及id号,aof不会记
conf文件相关内容的含义

1、关于配置备机,
1)可以在备机 6380.conf 里指定主机
relicaof ip port
masterauth 主机密码
2)replica-serve-stale-data yes
表示在备机同步主机数据完成之前,允许client查询备机原有的老数据,直到备机刷新数据完成之前。no为同步完才能提供查询功能。
3)replica-read-only yes 备机只支持查询

4)repl-diskless-sync no 先走磁盘,yes为走网络 ;
redis同步数据conf文件里的说明:
在这里插入图片描述
可画图表示为
在这里插入图片描述
5)repl backlog size 1mb 增量复制,设置的是队列大小
在这里插入图片描述
2、min-replicas-to-write 3 设置最小成功写入3个
min-replicas-max-lag 10

搭建过程遇到问题及小结

1、启动redis实例报错:process is already running or crashed

/var/run/redis_6381.pid exists, process is already running or crashed
Installation successful! 

原因 :杀redis实例进程的正确姿势 eg:service redis_6382 stop ,不要通过ps -ef|grep redis 查端口号直接kill -9 端口,就不会报上面的错误信息

解决:进入目录 /var/run/ 删除 redis_6381.pid
2、可能你数据库量的6379的,自己和自己同步这就没道理了,报错没跑~ ;还有一种情况,当前连的redis服务机器发现没启动,启动下就好了

Connecting to MASTER localhost:6379
10649:S 14 Jul 2020 02:52:36.027 * MASTER <-> REPLICA sync started
10649:S 14 Jul 2020 02:52:36.027 # Error condition on socket for SYNC: Connection refused
操作小结

搭建过程先配置conf文件,关掉日志以及aof和后台运行,然后依次启动主从机,启动从机要加上–replicaof ip port

1、主机能获取请求同步的所有备机

2、启动命令
/root/soft/redis-5.0.8/utils 重启实例 ./install_server.sh start 关闭 service redis_6382 stop

/root/test 配置文件路径 拷贝自 /etc/redis
启动实例 redis-server ~/test/6380.conf
或当前在test目录下 redis-server ./6380.conf

/var/lib/redis/6382 持久化文件的路径

3、之前设置了同步6379server,不想同步6379server了,在6382client上执行: replicaof no one 即可
想同步6380server,在6382client端连接redis后输入: replicaof 127.0.0.1 6380

4、也可以在util目录下启动

1 cd /root/soft/redis-5.0.8/utils/
2 启动6382实例:   ./install_server.sh start   ,输入 6382 ,执行 service redis_6382 stop 

[root@localhost utils]# ./install_server.sh start
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 6382
..........
service redis_6382 stop
....

四、redis哨兵

上面的主从复制,如果主机故障,需要人为干预维护故障。有了哨兵,就不用人为去维护主机故障问题了,哨兵起到监督作用,如果主机挂了等发生故障了,哨兵会通过选举得出谁是master主机 ,样例如下:
1 启动redis服务

启动窗口6379
cd /root/test
redis-server ./6379.conf 
窗口6380
cd /root/test
redis-server ./6379.conf  --replicaof 127.0.0.1 6379
窗口6382同窗口6380操作

2 启动哨兵

cd /root/test
vi 26379.conf 
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2

vi 26380.conf 
port 26380
sentinel monitor mymaster 127.0.0.1 6379 2

vi 26382.conf 
port 26382
sentinel monitor mymaster 127.0.0.1 6379 2

窗口依次启动,依次看日志信息26379monitor,6380monitor,26382monitor
启动命令:
  redis-server ./26379.conf --sentinel
  redis-server ./26380.conf --sentinel
  redis-server ./26382.conf --sentinel

3 杀掉6379,观察哨兵日志,哨兵会选举出一个leader.

4 在哨兵配置文件里可以看到的信息:
哨兵监控哪个主机master;然后根据主机获取备机信息,在存活的主身上开启 发布订阅 获取其他哨兵

可以通过发布订阅查看他们都交流了什么:
psubscribe * – 正则
或者 subscribe channel – channel定位一个通道,别人发的消息可以定位到。

哨兵通过监听主获取其他机器信息,然后通过发布订阅获取其他哨兵
在这里插入图片描述

想了解更多,可以参看:redis doc

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值