141. rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
不是,原因有两个:
- 存储空间的考虑:如果每个节点都拥有所有队列的完全拷贝,这样新增节点不单没有新增存储空间,反而增加了更多冗余的数据;
- 性能的考虑:如果每条消息都需要完整拷贝到每一个集群节点,那新增节点并没有提升处理消息的能力,最多是保持和单节点相同的性能甚至是更糟糕。
142. rabbitmq 集群中唯一一个磁盘节点崩溃了会发生什么情况?
如果唯一磁盘的磁盘节点崩溃了,不能进行以下操作:
- 不能创建队列
- 不能创建交换器
- 不能创建绑定
- 不能添加用户
- 不能更改权限
- 不能添加和删除集群节点
唯一磁盘节点崩溃了,集群是可以保持运行的,但你不能更改任何东西。
143. rabbitmq 对集群节点停止顺序有要求吗?
RabbitMQ 对集群的停止的顺序是有要求的,应该先关闭内存节点,最后再关闭磁盘节点。如果顺序恰好相反的话,可能会造成消息的丢失。
Kafka
144. kafka 可以脱离 zookeeper 单独使用吗?为什么?
kafka 不能脱离 zookeeper 单独使用,因为 kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。
145. kafka 有几种数据保留的策略?
kafka 有两种数据保存策略:按照过期时间保留和按照存储的消息大小保留。
146. kafka 同时设置了 7 天和 10G 清除数据,到第五天的时候消息达到了 10G,这个时候 kafka 将如何处理?
这个时候 kafka 会执行数据清除工作,时间和大小不论哪个满足条件,都会清空数据。
147. 什么情况会导致 kafka 运行变慢?
- cpu性能瓶颈
- 磁盘读写瓶颈
- 网络瓶颈
148. 使用 kafka 集群需要注意什么?
- 集群的数量不是越多越好,最好不要超过七个,因为节点越多,消息复制需要的时间就越长,整个群组的吞吐量就越低。
- 集群数量最好是单数,因为超过一半故障集群就不能用了,设置为单数容错率更高。
Zookeeper
149. zookeeper 是什么?
zookeeper 是一个分布式的,开放源码的分布式应用程序切条服务,是 google chubby的开源实现,是hadoop 和hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护,域名服务,分布式同步,组服务等。
150. zookeeper 都有哪些功能?
集群管理:监控节点存活状态、运行请求等。
主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 zookeeper 可以协助完成这个过程。
分布式锁:zookeeper 提供两种锁:独占锁,共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。zookeeper 可以对分布式锁进行控制。
命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。
151. zookeeper 有几种部署模式?
zookeeper 有三种部署模式:
- 单机部署:一台集群上运行;
- 集群部署:多台集群运行;
- 伪集群部署:一台集群启动多个zookeeper 实例运行。
152. zookeeper 怎么保证主从节点的状态同步?
zookeeper 的核心是原子广博,这个机制保证了各个server之间的同步。实现这个机制的协议叫做zab协议。zab协议有两种模式,分别是恢复模式(选主)和广播模式(同步)。当服务启动或者在领导者崩溃后,zab就进入了恢复模式,当领导者被选举出来,且大多数server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader 和server 具有相同的系统状态。
153. 集群中为什么要有主节点?
在分布式环境中,有些业务逻辑只需要集群中的某一台机器进行执行,其他的机器可以共享这个结果,这样可以大大减少重复计算,提高性能,所以就需要主节点。
154. 集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
可以继续使用,单数服务器只要没超过一半的服务器宕机就可以继续使用。
154. 说一下 zookeeper 的通知机制?
客户端会对某个znode 简历一个watcher事件,当该znode发生变化时,这些客户端会受到zookeeper的通知,然后客户端可以根据znode变化来做出业务上的改变。
MySql
155. 数据库的三范式是什么?
- 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
- 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
- 第三范式:任何非主属性不依赖于其他非主属性。
156. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
表类型如果是MyISAM,那id就是8;
表类型如果是InnoDB,那id就是5;
InnoDB表只会把自增主键的最大id记录在内存中,所以重启之后会导致最大id丢失。
157. 如何获取当前数据库版本?
使用select version()获取当前MySQL数据库版本。
158. 说一下 ACID 是什么?
Atomicity(原子性):
一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个缓解。事务在执行过程中发生错误,会被恢复(Roolback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不分割,不可约简。
Consistency(一致性):
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束,触发器,级联回滚等。
Isolation(隔离性):
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括:
- 读未提交(Read uncommitted)
- 读已提交(Read committed)
- 可重复读(Repeatable read)
- 串行化(Serializable)
Durability(持久性):
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
159. char 和 varchar 的区别是什么?
char(n):固定长度类型,比如订阅char(10),当你输入“abc”三个字符的时候,它们占的空间还是10个字节,其他7个是空字节。
char优点:效率高;缺点:占用空间;适用场景:存储密码的md5值,固定长度的,使用char非常适合。
varchar(n):可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。所以,从空间上考虑varchar比较合适;从效率上考虑char比较合适,二者使用需要权衡。
160. float 和 double 的区别是什么?
- float最多可以存储8位的十进制数,并在内存中占4字节。
- double最多可以存储16位的十进制数,并在内存中占8字节。