关于java:京淘项目day12

1. 实现数据库的高可用

1.1 搭建策略

1.1.1 问题阐明

如果依据如下的配置实现数据库的代理,如果数据库主机宕机,则间接影响整个程序的执行,所以须要实现高可用机制.

高可用实现的问题:
    如果实现了数据库高可用,能够主动的切换数据库,因为用户间接操作了从库,当主库启动时发现数据不统一时,主从同步的状态将会进行.

1.1.2 双机热备(双主模式)

阐明:能够通过数据库双主模式实现数据库高可用
双主模式本质都是主机,相互备份.

1.1.3 双机热备的实现

之前的配置:
主机:192.68.126.129
从库:192.168.126.130

当初的配置
主机:192.168.126.130
从库:192.168.126.129

1).查看主库的状态

2).实现数据的主从搭建

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缓存服务器

官网

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装置

1).解压redis文件

2).挪动文件批改文件

3).装置Redis
命令1:make
命令2: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号

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 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
 */
 @Test
 public void test01(){
        Jedis jedis = new Jedis("192.168.126.129",6379);
        jedis.set("2019", "杨千嬅");
        System.out.println(jedis.get("2019"));
    }
    /**
 * 我想判断是否有key数据,如果没有则新增数据,如果有则放弃新增
 */
 @Test
 public void test02(){
        Jedis jedis = new Jedis("192.168.126.129",6379);
//        if (!jedis.exists("2019")){ //判断数据是否存在.
//            jedis.set("2019", "张学友");
//        }
//        System.out.println(jedis.get("2019"));
 //setnx作用:如果有数据,则不做解决.
 jedis.setnx("2019", "陈慧娴");
        System.out.println(jedis.get("2019"));
    }
    /**
 * 需要:
 * 向redis中增加一个数据.set-key-value,要求增加超时工夫 100秒
 * 暗藏bug:代码执行过程中,如果报错,则可能删除失败
 * 原子性: 要么同时胜利,要么同时失败
 * 解决办法: 将入库操作/超时工夫一齐设定 setex
 * 死锁操作
 */
 @Test
 public void test03() throws Exception {
        Jedis jedis = new Jedis("192.168.126.129",6379);
        //jedis.set("2019", "刘德华");
 //暗藏含意:业务须要 到期删除数据
 //jedis.expire("2019", 100);
 jedis.setex("2019", 100, "刘德华");
        System.out.println(jedis.ttl("2019")+"秒");
    }
    /**
 * 1.如果数据存在,则不操作数据 setnx
 * 2.同时设定超时工夫,留神原子性 setex
 * 参数阐明:
 *      1. XX = "xx"; 只有key存在,则进行操作
 *      2. NX = "nx"; 没有key,进行写操作
 *      3. PX = "px"; 毫秒
 *      4. EX = "ex"; 秒
 */
 @Test
 public void test04() {
        Jedis jedis = new Jedis("192.168.126.129",6379);
        SetParams setParams = new SetParams();
        setParams.nx().ex(100);
        jedis.set("2019", "aaa",setParams);
    }
}

2.3.3 构建我的项目构造

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理