Redis主从与集群搭建

Redis主从
  • Redis主从的概念
    • ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
    • master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
    • master和slave都是通过一个redis实例(redis服务),通过主从配置可以实现读写分离
  • Redis中从的作用
    • 让redis实现读写分离,减轻主redis的读取数据的压力,分解到其他的从redis上
  • 搭建redis主从关系步骤
    • 准备工作:
      • 按照自定义部署redis的方式,创建两个redis,从redis的配置区别主要为
        • 更改的配置
          • pidfile  redis-6080.pid         更改从redis的pid文件
          • logfile  redis-6080.log          更改新的log日志文件
          • port 6381      绑定新端口
          • slaveof 192.168.8.14 6380     添加从属的redis  ip  和端口
        • 不变的配置
          • ip地址
    • 设置主redis:
      • sudo mkdir redis6080
      • sudo cp /usr/bin/redis-server redis6080/
      • sudo cp /etc/redis/redis.conf redis6080/
      • sudo chown admin-a.admin-a -R redis6080/*
      • vim redis6080/redis.conf
      • 42: daemonize yes
      • 46: pidfile  redis-6080.pid
      • 50: port 6380
      • 69: bind 192.168.8.14
      • 108: logfile  redis-6080.log
    • 设置从redis:
      • sudo mkdir redis6081
      • sudo cp /usr/bin/redis-server redis6081/
      • sudo cp /etc/redis/redis.conf redis6081/
      • sudo chown admin-a.admin-a -R redis6081/*
      • vim redis6081/redis.conf
      • 42: daemonize yes
      • 46: pidfile  redis-6081.pid
      • 50: port 6381
      • 69: bind 192.168.8.14
      • 108: logfile  redis-6081.log
      • 210: slaveof 192.168.8.14 6380        ******
    • 启动redis
      • ./redis6080/redis-server redis6080/redis.conf
      • ./redis6081/redis-server redis6081/redis.conf
    • 检查效果:
      • 进入6380redis
        • redis-cli -h 192.168.8.14 -p 6380
      • 检查效果
        • info Replication
      • 添加数据
        • set data_key 6380-6381
      • 进入6381redis
        • redis-cli -h 192.168.8.14 -p 6381
      • 检查效果
        • info Replication
          • 查看redis的信息,可以查看主从关闭,配置信息等
      • 查看数据
        • get data_key
  • 主从redis可以进行的操作
    • 默认redis的主从是读写分离的,即只有主才可以进行写操作,从redis只能读取数据库内容
 Redis集群
  • redis集群的简介
    • 为什么要有redis集群
      • 之前我们已经讲了主从的概念,一主可以多从,如果同时的访问量过大(1000w),主服务肯定就会挂掉,数据服务就挂掉了或者发生自然灾难,为了让数据分布在多个redis上,将多个redis视为一个整体的服务,这时候我们就可以应用集群
    • 什么是集群
      • 集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
      • Redis 集群由多个运行在集群模式(cluster mode)下的 Redis 实例组成,实例的集群模式需要通过配置来开启, 开启集群模式的实例将可以使用集群特有的功能和命令。
    • 集群的概念图
    • 集群的分类
      • 软件层面
        • 只有一台电脑,在这一台电脑上启动了多个redis服务。
      • 硬件层面
        • 存在多台实体的电脑,每台电脑上都启动了一个redis或者多个redis服务。
  • 使用集群的注意事项
    •  配置集群文件
      • port
        • -- 单主机集群或多主机集群 都必须设置
      • bind
        • -- 单主机集群可以不设置,但多主机集群必须设置为本机IP
      • daemonize
        • -- 测试环境和生产环境尽量都设置,不然实验或生产时候非常麻烦
      • pidfile
        • -- 测试环境和生产环境推荐设置,服务的标识
      • cluster-enabled
        • -- 开启redis实例的集群模式,集群必须设置
      • cluster-config-file
        • -- 集群配置文件路径,启动时自动创建并更新该文件,推荐使用port标识的集群唯一文件名
      • cluster-node-timeout
        • -- 集群验证超时时间,一个节点如果超出改时间未响应将视为故障节点
      • appendonly
        • -- 日志配置,每次操作都记录
    • 创建集群注意事项:
      • redis集群正常运行至少三个主节点
      • 集群测试实验时候推荐使用至少6个redis实例节点,三主三从,一一对应。
      • 集群的redis实例节点,需要专用目录和专用配置文件,配置文件中涉及到的唯一标识用自己的port号码
      • 集群redis实例节点启动时候,会自动生成自己的ID,而且这个id是集群生命周期中节点的唯一识别码
      • cluster-config-file 文件的目录是redis的家目录下
      • 创建集群的时候,任何节点中都不允许有key
      • 创建的集群既有主从对应关系,数据只是基于主从节点进行备份,所以只有主从节点可以进行数据交流
      • 如果使用-c登录到集群,不是在哪个主分支上提交数据就使用哪个分支提交,redis会根据c16算法来进行分配进行提交的服务器
    • 创建集群应用的命令
      • 创建集群命令
        • redis-trib.rb create -- replicas 1 IP1:PORT1 IP2:PORT2 IP3:PORT3 IP4:PORT4 IP5:PORT5 IP6:PORT6
      • 命令格式详解:
        • redis-trib.rb      -- 系统环境变量路径中的集群操作命令
        • create      -- 是创建集群的命令参数
        • --replicas 1    -- 为集群中的每个主节点创建一个从节点,因为我们配置的时候就是三主三从,一一对应
        • IPn:PORTn       -- 需要加入到集群中的各个redis实例
      • 使用总结
        • 上面命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。命令执行成功后,就会打印出一份集群中所有节点信息的配置展示, 如果确定觉得没问题的话,输入 yes, redis-trib 就会将这份配置应用到集群当中.
        • redis-trib默认用前3个实例作为Master,后3个作为Slave。因为Redis基于Master-Slave做数据备份,而非像Cassandra或Hazelcast一样不区分结点角色,自动复制并分配Slot的位置到各个结点;
  • 创建集群案例(按步骤执行)
    • 集群单个节点的配置流程
      • 1、创建文件目录
        • mkdir redis7001
      • 2、配置redis配置文件
        • cat << EOF >> redis7001/redis.conf
        • port 7001
        • bind 192.168.8.14
        • daemonize yes
        • pidfile 7001.pid
        • cluster-enabled yes
        • cluster-config-file 7001_node.conf
        • cluster-node-timeout 15000
        • appendonly yes
        • EOF
      • 3、批量创建6个redis配置文件并启动服务
        • for i in 1 2 3 4 5 6
        • do
        • mkdir redis700$i
        • cat << EOF >> redis700$i/redis.conf
        • port 700$i
        • bind 192.168.8.14
        • daemonize yes
        • pidfile 700$i.pid
        • cluster-enabled yes
        • cluster-config-file 700$i-node.conf
        • cluster-node-timeout 15000
        • appendonly yes
        • EOF
        • redis-server redis700$i/redis.conf
        • done
    • 创建redis集群
      • 配置ruby环境
        • apt-get install ruby
          •  集群是ruby语言开发的,所以需要安装ruby的开发环境
      • 配置集群所用命令
        • 查看redis自带程序redis-trip的位置
          • python:~/redis$   sudo  find / -name "redis-trib.rb"
            • /usr/share/doc/redis-tools/examples/redis-trib.rb
        • 将命令移动到普通用户可执行命令的专用目录
          • sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb   /usr/local/bin/
      • 创建集群
        • redis-trib.rb create --replicas 1 192.168.8.14:7001 192.168.8.14:7002 192.168.8.14:7003 192.168.8.14:7004 192.168.8.14:7005 192.168.8.14:7006
    •  运行检查集群创建后的结果
      • 登录任一节点
        • redis-cli -c -h 192.168.8.14 -p 7001
          • -c  是表示连接到集群
      • 查看集群信息
        • cluster info
      • 查看集群详细信息以及主从关系和标志位等
        • cluster nodes
      • 在主从关系中进行数据检查:
        • 登录7001 建立数据
          • python:~/redis$ redis-cli -c -h 192.168.8.14 -p 7001
          • keys *
          • (empty list or set)
          • set name nihao
          • Redirected to slot [5798] located at 192.168.8.14:7002        # 提示我们通过7002写入了数据
          • quit
        • 登录7002进行数据验证
          • python:~/redis$ redis-cli -c -h 192.168.8.14 -p 7002
          • keys *
          • 1) "name"
          • get name
          • "nihao"
  • 集群常见异常--创建集群报错
    • 异常发生场景
    • 产生原因
      • 天朝的防⽕墙导致⽆法下载最新版本,所以需要设置 gem 的源
    • 解决办法
    • -- 然后重新执⾏集群指令
  • 集群与python交互
    • 安装redis-py-cluster模块
      • pip install redis-py-cluster
    • 编辑代码
  • 集群的数据写入--我们写在哪个服务器上---CRC16算法
    • redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中 的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保 证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
    • Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希 槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈 希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的 时候看到set 和 get 的时候,直接跳转到了7000端⼝的节点
    • Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节 点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充 当 master
    • 需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了
 
刘小恺(Kyle) wechat
如有疑问可联系博主