学习zookeeper

 

4. 下载:

  1. cd /Users/guanguan/tools; 创建文件夹

  2. wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz 下载

  3. tar xvf zookeeper-3.4.9.tar.gz 解压缩

  4. cd zookeeper-3.4.9; ls -l

150754_l8IQ_2263272.png 

5.配置环境变量

➜   export ZOOKEEPER_HOME=/Users/guanguan/tools/zookeeper-3.4.9
➜   export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf

6.单机模式的配置情况如下:ZooKeeper的运行默认是读取zoo.cfg文件里面的内容的。

~mkdir /Users/guanguan/tools/zoo/zk0 

~cp conf/zoo_sample.cfg conf/zk0.cfg

~vim conf/zk0.cfg 

tickTime=2000

initLimit=10 

syncLimit=5 

dataDir=/Users/guanguan/tools/zoo/zk0 

clientPort=2181

152313_lSiw_2263272.png

在zk0.cfg这个文件中,我们需要指定 dataDir 的值,它指向了一个目录,这个目录在开始的时候需要为空。下面是每个参数的含义:

tickTime :基本事件单元,以毫秒为单位。这个时间是作为 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

dataDir :存储内存中数据库快照的位置,顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里

clientPort :这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

使用单机模式时用户需要注意:这种配置方式下没有 ZooKeeper 副本,所以如果 ZooKeeper 服务器出现故障, ZooKeeper 服务将会停止

 

6.1。zookeeper服务的启动

152610_5vbE_2263272.png

6.2。查看服务状态

152703_88PE_2263272.png

6.3。关闭zookeeper服务

152653_0cLU_2263272.png

7.集群模式(单机集群:在一台pc上启动多个zookeeper实例)

7.1。创建目录环境

153240_fzkm_2263272.png

7.2.修改各个配置文件

修改:dataDir,clientPort

增加:集群的实例,server.X,”X”表示每个目录中的myid的值

~ vim /Users/guanguan/tools/zookeeper-3.4.9/conf/zk1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/guanguan/tools/zoo/zk1
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

~ vim /Users/guanguan/tools/zookeeper-3.4.9/conf/zk2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/guanguan/tools/zoo/zk2
clientPort=2182
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

~ vim /Users/guanguan/tools/zookeeper-3.4.9/conf/zk3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/Users/guanguan/tools/zoo/zk3
clientPort=2183
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890

initLimit:这个配置项是用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过 10 个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。

syncLimit:这个配置项标识 Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒。

server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器,就是集群模式下配置的myid文件所存放的数值;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号

由于三个服务都在同一台电脑上,因此这里要保证地址的唯一性,因此要特别注意IP地址和端口号不要互相冲突,以免影响程序的正确执行。

3个节点的ZooKeeper集群配置完成,接下来我们的启动服务。

 

7.3.启动集群

160113_NH5w_2263272.png

160057_hAwf_2263272.png

7.4.查看zookeeper物理文件目录

160234_9IlM_2263272.png

8。分布式集群

to do...

9.命令行简单操作

当zookeeper服务开启之后,输入一下命令连接zookeeper服务

