我继续改造我上一篇文章中提到的项目,这里需要实现几个目标:
一、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 1
save 300 10
save 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.0
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 3000
从sentinel.conf
bind 0.0.0.0
port 26379
sentinel monitor mymaster 192.168.100.131 6379 2
sentinel down-after-milliseconds mymaster 3000
启动哨兵
进入你安装redis的目录输入 ./redis-sentinel /你所配置的sentinel的路径/sentinel.conf
启动三台虚拟机的redis服务,然后shutdown主节点。入下图所示
在哨兵将会进行投票,从2台丛机中选择一个升级为主机。
最后:现在我的项目已经从原来的:单机mysql演变成了如下图所示的架构