面试大概7个问题,虽然结果以失败告终,但是我觉得很不服气(不好意思,就是这么直性子),所以发出来让大家看一看。
注:有的回答可能不正确,或者不完整,别的同学不要拿去直接用。
一上来自我介绍:。。。
问题1:
HBase和mysql的区别
。
HBase基于列存储,查询中的选中规则是通过列来定义,因此整个数据库是自动索引化的。HBase无需考虑分库、分表,它可以对存储的数据自动切分数据,并支持高并发读写操作,使得海量数据存储自动具有更强的扩展性。
但是HBase不包含事务,没有表与表之间关联查询,
mysql基于行存储,
mysql的innodb引擎带事务控制,表之间的join比较方便;伸缩性比较差。
问题2 :
dubbo服务中,1500tps的服务A好2000tps的服务b同时调用服务c,如何实现在两台服务器上独立调用
?
我回答使用dubbo自带的一致性hash负载均衡。
问题3 :
mysql如何自己实现读写分离
?
我说的是一般两种方式,在应用层实现,或者使用中间件如cobra, amoeda。
mysql自己实现,这个我说没听说过,没答出来。
问题4:
cobar,
Amoeba
原理
?
直接回答,原理不知道,接着回答:
Amoeba处于应用程序和数据库服务器之间,充当一个中间代理层。其支持负载均衡、高可用、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
问题5:
如何在应用层实现mysql读写分离
?
这个就是平时用到的,所以说的比较详细:
(1)写一个DynamicDataSource类 继承Spring的AbstractRoutingDataSource,只要实现determineCurrentLookupKey方法即可。
(2)再写一个类DynamicDataSourceHolder,使用ThreadLocal技术来记录当前线程中的数据源的key;
(3)订阅数据源的AOP切面,通过Service的方法名判断是应该走读库还是写库;
(4)Spring的配置文件中配置数据源DataSource为自定义的DynamicDataSource,定义连接池,配置jdbc.properties;
(5)配置事务管理以及动态切换数据源切面。
问题6:
redis的list如何在分布式环境上缓存
?
我回答不知道,但是我知道redis上的sorted set数据结构的使用和原理。
set
可以通过用户额外提供一个优先级
(score)
的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,可以选择
sorted。比如想要获取自动按照时间排好序的帖子,就可以用帖子发表时间作为score来存储。
实现方式:
Redis sorted set的内部使用
HashMap
和跳跃表
(SkipList)
来保证数据的存储和有序,
HashMap
里放的是成员到
score
的映射,而跳跃表里存放的 是所有的成员,排序依据是
HashMap
里存的
score,
使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
问题7:
分库分表时的一致性hash算法
?
对节点和数据,都做一个哈希运算,然后比较节点和数据的哈希值,数据取和节点最相近的节点作为存放节点。这样就保证当节点增加或者减少的时候,影响的数据最少。
一种简单的办法,给每个真实结点后面根据虚拟节点加上后缀再取Hash值,比如"192.168.0.0:111"就把它变成"192.168.0.0:111&&VN0"到"192.168.0.0:111&&VN4",VN就是Virtual Node的缩写,还原的时候只需要从头截取字符串到"&&"的位置就可以了。