• Redis主从、哨兵、集群


    主从

    命名设置:
    >6380 slaveof 127.0.0.01 6379
    slaveof on one
    ----------配置:
    -- 注意一点: 一定开启rdb,不能使用aof
    从节点配置:
    主节点
    正常配置即可

    从节点
    slaveof 主节点ip 端口
    salve-read-only yes
    masterauth 主节点密码


    ------------------------------------------
    1、主服务是可以执行数据的读和写操作【rdb文件】
    2、从服务只能执行读操作【拷贝主服务上rdb】

    第一种: 主服务器和从服务在同一台机器上面
    第二种: 主服务器和从服务在不同的机器上面(生成环境下面)

    哨兵

    1、哨兵的配置文件

    sentinel.conf

    最小的配置

    每一个哨兵都可以去监控多个maser-slaves的主从架构

    因为可能你的公司里,为不同的项目,部署了多个master-slaves的redis主从集群

    相同的一套哨兵集群,就可以去监控不同的多个redis主从集群

    你自己给每个redis主从集群分配一个逻辑的名称

    sentinel monitor mymaster 127.0.0.1 6379 2
    sentinel down-after-milliseconds mymaster 60000
    sentinel failover-timeout mymaster 180000
    sentinel parallel-syncs mymaster 1

    sentinel monitor resque 192.168.1.3 6380 4
    sentinel down-after-milliseconds resque 10000
    sentinel failover-timeout resque 180000
    sentinel parallel-syncs resque 5

    sentinel monitor mymaster 127.0.0.1 6379

    类似这种配置,来指定对一个master的监控,给监控的master指定的一个名称,因为后面分布式集群架构里会讲解,可以配置多个master做数据拆分

    sentinel down-after-milliseconds mymaster 60000
    sentinel failover-timeout mymaster 180000
    sentinel parallel-syncs mymaster 1

    上面的三个配置,都是针对某个监控的master配置的,给其指定上面分配的名称即可

    上面这段配置,就监控了两个master node

    这是最小的哨兵配置,如果发生了master-slave故障转移,或者新的哨兵进程加入哨兵集群,那么哨兵会自动更新自己的配置文件

    sentinel monitor master-group-name hostname port quorum

    quorum的解释如下:

    (1)至少多少个哨兵要一致同意,master进程挂掉了,或者slave进程挂掉了,或者要启动一个故障转移操作
    (2)quorum是用来识别故障的,真正执行故障转移的时候,还是要在哨兵集群执行选举,选举一个哨兵进程出来执行故障转移操作
    (3)假设有5个哨兵,quorum设置了2,那么如果5个哨兵中的2个都认为master挂掉了; 2个哨兵中的一个就会做一个选举,选举一个哨兵出来,执行故障转移; 如果5个哨兵中有3个哨兵都是运行的,那么故障转移就会被允许执行

    down-after-milliseconds,超过多少毫秒跟一个redis实例断了连接,哨兵就可能认为这个redis实例挂了

    parallel-syncs,新的master别切换之后,同时有多少个slave被切换到去连接新master,重新做同步,数字越低,花费的时间越多

    假设你的redis是1个master,4个slave

    然后master宕机了,4个slave中有1个切换成了master,剩下3个slave就要挂到新的master上面去

    这个时候,如果parallel-syncs是1,那么3个slave,一个一个地挂接到新的master上面去,1个挂接完,而且从新的master sync完数据之后,再挂接下一个

    如果parallel-syncs是3,那么一次性就会把所有slave挂接到新的master上去

    failover-timeout,执行故障转移的timeout超时时长

    2、在eshop-cache03上再部署一个redis

    只要安装redis就可以了,不需要去部署redis实例的启动

    wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
    tar -xzvf tcl8.6.1-src.tar.gz
    cd /usr/local/tcl8.6.1/unix/
    ./configure
    make && make install

    使用redis-3.2.8.tar.gz
    tar -zxvf redis-3.2.8.tar.gz
    cd redis-3.2.8
    make && make test
    make install

    2、正式的配置

    哨兵默认用26379端口,默认不能跟其他机器在指定端口连通,只能在本地访问

    // 在redis的源文件中拷贝sentinel.conf文件

    port 26739
    daemonize yes
    logfile "/usr/local/redis/6381/log/26739.log"
    dir /usr/local/redis/6381/data
    sentinel monitor mymaster 192.168.3.220 6379 1
    sentinel auth-pass mymaster 123
    sentinel down-after-milliseconds mymaster 30000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1

    port 26739
    daemonize yes
    dir /usr/local/redis/6380/data
    sentinel monitor mymaster 192.168.3.220 6379 1
    sentinel auth-pass mymaster 123
    sentinel down-after-milliseconds mymaster 30000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1

    -- 远程拷贝
    scp ./sentinel-26739.conf root@192.168.3.221:/usr/local/redis/6380/

    3、启动哨兵进程

    在三台机器上,分别启动三个哨兵进程,组成一个集群,观察一下日志的输出

    redis-sentinel /etc/sentinal/5000.conf
    redis-server /etc/sentinal/5000.conf --sentinel

    日志里会显示出来,每个哨兵都能去监控到对应的redis master,并能够自动发现对应的slave

    哨兵之间,互相会自动进行发现,用的就是之前说的pub/sub,消息发布和订阅channel消息系统和机制

    4、检查哨兵状态

    redis-cli -h 192.168.31.187 -p 5000

    sentinel master mymaster 查看master状态
    SENTINEL slaves mymaster 查看mymaster的slave状态
    SENTINEL sentinels mymaster 查看出自己以为的其他sentinel

    SENTINEL get-master-addr-by-name mymaster 根据主节点名称获取对应IP地址和端口号

    哨兵原理

    1、哨兵节点的增加和删除

    增加sentinal,会自动发现

    删除sentinal的步骤

    (1)停止sentinal进程
    (2)SENTINEL RESET *,在所有sentinal上执行,清理所有的master状态
    (3)SENTINEL MASTER mastername,在所有sentinal上执行,查看所有sentinal对数量是否达成了一致

    2、slave的永久下线

    让master摘除某个已经下线的slave:SENTINEL RESET mastername,在所有的哨兵上面执行

    3、slave切换为Master的优先级

    slave->master选举优先级:slave-priority,值越小优先级越高

    4、基于哨兵集群架构下的安全认证

    每个slave都有可能切换成master,所以每个实例都要配置两个指令

    master上启用安全认证,requirepass
    master连接口令,masterauth

    sentinal,sentinel auth-pass <master-group-name> <pass>

    5、容灾演练

    通过哨兵看一下当前的master:SENTINEL get-master-addr-by-name mymaster

    把master节点kill -9掉,pid文件也删除掉

    查看sentinal的日志,是否出现+sdown字样,识别出了master的宕机问题; 然后出现+odown字样,就是指定的quorum哨兵数量,都认为master宕机了

    (1)三个哨兵进程都认为master是sdown了
    (2)超过quorum指定的哨兵进程都认为sdown之后,就变为odown
    (3)哨兵1是被选举为要执行后续的主备切换的那个哨兵
    (4)哨兵1去新的master(slave)获取了一个新的config version
    (5)尝试执行failover
    (6)投票选举出一个slave区切换成master,每隔哨兵都会执行一次投票
    (7)让salve,slaveof noone,不让它去做任何节点的slave了; 把slave提拔成master; 旧的master认为不再是master了
    (8)哨兵就自动认为之前的187:6379变成了slave了,19:6379变成了master了
    (9)哨兵去探查了一下187:6379这个salve的状态,认为它sdown了

    所有哨兵选举出了一个,来执行主备切换操作

    如果哨兵的majority都存活着,那么就会执行主备切换操作

    再通过哨兵看一下master:SENTINEL get-master-addr-by-name mymaster

    尝试连接一下新的master

    故障恢复,再将旧的master重新启动,查看是否被哨兵自动切换成slave节点

    (1)手动杀掉master
    (2)哨兵能否执行主备切换,将slave切换为master
    (3)哨兵完成主备切换后,新的master能否使用
    (4)故障恢复,将旧的master重新启动
    (5)哨兵能否自动将旧的master变为slave,挂接到新的master上面去,而且也是可以使用的

    6、哨兵的生产环境部署

    daemonize yes
    logfile /var/log/sentinal/5000

    mkdir -p /var/log/sentinal/5000

    reids集群

    配置如下:

    cluster-enable yes


    yum install ruby

    yum install rubygems

    gem install redis (安装ruby访问redis的接口)
    解决问题:
    https://www.cnblogs.com/PatrickLiu/p/8454579.html

    速度慢解决:
    https://gems.ruby-china.com/

    # 修改密码和配置文件的redis.config一样
    vi /usr/local/rvm/gems/ruby-2.5.1/gems/redis-4.0.1/lib/redis/client.rb

    cd /usr/local/redis/redis-3.2.8/src下(你的解压目录)

    ./redis-trib.rb create --replicas 1 192.168.3.220:7001 192.168.3.220:7002 192.168.3.221:7003 192.168.3.221:7004 192.168.3.222:7005 192.168.3.222:7006

    1 代表1主1从
    2 代表1主2从

    -- 问题解决方式:【ERR】can not connect 192.168.3.220:7001(220不允许222IP访问)
    添加端口
    firewall-cmd --zone=public --add-port=端口号/tcp --permanent
    重新加载防火墙规则
    firewall-cmd --reload
    查看所有放行的端口
    firewall-cmd --list-ports

    # 修改密码和配置文件的redis.config【masterauth,requirepass】一样
    vi /usr/local/rvm/gems/ruby-2.5.1/gems/redis-4.0.1/lib/redis/client.rb

    ----------------------------------------------------------------
    M: dec146703a9f16d4254115bc68ffd867df46a3d2 192.168.3.220:7001
    slots:0-5460 (5461 slots) master
    S: 26dc40df2fbccd3da7ee4485753dfb4ec4b46b39 192.168.3.220:7002
    replicates bc185fe5fd0a2e9ae17eb0fe0f79c90f7ba180fb
    M: 2c648ded57ffa25e80408101edef9aa2266f56bd 192.168.3.221:7003
    slots:5461-10922 (5462 slots) master
    S: 2a6cec38c41406a31d5f05fe207170bc7b25ae20 192.168.3.221:7004
    replicates dec146703a9f16d4254115bc68ffd867df46a3d2
    M: bc185fe5fd0a2e9ae17eb0fe0f79c90f7ba180fb 192.168.3.222:7005
    slots:10923-16383 (5461 slots) master
    S: 110ad795a1b0c7b0ee48b5bb5e0e721aeba7f15a 192.168.3.222:7006
    replicates 2c648ded57ffa25e80408101edef9aa2266f56bd

    2)针对错误信息执行集群修复命令:./redis-trib.rb fix 192.168.3.220:7001

    检查集群是正常工作
    -c 连接集群节点
    ./redis-cli -c -p 7001 -a 123 -h 192.168.3.220


    添加节点:

    1、首先把需要添加的节点启动

    创建7006目录,拷贝7000中的redis.conf到7006中,然后修改端口port为7006,修改好后进入7006目录启动这个节点:

    redis-server redis.conf

    2、执行以下命令,将这个新节点添加到集群中:

    redis-trib.rb add-node 192.168.33.130:7006 192.168.33.130:7000

    哨兵之间没有发现同伴。


    public static void test3() {
    //初始化集合,用于装下面的多个主机和端口
    HashSet<HostAndPort> nodes = new HashSet<HostAndPort>();

    //创建多个主机和端口实例
    HostAndPort hostAndPort = new HostAndPort("192.168.3.220", 70001);
    HostAndPort hostAndPort1 = new HostAndPort("192.168.3.220", 7002);
    HostAndPort hostAndPort2 = new HostAndPort("192.168.3.221", 7003);
    HostAndPort hostAndPort3 = new HostAndPort("192.168.3.221", 7004);
    HostAndPort hostAndPort4 = new HostAndPort("192.168.3.222", 7005);
    HostAndPort hostAndPort5 = new HostAndPort("192.168.3.222", 7006);

    //添加多个主机和端口到集合中
    nodes.add(hostAndPort);
    nodes.add(hostAndPort1);
    nodes.add(hostAndPort2);
    nodes.add(hostAndPort3);
    nodes.add(hostAndPort4);
    nodes.add(hostAndPort5);

    //创建config
    JedisPoolConfig poolConfig = new JedisPoolConfig();
    //通过config创建集群实例
    /*public JedisCluster(HostAndPort node, int connectionTimeout, int soTimeout,
    int maxAttempts, String password, final GenericObjectPoolConfig poolConfig)*/
    JedisCluster jedisCluster = new JedisCluster(nodes, 4000,1,1,"123",poolConfig);
    //获取集群中的key为name键的值
    String str = jedisCluster.get("3faf");
    System.out.println(str);

    try {
    jedisCluster.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

  • 相关阅读:
    JAVAWEB进行PC支付宝支付
    SpringBoot 设置请求字符串格式为UTF-8
    SpringBoot 处理跨域请求问题
    Python 包制作
    F5 开发
    CentOS7 部署nfs服务
    Debian 9 部分快捷键失效问题
    Win10提示 该文件没有与之关联的程序来执行操作
    Debian 9 编译Python
    debian 9 安装远程桌面
  • 原文地址:https://www.cnblogs.com/lm970585581/p/11969064.html
Copyright © 2020-2023  润新知