RocketMQ介绍


categories: MQ

RockerMQ学习笔记

RocketMQ介绍

  • rocketmq是阿里巴巴团队使用java语言开发的一款分布式消息中间件,是一款低延迟,高可用,拥有海量消息堆积能力和灵活拓展性的消息队列。

RocketMQ组成部分

  • rocketmq由四大核心模块组成:producer、consumer、brokerServer、nameServer。其中brokerServer和nameServer是rocketmq的服务端,两者一起独立的对外提供服务;而producer和consumer可看做是rocketmq的客户端,一般依附于业务应用程序

Producer

producer负责发送消息。使用producer将消息发送到brokerServer,由brokerServer统一进行消息的分发。

  rocketmq支持多种消息发送方式,如同步消息发送异步回调消息发送顺序消息发送以及单向消息发送(异步无回调)。除了单向消息发送,其余的发送方式均需要brokerServer返回发送结果的确认消息。

Consumer

consumer 负责消费producer发送的消息。consumer会从brokerServer获取消息,并传递给应用程序。

  rocketMQ使用的消息原语是At Least Once(至少一次成功消费),如果一定时间内没有接收到consumer消息确认消费的响应结果,会将同一条消息再次投递给consumer。rocketmq采用ack机制保证消息的消费成功所以consumer可能会多次收到同一条消息,需要consumer的业务方做好幂等防护。

​ 从使用者的角度来看,consumer分为两种方式来获取信息。一种是推模式(push consume),推模式看起来像是brokerServer将消息推给了consumer;另一种是拉模式(pull consume),拉模式看起来像是consumer主动的去brokerServer拉取消息(实际上,推模式是基于拉模式实现的)。

BrokerServer

brokerServer负责消息的接收,存储和分发,是rocketmq最核心,最重量级的组成部分。

  为实现高可用和高吞吐,brokerServer通常采用集群部署,共同对外提供服务。

NameServer

nameServer负责提供路由元数据。例如,brokerServer通常是集群部署的,其拓扑结构会经常的发生变化。如果每次集群中broker机器的上下线都需要通知所有的消费者、生产者,效率太低。

  因此,rocketmq引入了nameServer作为brokerServer路由信息的维护者,broker的每次上下线都和nameServer通信,由nameServer来维护broker的路由信息,而producer和consumer通过访问nameServer获得对应broker的访问地址后,再向对应的broker发起请求。nameServer解除了broker和客户端的耦合依赖关系,大大提高了效率

在其它主流消息队列中也存在着类似的维护元信息功能的组件,如zookeeper等。rocketmq的设计者认为zk的功能过于强大,杀鸡焉用牛刀,通过一个精简版的元数据服务nameServer,以减少对外部系统的耦合依赖,得以提供更可靠的服务。

  nameServer同样能以集群形式对外提供服务。但和zk集群不同的是,集群内的nameServer服务器并不会互相通信,而是保持相互独立。

image-20210301135510557

后台 启动 nameserver

1
nohup mqnamesrv &

后台 启动 broker

1
nohup mqbroker -n 117.50.7.7:9876 -c /opt/rocketmq/conf/broker.conf  &

Kafka学习笔记


categories: MQ

​ Kafka学习笔记

​ Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多生产者、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

主要应用场景是:日志收集系统和消息系统。

Kafka主要设计目标如下:

以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。

高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。

同时支持离线数据处理和实时数据处理。支持在线水平扩展

有两种主要的消息传递模式:点对点传递模式、发布-订阅模式。大部分的消息系统选用发布-订阅

模式。Kafka就是一种发布-订阅模式

Kafka只有消息的拉取,没有推送,可以通过轮询实现消息的推送。

  1. Kafka在一个或多个可以跨越多个数据中心的服务器上作为集群运行。

  2. Kafka集群中按照主题分类管理,一个主题可以有多个分区,一个分区可以有多个副本分区。

  3. 每个记录由一个键,一个值和一个时间戳组成

Kafka优势

  1. 高吞吐量:单机每秒处理几十上百万的消息量。即使存储了许多TB的消息,它也保持稳定的性

