Redis集群`(*>﹏<*)′

搭建Redis主从复制

三台服务器安装Redis
[root@redis01 ~]# yum -y install gcc gcc-c++ make
[root@redis01 ~]# tar zxvf redis-5.0.7.tar.gz -C /opt/

在这里插入图片描述

[root@master redis-5.0.7]# make
[root@master redis-5.0.7]# make PREFIX=/usr/local/redis install

在这里插入图片描述

[root@master utils]# ln -s /usr/local/redis/bin/* /usr/local/bin/
修改Redis配置文件
1、主服务器上设置
[root@master utils]# vim /etc/redis/6379.conf
bind 0.0.0.0    #80行,监听所有
daemonize yes   #137行,开启守护进程
logfile /var/log/redis_6379.log #172指定日志文件目录
dir /var/lib/redis/6379   #264指定工作目录
appendonly yes   #700开启aof持久化功能

[root@localhost ~]# /etc/init.d/redis_6379 restart
 ##重启生效
Stopping ...
Redis stopped
Starting Redis server...
2、两台slave的设置
[root@master redis]# vim /etc/redis/6379.conf
bind 0.0.0.0    #80行,监听所有
daemonize yes   #137行,开启守护进程
logfile /var/log/redis_6379.log #172指定日志文件目录
dir /var/lib/redis/6379   #264指定工作目录
replicaof 192.168.235.179 6379 #288行指定主服务器的ip和端口
appendonly yes   #700开启aof持久化功能

[root@localhost ~]# /etc/init.d/redis_6379 restart
  ##重启生效
Stopping ...
Redis stopped
Starting Redis server...
3、验证主从效果
[root@master utils]# tail -f /var/log/redis_6379.log 
72010:M 08 Aug 2021 19:18:28.817 * Synchronization with replica 192.168.235.144:6379 succeeded
72010:M 08 Aug 2021 19:21:09.564 # Connection with replica 192.168.235.144:6379 lost.
72010:M 08 Aug 2021 19:21:10.577 * Replica 192.168.235.144:6379 asks for synchronization
72010:M 08 Aug 2021 19:21:10.578 * Full resync requested by replica 192.168.235.144:6379
72010:M 08 Aug 2021 19:21:10.578 * Starting BGSAVE for SYNC with target: disk
72010:M 08 Aug 2021 19:21:10.578 * Background saving started by pid 72129
72129:C 08 Aug 2021 19:21:10.580 * DB saved on disk
72129:C 08 Aug 2021 19:21:10.580 * RDB: 4 MB of memory used by copy-on-write
72010:M 08 Aug 2021 19:21:10.670 * Background saving terminated with success
72010:M 08 Aug 2021 19:21:10.670 * Synchronization with replica 192.168.235.144:6379 succeeded

在这里插入图片描述

[root@master utils]# redis-cli info replication
# Replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.235.156,port=6379,state=online,offset=1162,lag=1
slave1:ip=192.168.235.144,port=6379,state=online,offset=1162,lag=0
master_replid:6dac2f78527e8a04a7cef1d6dc3e2882f60f0d9f
#master启动时生成的40位16进制标识码,用于标识master节点
master_replid2:0000000000000000000000000000000000000000
#复制流中的位置偏移量
master_repl_offset:1162
#都表示自己上次主实例repid1和复制偏移量;用于兄弟实例或级联复制,主库故障切换sync
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1162
[root@master utils]# redis-cli  #主服务器上
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set mykey lisi
OK
127.0.0.1:6379> get mykey
"lisi"
在服务器上建立数据,跑到slave上也能看到
[root@slave1 utils]# redis-cli   #从服务器上
127.0.0.1:6379> keys *
1) "mykey"
127.0.0.1:6379> get mykey
"lisi"
(4)报错排查

WARNING: The TcP backlog setting of 5ll cannot be enforced because /proc/sys/net/core/somaxconn is setto the lower value of 128
当前每一个端口最大的监听队列的长度不满足这个高负载环境,需要调整265
解决办法
echo 2048 > /proc/sys/net/core/ somaxconn
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition270内存超额警告,当前内存设置为0会导致后台保存失败
解决办法:
echo “vm.overcommit nemory=1” > letc/sysctl.conf
刷新配置文件保其生效
sysctl vm.overcomnit_memory=l
WARNING you have "ransparent Huge Pages (THP) support enabled in your kernel. This will create latencyand memory usage issues with Redis
内核中启用了透明大页面(THP)支持会将导致Redis的延迟和内存使用问题
解决:
echo never > /sys/kernel/mm /transparent_hugepage/enabled
Error condition on socket for sYNC: Connection reset by peer284
连接被拒绝,因为主服务器可能绑定了自身IP地址
解决办法:
主节点配置文件:bind 0.0.0.0

哨兵模式

在主从复制的基础上起到主节点自动故障转移的作用

1、作用及原理

(1)、哨兵模式的作用
监控
哨兵会不断地检查主节点和从节点是否运作正常
自动故障转移
当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点
通知哨兵可以将故障转移的结果发送给客户端
(2)、哨乓模式的原理
它一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 Master 并将所有slave连接到新的Master
个运行哨兵的集群的数量不得少于3个节点
(3)、哨兵节点
哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 redis 节点,不存储数据
数据节点
主节点和从节点都是数据节点
(4)、工作过程
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所以节点上都需要部署哨兵模式,哨兵模式会监控所有的Redis工作节点是否正常
当 Master 出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个Master的确出现问题,然后会通知哨兵间会推选出一个哨兵来进行故障转移工作(由该哨兵来指定哪个’slave 来做新的master) ,然后从Slaves中选取一个作为新的 Master
筛选方式是哨兵互相发送消息,并且参与投票,票多者当选需要特别注意的是,客观下线是主节点才有的概念,即如果从节点和哨兵节点发生故障,被哨兵主观下线后,将不会再有后续的客观下线和故障转移操作(及哨兵模式只负责Master的方面,而不管slaves)
当某个哨兵发现主服务器挂掉了,会将 master中的 sentinelRedistance 中的 master
改为SRI_s_DOWN(主观下线),并通知其他哨兵,告诉他们发现master挂掉了其他哨兵在接收到该哨兵发送的信息后,也会尝试去连接master,如果超过半数(配置文件中设置的)确认master挂掉后,会将master 中的SentinelRedistance 中的 master改为 SRI 0 DOwN (客观下线)

修改所有节点哨兵配置文件
[root@slave2 redis-5.0.7]# vim sentinel.conf 
#17行,关闭保护模式
 protected-mode no
#21行,Redis哨兵默认的监听端口 
port 26379
#26行开启守护进程
daemonize yes
#36行,指定日志存放路径
logfile " / var / log/ sentinel. log"
 #65行,指定数据库存放路径
dir " /var/ lib/redis/6379"
#84行,指定哨兵节点
sentinel monitor mymaster 192.168.235.179 6379 2
#113行,判定服务器down掉的时间周期,默认30000毫秒
sentinel down-after-milliseconds mymaster 3000
#146行,故障节点的最大超时时间为180000 (180秒)
sentinel failover-timeout mymaster 180000

在这里插入图片描述

查看哨兵信息
[root@slave1 redis-5.0.7]# redis-cli -p 26379 info sentinel

在这里插入图片描述

模拟故障

在这里插入图片描述

root@master redis-5.0.7]#redis-cli -p 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=mymaster,status=gdown , address=192.168.235.179:6379,slaves=2,sentinels=3

cluster集群

主节点负责读写请求和集群信息的维护,从节点只进行主节点数据和状态信息的复制

1作用

(1)数据分区
数据分区(或称数据分片)是集群最核心的功能
集群将数据分散到多个节点,一方面突破了Redis
单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及
操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出

( 2)高可用

集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务

(3)数据分片

Redis集群引入了哈希槽的概念,有16384 个哈希槽(编号0~16383)
集群的每个节点负责一部分哈希槽,每个 Key 通过CRC16校验后对16384
取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作
以3个节点组成的集群为例:
节点A包含0~5469号的哈希槽
节点B包含5461~10922号的哈希槽
节点c包含10923~16383号的哈希槽

(4)搭建cluster集群
创建redis 6个端口的工作目录
[root@master redis-5.0.7]# cd /etc/redis/
[root@master redis]# mkdir -p redis-cluster/redis600{1..6}
[root@master redis]# ls

在这里插入图片描述

[root@master redis-cluster]# vim /opt/redis.sh
#!/bin/bash
for i in {1..6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
[root@master redis-cluster]# chmod +x /opt/redis.sh
[root@master redis-cluster]# sh -x /opt/redis.sh

在这里插入图片描述

修改配置文件
[root@master redis6001]# vim redis.conf
bind 127.0.0.1
#69行,注释掉bind项或不修改,默认监听所有网卡
protected-mode no
#88行,修改,关闭保护模式
port 6001
#92行,修改,redis监听端口,
daemonize yes
#136行,开启守护进程,以独立进程启动
cluster-enabled yes
#832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf
#840行,取消注释,群集名称文件设置
cluster-node-timeout 15000
#846行,取消注释群集超时时间设置
appendonly yes
#700行,修改,开启AOF持久化
其他5个配置文件除端口号外改动相同

在这里插入图片描述

[root@master redis6006]# vim /opt/redis_start.sh
#!/bin/bash
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
[root@master redis6006]# chmod +x /opt/redis_start.sh 
[root@master redis6006]# sh -x /opt/redis_start.sh 

在这里插入图片描述

[root@master redis6006]# ps -ef | grep redis

在这里插入图片描述

加入集群
root@master redis6006]# redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1

在这里插入图片描述

测试
[root@master redis6006]# redis-cli -p 6001 -c #加-c参数,节点之,间就可以互相跳转
127.0.0.1:6001> cluster slots    #查看节点的哈希槽编号范围
1) 1) (integer) 5461
   2) (integer) 10922        #哈希槽编号范围
   3) 1) "127.0.0.1"
      2) (integer) 6003        #主节点IP和端口号
      3) " fdca661922216dd69a63a7c9d3c4540cd6baef44"
   4) 1) "127.0.0.1"
      2) (integer) 6004        #从节点IP和端口号
     3) " a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6001
      3) "0e5873747a2e26bdc935bc76c2bafb19d0a54b11"
      4) 1) "127.0.0.1"
         2) (integer) 6006
         3) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6002
      3) "81 6ddaa3d1469540b2ffbcaaf9aa867646846b30"
   4) 1) "127.0.0.1"
      2) (integer) 6005
      3) " f847077bfe6722466e96178ae8cbb09dc8b4d5eb"
127.0.0.1:6001> set name zhangsan
-> Redi rected to slot [5798] located at 127.0.0.1:6003 
OK
127.0.0.1:6001> cluster keyslot name    #查看name键的槽编号
(integer) 5798
127.0.0.1:6001> cluster slots
1) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 6003
      3) "39614d0430e2ebd224578d51471fb5a673199c1c"
   4) 1) "127.0.0.1"
      2) (integer) 6004
      3) "50dd66911241cbe1e6d0855aee66be39e975cafe"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 6001
      3) "62e2a6e01d2a6aee1840a01a1529c4260df030ff"
   4) 1) "127.0.0.1"
      2) (integer) 6005
      3) "2efb7a45d2e6a686127b085082c7ce863f1d04b7"
3) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 6002
      3) "c98df4e0e04b9e5181168d3df15d86f87dac4436"
   4) 1) "127.0.0.1"
      2) (integer) 6006
      3) "1bcb8f2dbf709ba39be7a40bbb0437d987f3e495"

主从模式

过持久化功能,redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,因为持久化会把内存中的数据保存到硬盘上,重启会从硬盘上加载数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务,为此,redis提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。
在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据(slave)。主数据可以进行读写操作,当写操做导致数据变化时自动将数据同步给数据库,而从数据库一般是只读的,并接收主数据同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库

优缺点

优点:高可用,哨兵模式是基于主从模式的,所有主从模式的优点,哨兵模式都具有有;主从可以自动切换,系统更健壮,可用性更高
确定:redis比较难支持在线扩容,在群集容量达到上限时在线扩容会变得很复杂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值