zoukankan      html  css  js  c++  java
  • Redis集群配置

    环境:
    3台安装有redis软件的服务器 Centos7
    Redis01 192.168.100.208
    Redis02 192.168.100.209
    Redis03 192.168.100.210
    软件版本:redis-5.0.9

    1.1 安装redis

    yum -y install gcc-c++
    mkdir /software  && cd /software
    wget https://download.redis.io/releases/redis-5.0.9.tar.gz
    tar xzf redis-5.0.9.tar.gz
    cd redis-5.0.9/
    make
    make install
    安装完成之后 关于redis的命令都在/usr/local/bin/下
    [root@redis01 software]# cd /usr/local/bin/
    [root@redis01 bin]# ls
    dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server
    

    1.2 修改配置文件

    需要注意的地方有

    bind 127.0.0.1 192.168.100.208 //这里的话需要指明Bind的ip地址 或者也可以把这一行都注销掉
    protected-mode no //这里的话 默认是yes 需要更改为no
    

    1.3 启动redis
    将三台服务器的redis都启动
    我这里把修改好的配置文件 放在了/redis 文件夹下(这个文件夹自己新建的)
    redis-server /redis/redis.conf
    进入redis 下面两个命令都可以
    redis-cli -p 6379
    redis-cli -h 192.168.100.208 -p 6379

    1.4 配置主从复制
    因为redis默认就是master模式 所以配置主从复制 只需要在slave主机上配置就可以了
    Redis02

    192.168.100.209:6379> info replication //配置主从复制前
    # Replication
    role:master
    connected_slaves:0
    master_replid:e5f164f408d8e47a1711d36fa285ed7d10a8211c
    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
    192.168.100.209:6379> SLAVEOF 192.168.100.208 6379 //配置主从复制命令 想要永久生效的话 需要修改redis.conf 添加一行 replicaof 192.168.100.208 6379
    OK
    192.168.100.209:6379> info replication //配置主从复制后
    # Replication
    role:slave
    master_host:192.168.100.208
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:7
    master_sync_in_progress:0
    slave_repl_offset:0
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:0
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:0
    

    Redis03

    192.168.100.210:6379> SLAVEOF 192.168.100.208 6379
    OK
    192.168.100.210:6379> info replication
    # Replication
    role:slave
    master_host:192.168.100.208
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:8
    master_sync_in_progress:0
    slave_repl_offset:126
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:126
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:113
    repl_backlog_histlen:14
    

    Redis01

    当redis01被设置为redis02 redis03的master主机之前
    [root@redis01 redis]# redis-cli -h 192.168.100.208 -p 6379
    192.168.100.208:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    master_replid:8239d784c26b3a125b43399829c1c327d79426d5
    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
    
    当redis01被设置为redis02 redis03的master主机之后
    192.168.100.208:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.100.209,port=6379,state=online,offset=350,lag=0
    slave1:ip=192.168.100.210,port=6379,state=online,offset=350,lag=1
    master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:350
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:350
    

    到这里 主从复制配置完成。在redis01上set一个值 在redis02 redis03上都可以get到。

    上面使用的是在命令行执行的 要想要永久生效 需要在配置文件里面配置
    在redis.conf里面配置master的地址
    replicaof 192.168.100.208 6379 //要不要配置在配置文件里 这个根据应用场景来定

    只有master主机可以写(set操作),salve主机只能读,即只能get.

    salve主机 想要set值的话 会报错.
    192.168.100.209:6379> set key2 v2
    (error) READONLY You can't write against a read only replica.
    

    模拟故障情景:

    1、只有一台master主机的情况下 master主机发生故障了(模拟故障 将master主机的redis shutdown)

    192.168.100.209:6379> get key1 //原slave主机 依然可以正常获取到值
    "v1"
    192.168.100.209:6379> info replication//原slave主机 依然把192.168.100.208作为master主机 只是status变成down了
    # Replication
    role:slave
    master_host:192.168.100.208
    master_port:6379
    master_link_status:down
    master_last_io_seconds_ago:-1
    master_sync_in_progress:0
    slave_repl_offset:19766
    master_link_down_since_seconds:15
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:1ca03edea9b5d8b411cd4d1d74e2bdd2fa5ee365
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:19766
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:19766
    

    这种情况下 将master主机的redis服务恢复正常
    无需其他操作 在master主机上 新设置的值,在slave主机上 也可以获取到。
    但是要是master主机 短期无法恢复的话 如果让slave主机恢复为master角色呢?
    执行SLAVEOF no one的命令//没有哨兵概念之前 都是手动执行让其成为master

    2、slave主机发生故障的情况
    2.1 使用命令行配置的话 重新启动redis后,需要重新配置。重新配置之后 会重新同步master主机上的所有值。
    所以master主机和salve主机之间的数据是如何同步的呢?
    a.salve主机 启动成功,与master主机建立连接之后,salve主机会发送一个sync同步命令给master主机。
    b.master主机接收到sync请求之后 会把整个数据文件夹传送到salve主机 完成一次完全的同步
    c.完全同步完成之后,之后的变化 会被依次同步给salve主机。
    所以每次重新建立连接 就会完成一次完全同步。

    2.2 使用配置文件配置主从复制的话 重新启动redis后 无需重新配置

    Redis集群 一般会配合哨兵模式来使用。

  • 相关阅读:
    还需要做恰当的解读,此时你可能需要一些书:
    创业公司的架构演进史
    任务调度平台Cuckoo-Schedule
    ORACLE中死锁
    Action的模型绑定
    三次握手、四次握手、backlog
    Django框架
    扩展BootstrapTable的treegrid功能
    Identity Service
    Linux权限
  • 原文地址:https://www.cnblogs.com/atwo/p/13861132.html
Copyright © 2011-2022 走看看