1. 数据库高可用实现
1.1 数据库读写拆散原理
1.2 Mycat 介绍
1.3 Mycat 个性
1. 反对前端作为 MySQL 通用代理
2. 后端 JDBC 形式反对 Oracle,DB2,SQL Server,mongodb, 巨杉
3. 基于心跳的主动故障切换,反对读写拆散
反对 MySQL Cluster,Galera,Percona,cluster 集群
反对数据的多片主动路由与聚合
反对 sum,count,max 等罕用的聚合函数, 反对跨库分页
反对库内分表, 反对单库外部任意 join 全局表,反对跨库 2 表 join
基于 caltlet 的多表 join
反对通过全局表,ER 关系的分片策略,实现了高效的多表 join 查问
1.4 装置具体步骤
1.4.1 上传安装包
1.4.2 解压文件
命令:‘tar -xvf Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz’
删除没用的文件. 如图所示:
1.4.3 对于代理服务器配置准则
1.4.4 编辑 server.xml 配置文件
1. 代理的端口号 -8066 常见端口号: 8080tomcat 服务器,3306 mysql 数据,80 nginx ,6379 redis
2. 批改数据库链接
3). 设定用户名和明码
4). 数据库链接池个别最大的链接数量 1000 个.
5). 逻辑库的阐明: 只存在于逻辑意义上的数据库
1.4.5 编辑 schema.xml 配置文件信息
阐明: 该文件次要的作用就是配置代理与数据库之间的关系. 次要配置数据库具体地址信息
`<?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>`
1.5 上传配置文件
阐明: 将配置文件上传到 mycat/conf 目录中. 留神先删除原始文件
1.6 Mycat 启动
阐明: Mycat 启动以来于 JDK 环境, 进入 bin 目录中 执行如下命令
1.7 对于 mycat 报错阐明
通过 cat mycat.log| cat wrapper.log 查看服务启动是否正确
1.8 我的项目测试
测试目录:
1. 向数据库中增加记录, 查看主从是否同步数据.
2. 批改从库中的记录, 利用程序检查数据信息. 查看是否有负载平衡成果.
3. 批改之后, 将数据更新保证数据统一即可.
1.9 双机热备
1.9.1 阐明
因为数据库中的主库因为非凡的起因可能宕机, 则通过双机热备的模式配置为互为主从.
实现数据库高可用的前提条件: 实现数据库主从同步…
1.9.2 双机热备的配置
IP: 192.168.126.129 之前主库 , 当初当从库
IP: 192.168.126.130 之前从库 , 当初当主库
1. 主库 130 配置:
`/*130 配置 明天当主库 */
SHOW MASTER STATUS;`
2. 从库 129 配置
`/* 设置 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=468;
/* 启动主从服务 */
START SLAVE;
/* 查看主从状态 */
SHOW SLAVE STATUS;`
1.9.3 实现数据库高可用
编辑 schema 配置信息:
`<?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>`
1.9.4 配置策略
1). 敞开 mycat 服务器
2). 编辑 schema 配置文件
3). 重启 mycat
1.9.5 测试高可用
1). 敞开主数据库.
2). 测试程序是否运行失常.
3). 重启主数据库检查数据是否同步.
2. 学习 Redis 缓存
2.1 缓存机制阐明
2.2 缓存机制原理阐明
缓存机制:
缓存中的数据, 肯定是数据库中的数据, 应用缓存次要的目标就是升高用户拜访物理设施的频次.
如果数据库记录更新, 则缓存应该同步更新.
1. 缓存的数据结构 K- V 构造进行数据保留
- 开发语言选择 C 语言程序
- 缓存数据的运行环境在内存中, 断电即擦除. 将内存数据进行长久化操作.
- 如果不停的增加缓存的记录必定会造成内存溢出. 定期优化缓存机制.
1.LRU 算法 2.LFU 算法 3.Random 4.TTL
- 缓存也须要实现高可用机制. 搭建缓存集群.
2.3 Redis 介绍
2.3.1 官网介绍
URL 地址: http://www.redis.cn
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)。
效率: 读: 11.2 万次 / 秒 写: 8.6 万次 / 秒 均匀:10 万次 / 秒
口诀: 1-5-8
2.3.2 常识扩大
1. 数据库:
1. 关系型数据库 mysql 数据库 /oracle 数据 2 维表 行 / 列
2. 非关系型数据库 mongodb/hbase/Redis 1 维表
- 中间件:
50 万次 / 秒 吞吐量
2.4 Redis 装置
2.4.1 上传安装包
2.4.2 解压 redis
阐明: tar -xvf redis-5.0.4.tar.gz 解压实现之后删除安装包 / 批改文件名称
2.4.3 装置 redis
阐明: 在 redis 根目录中执行如下命令
命令: 1. make
2.make install
2.4.4 进制换算
1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 1024_1024 bytes
1g => 1000000000 bytes
1gb => 1024_1024*1024 bytes
2.4.4 批改 Redis 配置文件
1). 批改 IP 绑定
2). 敞开保护模式
3). 开启后端运行
2.4.5 服务器命令
- 启动 redis redis-server redis.conf
- 进入客户端 redis-cli -p 6379 exit 退出 |quit|ctrl+c
- 敞开 redis redis-cli -p 6379 shutdown
2.4.6 客户端命令
阐明: 依据文档练习 redis 命令
温习 AOP 相干常识.