• java架构师学习路线-高可用如何搭建Redis哨兵机制


    图灵学院 java架构师学习路线

    概述

    哨兵机制的简介

    有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制。顾名思义,哨兵的含义就是监控Redis系统的运行状态。可以启动多个哨兵,去监控Redis数据库的运行状态。其主要功能有两点:

    1、监控主数据库和从数据库是否正常运行。

    2、主数据库出现故障时,可以自动将从数据库转换为主数据库,实现自动切换。

    一、架构图

    一丶下载

    首页地址:http://redis.io/

    最新稳定版下载地址:http://download.redis.io/releases/redis-3.2.9.tar.gz

    二、命令

    三、配置

    四、启动

    五、查看

    六、Sentinel(哨兵)配置

    vi sentinel.conf

    启动前:

    port 26379

    dir "/var/lib/redis/tmp" ###定义目录存放

    sentinel auth-passmymaster vhreal ##密码

    sentinel monitor mymaster 192.168.65.128 6379 2 ###监控mymaster(可自定义-但只能包括A-z 0-9和”._-”)

    sentinel down-after-milliseconds mymaster 30000 ###mymaster多久不响应认为SDOWN

    sentinel parallel-syncs mymaster 1 ###指定最大同时同步新maser配置的salve数量

    sentinel failover-timeout mymaster 180000 ###2次failover切换时间

    启动后(redis.con配置文件完全由sentinel控制,请不要再随意手动改动):

    port 26379

    dir "/var/lib/redis/tmp"

    sentinel monitor mymaster 192.168.65.128 6379 2

    sentinel config-epoch mymaster 18 ###确认mymater SDOWN时长

    sentinel leader-epoch mymaster 18 ###同时一时间最多18个slave可同时更新配置,建议数字不要太大,以免影响正常对外提供服务

    sentinel known-slave mymaster 192.168.65.129 6379 ###已知的slave

    sentinel known-slave mymaster 192.168.65.130 6379 ###已知的slave

    sentinel known-sentinel mymaster 192.168.65.130 26379 be964e6330ee1eaa9a6b5a97417e866448c0ae40 ###已知slave的唯一id

    sentinel known-sentinel mymaster 192.168.65.129 26379 3e468037d5dda0bbd86adc3e47b29c04f2afe9e6 ###已知slave的唯一id

    sentinel current-epoch 18 ####当前可同时同步的salve数最大同步阀值

    开启sentinel

    开启sentinel后会后redis.conf会由sentinel进行管理

    # redis-server /etc/redis/sentinel.conf --sentinel &> /var/log/redis/sentinel.log &

    七、常用命令

    redis-cli

    redis-server

    auth

    set key value

    get key

    八、问题解决

    1、Redis主从配置异常解决:Error condition on socket for SYNC: Connection refused

    Redis主从集群时,从服务器上的redis日志报错:

    32677:S08Feb16:14:38.947*ConnectingtoMASTER172.168.10.70:637932677:S08Feb16:14:38.948*MASTER

    解决方案:

    在redis主服务器上的redis.conf中修改bind字段,将

    bind 127.0.0.1

    修改为

    bind 0.0.0.0

    又或者直接注释掉bind字段

    # bind 127.0.0.1

    原因:

    如果redis主服务器绑定了127.0.0.1,那么跨服务器IP的访问就会失败,从服务器用IP和端口访问主的时候,主服务器发现本机6379端口绑在了127.0.0.1上,也就是只能本机才能访问,外部请求会被过滤,这是Linux的网络安全策略管理的。如果bind的IP地址是172.168.10.70,那么本机通过localhost和127.0.0.1、或者直接输入命令redis-cli登录本机redis也就会失败了。只能加上本机ip才能访问到。

    所以,在研发、测试环境可以考虑bind 0.0.0.0,线上生产环境建议绑定IP地址。

    2、(DENIED Redis is running in protected mode)

    Java程序中使用JedisSentinelPool建立redis连接池

    Set sentinels = new HashSet();

    sentinels.add("172.17.16.7:26379");

    sentinels.add("172.17.16.8:26379");

    sentinels.add("172.17.16.9:26379");

    JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinels, "123456");

    报错:

    DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.......

    使用redis-cli -h 127.0.0.1 -p 26379连接sentinel可以执行命令,而使用redis-cli -h 172.17.16.7 -p 26379连接sentinel执行命令则会报同上的错误。

    查遍了网上没有找到相关的问题分析和解决的案例,所以只能自己猜测和排查,初步怀疑是通过172.17.16.7访问sentinel时受限。

    由于此错误和redis server的protect-mode为yes的访问错误颇为相似,官方在redis.conf的注释说明中有protected-mode这一配置项,但sentinel.conf的注释中完全没有提到过该配置项,我很疑惑,但还是尝试在sentinel.conf中加入

    protected-mode no

    之后保存并重新启动sentinel,之后用Java程序建立连接池,没有报错,且可以对redis server进行数据处理,问题解决。

    尽管Java架构师学习路线已经分享给大家,但有多少学员能认真的去践行,这个就难说了。互联网寒冬已经到来,作为程序员,更应在此时提高自己,有着更高远的追求。

    篇幅有限,如果需要更详细的java架构师学习路线资料可加博主qq:1993712276,或者去图灵官网查看

  • 相关阅读:
    Python使用struct处理二进制
    ProtoBuf与Python结合使用初步
    智能指针shared_ptr的用法
    C++模板
    mac 安装protobuf,并编译为java,c++,python
    java的HashCode方法
    JVM的内存结构
    HashSet与TreeSet的比较
    面向对象的特征有哪些方面?
    Collection与Collections的区别是什么?
  • 原文地址:https://www.cnblogs.com/tulingxueyuan/p/13307696.html
Copyright © 2020-2023  润新知