笔记|Redis-redis概念、配置、Sentinel高可用

一 Redis概念

如果涉及大数据量的需求,比如淘宝抢购,或者是主页访问量瞬间增大的时候,单一数据库来保存数据的系统由于面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,大量访问极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
NoSQL内存数据库(非关系型的数据库)是最近兴起的新型数据库,它的特点就是把数据放在内存中操作,数据处理速度相对于磁盘提高了好几个量级,因此,通过把经常访问的数据转移到内存数据库中,不但可以缓解Oracle的访问压力,而且可以极大提高数据的访问速度,提高用户体验。
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的键值对(Key-Value)数据库。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
Redis是一个内存型数据库。不限于此,Redis也可以把数据持久化到磁盘中,或者把数据操作指令追加了一个日志文件,把它用于持久化。也可以用Redis容易的搭建master-slave架构用于数据复制。
redis优点
  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API
如果我们把数据放在 Redis 中,是基于内存的,让服务端直接去读取内存中的数据,读写速度会快速增加,并且会减小数据库的压力,但是内存进行数据存储开销比磁盘大,一般只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。
二 Redis安装和环境配置: 下载redis,查看README文件,选择SYSTEMD方式编译,编译时要安装部分依赖,全部ENTER回车即可
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

编译成功,make install 安装即可笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

使用源码包里的脚本install_server.sh来创建实例:由于使用systemd编译的,所以提示使用systemd命令,本实验不使用systemd命令,更改install_server.sh文件即可笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

使用脚本来创建实例,创建的时候有提示,全部回车即可。
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

上面创建了两个实例端口分别为6379、6380。删除实例6380笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

默认redis只监听本机回环接口127.0.0.1,远程主机无法访问,修改redis监听端口为0.0.0.0表示监听本机所有接口。
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

进入redis实例,查看信息笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server1 此时的状态为master,没有slave笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

添加server2上的redis为slave:
server2上安装redis
server1上把redis目录发送给server2
[root@server1 ~]# scp -r redis-6.2.4 server2:

server2上安装笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server2上查看redis信息,状态为master
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

把server2变为server1的slave节点 :下图写的是server1的ip和端口
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

【笔记|Redis-redis概念、配置、Sentinel高可用】server2 redis-cli 进入实例查看信息发现6379已经变为slave:
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server1上查看redis信息识别到了slave:笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

测试:server1上定义一个key,值是hahaha。笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server2上同步到数据
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

slave只读,redis作为slave接入master时会放弃本机所有数据,和master保持完全一致
redis支持的数据类型:
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)
redis常用指令:
config get *//查看配置
select 1//选择数据库 ,总共16个数据库,0~15
flushdb//清空当前数据库
flushall//清空所有数据库
move key 1//移动key到其他数据库
del key//删除
rename oldkey newkey//改名
expire key 10//设置过期时间
persist key//设置持久化
keys user*//查询
exists key//判断是否存在
三 RedisSentinel高可用配置 笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

高可用时,当master和slave之间网络故障后,sentinel哨兵模式会在上图右边部分slave中选取一个成为新的master,其他slave又指向新的master,当原来master恢复后,只能作为slave节点,此时原master会放弃本机所有数据,这就导致一个问题:在原master和slave之间网络故障后,客户端还在向原master里面写入数据,原master转换为slave时同样会放弃客户端传过来的新数据,导致客户数据丢失。所以添加参数min-slave-to-write=2,最小连接数是2。保证当和master所链接的slave小于2个时,禁止客户向master写入数据。
Redis 的 Sentinel (哨兵)系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。
首先再添加server3作为slave 端,和server2相同操作:
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片


笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server3查看redis状态为slave:笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server1查看redis状态server3作为slave已经添加到集群节点
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

resdis一主两从实现,server1为master,server2、3是slave
server1上热生效:重启服务没了
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

添加到配置文件永久生效
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server1 master上配置sentinel哨兵文件,并发送给server2、3笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

三个结点上全部运行哨兵进程。哨兵进程不打入后台是为了清楚观察自动切换master变化:
server1上显示server1为master,2、3为slave。
当server1哨兵进程运行后,/etc/redis/sentinel.conf信息就变了。所以server1上不要先运行哨兵进程,在把哨兵文件发给server2、3。笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server2、3上进程显示一主两从:笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

打开一个新的shell连接到server1上,关闭server1上的redis: 笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

server3上哨兵进程显示,选举server3成为新的master 笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

把server1启动起来,server1添加到slave中
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

-down表示server1已启动,不在是down状态。
笔记|Redis-redis概念、配置、Sentinel高可用
文章图片

打开一个新的shell连接到server3上,查看redis信息,发现一主两从,server3是master,1、2是slave:笔记|Redis-redis概念、配置、Sentinel高可用
文章图片



R

    推荐阅读