Redis高可用及集群
Redis主从复制
- 使用异步复制
- 一个服务器可以有多个从服务器
- 从服务器也可以有自己的从服务器
- 复制功能不会阻塞主服务器
- 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化操作即可。
以下是关于Redis复制功能的几个重要方面:
- Redis使用异步复制。从Redis 2.8开始,从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度。
- 一个主服务器可以有多个从服务器。
- 不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器,多个从服务器之间可以构成一个图状结构。
- 复制功能不会阻塞主服务器: 即使有一个或多个从服务器正在进行初次同步, 主服务器也可以继续处理命令请求。
- 复制功能也不会阻塞从服务器: 只要在 redis.conf 文件中进行了相应的设置, 即使从服务器正在进行初次同步, 服务器也可以使用旧版本的数据集来处理命令查询。
- 不过, 在从服务器删除旧版本数据集并载入新版本数据集的那段时间内, 连接请求会被阻塞。
- 你还可以配置从服务器, 让它在与主服务器之间的连接断开时, 向客户端发送一个错误。
- 复制功能可以单纯地用于数据冗余(data redundancy), 也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability): 比如说, 繁重的 SORT 命令可以交给附属节点去运行。
- 可以通过复制功能来让主服务器免于执行持久化操作: 只要关闭主服务器的持久化功能, 然后由从服务器去执行持久化操作即可。
环境准备
首先需要准备环境,我这里准备四个redis实例:
主节点:6379
从节点:6380 - 6382
port:6379-6382 4个实例:
[root@192.168.32.130 /etc/redis]$ netstat -tunlp|grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 123988/redis-server
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 107646/redis-server
tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 108096/redis-server
tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 108110/redis-server
启动多个实例的方法:
启动脚本: 复制到你的脚本中即可
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
REDISPORT=$1
EXEC=/data/app/redis/src/redis-server
CLIEXEC=/data/app/redis/src/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"
PWD="root"
case "$2" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
#PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -a ${PWD} -p $REDISPORT shutdown
echo "Redis stopped"
;;
*)
echo "Please use start or stop as first argument"
;;
esac
[root@192.168.32.130 /etc/redis]$ cp 6379.conf 6380.conf
[root@192.168.32.130 /etc/redis]$ cp 6379.conf 6381.conf
[root@192.168.32.130 /etc/redis]$ cp 6379.conf 6382.conf
# 批量修改端口号
[root@192.168.32.130 /etc/redis]$ sed -i 's/6379/6380/g' 6380.conf
[root@192.168.32.130 /etc/redis]$ sed -i 's/6379/6381/g' 6381.conf
[root@192.168.32.130 /etc/redis]$ sed -i 's/6379/6382/g' 6382.conf
启动多个redis实例:
[root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6380 start
Starting Redis server...
[root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6381 start
Starting Redis server...
[root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6382 start
Starting Redis server...
主从复制命令
命令行临时生效
[root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6380
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
[root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379
OK
[root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6382
127.0.0.1:6382> SLAVEOF 127.0.0.1 6379
OK
修改配置文件重启永久生效
# 向各个实例的配置文件中追加配置:
[root@192.168.32.130 /etc/redis]$ echo 'slaveof 127.0.0.1 6379' >> 6380.conf
[root@192.168.32.130 /etc/redis]$ echo 'slaveof 127.0.0.1 6379' >> 6381.conf
[root@192.168.32.130 /etc/redis]$ echo 'slaveof 127.0.0.1 6379' >> 6382.conf
# 因为主节点有密码,所有需要使用密码验证:
[root@192.168.32.130 /etc/redis]$ echo 'masterauth root' >> 6380.conf
[root@192.168.32.130 /etc/redis]$ echo 'masterauth root' >> 6381.conf
[root@192.168.32.130 /etc/redis]$ echo 'masterauth root' >> 6382.conf
# redis全部实例重启
[root@192.168.32.130 /etc/redis]$ killall redis-server
[root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6379 start
Starting Redis server...
[root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6380 start
Starting Redis server...
[root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6381 start
Starting Redis server...
[root@192.168.32.130 /etc/redis]$ /etc/init.d/redis 6382 start
Starting Redis server...
[root@192.168.32.130 /etc/redis]$ netstat -tunlp|grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 109549/redis-server
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 109563/redis-server
tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 109577/redis-server
tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 109591/redis-server
[root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6379 info Replication
# Replication
role:master
connected_slaves:3 # 表示有三个从节点
slave0:ip=127.0.0.1,port=6380,state=online,offset=155,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=155,lag=1
slave2:ip=127.0.0.1,port=6382,state=online,offset=155,lag=0
[root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6380 info Replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up # 表示已经连接到主节点
[root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6381 info Replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up # 表示已经连接到主节点
[root@192.168.32.130 /etc/redis]$ redis-cli -a root -p 6382 info Replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up # 表示已经连接到主节点
主从复制状态监控命令:
info replication
-a :指定密码连接
-p :指定端口连接
主从切换:
slaveof no one
Redis Sentinel
Redis-Sentinel是Redis官方推荐的高可用性(HA)接近方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,他能监控多个master-slave集群,发现master宕机后能进行自动切换。
Sentinel是一个监视器,它可以根据被监视实例的身份和状态来判断应该执行何种动作。
功能
监控(Monitoring)
Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification)
当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover)
当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效服务器的其他从服务器改为负值新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel配置
[root@192.168.32.130 /usr/local/redis]$ cp /usr/local/redis/sentinel.conf /etc/redis/
# 去掉空行和注释后的配置文件:
[root@192.168.32.130 /etc/redis]$ cat sentinel.conf | grep -v "#" | grep -v "^$" > sentinel_26379.conf
# 编辑添加以下内容:
port 26379
bind 127.0.0.1
dir './'
pidfile /var/run/redis-sentinel.pid
daemonize yes
logfile "sentinel_26379.log"
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster root
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
# 拷贝其他端口的
[root@192.168.32.130 /etc/redis]$ cp sentinel_26379.conf sentinel_26380.conf
[root@192.168.32.130 /etc/redis]$ cp sentinel_26379.conf sentinel_26381.conf
[root@192.168.32.130 /etc/redis]$ cp sentinel_26379.conf sentinel_26382.conf
[root@192.168.32.130 /etc/redis]$
[root@192.168.32.130 /etc/redis]$ sed -i 's/26379/26380/g' sentinel_26380.conf
[root@192.168.32.130 /etc/redis]$ sed -i 's/26379/26381/g' sentinel_26381.conf
[root@192.168.32.130 /etc/redis]$ sed -i 's/26379/26382/g' sentinel_26382.conf
[root@192.168.32.130 /usr/local/redis/src]$ cp /usr/local/redis/src/redis-sentinel /usr/bin/
[root@192.168.32.130 /usr/local/redis/src]$ redis-sentinel /etc/redis/sentinel_26380.conf
[root@192.168.32.130 /usr/local/redis/src]$ redis-sentinel /etc/redis/sentinel_26381.conf
[root@192.168.32.130 /usr/local/redis/src]$ redis-sentinel /etc/redis/sentinel_26382.conf
[root@192.168.32.130 /usr/local/redis/src]$ netstat -tunlp|grep redis
tcp 0 0 127.0.0.1:26379 0.0.0.0:* LISTEN 111670/redis-sentin
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 109993/redis-server
tcp 0 0 127.0.0.1:26380 0.0.0.0:* LISTEN 111701/redis-sentin
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 110007/redis-server
tcp 0 0 127.0.0.1:26381 0.0.0.0:* LISTEN 111714/redis-sentin
tcp 0 0 127.0.0.1:6381 0.0.0.0:* LISTEN 110022/redis-server
tcp 0 0 127.0.0.1:26382 0.0.0.0:* LISTEN 111727/redis-sentin
tcp 0 0 127.0.0.1:6382 0.0.0.0:* LISTEN 110037/redis-server
# 都配置好之后,再来看配置文件,发现配置文件被重写了。:
# 出现以下像md5值一样的字符串就说明已经配置好了。
[root@192.168.32.130 /etc/redis]$ cat sentinel_26379.conf
port 26379
bind 127.0.0.1
dir "/usr/local/redis/src"
pidfile "/var/run/redis-sentinel.pid"
daemonize yes
logfile "sentinel_26379.log"
sentinel myid 3067717f666b6cb157172e270f85441ecaa0c692
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster root
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 127.0.0.1 6381
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6382
sentinel known-sentinel mymaster 127.0.0.1 26381 97cad0c94d3ee7927e11eb9d6edd90d3cfb16f01
sentinel known-sentinel mymaster 127.0.0.1 26382 62c515d8e0f7098fc1b66a81282c28ba83be24fd
sentinel known-sentinel mymaster 127.0.0.1 26380 b5514c5530497046ce6f9407a1386e0573b2b82f
sentinel current-epoch 0
像 port、daemonize、logfile、dir、bind 这些我就不介绍了,之前也介绍过了,这边重点介绍一下sentinel的配置
sentinel monitor <master-name> <ip> <redis-port> <quorum>
告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效
sentinel auth-pass <master-name> <password>
设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。
sentinel down-after-milliseconds <master-name> <milliseconds>
这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒
sentinel parallel-syncs <master-name> <numslaves>
这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel failover-timeout <master-name> <milliseconds>
failover-timeout 可以用在以下这些方面:
1. 同一个sentinel对同一个master两次failover之间的间隔时间。
2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
3.当想要取消一个正在进行的failover所需要的时间。
4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
Redis集群
Redis集群略,
请移步:
redis cluster 集群畅谈(三) 之 水平扩容、slave自动化迁移
Redis高可用及集群的更多相关文章
- Redis高可用之集群配置(六)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
- Redis高可用复制集群实现
redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis 与其他 key - value 缓存产品有以下三个特点: 支持数据的持久化,可以将 ...
- redis高可用分布式集群
一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...
- Redis 高可用分布式集群
一,高可用 高可用(High Availability),是当一台服务器停止服务后,对于业务及用户毫无影响. 停止服务的原因可能由于网卡.路由器.机房.CPU负载过高.内存溢出.自然灾害等不可预期的原 ...
- Redis之高可用、集群、云平台搭建
原文:Redis之高可用.集群.云平台搭建 文章大纲 一.基础知识学习二.Redis常见的几种架构及优缺点总结三.Redis之Redis Sentinel(哨兵)实战四.Redis之Redis Clu ...
- 一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_185 2021年,君不言容器技术则已,欲言容器则必称Docker,毫无疑问,它是当今最流行的容器技术之一,但是当我们面对海量的镜像 ...
- 构建高可用ZooKeeper集群
ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...
- 搭建高可用mongodb集群(四)—— 分片(经典)
转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还 ...
- 构建高可用ZooKeeper集群(转载)
ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分布式基础服务.由于 Zo ...
随机推荐
- 解决k8s gcr.io被墙下载不了镜像的问题
gcr.io镜像 根据开源项目: https://github.com/anjia0532/gcr.io_mirror 作者将gcr.io相关镜像pull下来,然后push到docker官方仓库htt ...
- python和go对比字符串的链式处理
一.什么是链式处理 对数据的操作进行多步骤的处理称为链式处理,链式处理器是一种常见的编程设计,链式处理的开发思想将数据和操作拆分,解耦,让开发者可以根据自己的技术优势和需求,进行系统开发,同时将自己的 ...
- VS2010-MFC(菜单:菜单及CMenu类的使用)
转自:http://www.jizhuomi.com/software/212.html 上一节讲的是VS2010的菜单资源,本节主要讲菜单及CMenu类的使用. CMenu类的主要成员函数 MFC为 ...
- 初识OpenCV-Python - 007: 平滑图像
本节内容主要将如何平滑图像.如通过低通道滤波模糊图像.或者自定义滤波处理图像. import cv2import numpy as npfrom matplotlib import pyplot as ...
- 谈谈HINT /*+parallel(t,4)*/在SQL调优中的重要作用
/*+parallel(t,4)*/在大表查询等操作中能够起到良好的效果,基于并行查询要启动并行进程.分配任务与系统资源.合并结果集,这些都是比较消耗资源,但我们为能够减少执行事务的时间使用paral ...
- spring:bean的作用范围和生命周期
bean的作用范围调整: <!--bean的作用范围调整 bean标签的scope属性: 作用:用于指定bean的作用范围 取值:常用的就是单例的和多例的 singleton:单例的(默认值) ...
- [NOIP2019模拟赛]数数(gcd)
题目大意: 求l~r中有多少数与x互质,带单点修改 分析: 两个30的部分分很好打: ·n<=1000暴力O(nq)就好了 ·$a_i<=100$用树状数组维护每个x的前缀和就好了 100 ...
- MVVM test
示例代码 public class RegisterUserViewModel { public UserInfo userInfo { get; set; } public ICommand Cli ...
- differential related impedance and termination
Impedance (1) Z0 Z0 is the impedance of one T-line while other lines are held at 0. Single end. (2) ...
- 代码内存泄露检测工具(linux gcc + valrind)
参考博客: https://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111248.html linux命令如下:valgrind --tool ...