1、实现数据库的高可用
1.1 搭建策略
1.1.1 问题阐明
阐明:
如果依据如下的配置实现数据库的代理, 如果数据库主库宕机, 则间接影响整个程序的执行, 所以须要实现高可用机制
高可用实现的问题:
如果实现了数据库高可用, 能够主动的切换数据库, 因为用户间接操作了从库, 当主库启动时发现数据不统一时, 主从同步的状态将会终止
1.1.2 双机热备(双主模式)
阐明:能够通过数据库双主的模式实现数据库高可用
双主模式本质都是主机, 相互备份
1.1.3 双机热备的实现
之前的配置
主机:192.168.126.129
从机:192.168.126.130
当初的配置
主机:192.168.126.130
从机:192.168.126.129
1、查看主库的状态
2、实现数据库的主从搭建
/* 我是 129 明天当从机 */
CHANGE MASTER TO MASTER_HOST="192.168.126.130",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=1436;
/* 启动主从服务 */
START SLAVE;
/* 查看主从状态 */
SHOW SLAVE STATUS;
/* 进行 */
STOP SLAVE;
1.2 数据库高可用实现
1、编辑配置文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--name 属性是自定义的 dataNode 示意数据库的节点信息 jtdb 示意逻辑库 -->
<schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/>
<!-- 定义节点名称 / 节点主机 / 数据名称 -->
<dataNode name="jtdb" dataHost="localhost1" database="jtdb" />
<!-- 参数介绍 UTF-8 中文报错 -->
<!--balance 0 示意所有的读操作都会发往 writeHost 主机 -->
<!-- 1 示意所有的读操作发往 readHost 和闲置的主节点中 -->
<!--writeType=0 所有的写操作都发往第一个 writeHost 主机 -->
<!--writeType=1 所有的写操作随机发往 writeHost 中 -->
<!--dbType 示意数据库类型 mysql/oracle-->
<!--dbDriver="native" 固定参数 不变 -->
<!--switchType=-1 示意不主动切换, 主机宕机后不会主动切换从节点 -->
<!--switchType=1 示意会主动切换 (默认值) 如果第一个主节点宕机后,Mycat 会进行 3 次心跳检测, 如果 3 次都没有响应, 则会主动切换到第二个主节点 -->
<!-- 并且会更新 /conf/dnindex.properties 文件的主节点信息 localhost1=0 示意第一个节点. 该文件不要随便批改否则会呈现大问题 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select 1</heartbeat>
<!-- 配置第一台主机次要进行写库操作, 在默认的条件下 Mycat 次要操作第一台主机在第一台主机中曾经实现了读写拆散. 因为默认写操作会发往 137 的数据库. 读的操作默认发往 141. 如果从节点比较忙, 则主节点分担局部压力.
-->
<writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root">
<!-- 读数据库 1 -->
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<!-- 读数据库 2 -->
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
<!-- 定义第二台主机 因为数据库外部曾经实现了双机热备.-->
<!--Mycat 实现高可用. 当第一个主机 137 宕机后.mycat 会主动收回心跳检测. 检测 3 次.-->
<!-- 如果主机 137 没有给 Mycat 响应则判断主机死亡. 则回启东第二台主机持续为用户提供服务.-->
<!-- 如果 137 主机复原之后则处于期待状态. 如果 141 宕机则 137 再次继续为用户提供服务.-->
<!-- 前提: 实现双机热备.-->
<writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root">
<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
2、上传配置文件
3、重启 mycat 服务器
1.3 数据库高可用实测试
1、启动服务器, 测试 mysql 数据库是否失常
2、敞开数据库主库, 再次检查用户的操作是否失常
3、批改数据库中的内容, 重启主数据库, 检查数据是否同步
1.4 查看端口占用状况
2、Redis 缓存学习
2.1 优化现有架构
阐明:通过缓存的服务器能够无效的晋升用户的拜访的效率
注意事项:
1、缓存的数据结构 应该选用 K - V 构造 只有 key 惟一 那么后果必然雷同 …
2、缓存中的数据不可能始终存储, 须要定期将内存数据进行优化?LRU 算法 …
3、缓存要求运行的速度很快,C 语言实现 … 运行在内存中
4、如果缓存运行的数据在内存中, 如果断点 / 宕机, 则内存数据间接失落 实现内存数据的 长久化操作(磁盘)
2.2 Redis 缓存服务器
网址:http://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 文件
2、挪动文件 / 批改文件
3、装置 redis
命令一:make
命令二:make install
2.2.3 批改 redis.conf 配置文件
1、批改 IP 绑定
2、敞开保护模式
3、开启后盾启动
2.2.4 Redis 命令
1、启动 redis
`redis-server redis.conf`
2、查看 redis 服务项
3、进入 redis 客户端
redis-cli -p 6379
4、敞开 redis
1、命令 `redis-cli -p 6379 shutdown`
2、kill 命令 kill -9 pid 号
1. 启动:redis-server(redis-server redis.conf)2. 登陆:redis-cli(redis-cli -p 6379)3. 敞开:redis-cli shutdown
2.3 SpringBoot 整合 Redis
2.3.1 导入 jar 包
<!--spring 整合 redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
2.3.2 入门案例
package com.jt;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;
public class TestRedis {
/**
* 1. 实现 redis 测试
* 报错查看:
* 1. 查看 redis.conf 配置文件 1.ip 绑定问题 2. 保护模式问题 3. 后盾启动问题
* 2. 查看 redis 启动形式 redis-server redis.conf
* 3. 查看防火墙
* */
@Test
public void test01(){Jedis jedis = new Jedis("192.168.126.129",6379);
jedis.set("2007", "redis 入门案例");
System.out.println(jedis.get("2007"));
}
/**
* 我想判断是否有 key 数据, 如果没有则新增数据, 如果有则放弃新增 */
@Test
public void test02(){Jedis jedis = new Jedis("192.168.126.129",6379);
// if(!jedis.exists("2007")){ // 判断数据是否存在.
// jedis.set("2007", "测试案例 2222");
// }
//setnx 作用: 如果有数据, 则不做解决.
jedis.setnx("2007", "测试高级用法");
System.out.println(jedis.get("2007"));
}
/**
* 需要:
* 向 redis 中增加一个数据.set-key-value, 要求增加超时工夫 100 秒.
* 暗藏 bug: 代码执行过程中, 如果报错, 则可能删除失败.
* 原子性: 要么同时胜利, 要不同时失败.
* 解决办法: 将入库操作 / 超时工夫一齐设定. setex
*/
@Test
public void test03() throws InterruptedException {Jedis jedis = new Jedis("192.168.126.129",6379);
//jedis.set("2007", "测试工夫");
// 暗藏含意: 业务须要 到期删除数据
//jedis.expire("2007", 100);
jedis.setex("2007", 100, "测试工夫");
System.out.println(jedis.ttl("2007")+"秒");
}
/**
* 1. 如果数据存在, 则不操作数据 setnx
* 2. 同时设定超时工夫, 留神原子性 setex
* 参数阐明:
* 1. XX = "xx"; 只有 key 存在, 则进行操作
* 2. NX = "nx"; 没有 key, 进行写操作
* 3. PX = "px"; 毫秒
* 4. EX = "ex"; 秒
*/
@Test
public void test04() throws InterruptedException {Jedis jedis = new Jedis("192.168.126.129",6379);
SetParams setParams = new SetParams();
setParams.xx().ex(100);
jedis.set("2007", "bbbbb",setParams);
System.out.println(jedis.get("2007"));
}
}
2.3.3 构建我的项目构造