1. 对于 tomcat 服务器脚本
1.1 问题阐明
如果通过命令: java -jar xxx.war 的形式启动服务器时, 如果近程的终端敞开之后, 那么 tomcat 服务器也会随之敞开. 影响用户的应用. 上述的命令 示意前台运行.
1.2 线上部署的命令
阐明: 个别在 Linux 零碎中部署服务器 个别采纳后端运行的形式 启动 tomcat 服务器. 并且指定日志文件输入.
命令: nohup java -jar 8081.war -> 8081.log &
1.3 对于文件查看的阐明
cat 输入文件所有的内容
more 输入文档所有的内容,分页输入,空格浏览下一屏,q 退出
less 用法和 more 雷同,只是通过 PgUp、PgOn 键来管制 q 退出
tail 用于显示文件后几号,应用频繁
tail -10 nginx.conf 查看 nginx.conf 的最初 10 行
tail –f nginx.conf 动静查看日志,不便查看日志新增的信息
ctrl+c 完结查看
1.4 Linux 脚本阐明
阐明: Linux 中的 ” 脚本 ”(外挂 - 荒野口头)的后缀为.sh
创立文件: vim start.sh
执行脚本:
2 数据库代理阐明
2.1 数据库构造的优化
阐明: 因为须要用户同时链接 2 台甚至多台数据库时须要引入代理, 所以有如下的部署.
注意事项: 用户链接代理服务器 端口号个别:8066 端口
2.2 Mycat 介绍
2.3 Mycat 部署
2.3.1 上传 Mycat 安装包
解压 Mycat 压缩包:
`tar -zxvf Mycat-server-1.7.0-DEV-20170416134921-linux.tar.gz`
2.3.2 查看 JDK 是否装置
2.4 对于 Mycat 配置文件阐明
2.4.1 server.xml 配置文件阐明
阐明: 在 server.xml 配置文件中定义用户名和明码及操作的数据库信息, 必须与 YML 配置文件统一.
2). 批改 YML 配置文件
2.4.2 schemas 配置文件阐明
阐明:schemas 文件次要的作用就是配置数据库读写的策略.
`<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>`
2.5 Mycat 测试
启动命令:
Mycat 测试:
2.6 数据库实现高可用
高可用: 保障服务尽可能的不宕机, 保障用户失常应用.
2.6.1 数据库双机热备
阐明: 个别在公司中配置双机热备的模式, 配置为互为主从.
配置阐明:
1. 主库 192.168.126.130
2. 从库 192.168.126.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=482
/* 启动主从服务 */
START SLAVE
/* 查看主从状态 */
SHOW SLAVE STATUS;`
2.6.2 实现数据库高可用配置
阐明: 批改实现数据库之后, 将配置文件上传即可.
`<?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.6.2 实现数据库高可用测试
测试步骤:
1. 敞开主数据库, 之后检索数据, 检查用户的拜访是否受限.
2. 批改数据库记录, 检查用户的操作是否失常. (操作的是从库)
3. 重启主数据库 之后查看从库的数据是否同步.
- Redis 学习
===========
3.1 还原程序
3.1.1 批改 YML 配置文件
3.1.2 批改 pro 图片门路
3.1.3 批改 Nginx 配置文件
3.1.4 批改 hosts 文件
3.2 缓存机制
阐明: 应用缓存能够无效的升高用户拜访物理设施的频次. 疾速从内存中获取数据, 之后返回给用户, 同时须要保障内存中的数据就是数据库数据.
思考:
1. 缓存的运行环境应该在内存中.(快)
2. 应用 C 语言开发缓存
3. 缓存应该应用什么样的数据结构呢 ——–K- V 构造 个别采纳 String 类型居多 key 必须惟一 . v:JSON 格局
4. 内存环境断电即擦除, 所以应该将内存数据长久化(执行写盘操作)
5. 如果没有保护内存的大小, 则容易导致 内存数据溢出. 采纳 LRU 算法优化!!!
3.3 Redis 介绍
redis 是一个 key-value 存储系统。和 Memcached 相似,它反对存储的 value 类型绝对更多,包含 string(字符串)、list(链表)、set(汇合)、zset(sorted set – 有序汇合)和 hash(哈希类型)。这些数据类型都反对 push/pop、add/remove 及取交加并集和差集及更丰盛的操作,而且这些操作都是 原子性 的。在此基础上,redis 反对各种不同形式的排序。与 memcached 一样,为了保障效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把批改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步。
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)。
原子性阐明: Redis 的操作是单过程单线程操作, 所以没有线程并发性的平安问题. 采纳队列的形式一个一个操作.
Redis 常见用法:
1.Redis 能够当做缓存应用
2.Redis 能够当做数据库应用 验证码
3.Redis 能够消息中间件应用 银行转账等
3.4 Redis 装置
1). 解压 Redis 安装包
`[root@localhost src]# tar -zxvf redis-5.0.4.tar.gz`
2). 装置 Redis
阐明: 在 Redis 的根目录中执行命令
命令: 1.make
2.make install
3.5 批改 Redis 的配置文件
命令 1: 展示行号 :set nu
批改地位 1: 正文 IP 绑定
批改地位 2: 敞开保护模式
批改地位 3: 开启后盾启动
3.6 redis 服务器命令
1. 启动命令: redis-server redis.conf
2. 检索命令: ps -ef | grep redis
3. 进入客户端: redis-cli -p 6379
4. 敞开 redis: kill -9 PID 号 | redis-cli -p 6379 shutdown
- Redis 入门案例
=============
4.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>`
4.2 编辑测试 API
`package com.jt.test;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
public class TestRedis {
/**
* 1. 测试 redis 程序链接是否失常
* 步骤:
* 1. 实例化 jedis 工具 API 对象(host:port)
* 2. 依据实例 操作 redis 办法就是命令
*
* 对于链接不通的阐明:
* 1. 查看 Linux 防火墙
* 2. 查看 Redis 配置文件批改项
* 2.1 IP 绑定
* 2.2 保护模式
* 2.3 后盾启动
* 3. 查看 redis 启动形式 redis-server redis.conf
* 4. 查看 IP 端口 及 redis 是否启动...
*
* */
@Test
public void test01(){
String host = "192.168.126.129";
int port = 6379;
Jedis jedis = new Jedis(host,port);
jedis.set("cgb2006","好好学习 天天向上");
System.out.println(jedis.get("cgb2006"));
//2. 练习是否存在 key
if(jedis.exists("cgb2006")){jedis.del("cgb2006");
}else{jedis.set("cgb2006", "xxxx");
jedis.expire("cgb2006", 100);
}
}
}`
作业
1. 预习其余的命令 代码和命令
2. 回顾 AOP 的常识