redis5.x版本集群搭建
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