Redis主从复制、哨兵、Cluster安装部署

1、主从复制(Replication)

Redis支持三种集群方案

  • 主从复制模式
  • Sentinel(哨兵)模式
  • Cluster模式

1.1、部署主从复制

1.1.1、环境说明

软件版本
操作系统Centos 7.6
redisredis-5.0.8

redis版本:redis-5.0.8(下载地址:http://download.redis.io/releases/)

其他软件:yum install gcc gcc-c++ -y

主机redis主从信息
1.1.3.511.1.3.51:6379(主)
1.1.3.521.1.3.52:6379(从)

安装规范约定:

描述路径
软件安装路径/tools/redis
配置文件存放路径/data/redis/etc
log存放路径/data/redis/log
pid文件存放路径/data/redis/pid
数据存放路径/data/redis/redisdata-6379

1.1.2、安装步骤

编译安装redis: 具体参考tar包里面的README.md文档

mkdir -p /tools/redis
tar -zxvf redis-5.0.8.tar.gz -C /tools
cd /tools/redis-5.0.8
make PREFIX=/tools/redis install
ln -s /tools/redis /usr/local/redis

修改 /etc/profile : PATH=$PATH:/usr/local/redis/bin
source /etc/profile

创建所需目录:

mkdir -p /data/redis/{etc,log,pid,redisdata-6379}

编辑配置文件:

官方的配置文件说明详见:https://redis.io/topics/config ,可能要翻墙才能看到各个版本参数官方详细解释。

vi /data/redis/etc/redis-6379.conf (配置文件后面跟端口为了区分不同实例)

简单的测试环境,大部分参数默认配置:

daemonize yes
pidfile "/data/redis/pid/redis-6379.pid"
logfile "/data/redis/log/redis-6379.log"
dbfilename "redis-6379.rdb"
dir "/data/redis/redisdata-6379"
protected-mode no
requirepass 1234.C0m

从库上需要单独配置的:

replicaof 1.1.3.51 6379 
# master的ip,port,redis从配置文件
masterauth 1234.C0m 
# master的密码,redis从配置文件
replica-serve-stale-data no 
# 如果slave无法与master同步,设置成slave不可读,方便监控脚本发现问题,redis从配置文件

生产环境配置文件参考:

daemonize yes
# 默认情况下,redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为 yes
pidfile "/data/redis/pid/redis-6379.pid"
# 当运行多个 redis 服务时,需要指定不同的 pid 文件和端口。
port 6379
# 指定 redis 运行的端口,默认是 6379
timeout 0
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。
# 0 是关闭此设置。
tcp-keepalive 60
# TCP keepalive
# 在 Linux 上,指定值(秒)用于发送 ACKs 的时间。注意关闭连接需要双倍的时间。默认为 0 。
tcp-backlog 511
# 在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志缓冲区backlog。
# 该参数指定tcp监听backlog。
loglevel notice
# 日志记录级别,默认为notice
logfile "/data/redis/log/redis-6379.log"
# 日志文件存放路径,默认值为 stdout ,标准输出,若后台模式会输出到 /dev/null
databases 16
# 可用数据库数
# 默认值为 16 ,默认数据库为 0 ,数据库范围在 0- ( database-1 )之间
dbfilename "redis-6379.rdb"
#SNAPSHOTTING
# 本地持久化数据库文件名,默认值为 dump.rdb
stop-writes-on-bgsave-error yes
# 后台存储错误停止写。默认为yes。
rdbcompression yes
# 压缩存储RDB文件
rdbchecksum yes
# 配置RDB文件中是否记录校验位
dir "/data/redis/redisdata-6379"
# 工作目录
# 数据库镜像备份的文件放置的路径。
# AOF 文件也会存放在这个目录下面。
# 注意这里必须制定一个目录而不是文件。
slave-serve-stale-data yes
#REPLICATION
# 设置当本机为slave服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步。
# 如:slaveof 192.168.1.10 6379 从库请放开该参数。
# 当从库同主机失去连接或者复制正在进行时,
# 如果 slave-serve-stale-data 设置为 yes( 默认值 ) ,从库会继续响应客户端的请求。
slave-read-only yes
# 配置 slave 实例是否接受写,配置为readonly。
repl-diskless-sync no
# 是否使用diskless方式传输RDB文件。默认值为no。2.8.19新增功能。
# DISKLESS功能开启时,在新加入从库或从库断开重连,将不使用磁盘记录RDB文件,而使用网络进行传输。
repl-backlog-size 256mb
# 设置backlog缓冲区大小。
repl-backlog-ttl 7200
# 设置backlog缓冲区数据过期时间。
repl-disable-tcp-nodelay no
# 在 slave socket 的 SYNC 后禁用 TCP_NODELAY
# 如果选择"yes",Redis将使用一个较小的数字TCP数据包和更少的带宽将数据发送到slave, 但是这可能导致数据发送到slave端会有延迟, 如果是Linux kernel的默认配置,会达到 40 毫秒。
# 如果选择"no",则发送数据到slave端的延迟会降低,但将使用更多的带宽用于复制 .
repl-ping-slave-period 30
# 从库会按照一个时间间隔向主库发送 PINGs. 可以通过 repl-ping-slave-period 设置这个时间间隔,默认是 10 秒。从库开启。
repl-timeout 300
# repl-timeout 设置主库批量数据传输时间或者 ping 回复时间间隔,默认值是 60 秒
# 一定要确保 repl-timeout 大于 repl-ping-slave-period。主库开启。
slave-priority 100
# 如果 master 不能再正常工作,那么会在多个 slave 中,选择优先值最小的一个 slave 提升为 master ,优先值为 0 表示不能提升为 master 。
maxclients 50000
#LIMITS
# 最大可连接客户端数
maxmemory 10G
# 最大可使用内存数
maxmemory-policy allkeys-lru
# 内存达到最大值时键删除的LRU策略。默认值为volatile-lru-> 利用LRU算法移除设置过过期时间的key。
maxmemory-samples 5
# 设置LRU原则灰度选择样本数。默认值为3.
lua-time-limit 5000
#LUA SCRIPT
# 限制LUA脚本的执行时间
slowlog-log-slower-than 10000
#SLOW LOG
# 设置执行时间超过该值的查询被记录到slow log中。单位微秒。
slowlog-max-len 128
# 设置slow log的最大长度。默认128。
activerehashing yes
#ADVANCED CONFIG
# 是否开启自动rehash
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 当 hash 中包含超过指定元素个数并且最大的元素没有超过临界时,
# hash 将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值
# Redis Hash 对应 Value 内部实际就是一个 HashMap ,实际这里会有 2 种不同实现,
# 这个 Hash 的成员比较少时 Redis 为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的 HashMap 结构,对应的 valueredisObject 的 encoding 为 zipmap,
# 当成员数量增大时会自动转成真正的 HashMap, 此时 encoding 为 ht。
list-max-ziplist-entries 512
list-max-ziplist-value 64
# 和 Hash 一样,多个小的 list 以特定的方式编码来节省空间。
# list 数据类型节点值大小小于多少字节会采用紧凑存储格式。
set-max-intset-entries 512
# set 数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
# set 数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# 和 hashe 和 list 一样 , 排序的 set 在指定的长度内以指定编码方式存储以节省空间
# zsort 数据类型节点值大小小于多少字节会采用紧凑存储格式。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 250gb 64000mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,
# 可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
# 可以三种不同客户端的方式进行设置:
# normal -> 正常客户端
# slave -> slave 和 MONITOR 客户端
# pubsub -> 至少订阅了一个 pubsub channel 或 pattern 的客户端
# 一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
# 例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开
# 如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。
# 默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
# 只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
# 把硬限制和软限制都设置为 0 来禁用该特性
hz 10
# 设置Redis调用内部函数来执行后台任务的权限。
aof-rewrite-incremental-fsync yes
# 当一个子节点重写AOF文件时,如果启用下面的选项,则文件每生成32M 数据进行同步。
rename-command KEYS "MYKEYS"
rename-command FLUSHALL "MYFLUSHALL"
rename-command FLUSHDB "MYFLUSHDB"
rename-command SHUTDOWN "MYSHUTDOWN"
# 命令重命名
protected-mode no
# 关闭保护模式
requirepass 1234.C0m
# 设置复杂一点的密码
replicaof 1.1.3.51 6379 
# master的ip,port,redis从配置文件
masterauth 1234.C0m 
# master的密码,redis从配置文件
replica-serve-stale-data no 
# 如果slave无法与master同步,设置成slave不可读,方便监控脚本发现问题,redis从配置文件

#appendonly 'yes'
##APPEND ONLY MODE
##是否开启appendonly模式。开启之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
#appendfilename redis-6379.aof
## aof文件记录名称。默认为appendonly.aof。
#appendfsync everysec
## aof文件同步策略。默认为everysec:表示对写操作进行累积,每秒同步一次。
## AOF 策略设置为 always 或者 everysec 时,后台处理进程 ( 后台保存或者 AOF 日志重写 ) 会执行大量的 I/O 操作
#no-appendfsync-on-rewrite 'yes'
## 在某些 Linux 配置中会阻止过长的 fsync() 请求。注意现在没有任何修复,即使 fsync 在另外一个线程进行处理
## 为了减缓这个问题,可以设置下面这个参数 no-appendfsync-on-rewrite
#auto-aof-rewrite-percentage 100
## 设置自动重写aof文件的比率
#auto-aof-rewrite-min-size 1000GB
## 设置aof文件执行自动重写的最小值
#aof-load-truncated 'yes'
## 设置是否在导入aof文件后清空aof文件

1.2、配置主从

启动主从

/usr/local/redis/bin/redis-server /data/redis/etc/redis-6379.conf
ps aux|grep redis  --查看redis是否已经启动

如果你的从库配置了如下参数,请跳过后面的配置,直接检查下主从是否同步即可

requirepass 1234.C0m
# 设置复杂一点的密码
replicaof 1.1.3.51 6379 
# master的ip,port,redis从配置文件
masterauth 1234.C0m 
# master的密码,redis从配置文件
replica-serve-stale-data no 
# 如果slave无法与master同步,设置成slave不可读,方便监控脚本发现问题,redis从配置文件

如果没有配置,则需要配置下密码验证信息:
为master、slave之间配置密码验证,从节点配置

config set requirepass redis-passwd
auth redis-passwd
config set masterauth redis-passwd
auth redis-passwd
config rewrite  #配置信息持久化到配置文件

配置主从参数,从节点配置

redis-cli -h 1.1.3.52 #默认6379端口方式进入从节点
slaveof 1.1.3.51 6379 #设置从的主节点
info                  #查看主从信息

1.3、主从复制优缺点

优点:

  1. master能自动将数据同步到slave,可以进行读写分离,分担master的读压力
  2. master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求

缺点:

  1. 不具备自动容错与恢复功能,master或slave的宕机都可能导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复
  2. master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题
  3. 难以支持在线扩容,Redis的容量受限于单机配置

2、哨兵(Sentinel)

2.1、部署哨兵

2.1.1、环境说明

在完成了主从复制的前提下来配置哨兵。

主机redis主从信息Sentinel信息
1.1.3.511.1.3.51:6379(主)1.1.3.51:26379
1.1.3.521.1.3.52:6379(从)1.1.3.52:26379
1.1.3.531.1.3.53:26379

安装规范约定:

描述路径
软件安装路径/tools/redis
配置文件存放路径/data/redis/etc
log存放路径/data/redis/log
pid文件存放路径/data/redis/pid
数据存放路径/data/redis/redisdata-6379
sentinel存放路径/data/redis/sentinel-26379

2.1.2、安装配置

编译安装redis步骤同1.1.2章节。

1.1.3.51/52/53节点分别创建目录:

mkdir -p /data/redis/sentinel-26379

所有节点编辑redis sentinel配置文件:
vi /data/redis/etc/sentinel-26379.conf

daemonize yes
port 26379
protected-mode no
pidfile "/data/redis/pid/sentinel-26379.pid"
dir "/data/redis/sentinel-26379"
logfile "/data/redis/log/sentinel-26379.log"
protected-mode no

启动sentinel

/usr/local/redis/bin/redis-sentinel /data/redis/etc/sentinel-26379.conf
ps -ef|grep redis    --查看sentinel是否开启

为三个sentinel 配置密码验证:

/usr/local/redis/bin/redis-cli -p 26379
sentinel set test-sentinel auth-pass 1234.C0m

登录三个节点上的sentinel将主从添加到sentinel中:

/usr/local/redis/bin/redis-cli -p 26379
sentinel monitor test-sentinel 1.1.3.51 6379 2
sentinel set test-sentinel down-after-milliseconds 10000
sentinel set test-sentinel failover-timeout 30000

最后使用info sentinel命令检查下状态是否正常:

127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=test-sentinel,status=ok,address=1.1.3.51:6379,slaves=1,sentinels=3

2.2、测试下哨兵管用不

先查看下当前主从节点的状态:

主节点:

[root@redis1 etc]# redis-cli -h 1.1.3.51
1.1.3.51:6379> info replication
NOAUTH Authentication required.
1.1.3.51:6379> auth "1234.C0m"
OK
1.1.3.51:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=1.1.3.52,port=6379,state=online,offset=92968,lag=0
master_replid:9c5c08e2ffbfd92776c6f142b0cf2dd48fcb5a5e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:93240
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:268435456
repl_backlog_first_byte_offset:1
repl_backlog_histlen:93240

从节点:

[root@redis2 ~]# redis-cli -h 1.1.3.52
1.1.3.52:6379> auth "1234.C0m"
OK
1.1.3.52:6379> info replication
# Replication
role:slave
master_host:1.1.3.51
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:110554
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:9c5c08e2ffbfd92776c6f142b0cf2dd48fcb5a5e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:110554
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:268435456
repl_backlog_first_byte_offset:1
repl_backlog_histlen:110554
1.1.3.52:6379> 

发现状态都是OK的,接着把redis master kill 掉:

[root@redis1 etc]# ps -ef|grep redis
avahi      1241      1  0 03:03 ?        00:00:00 avahi-daemon: running [redis1.local]
root     110225      1  0 17:21 ?        00:00:32 redis-server *:6379
root     113307      1  0 21:58 ?        00:00:02 /usr/local/redis/bin/redis-sentinel *:26379 [sentinel]
root     113311 104076  0 21:58 pts/0    00:00:00 /usr/local/redis/bin/redis-cli -p 26379
root     113452 113179  0 22:07 pts/1    00:00:00 grep --color=auto redis
[root@redis1 etc]# kill -9 110225
[root@redis1 etc]# ps -ef|grep redis
avahi      1241      1  0 03:03 ?        00:00:00 avahi-daemon: running [redis1.local]
root     113307      1  0 21:58 ?        00:00:02 /usr/local/redis/bin/redis-sentinel *:26379 [sentinel]
root     113311 104076  0 21:58 pts/0    00:00:00 /usr/local/redis/bin/redis-cli -p 26379
root     113454 113179  0 22:08 pts/1    00:00:00 grep --color=auto redis

1.1.3.52节点上查看复制状态,发现该节点上的redis已经变成master:

1.1.3.52:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:14897ea32dd7abeb2dd418e2e200251d410c6002
master_replid2:9c5c08e2ffbfd92776c6f142b0cf2dd48fcb5a5e
master_repl_offset:133875
second_repl_offset:124333
repl_backlog_active:1
repl_backlog_size:268435456
repl_backlog_first_byte_offset:1
repl_backlog_histlen:133875

把1.1.3.51上面的redis启动看看复制状态:发现该节点redis已经变成了slave

[root@redis1 etc]# redis-cli -h 1.1.3.51
1.1.3.51:6379> auth "1234.C0m"
OK
1.1.3.51:6379> info replication
# Replication
role:slave
master_host:1.1.3.52
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1584886273
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1622389f3ce9ccdb708d75d7968f82d441b2097d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:268435456
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

2.3、哨兵模式的优缺点

优点:

  1. 哨兵模式基于主从复制模式,所以主从复制模式有的优点,哨兵模式也有
  2. 哨兵模式下,master挂掉可以自动进行切换,系统可用性更高

缺点:

  1. 同样也继承了主从模式难以在线扩容的缺点,Redis的容量受限于单机配置
  2. 需要额外的资源来启动sentinel进程,实现相对复杂一点,同时slave节点作为备份节点不提供服务

3、集群(Cluster)

哨兵模式解决了主从复制不能自动故障转移,达不到高可用的问题,但还是存在难以在线扩容,Redis容量受限于单机配置的问题。Cluster模式实现了Redis的分布式存储,即每台节点存储不同的内容,来解决在线扩容的问题。

看样子cluster模式还是挺有用的,值得部署…

官方参考文档:https://redis.io/topics/cluster-tutorial

3.1、部署集群

3.1.1、环境说明

前提条件:

  1. 按照第1章节完成3主3从的主从复制搭建
  2. 每个主节点和相应的从节点不要创建在同一台机器上
  3. 三台机器任意主节点down掉,相应的从节点会加入集群中
主机信息节点信息
1.1.3.511.1.3.51:36381 1.1.3.51:36382
1.1.3.521.1.3.52:36381 1.1.3.52:36382
1.1.3.531.1.3.53:36381 1.1.3.53:36382

安装规范约定:

描述路径
软件安装路径/tools/rediscluster
配置文件存放路径/data/rediscluster/etc
log存放路径/data/rediscluster/log
pid文件存放路径/data/rediscluster/pid
数据存放路径/data/rediscluster/redisdata-36379

3.1.2、安装步骤

编译安装redis: 具体参考tar包里面的README.md文档

mkdir -p /tools/rediscluster
tar -zxvf redis-5.0.8.tar.gz -C /tools
cd /tools/redis-5.0.8
make PREFIX=/tools/rediscluster install
ln -s /tools/rediscluster /usr/local/rediscluster

修改 /etc/profile : PATH=$PATH:/usr/local/rediscluster/bin
source /etc/profile

创建所需目录:三个节点分别执行

mkdir -p /data/rediscluster/{etc,log,pid,redisdata-36381,redisdata-36382,redisdata-36383}

编辑配置文件:
每个节点上两个redis实例,总共需要编辑6个配置文件。

生成 /data/rediscluster/etc/redis-36381.conf(配置文件后面跟端口为了区分不同实例)

cat >> /data/rediscluster/etc/redis-36381.conf << EOF
daemonize yes
port 36381
pidfile "/data/rediscluster/pid/redis-36381.pid"
logfile "/data/rediscluster/log/redis-36381.log"
dbfilename "redis-36381.rdb"
dir "/data/rediscluster/redisdata-36381"
protected-mode no
tcp-backlog 511
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
EOF

启动所有redis实例

/usr/local/rediscluster/bin/redis-server /data/rediscluster/etc/redis-36381.conf
ps aux|grep redis    查看redis是否启动

redis5.0以下版本需要配置ruby和redis gem

需要注意的是:redis的版本和ruby包的版本最好保持一致,yum install安装的版本不是想要的版本,需要从分别下载这俩包编译安装。

ruby下载地址:http://www.ruby-lang.org/en/downloads/

gem下载地址:https://rubygems.org/gems/redis/versions/

tar -zxvf ruby-2.7.0.tar.gz
cd ruby-2.7.0/
./configure
make && make install
gem install -l redis-4.1.3.gem

redis5.0以下版本搭建集群

redis-trib.rb create --replicas 1 1.1.3.51:36381 1.1.3.51:36382 1.1.3.52:36381 1.1.3.52:36382 1.1.3.53:36381 1.1.3.53:36382 

redis5.0+版本搭建集群

redis-cli --cluster create 1.1.3.51:36381 1.1.3.51:36382 \
1.1.3.52:36381 1.1.3.52:36382 \
1.1.3.53:36381 1.1.3.53:36382 \
--cluster-replicas 1

查看集群状态

redis-cli -p 36381
cluster nodes
127.0.0.1:36381> cluster nodes
80993783427bd394534380c08f054ea9a98a82df 1.1.3.53:36382@46382 slave 92bf58fcd7f9eccbad3b0441f74edbc2d242da34 0 1585114214000 6 connected
c86a2fd50f429186354c5abc22d28e135b12e9e5 1.1.3.52:36382@46382 slave 39dad3c0e90fa98e27514be0dc3a8950d92b9f4b 0 1585114213000 4 connected
92bf58fcd7f9eccbad3b0441f74edbc2d242da34 1.1.3.52:36381@46381 master - 0 1585114213516 3 connected 5461-10922
a6aaeca7fe569d415fd32698f704bc5c7fc742f2 1.1.3.53:36381@46381 master - 0 1585114214929 5 connected 10923-16383
20b2b472c8f4b135872536c4ff53de609454cd4c 1.1.3.51:36382@46382 slave a6aaeca7fe569d415fd32698f704bc5c7fc742f2 0 1585114213920 5 connected
39dad3c0e90fa98e27514be0dc3a8950d92b9f4b 1.1.3.51:36381@46381 myself,master - 0 1585114212000 1 connected 0-5460

为了安全,配置密码认证

config set requirepass redis-passwd
auth redis-passwd
config set masterauth redis-passwd
auth redis-passwd
config rewrite

连接到集群节点

redis-cli -p 36381 -c 
注意:一定要加上-c,不然节点之间是无法自动跳转的!

3.2、测试下集群的健壮性

在kill掉1.1.3.51:36381之前先看下它的从库,结果:从库是1.1.3.52:36382

1.1.3.51:36381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=1.1.3.52,port=36382,state=online,offset=1357,lag=0
master_replid:2a286f0e5806c77267224e20432f5a7fefa60b57
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1357
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1357

kill -9 杀掉1.1.3.51:36381,观察从库是否变成主库,结果:1.1.3.52:36382变成主库

[root@redis2 ~]# redis-cli -h 1.1.3.52 -p 36382
1.1.3.52:36382> info replication
# Replication
role:master
connected_slaves:0
master_replid:7e6d31f601f1654d7c9ed6192c0d763dbceceddf
master_replid2:2a286f0e5806c77267224e20432f5a7fefa60b57
master_repl_offset:1945
second_repl_offset:1946
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1945

重新启动1.1.3.51:36381后,该实例切换为1.1.3.52:36382的从库。

小结:redis cluster 具有高可用

3.3、集群模式的优缺点

优点:

  1. 无中心架构,数据按照slot分布在多个节点。
  2. 集群中的每个节点都是平等的关系,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
  3. 可线性扩展到1000多个节点,节点可动态添加或删除
  4. 能够实现自动故障转移,节点之间通过gossip协议交换状态信息,用投票机制完成slave到master的角色转换

缺点:

  1. 客户端实现复杂,驱动要求实现Smart Client,缓存slots mapping信息并及时更新,提高了开发难度。目前仅JedisCluster相对成熟,异常处理还不完善,比如常见的“max redirect exception”
  2. 节点会因为某些原因发生阻塞(阻塞时间大于 cluster-node-timeout)被判断下线,这种failover是没有必要的
  3. 数据通过异步复制,不保证数据的强一致性
  4. slave充当“冷备”,不能缓解读压力
  5. 批量操作限制,目前只支持具有相同slot值的key执行批量操作,对mset、mget、sunion等操作支持不友好
  6. key事务操作支持有线,只支持多key在同一节点的事务操作,多key分布不同节点时无法使用事务功能
  7. 不支持多数据库空间,单机redis可以支持16个db,集群模式下只能使用一个,即db 0

另外,Redis Cluster模式不建议使用pipeline和multi-keys操作,减少max redirect产生的场景。

最后总结下:Redis集群方案的三种模式,其中主从复制模式能实现读写分离,但是不能自动故障转移;哨兵模式基于主从复制模式,能实现自动故障转移,达到高可用,但与主从复制模式一样,不能在线扩容,容量受限于单机的配置;Cluster模式通过无中心化架构,实现分布式存储,可进行线性扩展,也能高可用,但对于像批量操作、事务操作等的支持性不够好。三种模式各有优缺点,可根据实际场景进行选择。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值