redis集群
主从复制
在主从复制中,数据库分为俩类,主数据库(master)和从数据库(slave)
- 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
- 从数据库一般都是只读的,并且jie shou主数据库同步过来的数据
- 一个master可以拥有多个slave,但是一个slave只能对应一个master
### 哨兵模式
哨兵的作用是监控 redis系统的运行状况
- 监控主从数据库是否正常运行
- master出现故障时,自动将slave转化为master
- 多哨兵配置的时候,哨兵之间也会自动监控
- 多个哨兵可以监控同一个redis
### 集群模式
使用集群,只需要将每个数据库节点的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行
- 集群会开放两个tcp链接端口,一个用作正常的管理链接,如6379,另一个通常在管理端口上加10000,用作集群间的通信
- 集群的数据是分片存储的,利用一致性的哈希算法对数据进行分片,每个节点负责一部分hash槽,用来存储数据
- 集群具备主从模式,每个主节点都会搭建一个从节点保证无单点故障
- 集群无法保证强一致性,原因是由于主从复制是异步进行的
redis群集搭建
安装redis服务
- 安装epel源
yum -y install epel-release
- 安装redisf服务
yum -y install redis
下载redis-trib.rb工具
- 查看版本
redis-server --version
- 根据服务的版本查看redis源码包
wget http://download.redis.io/releases/redis-3.2.12.tar.gz
- 源码包解压
tar xf redis-3.2.12.tar.gz
- 复制ruby工具到/usr/bin目录下
cp redis-3.2.12/src/redis-trib.rb /usr/bin/
创建redis服务需要的配置文件
- 创建群集存放的目录
mkdir -p redis-cluster/{7001,7002,7003,7004,7005,7006}
- 编辑集群配置文件,并修改端口号
##配置文件一
vi redis-cluster/7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
##配置文件二
vi redis-cluster/7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
##配置文件三
vi redis-cluster/7003/redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
##配置文件四
vi redis-cluster/7001/redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
##配置文件五
vi redis-cluster/7005/redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
##配置文件六
vi redis-cluster/7006/redis.conf
port 7006
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
启动redis
- 进入各自的配置目录以后台的方式启动集群方式启动redis
cd redis-cluster/7001
redis-server redis.conf &
cd redis-cluster/7002
redis-server redis.conf &
cd redis-cluster/7003
redis-server redis.conf &
cd redis-cluster/7004
redis-server redis.conf &
cd redis-cluster/7005
redis-server redis.conf &
cd redis-cluster/7006
redis-server redis.conf &
安装ruby环境
- 安装ruby环境
yum -y install suby
- 安装ruby的gems包管理工具
yum -y install rubygems
- 使用gem包管理工具安装redis的ruby环境,用来支持redis-trib.rb运行
gem install redis
升级ruby环境(无报错不执行)
- 报错的状况,原因是因为版本太低,无法安装,需要升级ruby环境
[root@localhost 7006]# gem install redis
Fetching: redis-4.1.0.gem (100%)
ERROR: Error installing redis:
redis requires Ruby version >= 2.2.2. #这里是版本
- 安装ruby下载的密钥
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
- 下载ruby包并执行安装
curl -sSL https://get.rvm.io | bash -s stable
- 加载profile下的rvm脚本文件
source /etc/profile.d/rvm.sh
- 列出环境列表
rvm list known
- 升级版本
rvm install 2.4.1
- 重新安装redis-trib.rb运行所需要的ruby环境
gem install redis
### 用ruby工具创建集群
redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
测试集群服务
- 集群连接redis方式
redis-cli -c -p 70001
- 设置一个键值对
set a b
- 自动切换的情况下根据键获取值
get a
- 设置一个列表
lpush alice name age sex
- 获取一个列表
lrangr alice 0 10
事务
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
-
批量操作在发送 EXEC 命令前被放入队列缓存。
-
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
-
DISCARD 取消事务,放弃执行事务块内的所有命令。
-
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
三种模式:
- 开始事务
- 命令入队
- 执行事务
事务命令:
- discard:取消事务,放弃执行事务块内的所有命令。
- exec:执行所有事务块内的命令。
- nulti:标记一个事务块的开始
- unwatch:取消 WATCH 命令对所有 key 的监视。
- watch key [key …]:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
实例:
redis 127.0.0.1:7000> multi
OK
redis 127.0.0.1:7000> set a aaa
QUEUED
redis 127.0.0.1:7000> set b bbb
QUEUED
redis 127.0.0.1:7000> set c ccc
QUEUED
redis 127.0.0.1:7000> exec
1) OK
2) OK
3) OK