状态是指网络上的某个资源在某个时间点下的数据呈现,表述性指将状态用一定的格式表述出来。
简单举例如下:比如说在北京时间20170929 08:55:06.986这个时间点,我们想查看下es集群的状态,于是发送了一个HTTP GET请求:
GET /_cluster/health?pretty HTTP/1.1
Host: hadoop01:9200
Accept: text/html,application/xhtml+xml,application/xml;...
服务器的响应头:
Content-Length:356
Content-Type:application/json; charset=UTF-8
响应body:
{
"cluster_name" : "escluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 4,
"active_shards" : 8,
"relocating_shards" : 1,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
响应信息显示,es集群当前状况良好,有3个节点…
我们请求的资源,在那个时间点下的状态,就通过如上的格式表述了出来。这就是表述性状态。
当然同一个状态可以通过不同的格式表述,即资源的多重表述。如上资源也可以通过xml的格式表述:
node-0
escluster ...
转移是指资源在不同时间点下呈现不同的状态,即资源从一个状态转移到了另一个状态。
简单举例:上面的那个请求,当我们关掉一个节点的服务,而后再次请求时,状态如下:
响应body:
{
"cluster_name" : "escluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 2,
"number_of_data_nodes" : 2,
"active_primary_shards" : 4,
"active_shards" : 8,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
响应信息显示,es集群当前状况良好,有2个节点…
以上。
虽然以上举例都是用http请求,但REST并不局限于web,而是因为REST通常被用于web系统中。非web的系统例如提供Service服务的后台系统同样也可以是REST风格的。
REST是针对架构的一组约束条件和原则,满足这些约束和原则的架构,就是RESTful架构。
curl [options] url
-d/--data #HTTP POST data(parama=valuea¶mb=valueb)
-X/--request #POST/PUT/HEAD/DELETE Specify request command to use
-v/--verbose #显示详细信息
url /{index}/{type}/{documentId}
执行:curl -XPOST http://hadoop01:9200/djt/user/1 -d '{"name":"liyl","age":18}'
输出:
{"_index":"djt","_type":"user","_id":"1","_version":1,"_shards":{"total":2,"successful":2,"failed":0},"created":true}
创建了一个名称为djt的索引库,并创建了一个名为user的类型,创建了一个document Id为1
curl -XPUT http://hadoop01:9200/
/{index}/{type}/{documentId}?op_type=create -d '{...}'
或者
/{index}/{type}/{documentId}/_create -d '{...}'
如果不需指定id,而是自增id
/{index}/{type}/ -d '{...}'
curl -XGET http://hadoop01:9200
根据docId查询
/{index}/{type}/{docId}
根据多个docId查询
/{index}/{type}/_mget -d '{ "ids" : [1,2,3] }'
只显示指定字段
/././{docId}?_source=name
查询所有
/././_search
条件查询
/././_search?q=name:liyl
curl -XPOST http://.../{docId}/_update -d '{"docs" : { "name" : "liyl" } }'
metadata:用于指定要更新的目标,例:
{"_index" : "djt","_type" : "user","_id":1}
body:要更新为的结果。例:
{"docs":{"name":"liyl","age":33}}。
可以有多组,写到同一个文件中,用命令执行:
POST /_bulk --data-binary @文件路径
批量操作建议1000-5000条为一批,大小5M-15M,默认不超过100M,这个上限可以配置:http.max_content_length
6. 并发控制(事务)
1. 普通关系型数据库使用的是悲观锁进行并发控制(PCC)
2. es使用的是乐观锁进行并发控制(OCC):
es不会阻止对正在被其它线程更新的数据的访问,但是如果数据在读取和写入的中间发生了变化,写入就会失败。这需要客户端自行处理这种失败。客户端可以选择重新读取数据,再更新。也可以选择反馈给用户。
3. es的乐观锁的实现:
读取文档时,获得版本号
更新文档时,会把版本号传过去,es会检查要被更新的数据的最新版本号与传递过来的版本号是否相同,如果不相同,则返回失败。