Redis主从哨兵集群

Posted zqq_hello_world

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis主从哨兵集群相关的知识,希望对你有一定的参考价值。

文章目录

Redis主从复制

概念

主从复制,是指将一台Redis服务器的数据,复制到其他Redis服务器。前者称为主节点(master/leader),后者称为从结点(slave/follower);数据的复制是单向的,只能由主节点到从结点。Master以写为主,Slave以读为主,实现读写分离。

默认情况下,每台Redis服务都是主节点,且一个主节点可以有多个从结点,但一个从结点只能由一个主节点。

主从复制

  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速故障恢复,实际上是一种服务的冗余
  3. 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务器,由从节点提供读服务(写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器压力,实现负载均衡。再读多写少的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量
  4. 高可用基石:主从复制是哨兵和集群能够实施的基础

主从复制配置

Redis主从复制配置,只需要配置从库,不需要配置主库,默认下Redis就是主节点。主机可以写,从机不能写只能读,主机中所有信息和数据都会自动被从机保存。

#查看当前库的信息
127.0.0.1:6379> info replication
# Replication
#角色,默认master
role:master
#从节点数
connected_slaves:0
master_failover_state:no-failover
master_replid:1fcc7eba9e136a3561dea02d7bbd4aecdba44fa0
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

配置方式

  • 通过命令直接指定主机,重启失效

    #slaveof [ip] [port]
    slaveof 192.168.0.101 6379
    
    info replication
    # Replication
    #角色,从机
    role:slave
    #主机信息
    master_host:192.168.0.101
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:8
    master_sync_in_progress:0
    slave_repl_offset:29
    slave_priority:100
    slave_read_only:1
    replica_announced:1
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:c803d92da77b93d98b59bc319905130d81270bbf
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:29
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:28
    

    查看主机

    127.0.0.1:6379> info replication
    # Replication
    role:master
    #从机信息
    connected_slaves:1
    slave0:ip=192.168.0.101,port=6379,state=online,offset=337,lag=0
    master_repl_offset:337
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:2
    repl_backlog_histlen:336
    
  • 通过配置文件设置主机,永久有效

    #主从复制——主机的ip和端口
    replicaof <masterip> <masterport>
    #如果主机有密码需要设置密码
    #masterauth <master-password>
    

复制原理

Slave启动成功连接到master后会发送一个sync同步命令。Master接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕后,master将传送整个数据文件到slave,并完成一次同步。

全量复制:slave服务在收到数据库文件数据后,将其存盘并加装到内存中。

增量复制:Master继续将新的所有收集到的修改命令依次传给salve,完成同步

只要Slave重新连接Master,完全同步(全量复制)将被自动执行。

手动设置主节点

#指定自己为主节点(链式主从复制)
slaveof no one

哨兵模式

主从切换的方法时当主机服务宕机后,需要手动把一台从服务器切换为主服务器,这需要人工干预,费时费力还会造成一段实际内服务不可用。这不是一种可行的方式,Redis从2.8开始正式提供哨兵(Sentienl)架构来解决这个问题。

哨兵能够监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

哨兵模式一种特殊的模式。首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。原理是哨兵通过发送命令,等待Redis服务器响应,从而健康运行的多个Redis实例

哨兵的作用

  • 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器
  • 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布定于模式通知其他的从服务器,修改配置文件,让它们切换主机

哨兵测试

  1. 配置哨兵配置文件

    #sentinel monitor [被监控的名称] 127.0.0.1 6379 1
    sentinel monitor myredis 127.0.0.1 6379 1
    
  2. 启动哨兵

    #指定配置文件启动哨兵
    nohup ./redis-sentinel sentinel.conf &
    

分片集群

配置文件配置,对应修改三份8001,8002,8003

#设置端口
port 8001
#启动集群模式
cluster-enabled yes
#集群配置文件,redis自己维护
cluster-config-file nodes-8001.conf
#集群节点超时时间
cluster-node-timeout 15000
#AOF方式持久化打开
appendonly yes
#redis访问密码
requirepass 123456
#设置集群节点master密码,master启用密码,集群间通信需要验证密码
masterauth 123456
#指定数据持久化位置(一台机器上运行多个实例)
dir /usr/local/redis/bin/data/8001

将8001复制出来8002,8003,vim命令模式下统一修改

#vim命令模式下,同一把8001改成8002
:%s/8001/8002/g

指定配置文件启动redis实例,这里一台机器启动6个

./redis-server cluster/redis-8001.conf 
./redis-server cluster/redis-8002.conf 
./redis-server cluster/redis-8003.conf 
./redis-server cluster/redis-8004.conf 
./redis-server cluster/redis-8005.conf 
./redis-server cluster/redis-8006.conf 

查看启动情况

[root@localhost bin]# ps -ef|grep redis
root      56723      1  0 09:46 ?        00:00:01 ./redis-server 0.0.0.0:8001 [cluster]
root      79544      1  0 10:06 ?        00:00:00 ./redis-server 0.0.0.0:8002 [cluster]
root      79609      1  0 10:06 ?        00:00:00 ./redis-server 0.0.0.0:8003 [cluster]
root      79660      1  0 10:06 ?        00:00:00 ./redis-server 0.0.0.0:8004 [cluster]
root      79725      1  0 10:06 ?        00:00:00 ./redis-server 0.0.0.0:8005 [cluster]
root      79789      1  0 10:06 ?        00:00:00 ./redis-server 0.0.0.0:8006 [cluster]
root      83687  46345  0 10:10 pts/0    00:00:00 grep --color=auto redis

查看集群相关命令

./redis-cli --cluster help

使用redis-cli提供的命令创建集群

#-a 指定密码。create创建集群。--cluster-replicas指定模式,1 一主一从。
./redis-cli -a 123456 --cluster create 192.168.136.136:8001 192.168.136.136:8002 192.168.136.136:8003 192.168.136.136:8004 192.168.136.136:8005 192.168.136.136:8006 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460			#每一个master负责的卡槽
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.136.136:8005 to 192.168.136.136:8001
Adding replica 192.168.136.136:8006 to 192.168.136.136:8002
Adding replica 192.168.136.136:8004 to 192.168.136.136:8003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a89bf82d44dc8f3f701595534000806f7442abb4 192.168.136.136:8001
   slots:[0-5460] (5461 slots) master
M: 5acad78954b19ee204f2ccdf1c6a150f2b7ba0d1 192.168.136.136:8002
   slots:[5461-10922] (5462 slots) master
M: e2a26fd29c7f645e1b8bfab7f235a4e08d701d1b 192.168.136.136:8003
   slots:[10923-16383] (5461 slots) master
S: 653840a85f4e3a3cca26bd1ab7e5745d76440b62 192.168.136.136:8004
   replicates a89bf82d44dc8f3f701595534000806f7442abb4
S: eb85341713dda2d13cb4ddfeaf800c58e7001e5b 192.168.136.136:8005
   replicates 5acad78954b19ee204f2ccdf1c6a150f2b7ba0d1
S: f95d2916a00a0aea801a270ce3d6d5d94e8821cb 192.168.136.136:8006
   replicates e2a26fd29c7f645e1b8bfab7f235a4e08d701d1b
Can I set the above configuration? (type 'yes' to accept): yes

连接集群环境

#-a 密码。-c智能客户端,不加的话key对饮改的卡槽需要导指定负责的redis上。-h连接的ip,-p连接redis的端口
[root@localhost bin]# ./redis-cli -a 123456 -c -h 127.0.0.1 -p 8001
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:8001> 

相关命令

#查看key属于哪个卡槽,cluster keyslot [key]
cluster keyslot a
#查看集群卡槽分配情况
192.168.136.136:8003> cluster slots
1) 1) (integer) 0
   2) (integer) 5460			#卡槽0-5460
   3) 1) "192.168.136.136"		#主节点ip  ,第一个是主节点,从节点依次跟在后面显示
      2) (integer) 8001			#主节点端口
      3) "a89bf82d44dc8f3f701595534000806f7442abb4"
   4) 1) "192.168.136.136"		#从节点ip
      2) (integer) 8004			#从节点端口
      3) "653840a85f4e3a3cca26bd1ab7e5745d76440b62"
