1.实现数据库高可用

1.1 搭建策略

1.1.1 问题说明

说明:如果根据如下的配置实现数据库的代理,如果数据库主库宕机,则直接影响整个程序的执行.所以需要实现高可用机制.
高可用实现的问题:
如果实现了数据库高可用,可以自动的切换数据库,由于用户直接操作了从库,当主库启动时发现数据不一致时,主从同步的状态将会终止.
12-数据库高可用 Redis入门 - 图1

1.1.2 双机热备(双主模式)

说明:可以通过数据库双主模式实现数据库高可用.
双主模式实质都是主机,互相备份.
12-数据库高可用 Redis入门 - 图2

1.1.3 双机热备的实现

之前的配置:
主机: 192.168.126.129
从库: 192.168.126.130
现在的配置:
主机: 192.168.126.130
从库: 192.168.126.129
1).检查主库状态
12-数据库高可用 Redis入门 - 图3
2).实现数据库主从搭建
12-数据库高可用 Redis入门 - 图4

1.2 数据库高可用实现

1).编辑配置文件

  1. <?xml version="1.0"?>
  2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3. <mycat:schema xmlns:mycat="http://io.mycat/">
  4. <!--name属性是自定义的 dataNode表示数据库的节点信息 jtdb表示逻辑库-->
  5. <schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/>
  6. <!--定义节点名称/节点主机/数据名称-->
  7. <dataNode name="jtdb" dataHost="localhost1" database="jtdb" />
  8. <!--参数介绍 UTF-8 中文报错-->
  9. <!--balance 0表示所有的读操作都会发往writeHost主机 -->
  10. <!--1表示所有的读操作发往readHost和闲置的主节点中-->
  11. <!--writeType=0 所有的写操作都发往第一个writeHost主机-->
  12. <!--writeType=1 所有的写操作随机发往writeHost中-->
  13. <!--dbType 表示数据库类型 mysql/oracle-->
  14. <!--dbDriver="native" 固定参数 不变-->
  15. <!--switchType=-1 表示不自动切换, 主机宕机后不会自动切换从节点-->
  16. <!--switchType=1 表示会自动切换(默认值)如果第一个主节点宕机后,Mycat会进行3次心跳检测,如果3次都没有响应,则会自动切换到第二个主节点-->
  17. <!--并且会更新/conf/dnindex.properties文件的主节点信息 localhost1=0 表示第一个节点.该文件不要随意修改否则会出现大问题-->
  18. <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
  19. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  20. <heartbeat>select 1</heartbeat>
  21. <!--配置第一台主机主要进行写库操作,在默认的条件下Mycat主要操作第一台主机在第一台主机中已经实现了读写分离.因为默认写操作会发往137的数据库.读的操作默认发往141.如果从节点比较忙,则主节点分担部分压力.
  22. -->
  23. <writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root">
  24. <!--读数据库1-->
  25. <readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
  26. <!--读数据库2-->
  27. <readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
  28. </writeHost>
  29. <!--定义第二台主机 由于数据库内部已经实现了双机热备.-->
  30. <!--Mycat实现高可用.当第一个主机137宕机后.mycat会自动发出心跳检测.检测3次.-->
  31. <!--如果主机137没有给Mycat响应则判断主机死亡.则回启东第二台主机继续为用户提供服务.-->
  32. <!--如果137主机恢复之后则处于等待状态.如果141宕机则137再次持续为用户提供服务.-->
  33. <!--前提:实现双机热备.-->
  34. <writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root">
  35. <readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
  36. <readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
  37. </writeHost>
  38. </dataHost>
  39. </mycat:schema>

2).上传配置文件:
12-数据库高可用 Redis入门 - 图5
3).重启mycat服务器
12-数据库高可用 Redis入门 - 图6

1.3 数据库高可用实测试

1.启动服务器,测试mysql数据库是否正常.
12-数据库高可用 Redis入门 - 图7
2.关闭数据库主库,再次检查用户的操作是否正常.
12-数据库高可用 Redis入门 - 图8
12-数据库高可用 Redis入门 - 图9
3).修改数据库中的内容,重启主数据库,检查数据是否同步
12-数据库高可用 Redis入门 - 图10
12-数据库高可用 Redis入门 - 图11
12-数据库高可用 Redis入门 - 图12

1.4 检查端口占用情况

12-数据库高可用 Redis入门 - 图13
12-数据库高可用 Redis入门 - 图14

2 Redis缓存学习

2.1 优化现有架构

说明:通过缓存服务器可以有效的提升用户的访问的效率.
注意事项:
1.缓存的数据结构 应该选用 K-V结构 只要key唯一 那么结果必然相同…
2.缓存中的数据不可能一直存储,需要定期将内存数据进行优化 LRU算法…
3.缓存要求运行速度很快, C语言实现… 运行在内存中.
4.如果缓存运行的数据在内存中,如果断电/宕机,则内存数据直接丢失. 实现内存数据的持久化操作(磁盘).
12-数据库高可用 Redis入门 - 图15

