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 的源
- 解决办法
- -- 先查看⾃⼰的 gem 源是什么地址
- gem source
- 如果是https://rubygems.org/ 就需要更换
- -- 更换指令为下面地址
- -- 通过 gem 安装 redis 的相关依赖
- sudo gem install redis
- -- 然后重新执⾏集群指令
- 集群与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个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了