1.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等客户端,使用很方便。

2.Redis集群介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:

1 自动分割数据到不同的节点上。

2 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

3.Redis主从复制

3.1. 主从复制的简单流程介绍:

1.Master可以拥有多个slave

2.多个slave可以连接同一个Master外,还可以连接到其他的slave

3.主从复制不会阻塞Master在主从复制时,Master可以处理client请求。

4.提供系统的伸缩性。

3.2. 主从复制简单原理的过程

1.slave与Master建立连接,发送sync同步命令。

也就是说当用户在Master写入一条命令后,他们之间会通过一些算法把数据同步到每一个slave上。

2.Msater会开启一个后台进程,将数据库快照保存到文件中。同时Master主进程会开始收集新的写命令并缓存。

3.后台完成保存后,就将文件发送给slave

4.slave将此文件保存在硬盘上。

4.Redis Sentinel(哨兵)模式

4.1. Sentinel工作方式:

1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令

2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。

3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。

4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线

5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令

6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次

7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。

若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

阿里消防员的Redis集群搭建

5.搭建redis主从环境

5.1. 下载和解包

cd /usr/local/

wget http://download.redis.io/releases/redis-3.2.1.tar.gz

tar -zxvf /redis-3.2.1.tar.gz

5.2.  编译安装

cd redis-3.2.1

make && make install

5.3. 创建redis节点

为了演示方便,方便大家在自己的机器上搭建环境来测试,我特意把所有客户端都安装到了同一台机器上,操作步骤如下:

1 在/usr/local/ 下新建一个目录redis-sentinel,然后在此目录下新建7501/ 7502/ 7503/ 7504/ 7505/ 7506/ 六个目录。

2.将redis安装目录下的reids.conf,拷贝到前4个目录下,分别命名为:

Redis-7501.conf redis-7502.conf redis-7503.conf redis-7504.conf

3 修改配置文件内容(以redis-7501.conf为例):

daemonize yes

Port 7501

Bind 192.168.12.90

logfile “./redis-7501.log”

4 将redis安装目录下的sentinel.conf拷贝到7505/和7506/目录下分别命名:

Sentinel-7505.conf sentinel-7506.conf

修改配置文件(以sentinel-7505.conf为例):

port 7505

sentinel monitor mymaster 127.0.0.1 7501 2

注:我们稍后要启动四个redis实例,其中端口为7501的redis设为master,其他三个设为slave 。所以my mymaster 后跟的是master的ip和端口,最后一个’2’代表我要启动只要有

2个sentinel认为master下线,就认为该master客观下线,启动failover并选举产生新的master。通常最后一个参数不能多于启动的sentinel实例数。

5、启动redis

分别启动4个redis实例:

目录切换到redis-3.2.1下的 src目录下

redis-server ../../redis-sentinel/7501/redis-7501.conf

然后分别登陆7502 7503 7504三个实例,动态改变主从关系,成为7501的slave:

redis-cli -h 127.0.0.1 -p 7502

192.168.12.90:7502> SLAVEOF 127.0.0.1 7501

从这个操作界面可以看到,我们实现了在主redis上设置的数据信息,同步到了备redis上了,真正实现了主从同步功能。

6.搭建redis-sentinel 集群环境

以后台启动模式启动两个sentinel(哨兵):

redis-sentinel ../../redis-sentinel/7505/sentinel-7505.conf &

同样的方法,切换到7506的目录下,启动7506的哨兵模式。

先来对sentinel一些命令介绍 :

要使用sentinel的命令,我们需要用redis-cli命令进入到sentinel,比如进入7505:

redis-cli -h 127.0.0.1 -p 7505

① INFO

sentinel的基本状态信息

②SENTINEL masters

列出所有被监视的主服务器,以及这些主服务器的当前状态

③ SENTINEL slaves

列出给定主服务器的所有从服务器,以及这些从服务器的当前状态

④SENTINEL get-master-addr-by-name

返回给定名字的主服务器的 IP 地址和端口号

⑤SENTINEL reset

重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。

⑥SENTINEL failover

当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新

接下来我们进行测试操作:

(1)登陆到 master:

redis-cli -h 192.168.12.90 -p 7501

192.168.12.90:7501> set name “zhangsan”

[root@localhost redis-sentinel]# redis-cli -h 127.0.0.1 -p 7502

192.168.12.90:7502> get name

“zhangsan”

192.168.12.90:7502> set age 24

(error) READONLY You can’t write against a read only slave.

可以看到:我们的主从模式中,slave默认是只读。

(2)目前7501是master, 我们强制kill掉 7501 的进程以后,可以看到sentinel打出的信息:

Kill -9 38905

下面就会输出sentinel的输出信息,里面进行决策选出新的master。

可以看到,sentinel已经将7504这个redis instance提升为新的master,稍后将7501这个实例启动,动态作为7504的slave,这样就手动恢复了redis 集群。

7.强调文字Redis优缺点

优点:

1 读写性能优异

2 支持数据持久化,支持AOF和RDB两种持久化方式

3 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。

缺点:

1 Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。

2 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。

3 Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

Redis应用场景,它能做什么
众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。
拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。
在这里我们对redis的集群搭建就全部结束了,谢谢大家共同学习进步,欢迎大家指导!