近况

最近一段时间在学redis,今天29号,redis学的快差不多了,再过几天把笔记放上来
先来了解一下Linux系统中是如何配置Redis主从复制和哨兵的吧

配置Redis主从复制,实现读写分离
  • 登录你的linux系统,推荐ubuntu,在ubuntu系统上直接输入以下命令

    #apt是Debian系操作系统的包管理工具
    sudo apt update
    #安装redis-server,redis-sentinel
    sudo apt install redis-server
    sudo apt install redis-sentinel
    
    使用apt命令安装后,可以直接在命令行中输入redis-server或redis-sentinel启动服务
  • 如果你使用不了apt命令,则在安装redis之前需要配置其他环境

    • 安装gcc环境

      #CentOS系统下安装gcc
      yum -y install gcc
      
      #Ubuntu系统下安装gcc
      apt install gcc
      
      #查看gcc版本
      gcc -v
      
      gcc环境是C语言的环境,redis底层是C语言编写的
    • 安装make环境

      #CentOS系统下安装make
      yum -y install make
      
      #Ubuntu系统下安装make
      apt install make
      
      #查看make版本
      make -v
      
      注意:使用这些命令是需要linux联网的
    • 最后安装redis环境

      #下载redis安装包,解压,进入redis目录使用make命令编译
      wget http://download.redis.io/releases/redis-6.0.8.tar.gz
      tar xzf redis-6.0.8.tar.gz
      cd redis-6.0.8
      make
      
      使用apt安装redis与这种解压方式安装redis有一点区别
      1,使用apt安装比使用这种方式简单
      2,使用apt安装redis后,使用redis命令简单
          直接使用redis-server 自定义redis.conf文件路径,启动redis服务
          使用redis-cli -p 指定redis端口号 启动redis测试客户端
          
          而使用解压编译方式安装redis,则需要进入redis/src目录下使用
          [./redis-server 自定义redis.conf文件路径],启动redis服务
          启动redis测试客户端也需要进入redis/src目录下才能使用。
  • redis安装完毕后,下面开始搭建主从复制,本次实验是一主二从,一主多从也是类似

    • 在根目录/下创建一个自定义文件夹,存放redis配置信息,例如文件名:redisFile

    • 修改redis.conf配置文件信息,如果是apt命令安装redis,则redis.conf文件在/etc/redis/redis.conf

      1)注释bind 127.0.0.1,不注释只能本机访问
      2)将protected-mode修改成no,将本机访问保护模式设置no
      #保护模式是如果你没有设置redis密码,则只能本机访问,改成no后表示就算没有设置密码,其他电脑也能访问
    • 拷贝redis.conf文件到自定义目录下,即/redisFile下

    • 创建三个配置文件,配置文件名是:redis6379.conf,redis6380.conf,redis6381.conf
      并在三个配置文件中输入以下内容

      include /redisFile/redis.conf
      pidfile /var/run/redis6379.pid[redis6380.pid,redis6381.pid]
      port 6379[6380,6381]
      dbfilename dump6379.rdb[dump6380.rdb,dump6381.rdb]
      
      注意:[]中是可变内容,自行替换成相应端口号和文件名
    • 使用这三个配置文件来启动三台redis进程,在启动之前使用 ps -ef | grep redis命令查看是否
      有已经运行的redis服务,如果有则使用kill -9 进程pid命令杀掉该进程,如果使用kill命令杀不掉
      则使用/etc/init.d/redis-server stop命令杀掉默认启动的redis进程

    • 使用三个配置文件启动三台redis服务器,并使用测试客户端连接各个redis进程,查看具体信息

      #如果使用的是apt安装的redis
      redis-server /redisFile/redis6379.conf
      redis-server /redisFile/redis6380.conf
      redis-server /redisFile/redis6381.conf
      
      #如果使用解压编译的方式安装redis,则需要进入redis/src目录下执行
      ./redis-server /redisFileredis6379.conf
      ./redis-server /redisFileredis6380.conf
      ./redis-server /redisFileredis6381.conf
      
      #启动后可以通过ps -ef | grep redis命令查看redis进程信息
      root@redis:~# ps -ef | grep redis
      root       11759    2083  0 02:05 pts/0    00:00:00 ./redis-server 127.0.0.1:6379
      root       11772   11671  0 02:06 pts/1    00:00:00 ./redis-server 127.0.0.1:6380
      root       11881   11846  0 02:09 pts/2    00:00:00 ./redis-server 127.0.0.1:6381
      root       11971   11955  0 02:10 pts/3    00:00:00 grep --color=auto redi
      
      #启动无误后,可以通过测试客户端查看各个redis
      #如果使用的是apt安装的redis
      redis-cli -p 6379
      redis-cli -p 6380
      redis-cli -p 6381
      
      #如果使用解压编译的方式安装redis,则需要进入redis/src目录下执行
      ./redis-cli -p 6379
      ./redis-cli -p 6380
      ./redis-cli -p 6381
      
      #使用测试客户端进入相应的redis进程中后,通过info replication命令可以查看该redis进程信息
      root@redis:/redisFile/redis-6.0.8/src# ./redis-cli -p 6379
      127.0.0.1:6379> info replication
      # Replication
      role:master
      connected_slaves:0
      master_replid:df6a076596335950973293f1deb7c7b443357a48
      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	
      127.0.0.1:6379> 
      通过info replicatio命令,我们可以看到当前三个redis服务都是主机,
      还需要配置一下才能将6380,6381的redis进程改成从机
    • 将6380,6381redis进程设置为从机

      1)进入6380测试客户端
          redis-cli -p 6380
      2)执行以下命令,将6380redis进程设置为从机
          127.0.0.1:6380> slaveof 127.0.0.1 6379
          这里我6380从机连接的是本地的6379的主机,实际开发中都是一个linux一台redis服务器
          从机连接远程的主机ip和端口号
      3)再次使用命令查看6379redis进程的信息
      	root@redis:/redisFile/redis-6.0.8/src# ./redis-cli -p 6379
          127.0.0.1:6379> info replication
          # Replication
          role:master
          connected_slaves:1	#这里可以看到,主机已经拥有了一个从机6380
          slave0:ip=127.0.0.1,port=6380,state=online,offset=28,lag=1
          master_replid:2d032ee4c3f0951c9c5097bd38923b9d86e1f303
          master_replid2:0000000000000000000000000000000000000000
          master_repl_offset:28
          second_repl_offset:-1
          repl_backlog_active:1
          repl_backlog_size:1048576
          repl_backlog_first_byte_offset:1
          repl_backlog_histlen:28
      6381redis进程也是同样的设置
    • 测试,搭建好一主两从后,则我们只能在主机上进行增删改操作,从机只能进行查询操作

      在从机上添加数据:
          127.0.0.1:6381> set age 22
          (error) READONLY You can't write against a read only replica.
      在主机上添加数据:
          127.0.0.1:6379> set age 22
          OK
      在从机上查看数据:
          127.0.0.1:6381> get age
          "22"
