lukaliou123 / lukaliou123.github.io

lukaliou123在2022年的面试用知识点总结
Other
5 stars 0 forks source link

面试时遇到的一些有趣不好分类的问题 #34

Open lukaliou123 opened 1 year ago

lukaliou123 commented 1 year ago

1.消息队列如何让消费者无序消费?又如何有序?

无序: 这和mq的一个机制,partition(分区)有关

许多分布式消息队列系统中,如Kafka和RocketMQ等,消息会被分配到不同的分区(partition)。每个分区内的消息都是有序的,但是不同分区之间的消息是无序的。以下是如何通过分区实现无序消费的具体方法:

1.多个分区: 可以通过将消息分散到多个分区中,让消费者从不同的分区并行消费。因为每个分区内的消息是有序的,但不同分区之间没有顺序关系,所以最终的消费顺序是无序的。

2.自定义分区策略: 通过自定义分区策略,你可以控制消息被发送到哪个分区。例如,你可以随机选择分区,这样消息就会被随机分散到不同的分区,消费时也就无序了。

3.并行消费分区: 通过增加消费者的数量或配置并行消费分区的数量,消费者可以同时从多个分区获取消息。因为不同分区间没有固定的顺序关系,所以并行消费会打破FIFO的顺序。

虽然无序消费可能在某些场景中是有用的,但它也可能导致一些问题。例如,如果你的业务逻辑依赖于消息的顺序,那么无序消费可能会导致错误的结果。

总结: 在许多消息队列系统中,分区是一个重要的概念。每个分区内的消息都是有序的,但不同分区之间的消息是无序的。消费者可以从一个或多个分区并行消费消息。

如果消费者从多个分区获取消息,并且不特别关心或控制分区之间的顺序,那么从消费者的角度来看,消费的顺序就是无序的。这样的无序消费可以增加系统的并行能力和吞吐量,因为消费者可以同时从多个分区获取和处理消息。

当然,这种设计也可能有一些挑战。例如,如果业务逻辑需要全局的消息顺序,则可能需要额外的同步和协调机制。

无序的场景?为什么无序?

想象一下,我们有一个大型电商网站,需要处理大量的用户点击事件。每个点击事件包括了用户点击的产品、时间、位置等信息。我们想通过分析这些点击事件来了解用户的兴趣和行为。

在这个场景下:

1.无序消费的优点1.提高吞吐量:通过从多个分区并行消费,我们可以更快地处理消息,提高系统的吞吐量。 2.负载均衡:如果我们不关心消息的全局顺序,我们可以更灵活地分配消费者到分区,确保所有的消费者都在有效地工作。

2.为什么顺序不重要: 在这个例子中,我们关心的是用户的整体行为和趋势,而不是单个用户的精确点击顺序。所以,无序消费不会对分析的结果造成影响。 当你关心的是消息的内容,而不是它们之间的精确顺序时,无序消费可能是一个很好的选择。它可以让你更灵活地扩展和优化系统,同时还能满足业务的需求

有序:

在一个分布式的消息队列系统中,如果要保证消费者接收到有序的消息,可以采取以下策略:

1.使用单一分区:如果你的队列只有一个分区,那么所有的消息都将按照进入该分区的顺序被消费。但是这样会限制系统的可扩展性和吞吐量。

2.基于关键字分区:如果消息可以根据某个关键字(例如用户ID)进行分区,那么相同关键字的消息将被发送到同一个分区。消费者可以确保从同一个分区按顺序消费消息。这样,相同关键字的消息将被顺序处理,但不同关键字的消息仍可能无序。

3.消费者与分区的一对一映射:可以将特定的消费者映射到特定的分区。只要消费者按照分区的顺序消费消息,就可以确保全局的顺序。

4.全局排序:这是一种更复杂的方法,需要消费者之间的协调和额外的逻辑来确保全局顺序。这可能涉及使用时间戳、序列号或其他同步机制来对消息进行排序

lukaliou123 commented 1 year ago

2.MySQL主从集群如果出现宕机怎么恢复?

主库宕机: (1)确保所有的relay log全部更新完毕,在每个从库上执行show processlist

(2)更新完毕后,登录所有从库查看master.info文件,对比选择pos最大的作为新的主库

(3)然后登录这个新的主库,执行stop slave;进入主目录,删除master.Info和relay-log.info配置my.cnf文件开启log-bin文件

(4)创建用于同步的用户并授权slave

(5)登录另外一台从库,执行stop slave停止同步

(6)执行start slave

(7)修改新的master数据,测试slave是否同步更新

从库宕机: (1)查看从库上mysql的错误日志,里面有记录主从挂掉时的binlog信息

(2)有了binlog和postion信息后,只需要重新在从库上进行change master to配置即可。配置后开启slave状态,没有报错

(3)查看slave状态,发现slave已经正常了,开始进行延时数据恢复。

SHOW PROCESSLIST是什么?

查看数据库当前的线程 1691414890068 1691414925529 在这个输出中,你可以看到一些重要的信息:

线程3正在等待主服务器发送事件,这是从库的I/O线程线程4正在从中继日志中读取事件,这是从库的SQL线程。 假如你在State列看到了“Waiting for master to send event”一直没有改变,可能表示主服务器和从服务器之间的连接有问题。这时,你需要检查主从复制的配置,并查看主服务器和从服务器的日志,以确定问题所在。

通过这个命令,你可以迅速了解到MySQL复制中可能出现的问题,从而采取适当的措施来修复它们。

POS是什么?

当我们谈到MySQL的binlog中的pos时,我们是在谈论"位置"或"偏移量"(position)。在MySQL的二进制日志(binlog)中,每个事件都有一个与之关联的位置,这个位置表示事件在日志文件中的偏移量。当MySQL复制运行时,主库的每个更改都会写入binlog,而从库会记录已经复制并执行了主库的哪个位置的更改。这个位置信息存储在从库的relay-log.info文件中。

当主库宕机时,选择pos最大的从库作为新的主库的原因是,pos最大的从库是复制最远的从库,也就是说,它已经复制并执行了主库的最多更改。因此,选择pos最大的从库可以确保数据的一致性,并最大限度地减少数据丢失的风险。

以下是一个例子

在主库上执行以下命令,可以看到binlog的文件和位置1691415423657

结果可能类似于1691415490076

这里的Position列就表示当前binlog的位置,也就是我们所说的pos

同样地,在从库上执行以下命令,可以看到复制到哪个位置: 1691415506815

在输出中,你会看到Exec_Master_Log_Pos字段,它指示了从库复制并执行了主库的哪个位置的更改。