➜  zookeeper-3.4.9 bin/zkCli.sh -server 127.0.0.1:2181
Connecting to 127.0.0.1:2181
2017-08-31 16:25:52,978 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.9-1757313, built on 08/23/2016 06:50 GMT
2017-08-31 16:25:52,982 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=172.20.158.239
2017-08-31 16:25:52,982 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.8.0_92
2017-08-31 16:25:52,983 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/jre
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/Users/guanguan/tools/zookeeper-3.4.9/bin/../build/classes:/Users/guanguan/tools/zookeeper-3.4.9/bin/../build/lib/*.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/slf4j-log4j12-1.6.1.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/slf4j-api-1.6.1.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/netty-3.10.5.Final.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/log4j-1.2.16.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../lib/jline-0.9.94.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../zookeeper-3.4.9.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../src/java/lib/*.jar:/Users/guanguan/tools/zookeeper-3.4.9/bin/../conf:
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/Users/guanguan/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/var/folders/rj/lcp0d7815kl2v5xh0j4zm6h00000gn/T/
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Mac OS X
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=x86_64
2017-08-31 16:25:52,984 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=10.12.5
2017-08-31 16:25:52,985 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=guanguan
2017-08-31 16:25:52,985 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/Users/guanguan
2017-08-31 16:25:52,985 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/Users/guanguan/tools/zookeeper-3.4.9
2017-08-31 16:25:52,986 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@531d72ca
Welcome to ZooKeeper!
2017-08-31 16:25:53,019 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1032] - Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2017-08-31 16:25:53,108 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@876] - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
[zk: 127.0.0.1:2181(CONNECTING) 0] 2017-08-31 16:25:53,186 [myid:] - INFO  [main-SendThread(127.0.0.1:2181):ClientCnxn$SendThread@1299] - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15e374985180000, negotiated timeout = 30000

WATCHER::

WatchedEvent state:SyncConnected type:None path:null

9.1 使用ls命令查看当前zookeeper中所包含的内容:

ls /
[zookeeper]
[zk: 127.0.0.1:2181(CONNECTED) 1] ls /
[zookeeper]

9.2 创建一个znode,这个命令创建了一个新的 znode 节点“ zk ”以及与它关联的字符串:

[zk: 127.0.0.1:2181(CONNECTED) 2] create /zoo "myData"
Created /zoo

9.3.运行get命令来获取znode中的所创建的字符串:

get /zoo

163608_V8XC_2263272.png

 

9.4通过set命令来对zoo所关联的字符串进行修改:

set /zoo "gg"

163818_w3Am_2263272.png

9.5。znode删除

delete /zoo

9.6 help命令

[zk: 127.0.0.1:2181(CONNECTED) 7] help
ZooKeeper -server host:port cmd args
       	stat path [watch]
       	set path data [version]
       	ls path [watch]
       	delquota [-n|-b] path
       	ls2 path [watch]
       	setAcl path acl
       	setquota -n|-b val path
       	history
       	redo cmdno
       	printwatches on|off
       	delete path [version]
       	sync path
       	listquota path
       	rmr path
       	get path [watch]
       	create [-s] [-e] path data acl
       	addauth scheme auth
       	quit
       	getAcl path
       	close
       	connect host:port

9.7退出命令行

quit

10.通过Java编程实现简单的命令。

pom.xml文件

<dependency>
           <groupId>org.apache.zookeeper</groupId>
           <artifactId>zookeeper</artifactId>
           <version>3.4.9</version>
           <exclusions>
               <exclusion>
                   <groupId>org.slf4j</groupId>
                   <artifactId>slf4j-log4j12</artifactId>
               </exclusion>
           </exclusions>

       </dependency>
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {


        // 创建一个与服务器的连接
        ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 60000, new Watcher() {
            // 监控所有被触发的事件
            public void process(WatchedEvent event) {
                System.out.println("EVENT:" + event.getType());
            }
        });


        // 查看根节点
        System.out.println("ls / => " + zk.getChildren("/", true));

        //创建一个目录节点
        if (zk.exists("/node", true) == null) {
            /**
             *  CreateMode.PERSISTENT :代表创建一个持久的znode
             * ZooDefs.Ids.OPEN_ACL_UNSAFE :代表对所有的连接完全开放的权限
             */
            zk.create("/node", "guanguan".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

            System.out.println("create /node guanguan");

            //查看/node节点数据
            System.out.println("get /node:: " + new String(zk.getData("/node", false, null)));

            //查看根节点
            System.out.println("ls / ::" + zk.getChildren("/", true));
        }

        //创建一个子目录节点
        if (zk.exists("/node/sub1", true) == null) {
            zk.create("/node/sub1", "sub1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println("create /node/sub1 sub1");

            //查看node节点
            System.out.println("ls node:" + zk.getChildren("/node", true));
        }


        //修改节点数据
        if (zk.exists("/node", true) != null) {
            zk.setData("/node", "changed".getBytes(), -1);
            //查看/node节点数据
            System.out.println("get /node ::" + new String(zk.getData("/node", false, null)));


        }

        //删除节点
        if (zk.exists("/node/sub1", true) != null) {
            zk.delete("/node/sub1",-1);
            zk.delete("/node",-1);

            //查看根节点
            System.out.println("ls / ::"+zk.getChildren("/",true));
        }


        //关闭连接
        zk.close();


    }

运行结果如下:

