关于java:JTday12

13次阅读

共计 5127 个字符,预计需要花费 13 分钟才能阅读完成。

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 构建我的项目构造

正文完
 0