1.redis是什么?

基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
redis是一个key-value存储系统。
它支持存储的value类型:string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的,
与memcached一样,数据都是缓存在内存中。。
redis会周期性的把更新的数据写入磁盘(rdb)或者把修改操作写入追加的记录文件(aof),
并且在此基础上实现了master-slave(主从)同步。

2.主从复制概念

主从复制模型中,有多个redis节点。
其中,有且仅有一个为主节点Master。从节点Slave可以有多个。

只要网络连接正常,Master会一直将自己的数据更新同步给Slaves,保持主从同步。
特点
(1)主节点Master可读、可写.

(2)从节点Slave只读。(read-only)

因此,主从模型可以提高读的能力,在一定程度上缓解了写的能力。因为能写仍然只有Master节点一个,可以将读的操作全部移交到从节点上,变相提高了写能力。

3.实验环境

本实验搭建主从同步,一主两备

主机信息

主机功能

server1(172.25.1.1)

redis主服务器

server2(172.25.1.2)

redis从服务器1

4.实验步骤

主Redis(server1)上:

<1>安装redis
(1)下载安装包:redis-5.0.3.tar.gz,并解压

[root@server1 ~]# tar zxf redis-5.0.3.tar.gz
[root@server1 ~]# cd redis-5.0.3		#进入解压目录

(2)下载编译依赖的软件gcc

[root@server1 redis-5.0.3]# yum install gcc -y

(3)cd redis-5.0.3进行编译

[root@server1 redis-5.0.3]# make
 [root@server1 redis-5.0.3]# make install

(4)cd utils执行./install_server.sh,一路敲回车。会生成配置文件,端口信息等。

[root@server1 redis-5.0.3]# cd utils/
[root@server1 utils]# ./install_server.sh

至此redis的安装,也就完成了。当redis安装完成之后,redis服务就已经开启。可以来用查看端口的方法(redis服务的端口是6379),来查看redis服务是否开启。

<2>配置redis
(1)修改配置文件

[root@server1 utils]# vim /etc/redis/6379.conf 

70    bind 0.0.0.0             #将70行的bind这行改掉,监听所有IP网段

(2)修改完配置文件后,重启redis服务(因为执行完./install_server.sh脚本之后,redis服务已经开启,所以这里是重启redis服务,而不是开启redis服务)

[root@server1 utils]# /etc/init.d/redis_6379 restart

至此redis的配置也就完成了。此时再次查看redis的端口信息,可以看到,redis监控的端口信息是0.0.0.0:6379和127.0.0.1:6379,而并不再只是127.0.0.1:6379。
配置server2(从机):
<1>安装redis,安装过程同server1
或者直接将server1上安装好的目录发送给server2,然后再在server2上执行剩下的操作,过程如下:

(1)将server1上安装好的目录发送给server2:

[root@server1 ~]# scp -r redis-5.0.3 root@172.25.63.3:/root/

(2)在server2上执行剩下的操作:

[root@server2 ~]# ls
redis-5.0.3
[root@server2 ~]# cd redis-5.0.3/
[root@server2 redis-5.0.3]# make install

<2>配置redis
(1)修改配置文件

[root@server2 utils]# vim /etc/redis/6379.conf
    
    bind 0.0.0.0                  #将70行的bind这行改掉,监听所有IP网段
    slaveof 172.25.63.4 6379      #在配置文件的最后一行指定主机的IP和端口(slaveof IP port做一主多从就在每台从机的配置文件中加上这行参数即可)

<3>重启redis服务
修改完配置文件后,重启redis服务(因为执行完./install_server.sh脚本之后,redis服务已经开启,所以这里是重启redis服务,而不是开启redis服务)

[root@server2 utils]# /etc/init.d/redis_6379 restart

配置server3(从机):
server2与server3操作完全相同

