快捷搜索:

redis-单机-集群部署-哨兵-主从

1.主从安装

1.1安装单机redis

yum install gcc tcl
wget http://download.redis.io/releases/redis-5.0.5.tar.gz -P /data/redis
cd /data/redis
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
make PREFIX=/data/redis/redis-5.0.5 install

1.2主从配置文件设置

cd /data/redis/redis-5.0.5
mkdir -p /data/redis/6379 && cp redis.conf /data/redis/6379/6379.conf
mkdir -p /data/redis/6380 && cp redis.conf /data/redis/6380/6380.conf
mkdir -p /data/redis/6381 && cp redis.conf /data/redis/6381/6381.conf


#设置配置文件
vim /data/redis/6379/6379.conf 
#bind 127.0.0.1
# 关闭保护模式
protected-mode no
# 修改启动端口为6379
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
# Redis使用后台模式
daemonize yes
supervised no
# 修改pidfile指向路径
pidfile /data/redis/6379/6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
以此类推,修改端口6380及6381配置

1.3启动三个redis实例

/data/redis/redis-5.0.5/bin/redis-server /data/redis/6379/6379.conf
/data/redis/redis-5.0.5/bin/redis-server /data/redis/6381/6381.conf
/data/redis/redis-5.0.5/bin/redis-server /data/redis/6380/6380.conf

1.4设置主从

在Redis中设置主从有2种方式:

1.在redis.conf中设置slaveof

a) slaveof <masterip> <masterport>

2、 使用redis-cli客户端连接到redis服务,执行slaveof命令

a) slaveof <masterip> <masterport>

我们使用第二种

首先连接三个实例 
redis-cli -p 6379
连接6380 设置主服务器为6379 
redis-cli -p 6380
slaveof localhost 6379
连接6381 设置主服务器为6379
redis-cli -p 6381
slaveof localhost 6379

1.5架构

主库要负责两个从库的同步 , 压力较大

更新后

1.6查看主从 :

使用Redis客户端连接上6379端口

# redis-cli -p 6379

查看Redis主从关系 如下图所示

info replication
#关闭主从
slaveof no one

1.7配置从库非只读

默认情况下redis数据库充当slave角色时是只读的不能进行写操作

可以在配置文件中开启非只读: replica-read-only no

1.8主从原理

1.当从库和主库建立MS关系后,会向主数据库发送SYNC命令

2.主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来

3.当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis

4.从Redis接收到后,会载入快照文件并且执行收到的缓存的命令

5.之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致

当出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库。增量复制

主从复制是乐观复制,当客户端发送写执行给主,主执行完立即将结果返回客户端,并异步的把命令发送给从,从而不影响性能。也可以设置至少同步给多少个从主才可写。

无硬盘复制:如果硬盘效率低将会影响复制性能,2.8之后可以设置无硬盘复制,repl-diskless-sync yes

1.9读写分离实现

nredis-proxy redis中间件实现

1:自带连接池,性能高效


 2:提供分片策略,扩展性强,可自定义分片算法


 3:提供读写分离,一主多从,从按照权重读取


 4:提供自动监听功能,主挂了,提供选举算法,从作为主


 5:可HA分布式部署,节点随意

2.lettue

@Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
            .master("mymaster")
            // 哨兵地址
            .sentinel("172.16.1.59", 26379);


        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder().
            readFrom(ReadFrom.SLAVE_PREFERRED).build();
        return new LettuceConnectionFactory(sentinelConfig, clientConfig);
    }


    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 可以配置对象的转换规则,比如使用json格式对object进行存储。
        // Object --> 序列化 --> 二进制流 --> redis-server存储
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        return redisTemplate;

2.哨兵

2.1 哨兵简介

Redis-Sentinel是用于管理Redis集群,该系统执行以下三个任务:


1.监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常


2.提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知


3.自动故障迁移(Automatic failover):当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主
服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主
服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服

2.2哨兵配置

进入redis所在目录
# cd /data/redis/redis-5.0.5


