zoukankan      html  css  js  c++  java
  • Redis主从模式、哨兵模式和集群的相关操作

    1、主从模式

    (1)特点

    有且仅有一个主节点Master,从节点slave可以有

    主节点master可读可写,从节点slave只能读;主节点将读的操作交给了从节点,变向的提高了自己写的能力

    (2)配置步骤(同一台服务器,利用不同端口进行部署)

    1】在/usr/local目录下,创建一个/redis/master-slave目录

    2】 在master-slave目录下,创建三个子目录6380、6381、6382

    3】 依次拷贝redis解压目录下的redis.conf配置文件,到这三个子目录中

    4】 进入6380目录,修改redis.conf,将port端口修改成6380即可

    5】 进入6381目录,修改redis.conf,将port端口改成6381,同时指定开启主从复制

    6】 进入6382目录,修改redis.conf,将port端口改成6382,同时指定开启主从复制

    (3)测试

    1】启动每个redis节点,查看输入日志(每启动一个redis从节点时,主节点的日志就会提示从节点连接信息)

    [root@node0719 master-slave]# cd 6380 && redis-server ./redis.conf
    [root@node0719 master-slave]# cd 6381 && redis-server ./redis.conf
    [root@node0719 master-slave]# cd 6382 && redis-server ./redis.conf

    2】在每个redis节点进行读写操作(即:”set user:name zhangsan“和”get user:name“)

    结论:当主节点写入数据时,系统会同步到从节点;主节点可读可写操作,而从节点只能读操作

    (4)优缺点

    1】 主从模型可以提高读的能力,在一定程度上缓解了写的能力

    2】 主节点宕机了,整个集群就没有可写的节点了

    2、哨兵模式( Sentinel)

    (1)特点:

    哨兵模式的任务是:监控( Monitoring)、提醒( Notification)、自动故障迁移( Automatic failover)

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

    Sentinel可以监控任意多个Master和该Master下的Slaves。(即多个主从模式)

    同一个哨兵下的、不同主从模型,彼此之间相互独立。

    Sentinel会不断检查Master和Slaves是否正常

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

    3】自动故障迁移:当主节点服务器不能正常工作时,Sentinel会自动将其中一个从节点服务器升级为新的主节点服务器,让故障服务器失效

    Sentinel网络: 当只有一个sentinel的时候,如果这个sentinel挂掉了,那么就无法实现自动故障切换了;在sentinel网络中,只要还有一个sentinel活着,就可以实现故障切换。

    (2)自动故障迁移中故障切换的过程

    1】投票(过半原则),确定有问题主服务器是否下线

    2】选举(过半原则),选举一个从节点(slave)服务器作为主节点master服务器

    3】原master节点重新上线后,自动转为当前master的从节点

    (3)哨兵模式部署

    由于哨兵模式的故障迁移时切换采用过半原则,所有至少要配置三个Sentinel实例(必须为奇数)

    由于哨兵模式与节点相互独立,只是对节点进行监控作用,所有需要存在一个正在运行的主从模式

    1】配置Sentinel

    在/usr/local目录下,创建/redis/sentinels/目录

    在/sentinels目录下,以次创建s1、s2、s3三个子目录中

    依次拷贝redis解压目录下的sentinel.conf文件,到这三个子目录中

    [root@node0719 local]# mkdir -p redis/sentinels
    [root@node0719 sentinels]# mkdir s1 s2 s3
    [root@node0719 sentinels]# cp  /root/redis-3.2.9/sentinel.conf  ./s1/
    [root@node0719 sentinels]# cp  /root/redis-3.2.9/sentinel.conf  ./s2/
    [root@node0719 sentinels]# cp  /root/redis-3.2.9/sentinel.conf  ./s3/

    依次修改s1、s2、s3子目录中的sentinel.conf文件,修改端口,并指定要监控的主节点。(从节点不需要指定,sentinel会自动识别)

    S1哨兵配置如下:

    S2/S3哨兵配置如S1只是端口号不一样,监控的主节点一致

    (4)测试

    关闭主节点master观察输出日志,发现确实重新指定一个主节点,当该节点再次上线时,该节点成为新主节点的从节点

    (5)优缺点

    优点:Sentinel哨兵模式,确实能实现自动故障切换。提供稳定的服务

    缺点:仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力

    3、Redis-cluster集群

    由于哨兵模式在同一时刻只有一个主节点master具有写的能力,所有无法满足并发写入请求较大时的需求

    通过集群模式提供多个master主节点,每个节点都可以读写,节点之间可以互相通信;整个集群无中心节点

    (1)准备工作:

    1】安装ruby环境(如果已存在就不需要再次安装)

    redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:

    yum -y install ruby
    yum -y install rubygems

    2】 安装ruby和redis的接口程序

    将下载好的 redis-3.0.0.gem拷贝 至/usr/local下,执行安装:

    gem install /usr/local/redis-3.0.0.gem

    (2)创建节点

    1】 Redis集群最少需要6个节点,可以分布在一台或者多台主机上。(同一台主机上用不同端口表示不同节点)

    主节点:192.168.56.3:7001 192.168.56.3:7002 192.168.56.3:7003

    从节点:192.168.56.3:7004 192.168.56.3:7005 192.168.56.3:7006

    2】 在/usr/local/redis下创建redis-cluster目录,其下创建7001、7002。。7006目录,拷贝原始的redis.conf文件到每个700x文件夹下,并修改相关配置,端口号、开启集群、开启后台运行、绑定主机及日志文件位置等设置

    必选配置:
    port 700X
    bind 192.168.23.3   
    cluster-enabled yes
    建议配置:
    daemonized  yes
    logfile  /usr/local/redis/redis-cluster/700X/node.log

    (3)启动每个节点

    [root@node5 redis-cluster]# cd 7001 && redis-server ./redis.conf
    [root@node5 7001]# cd ..
    [root@node5 redis-cluster]# cd 7002 && redis-server ./redis.conf
    [root@node5 7002]# cd ..
    [root@node5 redis-cluster]# cd 7003 && redis-server ./redis.conf
    [root@node5 7003]# cd ..
    [root@node5 redis-cluster]# cd 7004 && redis-server ./redis.conf
    。。。。

    (注意:每次启动一个节点必须在不同的位置,否则无法启动)

    查看每个节点启动信息(ps -aux |grep redis)

    [root@node5 ~]# ps -aux |grep redis
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    root   2319  0.4  0.5 137632  9764 ?  Ssl  18:47   0:01 redis-server 192.168.100.251:7001 [cluster]
    root   2346  0.6  0.5 137632  9764 ?  Ssl  18:48   0:00 redis-server 192.168.100.251:7002 [cluster]
    root   2352  0.5  0.5 137632  9768 ?  Ssl  18:48   0:00 redis-server 192.168.100.251:7003 [cluster]
    root   2358  0.3  0.4 137632  7720 ?  Ssl  18:49   0:00 redis-server 192.168.100.251:7004 [cluster]
    root   2363  0.2  0.4 137632  7712 ?  Ssl  18:50   0:00 redis-server 192.168.100.251:7005 [cluster]
    root   2368  1.1  0.4 137632  7716 ?  Ssl  18:50   0:00 redis-server 192.168.100.251:7006 [cluster]

    (4)创建集群(把每个启动的节点全部加入集群)

    执行redis-trib.rb(文件位置: redis源码存放目录redis/redis-4.10.3/src下,.rb文件依赖ruby环境),

    [root@node5 src]# ./redis-trib.rb  create --replicas 1 192.168.159.10:7001 192.168.159.10:7002 192.168.159.10:7003
     192.168.159.10:7004 192.168.159.10:7005  192.168.159.10:7006

    注: --replicas 1 1其实代表的是一个比例,就是主节点数/从节点数的比例, 按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点

    (5)查看集群信息

    在集群创建成功之后,集群可以包含多个可读写的主节点,集群无中心节点;

    可以通过登录任意一个redis节点查看集群信息

    [root@node5 bin]# ./redis-cli -c -h 192.168.100.251 -p 7001
    192.168.100.251:7001>

    注:-c表示以集群方式连接redis,-h指定ip地址,-p指定端口号

    查询集群节点信息,执行 cluster nodes

    查询集群状态信息,执行cluster info

    192.168.100.251:7001> 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:8
    cluster_my_epoch:8
    cluster_stats_messages_sent:9423
    cluster_stats_messages_received:3362
    192.168.100.251:7001>

    (6)向集群添加master主节点

    【1】创建并添加节点

    1)创建新的节点7007并启动节点服务

    2)执行添加命令:./redis-trib.rb add-node 192.168.100.251:7007 192.168.100.251:7001

    3)查看节点集群信息7007是否加入集群,是否为master

    【2】给新加主节点分配槽位

    1)连接上集群(连接集群中任意一个可用节点都行)

    ./redis-trib.rb reshard 192.168.23.3:7001

    2)输入分配槽位的数量

    3)输入接收槽位的节点id (分配的槽位给谁,节点id可以同cluster nodes查看)

    4)输入源节点id(即从哪个节点分离出来要分配的槽位,节点id可以同cluster nodes查看),原节点id输入完后,以done命令为结束标志(源节点输入all表示从其他主节点分配)

    5)分配完成后,输入开始进行槽位移动

    至此主节点添加完成

     

    (7)添加slave从节点

    【1】创建新节点7008并启动节点服务

    【2】执行新增节点命令:./redis-trib.rb add-node --slave --master-id masterID newNodIP:port MasterIP:port

    masterID 主节点id,从cluster nodes信息中查看

    newNodIP:port 新增节点的ip:端口

    MasterIP:port 主节点的ip:端口

    例如:将7008节点添加到7007下,909c349f5f2d4db015101fb7c4e3c227a74ad382为7007节点id(可通过cluster nodes 查看节点信息)

    ./redis-trib.rb add-node --slave --master-id 909c349f5f2d4db015101fb7c4e3c227a74ad382 192.168.4.253:7008 192.168.4.253:7007

    注:此处常见错误(原因 原来该结点在集群中的配置信息已经生成cluster-config-file指定的配置文件中)

    [ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

    解决方法:删除生成的配置文件nodes.conf,删除后再执行./redis-trib.rb add-node指令。

    (8)删除节点

    执行删除节点命令:./redis-trib.rb del-node nodeIP:port nodeID

    nodeIP:port 待删除节点的ip:端口

    nodeID 待删除节点的id,从cluster node中查看

    注:删除主节点的时候会报错,原因是,主节点占有槽位

    [ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.

    此时需要交要删除节点的槽位分配出去,再执行删除(槽位分配课参照添加主节点时的槽位分配步骤)

  • 相关阅读:
    04-26mysql命令(数据库操作层级,建表,对表的操作)
    mysql 建表和查询 大全 (待补全)
    04-21数据操作
    4-20 mysql 整理 (建表语句和mysql命令)
    MySql 初步整理
    初识jQuery 基础篇 借鉴版
    jQuery基础整理!!
    JS节点操作 (表格在js中添加行和单元格,并有一个删除键)
    一阶段项目结尾整理
    Css 分类 属性 选择器
  • 原文地址:https://www.cnblogs.com/Chary/p/13453623.html
Copyright © 2011-2022 走看看