yum install -y gcc -y  #下载GNU编译器套件gcc
tar zxf redis-5.0.3.tar.gz  #解压redis安装包
cd redis-5.0.3 进入解压目录
make #编译
make install  #安装
cd utils/
./install_server.sh  #执行redis服务脚本
vim /etc/redis/6379.conf  #编辑配置文件
	bind 0.0.0.0 #修改监听端口
	slaveof 172.25.1.1 6379  #文件最后一行添加主redis信息
systemctl start redis_6379 #开启redis
netstat -antlp #查看开启端口

3.测试:
<1>主机设定key-value

在server1:

[root@server1 utils]# redis-cli 
127.0.0.1:6379> set name jpf
OK
127.0.0.1:6379> get name
"jpf"

可以设定键和value,那么当然也可以删除键及其对应的value。对应的命令就是"del name"
<2>查看从机能否获取到value值

[root@server2 utils]# redis-cli 
127.0.0.1:6379> get name
"jpf"
[root@server3 utils]# redis-cli 
127.0.0.1:6379> get name
"jpf"

结论:
在主机设定的key-value,在从机可以看到,表示redis的主从配置成功。

值的注意的是:从库默认是只读的,是不可以写的。

但是从机并不能写入:

redis desktop 切换db_redis


redis desktop 切换db_服务器_02

5.搭建哨兵模式

此实验在上一个实验基础上进行。
(1)哨兵模式解决的问题

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。

(2)哨兵模式概述

Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

redis desktop 切换db_配置文件_03


这里的哨兵有两个作用:

  • (1)通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
  • (2)0当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件(/etc/redis/sentinel.conf),让它们切换主机。

用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel系统,互相通信并交换彼此关于被监视服务器的信息
搭建哨兵模式步骤
主Redis(server1)上:

cp sentinel /etc/redis/ #将redis安装目录下哨兵配置文件复制到/etc/redis/
vim /etc/redis/sentinel.conf
	17 protected-mode no	#,将注释开启,表示关闭保护模式,便于测试。如果你不关闭保护模式,启动哨兵的时候,无法正常运行。  
	121 sentinel monitor mymaster 172.25.1.1 6379 2	##配置监听的master信息,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,172.25.1.1  #代表监控的主服务器,6379代表端口,后面的2表示投票机制,至少有2个节点认为master挂了,才会切换
	146 sentinel down-after-milliseconds mymaster 10000	##改为10s,表示master挂后10s会切换
####注意注意:一定要先scp到slave节点上再启动
scp sentinel.conf root@172.25.1.2:/etc/redis/ #将修改好的配置文件传给从redis,此时需要保证本机解析文件/etc/hosts里边配置好了server2的域名解析
scp sentinel.conf root@172.25.1.3:/etc/redis/
redis-server /etc/redis/sentinel.conf --sentinel	##开启哨兵

redis desktop 切换db_服务器_04


redis desktop 切换db_服务器_05


redis desktop 切换db_redis desktop 切换db_06


可以看到redis主从服务器信息

redis desktop 切换db_redis_07


在备redis(server2和server3)上:

开启哨兵:

redis-server /etc/redis/sentinel.conf --sentinel

主Redis(server1)上:

[root@server1 ~]# redis-cli
127.0.0.1:6379> info  #查看master信息

redis desktop 切换db_配置文件_08

[root@server1 ~]# redis-cli -p 26379
127.0.0.1:26379> info #查询master哨兵信息

redis desktop 切换db_配置文件_09


注意启动的顺序。首先是主机(server1)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。

模拟故障测试:

主Redis(server1)上:

redis desktop 切换db_服务器_10


redis desktop 切换db_配置文件_11


其中+sdown表示哨兵主观认为主数据库停止服务了,最后输出的+slave信息表示故障恢复后新的主从结构

可见172.25.1.3切换为master,172.25.1.2从机开始指向新的master同步(当然主机挂掉之后,谁成为master,这是随机的)此时在新的server2终端中查看redis状态:

在server3上查看master信息

[root@server3 ~]# redis-cli

127.0.0.1:6379> info #查看master信息

redis desktop 切换db_配置文件_12


redis desktop 切换db_服务器_13


此时说明redis哨兵机制已经成功实现