10:03:34.319 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session
10:03:34.321 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 127.0.0.1/127.0.0.1:2181
10:03:34.339 [main-SendThread(127.0.0.1:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x15e374985180006, negotiated timeout = 40000
EVENT:None
10:03:35.246 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 1,8  replyHeader:: 1,8589934619,0  request:: '/,T  response:: v{'zookeeper} 
ls / => [zookeeper]
10:03:35.261 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 2,3  replyHeader:: 2,8589934619,-101  request:: '/node,T  response::  
10:03:35.292 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:35.294 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeCreated path:/node for sessionid 0x15e374985180006
EVENT:NodeCreated
10:03:37.323 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:37.324 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/ for sessionid 0x15e374985180006
EVENT:NodeChildrenChanged
10:03:39.335 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 3,1  replyHeader:: 3,8589934620,0  request:: '/node,#6775616e6775616e,v{s{31,s{'world,'anyone}}},0  response:: '/node 
create /node guanguan
10:03:39.345 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 4,4  replyHeader:: 4,8589934620,0  request:: '/node,F  response:: #6775616e6775616e,s{8589934620,8589934620,1504231415283,1504231415283,0,0,0,0,8,0,8589934620} 
get /node:: guanguan
10:03:39.348 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 5,8  replyHeader:: 5,8589934620,0  request:: '/,T  response:: v{'node,'zookeeper} 
ls / ::[node, zookeeper]
10:03:39.351 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 6,3  replyHeader:: 6,8589934620,-101  request:: '/node/sub1,T  response::  
10:03:39.354 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:39.354 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeCreated path:/node/sub1 for sessionid 0x15e374985180006
10:03:39.415 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 7,1  replyHeader:: 7,8589934621,0  request:: '/node/sub1,#73756231,v{s{31,s{'world,'anyone}}},0  response:: '/node/sub1 
create /node/sub1 sub1
EVENT:NodeCreated
10:03:41.495 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 8,8  replyHeader:: 8,8589934621,0  request:: '/node,T  response:: v{'sub1} 
ls node:[sub1]
10:03:41.496 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 9,3  replyHeader:: 9,8589934621,0  request:: '/node,T  response:: s{8589934620,8589934620,1504231415283,1504231415283,0,1,0,0,8,1,8589934621} 
10:03:41.505 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:41.506 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeDataChanged path:/node for sessionid 0x15e374985180006
EVENT:NodeDataChanged
10:03:42.673 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 10,5  replyHeader:: 10,8589934622,0  request:: '/node,#6368616e676564,-1  response:: s{8589934620,8589934622,1504231415283,1504231421500,1,1,0,0,7,1,8589934621} 
10:03:42.677 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 11,4  replyHeader:: 11,8589934622,0  request:: '/node,F  response:: #6368616e676564,s{8589934620,8589934622,1504231415283,1504231421500,1,1,0,0,7,1,8589934621} 
get /node ::changed
10:03:42.686 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 12,3  replyHeader:: 12,8589934622,0  request:: '/node/sub1,T  response:: s{8589934621,8589934621,1504231419352,1504231419352,0,0,0,0,4,0,8589934621} 
10:03:42.695 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:42.695 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeDeleted path:/node/sub1 for sessionid 0x15e374985180006
EVENT:NodeDeleted
10:03:43.766 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:43.766 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/node for sessionid 0x15e374985180006
EVENT:NodeChildrenChanged
10:03:44.787 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 13,2  replyHeader:: 13,8589934623,0  request:: '/node/sub1,-1  response:: null
10:03:44.792 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got notification sessionid:0x15e374985180006
10:03:44.793 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/ for sessionid 0x15e374985180006
10:03:44.794 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 14,2  replyHeader:: 14,8589934624,0  request:: '/node,-1  response:: null
EVENT:NodeChildrenChanged
10:03:45.804 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 15,8  replyHeader:: 15,8589934624,0  request:: '/,T  response:: v{'zookeeper} 
ls / ::[zookeeper]
10:03:45.804 [main] DEBUG org.apache.zookeeper.ZooKeeper - Closing session: 0x15e374985180006
10:03:45.804 [main] DEBUG org.apache.zookeeper.ClientCnxn - Closing client for session: 0x15e374985180006
10:03:45.817 [main-SendThread(127.0.0.1:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x15e374985180006, packet:: clientPath:null serverPath:null finished:false header:: 16,-11  replyHeader:: 16,8589934625,0  request:: null response:: null
10:03:45.817 [main] DEBUG org.apache.zookeeper.ClientCnxn - Disconnecting client for session: 0x15e374985180006
10:03:45.817 [main] INFO org.apache.zookeeper.ZooKeeper - Session: 0x15e374985180006 closed
Disconnected from the target VM, address: '127.0.0.1:57022', transport: 'socket'

Process finished with exit code 0

 

转载于:https://my.oschina.net/u/2263272/blog/1527044

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值