能。

  1. 高性能:单节点支持上千个客户端,并保证零停机和零数据丢失。

  2. 持久化数据存储:将消息持久化到磁盘。通过将数据持久化到硬盘以及replication防止数据丢失。

    • 1 零拷贝
    • 2 顺序读,顺序写
    • 3 利用Linux的页缓存
  3. 分布式系统,易于向外扩展。所有的Producer、Broker和Consumer都会有多个,均为分布

式的。无需停机即可扩展机器。多个Producer、Consumer可能是不同的应用。

  1. 可靠性 - Kafka是分布式,分区,复制和容错的。

  2. 客户端状态维护:消息被处理的状态是在Consumer端维护,而不是由server端维护。当失

败时能自动平衡。

  1. 支持online和offline的场景。

  2. 支持多种客户端语言。Kafka支持Java、.NET、PHP、Python等多种语言。

核心概念

Producer

生产者创建消息。

该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息

到当前用于追加数据的 segment 文件中。

一般情况下,一个消息会被发布到一个特定的主题上。

  1. 默认情况下通过轮询把消息均衡地分布到主题的所有分区上。

  2. 在某些情况下,生产者会把消息直接写到指定的分区。这通常是通过消息键和分区器来实现

的,分区器为键生成一个散列值,并将其映射到指定的分区上。这样可以保证包含同一个键的

消息会被写到同一个分区上。

  1. 生产者也可以使用自定义的分区器,根据不同的业务规则将消息映射到分区。

Consumer

消费者读取消息。

  1. 消费者订阅一个或多个主题,并按照消息生成的顺序读取它们。

  2. 消费者通过检查消息的偏移量来区分已经读取过的消息。偏移量是另一种元数据,它是一个不断递增的整数值,在创建消息时,Kafka 会把它添加到消息里。在给定的分区里,每个消息的偏移量都是唯一的。消费者把每个分区最后读取的消息偏移量保存在Zookeeper 或Kafka上,如果消费者关闭或重启,它的读取状态不会丢失。

  3. 消费者是消费组的一部分。群组保证每个分区只能被一个消费者使用。

  4. 如果一个消费者失效,消费组里的其他消费者可以接管失效消费者的工作,再平衡,分区重新分配。

Broker

一个独立的Kafka 服务器被称为broker。

broker 为消费者提供服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息。

  1. 如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。

  2. 如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。

  3. 如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。broker 是集群的组成部分。每个集群都有一个broker 同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来)。

在集群中,一个分区从属于一个broker,该broker 被称为分区的首领。

RabbitMQ 学习笔记


categories: MQ
— RabbitMQ 学习笔记

RPC主要基于TCP/UDP协议,HTTP协议是应用层协议,是构建在传输层协议TCP之上的,RPC效率更高,RPC长连接:不必每次通信都像HTTP一样三次握手,减少网络开销;

HTTP服务开发迭代更快:在接口不多,系统与系统之间交互比较少的情况下,HTTP就显得更加方便;相反,在接口比较多,系统与系统之间交互比较多的情况下,HTTP就没有RPC有优势。

分布式同步通信的问题

电商项目中,如果后台添加商品信息,该信息放到数据库。我们同时,需要更新搜索引擎的倒排索引同时,假如有商品页面的静态化处理,也需要更新该页面信息

归根到底,是同步调用处理不当。这个问题在分布式架构中尤为严重。

消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息队列模型,可以在分布式环境下扩展进程的通信

消息中间件就是在通信的上下游之间截断:break it,Broker 然后利用中间件解耦、异步的特性,构建弹性、可靠、稳定的系统。

异步处理流量削峰、限流、缓冲、排队、最终一致性消息驱动等需求的场景都可以使用消息中间件

RabbitMQ

RabbitMQ开始是用在电信业务的可靠通信的,也是少有的几款支持AMQP协议的产品之一。

优点:

  1. 轻量级,快速,部署使用方便

  2. 支持灵活的路由配置。RabbitMQ中,在生产者和队列之间有一个交换器模块。根据配置的路

由规则,生产者发送的消息可以发送到不同的队列中。路由规则很灵活,还可以自己实现。

  1. RabbitMQ的客户端支持大多数的编程语言。

缺点:

  1. 如果有大量消息堆积在队列中,性能会急剧下降

  2. RabbitMQ的性能在Kafka和RocketMQ中是最差的,每秒处理几万到几十万的消息。如果应

