zoukankan      html  css  js  c++  java
  • Redis主从哨兵集群搭建

      

      redis作为一个高性能内存数据库,常作为系统的缓存数据库来使用。然而在生产环境中,服务的稳定性非常重要,这篇博文则主要记录介绍使用redis主从哨兵集群来实现redis服务的高可用。

    当然为了解决redis的高可用和伸缩性,redis有很多集群方法,非官方的常见的有codis,Redis Sharding,及多种第三方中间件来实现。但是随着redis官方的集群越来越稳定和官方持续的维护和支持,redis官方集群成为不错的选择,两种方案分别如下:

    1. redis主从哨兵方案
    2. redis cluster 分布式集群方案

    主从哨兵集群架构图:

    此图为最常见的一主两从结构,一个master主机,两个slave主机。每台主机上都运行着两个进程:

    1. redis-server 服务,处理redis正常的数据操作与响应。master服务可读写,slave服务为只读,当master服务接受到数据修改或写入的命令时,会异步将命令发送到slave上,以此保持master与slave上数据的一致性。
    2. redis-sentinel 哨兵服务,此服务会监控master和slave服务是否正常运行,当超过半数的哨兵认定master服务挂掉时,会进行选举,将slave服务选举设置为master服务,并恢复集群访问,当旧master节点恢复正常后,可以作为新的slave节点重新加入集群。

    主从哨兵集群的优缺点:

    • 优点:实现了数据备份,读负载均衡,自动化故障恢复,高可用。
    • 缺点:没有伸缩性,数据存储的限制受到单机内存大小的限制,没发通过增加主机来增加存储空间。

    所以,此主从哨兵集群在中小系统中广受使用,因为其简单好用的特性,在数据量不大的情况下,可以很好的提供服务,但是随着互联网企业的不断发展,数据量越来越大,单机存储已经无法满足需求,于是redis官方至3.0版本后推出了新一代的集群方案,redis cluster分布式集群,此集群则在高可用的基础上,解决了伸缩性的问题。


    开始搭建

    1. 环境准备

    由于哨兵的高可用和确保不是因为哨兵故障导致的master状态误判,所以集群的数量为单数最好,最低集群配置则为1主两从,3哨兵。

    即需要3台服务器,每台服务器上运行一个redis-server,一个redis-sentinel

    环境如下:

    • master: ip: 192.168.0.1 os: centos7 redis:5.0.5
    • slave: ip: 192.168.0.2 os: centos7 redis:5.0.5
    • slave: ip: 192.168.0.3 os: centos7 redis:5.0.5

    2. 设置主从服务

      1)在master上操作

    # 修改redis配置文件,修改下面的列出的选项
    $ vim /etc/redis/6379.conf
    --------------------------------------------------------------------
    # 允许任意用户连接
    bind 0.0.0.0
    # 关闭保护模式
    protected-mode no 
    # 开启守护进程
    daemonize yes
    # 如果是作为缓存服务器,需要注释掉三个数据持久化的选项
    # save 900 1
    # save 300 10
    # save 60 10000
    # 设置redis密码,如果要设置密码,则主从的密码要统一一致,这样在故障时切换master才能正常连接,如果不设密码则都不设密码
    requirepass 123456
    # 设置最大内存限制,避免内存过大造成服务器宕机
    maxmemory 2gb
    --------------------------------------------------------------------
    
    # 启动服务
    $ systemctl restart redis_6379
    # 开启防火墙上6379端口
    $ firewall-cmd --add-port=6379/tcp --permanent
    $ firewall-cmd --reload

      2)在两个salve主机上操作

    # 修改redis配置文件,修改下面的列出的选项
    $ vim /etc/redis/6379.conf
    --------------------------------------------------------------------
    # 上面master上修改的配置项,这里要做一样的修改。就不重复写了
    # 在master的基础上,额外需要修改如下配置
    # 指定matser机的IP和端口
    slaveof 192.168.0.1 6379
    # master上redis的密码,如果没有设置密码则不需要配置
    masterauth 123456
    --------------------------------------------------------------------
    
    # 启动服务
    $ systemctl restart redis_6379
    # 开启防火墙上6379端口
    $ firewall-cmd --add-port=6379/tcp --permanent
    $ firewall-cmd --reload

    上面已经依次修改mster和slave的配置并启动服务,现在来验证主从是否已经正常运行。

    # 在master主机上,使用redis-cli登录redis,查看info信息
    $ redis-cli -a 123456
    127.0.0.1:6379> info
    # 查看最下面 # Replication 内容
    # 出现以下内容则证明主从配置已经正常运行
    role:master
    connected_slaves:2
    slave0:ip=192.168.0.2,port=6379,state=online,offset=874800532,lag=1
    slave1:ip=192.168.0.3,port=6379,state=online,offset=874800532,lag=1
    
    # 可以简单测试以下,数据复制是否正常
    # 在master上,创建一个key为a,值为1
    127.0.0.1:6379> select 0
    127.0.0.1:6379> set a 1
    
    
    # 在任意slave主机上,登录redis,查看上面设置的a的key是否存在
    $ redis-cli -a 123456
    127.0.0.01:6379> select 0
    127.0.0.01:6379> get a
    "1"
    # 如上,发现已经存在了键值为1的a的key,证明主从复制功能正常运行。

    3. 设置哨兵服务

    哨兵服务与redis-server服务是两个独立的进程,共同运行在每个redis主机上,下面依次在master和slave上设置与运行哨兵服务:

    在master和slave上都执行以下操作

    # redis通过源码安装后,在redis目录中,会有一个sentinel.conf的哨兵配置文件
    # 修改下面列出的配置项,{your-redis-dir}换为你redis的文件目录
    $ vim {your-redis-dir}/sentinel.conf
    --------------------------------------------------------------------
    # 设为后台启动
    daemonize yes
    # 设置log文件路径,方便出故障时进行排查
    logfile "/var/log/redis/sentinel.log"
    # 关闭保护模式
    protected-mode no
    
    # 设置监控master主机,只需要配置上master的ip和端口
    # 后面的2,表示有两台或以上哨兵认定master挂掉了,则认为master挂掉,进行选举切换master
    sentinel monitor mymaster 192.168.0.1 6379 2
    # 指定master和slave的统一密码
    sentinel auth-pass mymaster 123456
    --------------------------------------------------------------------
    
    
    # 指定配置文件,启动哨兵服务,{your-redis-dir}换为你redis的文件目录
    $ redis-sentinel {your-redis-dir}/sentinel.conf
    # 启动后默认监听26379端口
    # 开启防火墙上26379端口的访问
    $ firewall-cmd --add-port=26379/tcp --permanent
    $ firewall-cmd --reload

    到此哨兵服务在3太服务器上都启动后。我们来验证以下服务是否正常运行:

    # 任意在master或slave主机上,指定端口,登录redis的哨兵服务
    $ redis-cli -p 26379
    127.0.0.1:26379> info sentinel
    # 查看哨兵信息,最下一行出现master的信息和slave和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=ok,address=192.168.0.1:6379,slaves=2,sentinels=3
    
    # ok,出现上面的信息,则证明哨兵服务已经正常运行
  • 相关阅读:
    整数数组中最大子数组的和的问题(续)
    整数数组中最大子数组的和的问题
    PHP开发环境(Apache+mysql+PHPstorm+php)的搭建
    echart 库 初始
    2.15 学习总结 之 天气预报APP volley(HTTP库)之StringRequest
    2.14 学习总结 之 序列化
    2.13 阶段实战 使用layui重构选课系统
    2.12 学习总结 之 表单校验插件validate
    jsp连接数据库的乱码问题 servlet请求参数编码处理get post
    Rocket
  • 原文地址:https://www.cnblogs.com/xingxia/p/redis_master_slave.html
Copyright © 2011-2022 走看看