创建26379目录,将安装目录下的sentinel.conf拷贝到这三个目录下
cp sentinel.conf /data/redis/6379/26379.conf
修改配置文件
vim /data/redis/6379/26379.conf
#端口号
port 26379
#添加守护进程模式
daemonize yes
#启动pid
pidfile /data/redis/6379/sentinel-6379.pid
#添加指明日志文件名
logfile /data/redis/6379/sentinel.log
#工作目录
dir /data/redis/6379
#关闭保护模式
protected-mode no
#哨兵配置 redis 名字 地址 端口 几个哨兵决定死亡
sentinel monitor mymaster 127.0.0.1 6379 1
#心跳检测时间
sentinel down-after-milliseconds mymaster 3000
#选举票数
sentinel parallel-syncs mymaster 1
#多个哨兵之间同步时间
sentinel failover-timeout mymaster 10000
sentinel deny-scripts-reconfig yes

2.3启动哨兵

redis-sentinel /data/redis/6379/26379.conf 
redis-server /data/redis/6379/26379.conf --sentinel
查看哨兵配置
info replication

2.4哨兵架构

3.redis cluster

3.1cluster简介

1.redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。


2.Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。


特点 
1.去中心化 
2.所有的redis节点彼此互联(PING-PONG机制)
3.客户端与redis节点直连,不需要中间代理层。客户端不需要连接集群所有节点


选举容错
1.领导选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作
2.如果集群任意master挂掉,且当前master没有slave.集群进入fail状态
3.如果集群【超过半数以上master挂掉,无论是否有slave集群进入fail状态】


分片实现
1.客户端自行实现分片
  优点 : 降低了服务器集群的复杂度,客户端实现数据分片时,服务器是独立的,服务器之前没有任何关联。多数redis客户端库实现了此功能,也叫sharding
  缺点 : 缺点是客户端需要实时知道当前集群节点的联系信息,同时,当添加一个新的节点时,客户端要支持动态sharding
  
2.服务器实现数据分片
  客户端随意与集群中的任何节点通信,服务器端负责计算某个key在哪个机器上,当客户端访问某台机器时,服务器计算对应的key应该存储在哪个机器,然后把结果返回给客户端,客户端再去对应的节点操作key
  效率低下 
  使用 Smart 集群客户端。Smart 客户端通过在内部维护 slot 到 Redis 节点的映射关系,本地就可以实现键到节点的查找,从而保证 IO 效率的最大化,而 MOVED 重定向负责协助客户端更新映射关系
  相当于添加一个本地缓存
  客户端根据本地 slot 缓存发送命令到源节点,如果存在键对应则直接执行并返回结果给客户端。
  如果节点返回 MOVED 错误,更新本地的 slot 到 Redis 节点的映射关系,然后重新发起请求
 
3.通过代理服务器实现数据分片
  借助一个代理服务器实现数据分片,客户端直接与proxy联系,proxy计算集群节点信息,并把请求发送到对应的集群节点

3.2配置cluster

修改配置文件
# vim /data/redis-cluster/6379/6379.conf


# 开启守护进程模式
daemonize yes


# 修改启动端口为6379
port 6379


# 修改pidfile指向路径
pidfile /data/redis-cluster/6379/6379.pid


# 开启允许集群 
cluster-enabled yes


# 修改集群配置文件指向路径
cluster-config-file nodes-6379.conf


# 注释一下内容开启远程访问
# bind 127.0.0.1


# 关闭保护模式
protected-mode no


以此类推,修改端口6380及

3.3启动实例

redis-server /data/redis-cluster/6379/6379.conf
redis-server /data/redis-cluster/6380/6380.conf
redis-server /data/redis-cluster/6381/6381.conf

3.4安装环境

因为redis-trib.rb是由ruby语言编写的所以需要安装ruby环境
#下载
wget https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.5.tar.gz -P /data/redis
cd /data/redis
#解压安装
tar -xvzf ruby-2.6.5.tgz
cd ruby-2.6.5
 ./configure
 make
 sudo make install
 #下载 redis-ruby
 wget https://rubygems.org/downloads/redis-4.1.3.gem -P /data/redis
 #安装
 gem install -l redis-4.2.1.gem

3.5建立集群关系