用要求高的性能,不要选择RabbitMQ。

  1. RabbitMQ是Erlang开发的,功能扩展和二次开发代价很高。

RabbitMQ工作流程详解

生产者发送消息的流程

  1. 生产者连接RabbitMQ,建立TCP连接( Connection),开启信道(Channel)

  2. 生产者声明一个Exchange(交换器),并设置相关属性,比如交换器类型、是否持久化等

  3. 生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等

  4. 生产者通过 bindingKey (绑定Key)将交换器和队列绑定( binding )起来

  5. 生产者发送消息至RabbitMQ Broker,其中包含 routingKey (路由键)、交换器等信息

  6. 相应的交换器根据接收到的 routingKey 查找相匹配的队列。

  7. 如果找到,则将从生产者发送过来的消息存入相应的队列中。

  8. 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者

  9. 关闭信道。

  10. 关闭连接。

消费者接收消息的过程

  1. 消费者连接到RabbitMQ Broker ,建立一个连接(Connection ) ,开启一个信道(Channel) 。

  2. 消费者向RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数, 以及做一些准备工作

  3. 等待RabbitMQ Broker 回应并投递相应队列中的消息, 消费者接收消息。

  4. 消费者确认( ack) 接收到的消息。

  5. RabbitMQ 从队列中删除相应己经被确认的消息。

  6. 关闭信道。

  7. 关闭连接。

RabbitMQ TTL 机制 死信队列 延迟队列

RabbitMQ 可以对消息和队列两个维度来设置TTL

任何消息中间件的容量和堆积能力都是有限的,如果有一些消息总是不被消费掉,那么需要有一种过期的机制来做兜底。

目前有两种方法可以设置消息的TTL。

  1. 通过Queue属性设置,队列中所有消息都有相同的过期时间。

  2. 对消息自身进行单独设置,每条消息的TTL 可以不同。

如果两种方法一起使用,则消息的TTL 以两者之间较小数值为准。通常来讲,消息在队列中的生存时间一旦超过设置的TTL 值时,就会变成“死信”(Dead Message),消费者默认就无法再收到该消息。当然,“死信”也是可以被取出来消费的

一般 固定时长 用TTL+死信队列 比如 订单取消

延迟消息是指的消息发送出去后并不想立即就被消费,而是需要等(指定的)一段时间后才触发消费。

可以使用rabbitmq_delayed_message_exchange插件实现。

这里和TTL方式有个很大的不同就是TTL存放消息在死信队列(delayqueue)里,二基于插件存放消息在延时交换机里(x-delayed-message exchange)。

image-20210126171322013

redis常用命令


categories: Redis

redis常用命令

Redis简介

Redis是一个Key-Value的存储系统,使用ANSI C语言编写。

key的类型是字符串。

value的数据类型有:

常用的:string字符串类型、list列表类型、set集合类型、sortedset(zset)有序集合类型、hash类型。

不常见的:bitmap位图类型、geo地理位置类型。

Redis5.0新增一种:stream类型

注意:Redis中命令是忽略大小写,(set SET),key是不忽略大小写的 (NAME name)

Redis的Key的设计

  1. 用:分割

  2. 把表名转换为key前缀, 比如: user:

  3. 第二段放置主键值

    1. 第三段放置列名

比如:用户表user, 转换为redis的key-value存储

image-20210115120041410

String 常用命令

image-20210115120231936

list 常用命令

image-20210115120634665

set 命令:

image-20210115120729499

image-20210115120741576

SortedSet(ZSet) 有序集合: 元素本身是无序不重复的

每个元素关联一个分数(score)

可按分数排序,分数可重复

image-20210115120834530

**hash类型(散列表)

image-20210115120913754

应用场景:

对象的存储 ,表数据的映射

image-20210115120933218

bitmap位图类型

image-20210115121009723

image-20210115121020513

geo地理位置类型

geo是Redis用来处理位置信息的。在Redis3.2中正式使用。主要是利用了Z阶曲线、Base32编码和

geohash算法

image-20210115133242515

image-20210115133301114

stream数据流类型

stream是Redis5.0后新增的数据结构,用于可持久化的消息队列。

image-20210115133337748

image-20210115133353890

redis 集群(redis_cluster)搭建


categories: Redis

redis 集群(redis_cluster)搭建

