spring4.0.9结合redis进行数据的缓存--续1

来源:互联网 发布:实用安卓pp推荐知乎 编辑:程序博客网 时间:2024/05/26 15:57

我继续改造我上一篇文章中提到的项目,这里需要实现几个目标:

一、redis集群(一主两从)的主从复制  

二、读写分离  

三、redis只做缓存(redis也会进行持久化),MySQL做持久化。

四、使用容灾部署实现高可用(哨兵sentinel)

一、redis集群(一主两从)的主从复制  

  我这里启动三台虚拟机,分别是:

1、192.168.100.131(主机) 

2、192.168.100.132(从机1)

3、192.168.100.133(从机2)

启动三台机器,三台机器的的redis.conf 文件需要做一些配置,由于文件内容太长,

我这里简单写下我的主要配置

主机的redis.conf

bind 0.0.0.0    masterauth xujiandu  slave-read-only yes requirepass xujiandu
从机的redis.conf

 slaveof 192.168.100.131 6379   requirepass xujiandu   masterauth xujiandu

启动三台虚拟机,然后通过命令启动redis.server(指定配置好的redis.conf)

打开redis.cli

输入info Replication

如下所示,表示已经启动成功


启动完毕之后,我启动项目,我的项目会将我mysql的常用数据缓存的redis里面。

第一次使用命令keys * 查询的时候,我们看到里面并没有任何值,我启动完项目之后,实现了主从复制,如下图所示


二、读写分离

redis一般是用作内存数据库,一般不存在IO瓶颈,但是单台redis总是有极限,虽然磁盘io瓶颈少了,如果有persistent的需求,这样的话IO瓶颈,所以还是需要用redis cluster进行读写分离。只要主服务器之只能进行写,从服务器进行读。然后通过主从复制实现数据的最终一致性。我们在主服务器的redis.conf配置如下属性即可。

slave-read-only yes 

加入该属性,从服务器写入的操作将会提示错误。

三、Redis只做缓存(redis也会进行持久化),MySQL做持久化。

redis持久化方式有2中,分别是RDB,AOF。

1、RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
2、AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

我这里2种方式都会使用那么需要配置配置一下redis.conf

RDB配置

1、设置数据保存到数据文件中的save规则

save 900 1save 300 10save 60 10000
2、文件名称

dbfilename dump.rdb #指定rdb保存到本地数据库文件名

AOF配置

appendonly yes appendfilename "appendonly.aof"appendfsync everysec
配置好了之后。会在你是指定的目录下生成对应的dump.rdb和appendonly.aof


另外, redis的持久化是不可靠的,很有可能会丢失最后一次的数据。网上说了好几种数据库和redis同步的方案,

方案1、程序同时写Redis和MySQL

方案2、程序写MySQL, 使用Gearman调用MySQL的UDF,完成对Redis的写

方案3、程序写MySQL, 解析binlog,数据放入队列写Redis

方案4、程序写Redis,并将写放入MQ写MySQL

其实本质上都是需要保证的是Reids和MySQL的数据一致性。

方案2、3、4没有具体实践过,方案1存在缺点:用户如果直接操作数据库,不通过程序的话,那么数据是无法被写到redis里面的。

四、使用容灾部署实现高可用(哨兵sentinel)

我这里使用搭建集群的整体架构,使用主从结构+哨兵(sentinel)来进行容灾,先说说哨兵的作用

1、监控:监控主从是否正常
2、通知:出现问题时,可以通知相关人员
3、故障迁移:自动主从切换
4、统一的配置管理:连接者询问sentinel取得主从的地址 

sentinel和主从关系入下图所示


下面是我对sentinel.conf的配置

主sentinel.conf

bind 0.0.0.0port 26379sentinel monitor mymaster 127.0.0.1 6379 2sentinel down-after-milliseconds mymaster 3000

从sentinel.conf

bind 0.0.0.0port 26379sentinel monitor mymaster 192.168.100.131 6379 2sentinel down-after-milliseconds mymaster 3000
启动哨兵 

进入你安装redis的目录输入 ./redis-sentinel /你所配置的sentinel的路径/sentinel.conf

启动三台虚拟机的redis服务,然后shutdown主节点。入下图所示

在哨兵将会进行投票,从2台丛机中选择一个升级为主机。





最后:现在我的项目已经从原来的:单机mysql演变成了如下图所示的架构















1 0