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的主从配置成功。
值的注意的是:从库默认是只读的,是不可以写的。
但是从机并不能写入:
5.搭建哨兵模式
此实验在上一个实验基础上进行。
(1)哨兵模式解决的问题
主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
(2)哨兵模式概述
Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。
哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
这里的哨兵有两个作用:
- (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主从服务器信息
在备redis(server2和server3)上:
开启哨兵:
redis-server /etc/redis/sentinel.conf --sentinel
主Redis(server1)上:
[root@server1 ~]# redis-cli
127.0.0.1:6379> info #查看master信息
[root@server1 ~]# redis-cli -p 26379
127.0.0.1:26379> info #查询master哨兵信息
注意启动的顺序。首先是主机(server1)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。
模拟故障测试:
主Redis(server1)上:
其中+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哨兵机制已经成功实现