2.2 Redis缓存服务器

网址: http://www.redis.cn/

2.2.1 Redis介绍

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
nginx: 3-5万/秒
redis: 读: 11.2万/秒 写: 8.6万/秒 平均10万/秒
吞吐量: 50万/秒

2.2.2 Redis安装

1).解压redis文件
12-数据库高可用 Redis入门 - 图16
2).移动文件/修改文件
12-数据库高可用 Redis入门 - 图17
3).安装Redis
命令1: make
命令2: make install
12-数据库高可用 Redis入门 - 图18

2.2.3 修改redis.conf配置文件

1.修改IP绑定
12-数据库高可用 Redis入门 - 图19
2.关闭保护模式
12-数据库高可用 Redis入门 - 图20
3.开启后台启动
12-数据库高可用 Redis入门 - 图21

2.2.4 Redis命令

1.启动redis redis-server redis.conf
12-数据库高可用 Redis入门 - 图22
2.检查redis服务项
12-数据库高可用 Redis入门 - 图23
3. 进入redis客户端

  1. redis-cli -p 6379

4.关闭redis
1).命令 redis-cli -p 6379 shutdown
2).kill命令 kill -9 pid号
12-数据库高可用 Redis入门 - 图24

2.3 SpringBoot整合Redis

2.3.1 导入jar包

  1. <!--spring整合redis -->
  2. <dependency>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>jedis</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.data</groupId>
  8. <artifactId>spring-data-redis</artifactId>
  9. </dependency>

2.3.2 入门案例

  1. package com.jt;
  2. import org.junit.jupiter.api.Test;
  3. import org.springframework.boot.test.context.SpringBootTest;
  4. import redis.clients.jedis.Jedis;
  5. import redis.clients.jedis.params.SetParams;
  6. public class TestRedis {
  7. /**
  8. * 1.实现redis测试
  9. * 报错检查:
  10. * 1.检查redis.conf配置文件 1.ip绑定问题 2.保护模式问题 3.后台启动问题
  11. * 2.检查redis启动方式 redis-server redis.conf
  12. * 3.检查防火墙
  13. * */
  14. @Test
  15. public void test01(){
  16. Jedis jedis = new Jedis("192.168.126.129",6379);
  17. jedis.set("2007", "redis入门案例");
  18. System.out.println(jedis.get("2007"));
  19. }
  20. /**
  21. * 我想判断是否有key数据,如果没有则新增数据,如果有则放弃新增 */
  22. @Test
  23. public void test02(){
  24. Jedis jedis = new Jedis("192.168.126.129",6379);
  25. // if(!jedis.exists("2007")){ //判断数据是否存在.
  26. // jedis.set("2007", "测试案例2222");
  27. // }
  28. //setnx作用: 如果有数据,则不做处理.
  29. jedis.setnx("2007", "测试高级用法");
  30. System.out.println(jedis.get("2007"));
  31. }
  32. /**
  33. * 需求:
  34. * 向redis中添加一个数据.set-key-value,要求添加超时时间 100秒.
  35. * 隐藏bug: 代码执行过程中,如果报错,则可能删除失败.
  36. * 原子性: 要么同时成功,要不同时失败.
  37. * 解决方法: 将入库操作/超时时间一齐设定. setex
  38. */
  39. @Test
  40. public void test03() throws InterruptedException {
  41. Jedis jedis = new Jedis("192.168.126.129",6379);
  42. //jedis.set("2007", "测试时间");
  43. //隐藏含义: 业务需要 到期删除数据
  44. //jedis.expire("2007", 100);
  45. jedis.setex("2007", 100, "测试时间");
  46. System.out.println(jedis.ttl("2007")+"秒");
  47. }
  48. /**
  49. * 1.如果数据存在,则不操作数据 setnx
  50. * 2.同时设定超时时间,注意原子性 setex
  51. * 参数说明:
  52. * 1. XX = "xx"; 只有key存在,则进行操作
  53. * 2. NX = "nx"; 没有key,进行写操作
  54. * 3. PX = "px"; 毫秒
  55. * 4. EX = "ex"; 秒
  56. */
  57. @Test
  58. public void test04() throws InterruptedException {
  59. Jedis jedis = new Jedis("192.168.126.129",6379);
  60. SetParams setParams = new SetParams();
  61. setParams.xx().ex(100);
  62. jedis.set("2007", "bbbbb",setParams);
  63. System.out.println(jedis.get("2007"));
  64. }
  65. }

2.3.3 构建项目结构

12-数据库高可用 Redis入门 - 图25

3.总结

本节主要是实现数据库的高可用,采用双主模式,了解Redis的安装和基本命令使用,并将其整合到springboot项目中。