面试题答案
一键面试高并发读写可能出现的数据一致性问题
- 读写冲突:高并发场景下,读操作和写操作同时进行,可能导致读到未完成写入的数据,从而破坏数据一致性。例如,一个写操作正在修改某行数据,此时一个读操作并发执行,可能读取到部分修改后、部分未修改的数据,造成数据的不一致读取。
- 写写冲突:多个写操作同时针对同一行数据进行修改时,如果没有合适的控制机制,可能导致后一个写操作覆盖前一个写操作的部分结果,造成数据丢失或不一致。比如,两个写操作分别尝试增加和减少某行数据的某个字段值,无序执行可能导致最终结果不符合预期。
应对策略
- 锁机制
- 行级锁:HBase使用行级锁来保证同一时间只有一个写操作可以修改某一行数据。当一个写操作请求到达时,它会获取目标行的锁。在持有锁期间,其他写操作对该行的修改请求将被阻塞,直到当前写操作完成并释放锁。这样可以避免写写冲突,确保每行数据的修改操作是原子性的,从而保障数据一致性。
- 读锁与写锁:为了处理读写冲突,HBase可能会使用读写锁机制。写操作获取写锁,读操作获取读锁。写锁具有排他性,即当一个写锁被持有,其他读写操作都不能获取锁,直到写锁释放。读锁则允许多个读操作同时持有,但如果有写锁请求,读锁需要等待所有读操作完成后才能获取,以保证写操作的原子性和数据一致性。
- 日志机制(WAL,Write - Ahead Log)
- 预写式日志:HBase的WAL是一种预写式日志机制。在进行写操作时,数据首先被写入到WAL日志中,只有当WAL日志写入成功后,才会将数据写入到MemStore(内存存储)中。这样做的好处是,即使系统在数据写入MemStore之前崩溃,也可以通过重放WAL日志来恢复未完成的写操作,保证数据不会丢失,从而维护数据的一致性。
- 日志持久化与恢复:WAL日志会定期进行持久化到磁盘。当系统发生故障重启时,HBase会从持久化的WAL日志中读取未完成的写操作,并重新应用这些操作,将数据恢复到故障前的状态,确保数据一致性。同时,WAL日志也用于保证数据的顺序性,所有写操作按照在日志中的顺序进行重放,避免数据顺序错乱导致的一致性问题。