RedisCluster最少需要三台主服务器,三台从服务器。

  • 下载redis 对应的版本
1
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
  • 解压文件

    1
    tar -xzf redis-5.0.5.tar.gz
    • 新建redis_cluster 文件夹并 新建7001-7006 目录

      1
      2
      3
      mkdir redis_cluster
      cd redis_cluster/
      mkdir 7001 7002 7003 7004 7005 7006
  • 编译 redis

    1
    make install PREFIX=/root/redis_cluster/redis_cluster/7001
  • 拷贝配置文件

    1
    cp /root/redis-5.0.5/redis.conf /root/redis_cluster/7001/bin
  • 修改配置文件

    1 端口号

    image-20210114142001237

​ 2 打开cluster-enable yes

image-20210114142104172

​ 3 后台进程 开启 daemonize yes

image-20210114142214518

4 保护模式 关闭

image-20210114142249346

  • 复制7001,创建7002~7006实例,注意端口修改

    1
    2
    3
    4
    5
    cp -r /root/redis_cluster/7001/* /root/redis_cluster/7002
    cp -r /root/redis_cluster/7001/* /root/redis_cluster/7003
    cp -r /root/redis_cluster/7001/* /root/redis_cluster/7004
    cp -r /root/redis_cluster/7001/* /root/redis_cluster/7005
    cp -r /root/redis_cluster/7001/* /root/redis_cluster/7006
  • 创建 start.sh 启动所有实例

    1
    2
    cd 7001/bin
    ./redis-server redis.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 cd ..
cd ..
cd 7002/bin
./redis-server redis.conf
cd ..
cd ..

cd 7003/bin
./redis-server redis.conf
cd ..
cd ..

cd 7004/bin
./redis-server redis.conf
cd ..
cd ..
cd 7005/bin
./redis-server redis.conf
cd ..
cd ..

cd 7006/bin
./redis-server redis.conf
cd ..
cd ..

chmod u+x start.sh (赋写和执行的权限)

./start.sh(启动RedisCluster)

  • 创建Redis集群(创建时Redis里不要有数据)

​ 进入到任何一个实例下的bin 目录

1
cd redis_cluster/7001/bin/

执行 集群创建集群命令

1
./redis-cli --cluster create 10.9.49.202:7001 10.9.49.202:7002 10.9.49.202:7003 10.9.49.202:7004 10.9.49.202:7005 10.9.49.202:7006 --cluster-replicas 1

看到如下信息 回复yes

image-20210114143446447

最后看到如下信息说明成功

image-20210114143522864

  • 命令客户端连接集群 注意:-c 表示是以redis集群方式进行连接
1
./redis-cli -h 127.0.0.1 -p 7001 -c

执行命令测试

1
set name 111

image-20210114143848490

查看集群状态

1
cluster info

image-20210114144003634

查看集群中的节点

1
cluster nodes

image-20210114144132655

到此为止 redis 集群搭建成功!!!

​ —————————————————动态扩容——————————————————————

先创建7007 主节点 (无数据) 7008从节点 (无数据)

1
2
3
4
5
6
7
mkdir redis_cluster/7007
mkdir redis_cluster/7008
make install PREFIX=/root/redis_cluster/7007
make install PREFIX=/root/redis_cluster/7008
#拷贝配置文件 并进行端口修改
cp /root/redis-5.0.5/redis.conf /root/redis_cluster/7007/bin
cp /root/redis-5.0.5/redis.conf /root/redis_cluster/7008/bin

添加7007结点作为新节点,并启动

后面地址是集群的一个ip地址表示要加入到该集群中

1
./redis-cli --cluster add-node 10.9.49.202:7007 10.9.49.202:7001

image-20210114153904347

添加完主节点需要对主节点进行hash槽分配,这样该主节才可以存储数据。

给刚添加的7007结点分配槽

  • 第一步:连接上集群(连接集群中任意一个可用结点都行)

    1
    ./redis-cli --cluster reshard 10.9.49.202:7007
  • 第二步:输入要分配的槽数量

    How many slots do you want to move (from 1 to 16384)? 3000

​ 输入:3000,表示要给目标节点分配3000个槽

  • 第三步:输入接收槽的结点id

​ What is the receiving node ID?

输入:bcbac44a7830a8e23f3bd07cb69a38df04aa1a2c

1
2
PS:这里准备给7007分配槽,通过cluster nodes查看7007结点id为:
bcbac44a7830a8e23f3bd07cb69a38df04aa1a2c
  • 第四步:输入源结点id

image-20210114154653083

表示从所有节点上 一共分配3000 个节点

  • 第五步:输入yes开始移动槽到目标结点id

image-20210114154847720

image-20210114154908085

添加从节点

1
./redis-cli --cluster add-node 10.9.49.202:7008 10.9.49.202:7007 --cluster-slave --cluster-master-id  bcbac44a7830a8e23f3bd07cb69a38df04aa1a2c

image-20210114155117757

查看 扩容后结果

image-20210114155233904

成功

遇到问题 在客户端执行命名 报

  1. error MOVED 原因和解决方案

    原因①②③④

这种情况一般是因为启动redis-cli时没有设置集群模式所导致

启动时使用-c参数来启动集群模式,命令如下:

1
redis-cli -c -p 7000
  1. (error) CLUSTERDOWN The cluster is down

​ 外部不到redis 集群 所以修改了 nodes.conf 内网地址为 外网地址 导致 报这个错

解决过程

​ ① 删除所有节点的 dump.rdb 和nodes.conf文件删除

​ ② 开放17001-17008(重要)

​ ③ 节点创建使用外网地址 否则集群无法创建成功

​ ok 成功访问。使用客户端查看信息

image-20210115112823240

用Jedis 代码查看

image-20210115134442139

MongoDB和Neo4j学习笔记


categories: NoSql
— MongoDB 和Neo4j 学习笔记

整理 一些常用 命令

查看数据库

1
show dbs;

切换数据库 如果没有对应的数据库则创建

1
use 数据库名;

创建集合

1
db.createCollection("集合名")

查看集合

1
2
show tables; 
show collections;

删除集合

1
db.集合名.drop();

删除当前数据库

1
db.dropDatabase();

插入多条数据

1
db.集合名.insert([文档,文档])

查询

1
db.集合名.find({key1:value1, key2:value2}).pretty()

分页查询

1
db.集合名.find({条件}).sort({排序字段:排序方式})).skip(跳过的行数).limit(一页显示多少数据)

Neo4j

​ Neo4j是一个开源的 无Shcema的 基于java开发的 图形数据库,它将结构化数据存储在图中而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎。程序数据是在一个面向对象的、灵活的网络结构下,而不是严格、静态的表中,但可以享受到具备完全的事务特性、企业级的数据库的所有好处。

Neo4j 主要构建块

  • 节点

  • 属性

  • 关系

  • 标签

  • 数据浏览器

Neo4j CQL

CQL代表Cypher查询语言。 像关系型数据库具有查询语言SQL,Neo4j使用CQL作为查询语言。

  • 它是Neo4j图形数据库的查询语言。

  • 它是一种声明性模式匹配语言。

  • 它遵循SQL语法。

  • 它的语法是非常简单且人性化、可读的格式。

image-20210106103034711

集群环境

​ 集群环境

  • 实现功能

    主master1负责写,从slave1 slave2负责读

    主master2负责写,从slave3 slave4负责读

  • 代码

    * 主要类&方法&参数&返回值及代码行标注注释

    * 基于user_id对c_order表进⾏数据分⽚

    * 基于master1和master2主从集群实现读写分离

    ShowTime

    说明 各 ip 如下图

image-20201225163906164

接下来 代码请求插入操作

​ # 视频演示

分库分表实战及中间件


categories: 分库分表
分库分表实战及中间件

背景描述

  • 刚开始我们的系统只用了单机数据库

  • 随着用户的不断增多,考虑到系统的高可用和越来越多的用户请求,我们开始使用数据库主从架构

  • 当用户量级和业务进一步提升后,写请求越来越多,这时我们开始使用了分库分表

遇到的问题

  • 用户请求量太大

​ 单服务器TPS、内存、IO都是有上限的,需要将请求打散分布到多个服务器

  • 单库数据量太大

​ 单个数据库处理能力有限;单库所在服务器的磁盘空间有限;单库上的操作IO有瓶颈

  • 单表数据量太大

​ 查询、插入、更新操作都会变慢,在加字段、加索引、机器迁移都会产生高负载,影响服务

如何解决

  • 垂直拆分

    垂直分库

image-20201225135530458

​ 垂直分表

表中字段太多且包含大字段的时候,在查询时对数据库的IO、内存会受到影响,同时更新数据时,产生的binlog文件会很大,MySQL在主从同步时也会有延迟的风险

image-20201225135651977

  • 水平拆分

​ 水平分表

​ 针对数据量巨大的单张表(比如订单表),按照规则把一张表的数据切分到多张表里面去。但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。

image-20201225135825913

​ 水平分库

将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈

image-20201225140248714

  • 水平分库规则

不跨库、不跨表,保证同一类的数据都在同一个服务器上面。

数据在切分之前,需要考虑如何高效的进行数据获取,如果每次查询都要跨越多个节点,就需要谨慎使用。

  • 水平分表规则

​ RANGE

​ 时间:按照年、月、日去切分。例如order_2020、order_202005、order_20200501

​ 地域:按照省或市去切分。例如order_beijing、order_shanghai、order_chengdu

​ 大小:从0到1000000一个表。例如1000001-2000000放一个表,每100万放一个表

​ HASH

​ 用户ID取模

业务层改造

​ 基于代理层方式:Mycat、Sharding-Proxy、MySQL Proxy

基于应用层方式:Sharding-jdbc

  • 分库后面临的问题

​ 事务问题:一次投递需要插入两条记录,且分布在不同的服务器上,数据需要保障一致性。

​ 跨库跨表的join问题:

​ 全局表(字典表):基础数据/配置数据,所有库都拷贝一份

​ 字段冗余:可以使用字段冗余就不用join查询了

​ 系统层组装:可以在业务层分别查询出来,然后组装起来,逻辑较复杂额外的数据管理负担和数据运算压力:数 据库扩容、维护成本变高.

ShardingSphere

Apache ShardingSphere是一款开源的分布式数据库中间件组成的生态圈。它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(规划中)这3款相互独立的产品组成。 他们均提供标准化的数据

分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的

应用场景。

Sharding-JDBC:被定位为轻量级Java框架,在Java的JDBC层提供的额外服务,以jar包形式使用。

Sharding-Proxy:被定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。

Sharding-Sidecar:被定位为Kubernetes或Mesos的云原生数据库代理,以DaemonSet的形式代理所有对数据库的访问。

linux 作业题


categories: MySql数据库

linux 作业题

搭建一个MySQL高可用架构集群环境(4台主机,1主、2从、1 MHA)

image-20201218165712462

如上图 CoderCheng 为主库 UCloud 和 UCloud1年 为两个从库

以dept 为库为演示

image-20201218170115160

从库 和主库 目前只要这几条数据 现在 我在主库添加一条数据

id为4 name的5数据

image-20201218170611409

刷新从库 可以看到 数据已经同步过来了

image-20201218170740855

image-20201218170800466

说明 主从同步成功

以下命名在主库用到命令

image-20201218170921953

image-20201218170947061

以下命令从库 用到

image-20201218171031275

说明满足主从 半同步复制。

接下来 测试mha功能

备注

39.106.214.114 master

106.75.20.63 slave

117.50.7.7 slave

106.75.31.205 manager

  • 首先4台机器进行ssh免密登录

    配置完成后使用命令测试

1
masterha_check_ssh -conf=/etc/mha_master/mha.cnf

出现下图所示代表ssh 免密成功

image-20201219084600607

  • 进行主从复制测试(出现下图表示成功)

    1
    masterha_check_repl -conf=/etc/mha_master/mha.cnf > /etc/mha_master/manager.log &

    image-20201219084939148

  • 接下来 启动 manager管理节点查看主从切换日志

1
masterha_manager --conf=/etc/mha_master/mha.cnf < /etc/mha_master/manager.log &

​ 接下来手动关闭 39.106.214.114 模拟故障 master mysql 查看 manager日志

image-20201219091135589

出现 这个 成功 说明 已经 mha 切换可以成功

下面在新的master添加一条数据 测试 是否成成功

image-20201219091935067

​ 开始在新的master(Ucloud)添加一条 id 888 name 666的数据 刷新 slave (UCloud1年)库查看数据

image-20201219092058063

测试成功!!!