Redis主从模式
目录:
1、Redis主从模式简单介绍:
2、Redis主从模式的部署安装:
3、测试从服务器的只读:
4、测试主节点宕机故障恢复:
1、Redis主从模式简单介绍:
图1.1 主从模式架构
主从模式:
使用一个Redis实例作为主机,其余的作为备份机。主机和备份机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取。也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。
主节点宕机:
slave从节点不会竞选成为master。因为每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接。
2、Redis主从模式的部署安装:
(1)wget http://download.redis.io/releases/redis-4.0.8.tar.gz
wget命令:后台执行下载任务,通过网络下载资源,下载资源默认为当前目录。
(2)tar -xzvf redis-4.0.8.tar.gz
解压文件:x参数:解压文件;z参数:通过gzip指令处理备份文件;v参数:显示执行过程;f参数:指定备份文件
(3)cd redis-4.0.8
(4)make命令进行安装
使用默认的makefile文件进行编译。
(5)安装完毕后,将redis-server、redis-cli、redis.conf文件复制到新建的目录中:/usr/local/redis,然后修改redis.conf文件。
图2.1 截图1
(6)修改主服务器中conf文件中的以下参数:
daemonize yes
port 6379
requirepass qinyi123456
bind 172.18.6.92
dir /usr/local/redis/snap
logfile "./logs/redis_master.log"
(7)修改另外两台从服务器中conf文件中的以下参数:
daemonize yes
port 6379
slaveof 172.18.6.92 6379
一台为:bind 172.18.6.93以及另一台为:bind 172.18.6.91
dir /usr/local/redis/snap
一台为:logfile "./logs/redis_slave1.log"以及另一台为:logfile "./logs/redis_slave2.log"
附注(部分参数说明):
①daemonize yes:使得Redis可以以守护进程的形式运行
②port 6379:指定Redis监听的端口,默认端口是6379
③bind 172.18.6.92:配置绑定的主机地址,这个地址用于外部主机的访问
④timeout 1800:设置客户端闲置多久后会关闭连接,此处设置为1800秒,如果指定为0,表示关闭此功能
⑤loglevel notice:设置日志的记录级别,有四个级别:
图2.2 截图2
debug:大量信息,对开发和测试适用
verbose:很多精简有用的信息
notice:生产环境中需要的适量的信息
warning:只记录重要的或严重的信息
⑥logfile "./logs/redis_master.log":设置日志文件
⑦databases 16:设置数据库的数量为16
⑧save 900 1:表示900秒后至少有1个更新操作,就将数据同步到数据文件
save 300 10:表示300秒后至少有10个更新操作,就将数据同步到数据文件
save 60 10000:表示60秒后至少有10000个更新操作,就将数据同步到数据文件
⑨stop-writes-on-bgsave-error yes:如果开启了RDB快照,并且最新的后台保存失败,Redis默认会停止接受写操作,使得用户知道数据没有正确的持久化到硬盘中。
⑩dbfilename qinyi.rdb:指定本地数据库文件名,默认值是dump.rdb
①①dir /usr/local/redis/snap:指定本地数据库存放目录
①②slaveof
①③masterauth qinyi123456:当master服务设置了密码保护时,slave服务连接master的密码
①④requirepass qinyi123456:设置redis连接密码,如果配置了连接密码,客户端在连接redis时需要通过auth <密码>命令提供密码
①⑤slave-read-only yes:配置salve实例只读而不能进行写操作
①⑥maxclients 10000:设置同一时间客户端的最大连接数
(8)启用Redis-server:/usr/local/redis/redis-server /usr/local/redis/redis.conf
(9)使用客户端登入主服务器:/usr/local/redis/redis-cli -h 172.18.6.92 -p 6379 -a qinyi123456
图2.3 截图3
(10)使用客户端登入从服务器,并测试从服务器是否可以写:
图2.4 截图4
因为有slave-read-only yes的配置,所以从服务器可以读,但不能写,在写入时会报错。
(11)info Replication:查看master主服务器的主从复制的信息
图2.5 截图5
查看到role角色是master,连接的从服务器有两台(connected_slaves:2),
(11)info Replication:查看slave从服务器的信息
图2.6 截图6
查看到slave从服务器的信息,包括slave的优先级(这里是100,当出现master宕机时,优先级数字小的slave会优先考虑提升为master)、只读状态(这里是1,表示启用了只读),连接的slave数为0。
3、测试从服务器的只读:
package com.remoa.redis.action;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author qinyi
* @since 2018/02/23
*/
public class Test {
private static JedisPool jedisPool = null;
public static void main(String[] args) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(100);
//超时时间为10 * 1000,即十秒
jedisPool = new JedisPool(jedisPoolConfig, "172.18.6.92", 6379, 10 * 1000, "qinyi123456");//测试连接主节点,因为redis.conf文件中配置了连接密码“requirepass qinyi123456”,所以这里需要指定密码
Jedis resource = jedisPool.getResource();
System.out.println("master服务器返回:" + resource.ping());//使用客户端向Redis服务器发送一个ping,如果服务器运作正常的话, 会返回一个pong
resource.set("remoa", "boy");
System.out.println(resource.get("remoa"));
resource.set("remoa", "senior students");
System.out.println(resource.get("remoa"));
jedisPool = new JedisPool(jedisPoolConfig, "172.18.6.93", 6379, 10 * 1000, "qinyi123456");//测试连接从节点
resource = jedisPool.getResource();
System.out.println("slave服务器返回:" + resource.ping());
resource.set("remoa", "male");
System.out.println(resource.get("remoa"));
}
}
运行结果:
图3.1 运行结果
4、测试主节点宕机故障恢复:
(1)首先修改防火墙配置打开三台机器中相应的redis端口:/etc/sysconfig/iptables
重启防火墙配置:service iptables restart
外部主机使用telnet进行端口测试: telnet 172.18.6.91 6379
(2)使用外部机器进行测试,连接redis主节点,
(3)kill掉主节点master的实例:
ps aux | grep redis
kill -9 6995
图4.1 截图7
(4)然后再尝试连接redis master节点
发现master主节点无法连接,而从节点可以连接。也就是说,当主节点宕机时,slave节点不会重新竞选为master节点,因此需要人工进行故障转移工作。
图4.2 截图8