redis中
读操作是读从机
写的操作是针对于主机(一主多从)
假设主机挂了,备机还在工作,此时可以手动从备机中选一台让它作为主机!
哨兵模式:主机一旦挂掉,哨兵模式会自动从从机中选择一个作为主机,这种方法的可用性就很高了。
搭建一主二从的步骤:首先切换目录到/usr/local/bin 然后从/opt/redis-5.0.0下复制三个配置文件到/usr/local/bin,分别给三个机器使用。
分别对三个配置文件进行如下的修改
tips:
vim下 /+内容 可以快速匹配搜索,n表示下一个 shift+n表示上一个。
ctrl shift v 或者是鼠标右键都是粘贴
设置任何机器都可以访问
关闭保护模式
指定端口号
开启线程守护
进程文件
分别启动三个进程
查看启动的进程
ps是显示当前状态处于running的进程,grep表示在这些里搜索,而ps aux是显示所有进程和其状态。
ps aux | grep redis
查到redis的进程
kill -s 6379 pid
杀死redis进程
分别查看三个进程是否正常运行
杀死所有进程
开三个窗口分别进入/usr/local/bin目录
把三个都启动起来
进入客户端并查看信息
master 三个主机 0表示没有从机
配置从机:将2、3都设置为从机
分别查看信息,可以看到只有6379是主机master,另外两个是从slave,state=online表示联机状态 ,从机的state=up表示在上面
在主机上加数据从机都可以看到
模拟第二台从机损坏
继续在主机上存数据
可以看到好的从机依然可以拿到数据
重新开启坏掉的从机
坏掉的数据没有保存到从机
再次跟随主机,会发现数据回来了,其实是从主机复制过来的。
模拟主机挂掉
从机的status变成down
重新启动主机,发现从机会自动连上来
模拟主机损坏得到修复后再存储数据
从机能正常拿到数据
测试连接
测试读写操作:
package com.lay.kangan.utils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.Random;
/**
* @author Dragon code!
* @create 2022-04-01 10:33
*/
public class JedisUtil {
public static JedisPool pool = null;
//用于写的redis
public static Jedis getWriteJedis(){
Jedis jedis = getPool("192.168.xxx.xxx",6379).getResource();
return jedis;
}
//用于读的redis
public static Jedis getReadJedis(){
//轮询算法,实现负载均衡
Random random = new Random();
//随机0、1
int num = random.nextInt(2);
System.out.println(num);
int port = Integer.valueOf("638" +num);
Jedis jedis = getPool("192.168.xxx.xxx",port).getResource();
return jedis;
}
public static JedisPool getPool(String host,int port) {
//单例模式
synchronized (JedisPool.class) {
if (pool == null) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(15);
//最小空闲数量
poolConfig.setMinIdle(3);
poolConfig.setMaxIdle(10);
pool = new JedisPool(poolConfig,host,port);
}
}
return pool;
}
//把池中获取的连接对象归还
public static void releasePool(JedisPool pool, Jedis jedis){
pool.returnBrokenResource(jedis);
}
public static void main(String[] args) {
//测试写的redis
Jedis wj = getWriteJedis();
wj.set("k4","v4");
//测试从机读的redis
Jedis readJedis = getReadJedis();
System.out.println(readJedis.get("k4"));
}
}
薪火相传:
让从机跟随从机。
假设有一份数据保存到主机,此时主机只需要把数据给直接连接的从机,从机的从机由从机传数据。
反客为主:
主机挂掉,将从机6380设置为主机
redis从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
将第二台从机挂到新上位的主机上
坏掉的主机好了后直接将它作为从机跟随6380主机,此时6380是主机,6379和6381都是从机
哨兵模式:反客为主的自动版!(最实用)
采用哨兵后整个主从切换直接自动化。
哨兵每隔一段时间发ping判断是否死了(心跳),不会一次未响应就判断为死,如果发现真的主机死了后,进行选举操作。
所有的从机来投票,不能投自己,谁得票多,谁就是主机。
最后的1表示票数
配置完成后启动哨兵进行监控:
模拟79主机坏掉,此时哨兵起反应通过选举,结果为81被选为主机
79主机恢复后直接变为从机跟随81
注意达到高可用至少两个哨兵,可以解决哨兵的单点故障