#--cluster-replicas 每个实例有几个从节点
redis-cli --cluster create   172.16.1.59:6379 172.16.1.59:6380 172.16.1.59:6381 --cluster-replicas 0
redis-cli --cluster create --cluster-replicas 1 172.16.1.59:16379 172.16.1.59:16380 172.16.1.59:16381  172.16.1.59:16382 172.16.1.59:16383 172.16.1.59:16384 


#连接redis 查看对应槽值
cluster nodes 
#增加节点
cd /data/redis-cluster && cp -r 6381 6382
#修改对应配置文件
redis-server /data/redis-cluster/6382/6382.conf

3.6添加主节点

#添加主节点
redis-cli --cluster add-node 172.16.1.59:6382 172.16.1.59:6379
#重新分配槽点
redis-cli --cluster reshard 172.16.1.59:6382

添加原理

3.6 删除节点

3.7添加从节点

启动一个新的redis 登录
redis-cli -c -p 6070
加入集群
cluster meet 127.0.0.1:6003
配置添加哪个主节点的id
cluster replicate <6010_id>

4.各自优缺点

4.1单机

采用单个 Redis 节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景

优点 : 性价比高 , 省钱
缺点 : 不具备高可用 , 数据丢失

4.2 主从架构

采用主从(replication)部署结构,相较于单副本而言最大的特点就是主从实例间数据实时同步,并且提供数据持久化和备份策略。主从实例部署在不同的物理服务器上,根据公司的基础环境配置,可以实现同时对外提供服务和读写分离策略

优点 : 
高可用 , 双机备份 能有效的解决数据误操作和数据异常丢失的问题 , 读写分离策略:从节点可以扩展主库节点的读能力,有效应对大并发量的读操作
缺点 : 
性价比不高 ,故障恢复复杂 ,原生复制的弊端在早期的版本中也会比较突出
注意点 : 
slave节点不会过期key

4.3 sentinel

Redis Sentinel 是社区版本推出的原生高可用解决方案,其部署架构主要包括两部分:Redis Sentinel 集群和 Redis 数据集群

优点:
配置简单, 灵活切换主备机 , 可以实现一套 Sentinel 监控一组 Redis 数据节点或多组数据节点
缺点:
实现读写分离比较复杂 , 资源浪费,Redis 数据节点中 slave 节点作为备份节点不提供服务

4.4redis-cluster

Redis Cluster 是社区版推出的 Redis 分布式集群解决方案,主要解决 Redis 分布式方面的需求,比如,当遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster 能起到很好的负载均衡的目的。

Redis Cluster 采用虚拟槽分区,所有的键根据哈希函数映射到 0~16383 个整数槽内,每个节点负责维护一部分槽以及槽所印映射的键值数据

最少3节点

优点 : 
去中心化 , 可动态调整数据分布 , 可线性扩展到 1000 多个节点,节点可动态添加或删除
高可用性 , 部分节点不可用时,集群仍可用。通过增加 Slave 做 standby 数据副本,能够实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成主备交换 
缺点 : 
1. Key 批量操作限制,如使用 mset、mget 目前只支持具有相同 slot 值的 Key 执行批量操作。对于映射为不同 slot 值的 Key 由于 Keys 不支持跨 slot 查询,所以执行 mset、mget、sunion 等操作支持不友好。
2. pipeline 操作限制
3. Key 事务操作支持有限,只支持多 key 在同一节点上的事务操作,当多个 Key 分布于不同的节点上时无法使用事务功能。
4. 只能使用第0库
5. Slave 在集群中充当“冷备”,不能缓解读压力
6.Key 作为数据分区的最小粒度,不能将一个很大的键值对象如 hash、list 等映射到不同的节点

lua 局限性

redis.call(set, KEYS[1] , ARGV[1]);
redis.call(set, KEYS[2] , ARGV[2]);
redis.call(set, KEYS[3] , ARGV[3]);


redis.call(set, KEYS[1] , ARGV[1]) redis.call(set, KEYS[2] , ARGV[2])

pipeline

multi
set demo1 22
set demo2 33 
exec
经验分享 程序员 微信小程序 职场和发展