2) 1) (integer) 5461			#卡槽 5461-10922
   2) (integer) 10922
   3) 1) "192.168.136.136"
      2) (integer) 8002
      3) "5acad78954b19ee204f2ccdf1c6a150f2b7ba0d1"
   4) 1) "192.168.136.136"
      2) (integer) 8005
      3) "eb85341713dda2d13cb4ddfeaf800c58e7001e5b"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "192.168.136.136"
      2) (integer) 8003
      3) "e2a26fd29c7f645e1b8bfab7f235a4e08d701d1b"
   4) 1) "192.168.136.136"
      2) (integer) 8006
      3) "f95d2916a00a0aea801a270ce3d6d5d94e8821cb"

#查看集群信息
127.0.0.1:8001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3				
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:979
cluster_stats_messages_pong_sent:987
cluster_stats_messages_sent:1966
cluster_stats_messages_ping_received:982
cluster_stats_messages_pong_received:979
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1966

以上是关于Redis主从哨兵集群的主要内容,如果未能解决你的问题,请参考以下文章

Redis集群模式1-主从复制+哨兵机制

Redis 主从复制-哨兵-集群 相关部署

Redis 高可用篇:你管这叫 Sentinel 哨兵集群原理

玩转Redis的高可用(主从、哨兵、集群)

Redis 主从复制哨兵和集群区别

Redis 主从复制哨兵和集群区别