主从复制的三个经典问题
  • 一主二仆

    • 特点1:当通过命令配置主从关系,这种关系只是临时的,如果从机关闭后,
      重启后,该从机会变成主机,所以如果想当从机重启后还保持主从关系,
      就需要把配置主从关系命令写到从机的配置文件中。
    • 特点2:当从机挂掉,重新启动后,之前的被主机插入的数据仍然能查看到
      (主服务器会将数据恢复到从服务器中)
    • 特点3:当主机挂掉后,从机并不会上位,还是从服务器,并且能在从服务器中看到主服务器挂掉了。
      主机重启后,仍然能看到两个从服务器。
    1)slave1,slave2是从头开始复制还是从切入点开始复制?
    	答:是可以的,当从机重新启动时,k1,k2,k3仍然可以查看到。
    2)从机是否可以执行写操作?set可否
    	答:否
    3)主机shutdown后情况如何?从机是上位还是原地待命?
    	答:原地待命
  • 薪火相传

    • 指的是从机可以作为主机来用,上一个从机可以是下一个从机的主机,从机同样可以接收其他从机的连接
      和同步请求,那么该从机作为了链条中下一个从机的主机,可以有效减轻master的写压力,
      去中心化降低风险
    • 如果链条中的从机中途变更转向,即某个主机的从机更改成其他主机的从机,则会清除之前的记录,
      重新建立拷贝最新的
    • 风险是一旦某个从机宕机,后面的从机都没法备份,主机挂了,从机还是从机,无法写数据了。
  • 反客为主
    当一个主机宕机后,后面的从机可以立刻升为主机,其后面的从机不用做任何修改,在从机客户端中执行命令 slaveof no one
    即可将该从机升为主机,这种方式是手动将从机升为主机,可不可以当主机宕机后,从机自动升为主机呢?可以,哨兵模式!

搭建哨兵
  • 首先通过命令查看下是否有默认启动的哨兵进程

    #一般通过apt安装的redis。都有默认启动的redis进程服务
    #关掉默认的redis-server进程服务
    /etc/init.d/redis-server stop
    
    #关掉默认的redis-sentinel哨兵
    /etc/init.d/redis-sentinel stop
  • 在自定义的目录中创建sentinel.conf文件,名字不能错,例如/redisFile/sentinel.conf

    #创建sentinel.conf文件
    touch sentinel.conf
    
    #在该文件中编写如下内容
    sentinel monitor mymaster 127.0.0.1 6379 1
    其中mymaster是为监控对象(主机)起的服务器名称,1为至少有多少个哨兵同意迁移的数量
  • 启动哨兵进程,先启动哨兵进程再启动三台redis进程

    #如果是apt命令安装则执行
    redis-sentinel 自定义sentinel.conf的路径
    
    #如果使用解压编译的方式安装redis,则需要进入redis/src目录下执行
    ./redis-sentinel  自定义sentinel.conf的路径
  • 当主机6379redis进程宕机后,大概十几秒后,哨兵服务器会自动根据一些规则选举某个从机作为新主机
    选举后的从机作为新主机,而当原主机恢复后便自动成为新主机的从机。

    #具体哪个从机会被选举为主机呢?即选举的策略
    1)首先选择优先级靠前的,redis服务器的优先级在配置文件中进行配置
        slave-priority(redis6.0版本时,名字为replica-priority),默认是100,值越小优先级越高
    2)选择偏移量最大的,偏移量是指获取原主机数据最全的
    3)选择runid最小的从机,每一个redis实例启动后都会随机生成一个40位的runid