客户端:
1、调用client端的putAPI
2、客户端client的缓存会将这些puts缓存起来,缓存的大小可以在hbase的conf中配置
3、当客户端的缓存满或者用户主动调用flush API或者HBase的配置为auto flush;满足3者任何一个时,客户端会将puts操作发送至server端
4、如何将每个put操作发送至正确的Server端呢?主要通过Region定位来获取,可以参见子页面
5、获取到每个put操作对应的RegionServer后,客户端会根据ServerName来groupBy这些puts,分别发送到对应的RegionServer
发送失败时,会将失败的puts操作尝试重发,直到成功或者超过重试次数,若超过重试次数,将这些失败的puts操作重新添加到client端的buffer中
服务端:
1、checkAndRowMutate
1.1 checkReadOnly
1.2checkResources(如果memstore已经满了,先进行一次flush)
1.3startRegionOperation(获取读锁Region级别防止关闭等操作)
1.4获取行锁getRowLock
1.5获取updatesLocks(获取Region级别更新锁,防止过程中flush)
1.6processRowsWithLocks
1.7判断是否有reput的协处理器
1.8将FSWALEntry写入wal(详细操作参见WAL落地分析)
1.9将数据写入memstore
1.10释放updatesLocks(释放后就可以做flush了)
1.11释放行锁
1.12将wal刷写到磁盘(详细操作参见WAL落地分析)
1.13是否有postput的协处理器
1.14释放读锁
1.15是否需要flush(详细操作参见FLUSH分析)
