Redis搭建主从复制和集群

Redis的主从复制

redis的主从复制解决的是读取分离的问题。或者说解决的是数据备份的问题。node

redis主从复制经常使用方式redis

  • 一仆二主。一个主机有两个从机
  • 薪火相传。从机也能够有从机
  • 反客为主。使当前数据库中止和主机的同步,并由从机转为主机(从机执行SLAVEOF no one命令后,会从slave转为master

介绍

运行redis的主机挂了,迅速将redis的数据复制到从机上。这样就有修主机的时间了shell

只有主机能修改数据,从机只能读数据,不能改数据数据库

从机使用主机的.rdb文件覆盖本身的文件从而作到和主机数据保持一致服务器

搭建流程:并发

主机不须要修改,正常运行便可ui

从机须要修改配置文件redis.conf,指定主机的ip和端口。一旦主机的redis挂掉,从机立刻补上3d

单机启动多个Redis

  1. 建立多个redis.conf配置文件
  2. 使用不一样的redis.conf文件(这些配置文件中配置的端口号必须不一样)启动Redis
  3. slave从机中指定master

完成上述步骤便可完成单机集群日志

  1. 复制多个redis.confcode

    修改port,修改日志文件(logfile)的名字为“redis_port.log”,修改生成的rdb文件的名字(dbfile)修改pidfile文件名

  2. 使用不一样的配置文件启动redis

    $ redis-server ./redis6379.conf
    $ redis-server ./redis6380.conf
    $ redis-server ./redis6381.conf
  3. 启动多个redis-cli链接不一样的redis-server

    $ redis-cli -p 6379
    $ redis-cli -p 6380
    $ redis-cli -p 6381
  4. 查看redis的集群状态,如下命令会打印当前redis的身份,主从机的地址和端口号

    > info replication
    # Replication
    role:master
    connected_slaves:0
    master_replid:9dbcba9b7769c48547860bda99e9464b717a0ef3
    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

    可见,三个redis-server均为master

  5. 在两个redis-server中执行命令,指定主机地址(ip+端口)

    > SLAVEOF 127.0.0.1 6379

    此后这两个redis-server均变为slave,且所存数据和master一致

即,slave的原数据所有丢弃,数据和master同步

单机启动多个Redis遇到的问题

  1. 主机的redis-server执行SHUTDOWN关闭了服务。从机会怎么办?主机重启后,从机又怎么办?

    主机关闭后,从机仍是从机(不会上位变主机),从机中数据也不会丢失。主机启动后,主机依旧能存数据,从机依旧能复制主机数据

  2. 从机关闭了服务。会发生什么?从机从新启动后又会发生什么?

    其余从机正常工做。从机启动后,若是没有指定主机,这个从机将再也不是从机,而是一个独立的redis-server。须要从新在redis-cli中指定主机或在配置文件中就指定主机

哨兵模式

反客为主的自动版,原反客为主是要手动令从机转为主机

哨兵监控主机状态,若是主机挂掉,哨兵将选举新的主机

场景:A(master),B(slave),C(slave),D(哨兵)

A挂掉,B转为master。A从新启动,哨兵监控到A上线,A变为从机

实现步骤:

  1. 写哨兵的配置文件sentinel.conf(配置文件的内容只须要下述一行配置便可)
  2. 启动哨兵redis-sentinel ./sentinel.conf

哨兵的配置文件的内容

# sentinel monitor 被监控数据库名字(本身起名字) 127.0.0.1 6379 1
sentinel monitor iammaster 127.0.0.1 6379 1

上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多少后成为主机

sentinel.conf的其余可配置项在这里

# Example sentinel.conf
 
# 哨兵sentinel实例运行的端口 默认26379
port 26379
 
# 哨兵sentinel的工做目录
dir /tmp
 
# 哨兵sentinel监控的redis主节点的 ip port 
# master-name  能够本身命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
  sentinel monitor mymaster 127.0.0.1 6379 2
 
# 当在Redis实例中开启了requirepass foobared 受权密码 这样全部链接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 链接主从的密码 注意必须为主从设置同样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
 
 
# 指定多少毫秒以后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
 
# 这个配置项指定了在发生failover主备切换时最多能够有多少个slave同时对新的master进行 同步,
这个数字越小,完成failover所需的时间就越长,
可是若是这个数字越大,就意味着越 多的slave由于replication而不可用。
能够经过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
 
 
# 故障转移的超时时间 failover-timeout 能够用在如下这些方面: 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所须要的时间。  
#4.当进行failover时,配置全部slaves指向新的master所需的最大时间。不过,即便过了这个超时,slaves依然会被正确配置为指向master,可是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
 
# SCRIPTS EXECUTION
 
#配置当某一事件发生时所须要执行的脚本,能够经过脚原本通知管理员,例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有如下规则:
#若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
#若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
#若是脚本在执行过程当中因为收到系统中断信号被终止了,则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s,若是超过这个时间,脚本将会被一个SIGKILL信号终止,以后从新执行。
 
#通知型脚本:当sentinel有任何警告级别的事件发生时(好比说redis实例的主观失效和客观失效等等),将会去调用这个脚本,
这时这个脚本应该经过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,
一个是事件的类型,
一个是事件的描述。
若是sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,而且是可执行的,不然sentinel没法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>
  sentinel notification-script mymaster /var/redis/notify.sh
 
# 客户端从新配置主节点参数脚本
# 当一个master因为failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。
# 如下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>老是“failover”,
# <role>是“leader”或者“observer”中的一个。 
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通讯的
# 这个脚本应该是通用的,能被屡次调用,不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
 sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

Redis集群

相对于Redis的主从复制。Redis解决的是内存问题。将使用者对Redis的操做分摊到各个节点中

Redis集群解决内存不够和承受并发压力的问题

下面实现的是单机建立的集群

介绍

由上图可知,redis-cli操做的是集群。当redis-cli向集群中插入一对新的键值对时,数据具体存放到哪台服务器中由集群决定。因此使用者只须要像操做单个Redis服务同样,操做集群就能够了。

搭建集群流程

  1. 修改配置文件,开启集群

  2. 启动一堆redis

  3. 使用redis的集群命令,将redis链接起来造成集群

  4. 使用redis-cli实操

  5. 修改配置文件。主机的配置文件须要开启集群,从机不须要开启集群,可是须要指定主机的地址

    port 6379
    daemonize yes
    pidfile /var/run/redis_6379.pid
    # 主机须要开启集群
    cluster-enabled yes
    cluster-node-timeout 15000
    cluster-config-file  nodes-6379.conf
    port 6389
    daemonize yes
    pidfile /var/run/redis_6389.pid
    # 从机须要指定主机地址,并关闭集群
    cluster-enabled no
    slaveof 127.0.0.1 6379

    配置redis集群须要至少三个节点,每一个节点再配置一个从机。若是配置集群的话须要在启动redis前删除全部.rdb文件

  6. 启动一堆redis。这里启动的前三个是主机,后三个是从机。

    $ redis-server redis6379.conf
    $ redis-server redis6380.conf
    $ redis-server redis6381.conf
    $ redis-server redis6389.conf
    $ redis-server redis6390.conf
    $ redis-server redis6391.conf
    
    $ ps -ef | grep redis
  7. 使用命令将多个redis服务合并为集群

    # 主从节点的地址全都写上
    $ redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391
  8. 使用redis-cli实操

    $ redis-cli -c -p 6379

    -c选项表示使用集群启动,若是没有此选项,如下操做均不可实现

    6379端口下的redis-cli使用命令存入数据时,由于集群的缘由,数据可能存到不一样的节点。成功存入数据的同时当前终端也会自动跳转到存入数据的节点的redis-cli

    可是,正因如此。redis-cli没法执行批量操做。由于存取数据时,可能不一样数据会存入不一样节点或从不一样的节点取数据。因此在一个节点下的redis-cli没法执行批量操做

插槽

在执行以下命令时,会打印一些集群的信息

$ redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 5df2139bfae322a623dfeaa7e31f8663548a9fb2 127.0.0.1:6379
   slots:[0-5460] (5461 slots) master
M: 4f358a2baf74f490e14093cdcf6422f17b95b67e 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
M: 4efd186e801cfb226fd29215f98c1927eb035a01 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master

其中有关键字==slots==(插槽)

上述打印信息显示,集群的插槽范围为0~16383。,每一个插槽能够存放一对键值对

前三行显示了,每一个节点管理的插槽范围

关于集群的经常使用命令

查看节点列表

127.0.0.1:6379> cluster nodes

还有不少redis客户端执行的cluster命令,例如:查全部节点中键值对总数,插槽总数等,查询key所在的插槽,这里不赘述

添加主机节点

$ redis-cli --cluster add-node 127.0.0.1:6385 127.0.0.1:6379

添加从机节点

$ redis-cli --cluster add-node 127.0.0.1:6386 127.0.0.1:6379 --cluster-slave --cluster-master-id 22e8a8e97d6f7cc7d627e577a986384d4d181a4f

为新节点分配插槽

$ redis-cli --cluster reshard 127.0.0.1:6385

删除节点

$ redis-cli --cluster del-node 127.0.0.1:6386
相关文章
相关标签/搜索