2 Star 1 Fork 0

zhrun8899 / learning-notes

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
随笔.md 7.94 KB
一键复制 编辑 原始数据 按行查看 历史

1. Jib:为 Java 应用构建容器镜像

Jib 是 Google 开发的可以直接构建 Java 应用的 Docker 和 OCI 镜像的类库,以 Maven 和 Gradle 插件形式提供。

通过 Jib,Java 开发者可以使用他们熟悉的 Java 工具来构建容器。Jib 是一个快速而简单的容器镜像构建工具,它负责处理将应用程序打包到容器镜像中所需的所有步骤。它不需要你编写 Dockerfile 或安装 Docker,而且可以直接集成到 Maven 和 Gradle中 —— 只需要将插件添加到构建中,就可以立即将 Java 应用程序容器化。

项目主页:https://github.com/GoogleContainerTools/jib 开源协议:Apache-2.0 开发语言:Java 所属公司:Google

2. Tink:多语言、跨平台加密开发库

Tink 是一个多语言、跨平台的加密开发库,提供安全,易于正确使用和难以滥用的加密 API,目前 Tink 已经被用于保护许多谷歌内部产品的数据,如 AdMob、Google Pay、Google Assistant、Firebase 与 Android Search App 等。

Tink 旨在提供安全、易于正确使用且难以滥用的加密 API,它建立在现有安全相关的库之上,如 BoringSSL 和 Java Cryptography Architecture,但谷歌专门的团队 Project Wycheproof 发现了这些库中的一些弱点,Tink 进行了跟进,使之更加安全。

项目主页:https://github.com/google/tink 开源协议:Apache-2.0 开发语言:Java、C/C++、Python、Go 所属公司:Google

3.负载均衡硬件有哪些品牌

F5

A10

rdware

scaler

## 4.mysql 主/主同步的问题

两台MySQL之间的循环复制?实际上MySQL自己早就想到了这一点,所以在MySQL的BinaryLog中记录了当前MySQL的server-id,而且这个参数也是我们搭建MySQLReplication的时候必须明确指定,而且Master和Slave的server-id参数值比需要不一致才能使MySQLReplication搭建成功。一旦有了server-id的值之后,MySQL就很容易判断某个变更是从哪一个MySQLServer最初产生的,所以就很容易避免出现循环复制的情况。而且,如果我们不打开记录Slave的BinaryLog的选项(--log-slave-update)的时候,MySQL根本就不会记录复制过程中的变更到BinaryLog中,就更不用担心可能会出现循环复制的情形了。下如将更清晰的展示DualMaster复制架构组成:

5. Master –Slaves - Slaves

在有些应用场景中,可能读写压力差别比较大,读压力特别的大,一个Master可能需要上10台甚至更多的Slave才能够支撑注读的压力。这时候,Master就会比较吃力了,因为仅仅连上来的SlaveIO线程就比较多了,这样写的压力稍微大一点的时候,Master端因为复制就会消耗较多的资源,很容易造成复制的延时。

遇到这种情况如何解决呢?这时候我们就可以利用MySQL可以在Slave端记录复制所产生变更的BinaryLog信息的功能,也就是打开—log-slave-update选项。然后,通过二级(或者是更多级别)复制来减少Master端因为复制所带来的压力。也就是说,我们首先通过少数几台MySQL从Master来进行复制,这几台机器我们姑且称之为第一级Slave集群,然后其他的Slave再从第一级Slave集群来进行复制。从第一级Slave进行复制的Slave,我称之为第二级Slave集群。如果有需要,我们可以继续往下增加更多层次的复制。这样,我们很容易就控制了每一台MySQL上面所附属Slave的数量。这种架构我称之为Master-Slaves-Slaves架构

这种多层级联复制的架构,很容易就解决了Master端因为附属Slave太多而成为瓶颈的风险。

6、读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

读写分离的好处:

  1. 增加冗余

  2. 增加了机器的处理能力

  3. 对于读操作为主的应用,使用读写分离是最好的场景,因为可以确保写的服务器压力更小,而读又可以接受点时间上的延迟。

读写分离在实现上一般采用复制的方式,读在Slave端,写和事务在Master端,按照其实现可分为如下两种大类:

  1. 程序修改mysql操作类

在数据库操作时直接指定读写库的位置,这种方式

优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配

缺点:数据段和程序的耦合度太高,自己维护更新,增减服务器在代码处理。

  1. 数据库代理

使用mysql官方(mysql proxy)或者第三方数据库代理(如mycat)将数据库连接抽象和屏蔽,

优点:直接实现读写分离和负载均衡,不用修改代码,

缺点:增加额外耗时和性能损耗。

7、Replication的常用方案

1、master-master架构

​ 两台服务器装mysql,各自作为对方的从机接受对方发来的数据,做到数据的同步备份,感觉和master-slave基本实现原理是一样的。这样保证了数据的一致性,如何保证其中一台服务器故障,自动切换到另外的一个master上呢,使用MMM(MySQL Master-Master Replication Manager)来管理

2、heartbeat+drbd+mysql主从复制 基本原理与1相似,这里需要做一个master库的冗余备份,使用drbd来保证不同服务器中两个master库的数据一致性。利用heartbeat来完成其中一台服务器发生故障后的自动切换。结构如下图:

img

3、Mysql + keepalived 实现双主热备读写分离

keepalived主要用于实现故障切换和热备,作为mysql的补充。

主从同步读写分离架构图

通常用springboot时都是使用它的默认配置,只需要在配置文件中定义好连接属性就行了,但是现在我们需要自己来配置了,spring是支持多数据源的,多个datasource放在一个HashMapTargetDataSource中,通过dertermineCurrentLookupKey获取key来觉定要使用哪个数据源。因此我们的目标就很明确了,建立多个datasource放到TargetDataSource中,同时重写dertermineCurrentLookupKey方法来决定使用哪个key。2)、如何选择数据源

  事务一般是注解在Service层的,因此在开始这个service方法调用时要确定数据源,有什么通用方法能够在开始执行一个方法前做操作呢?相信你已经想到了那就是切面 。怎么切有两种办法:

  • 注解式,定义一个只读注解,被该数据标注的方法使用读库
  • 方法名,根据方法名写切点,比如getXXX用读库,setXXX用写库

mysql-connector-java驱动读写分离

使用起来也非常简单。

网上很多文章会提到com.mysql.jdbc.ReplicationDriver这个类,其实这个类在稍高的mysql-connector-java版本中已经被移除了,直接使用com.mysql.cj.jdbc.Driver即可。

首先,看配置:

spring:
  datasource:
    url: jdbc:mysql:replication://192.168.41.130:3306,192.168.41.130:3307/test?useUnicode=true&characterEncoding=utf-8
    username: root
    password: mysql
    driver-class-name: com.mysql.cj.jdbc.Driver

url的第一个mysql是作为master库,后面的所有mysql都是slave库。

① 在代码中,如果需要走slave库,那么只需要指定为只读事务,加上@Transactional(readOnly = true)注解即可,例如:

    @Override
    @Transactional(readOnly = true)
    public UserEntity findById(Long id) {
        return userDao.findById(id);
    }

② 如果加了@Transactional或者没有事务的方法,那么都是走msater库。

这是一种比较简单的读写分离方案,另外,还可以通过mysql-router中间件去实现读写分离。

1
https://gitee.com/zhrun8899/learning-notes.git
git@gitee.com:zhrun8899/learning-notes.git
zhrun8899
learning-notes
learning-notes
master

搜索帮助