• CentOS 7 基于C 连接ZooKeeper 客户端


    前提条件:CentOS 7 编译ZooKeeper 客户端,请参考:CentOS 7 编译ZooKeeper 客户端

    1、Docker 安装ZooKeeper

    1. # docker 获取zookeeper 最新版本
    2. docker pull zookeeper
    3. # docker 容器包含镜像查看
    4. docker iamges
    5. # 准备zookeeper 镜像文件挂载对应文件目录
    6. 将它部署在 /usr/local/zookeeper 目录下:
    7. cd /usr/local && mkdir zookeeper && cd zookeeper
    8. 创建data目录,用于挂载容器中的数据目录:
    9. mkdir data
    10. # docker 运行zookeeper
    11. docker run -d -e TZ="Asia/Shanghai" -p 2181:2181 -v $PWD/data:/data --name zookeeper --restart always zookeeper
    12. # 运行参数说明
    13. -e TZ="Asia/Shanghai" # 指定上海时区
    14. -d # 表示在一直在后台运行容器
    15. -p 2181:2181 # 对端口进行映射,将本地2181端口映射到容器内部的2181端口
    16. --name # 设置创建的容器名称
    17. -v # 将本地目录(文件)挂载到容器指定目录;
    18. --restart always #始终重新启动zookeeper
    19. # docker 查看zookeeper 运行状态
    20. docker ps

    2、CentOS 7 基于C 连接ZooKeeper Demo

    在 /usr/local/source_code/zookeeper_demo/ 目录下,新增zookeeper_demo.c 文件,内容如下:

    1. [root@localhost source_code]# cd zookeeper_demo/
    2. [root@localhost zookeeper_demo]# ll
    3. 总用量 0
    4. [root@localhost zookeeper_demo]# vi zookeeper_demo.c
    5. [root@localhost zookeeper_demo]# ll
    6. 总用量 4
    7. -rw-r--r--. 1 root root 575 1010 12:46 zookeeper_demo.c
    1. #include <zookeeper/zookeeper.h>
    2. int main() {
    3. zhandle_t *zh;
    4. char buffer[512];
    5. int bufferlen=sizeof(buffer);
    6. // 初始化zookeeper客户端
    7. zh = zookeeper_init("localhost:2181", NULL, 30000, 0, 0, 0);
    8. if (zh == NULL) {
    9. printf("zookeeper 连接失败! \n");
    10. }else {
    11. printf("zookeeper 连接成功! \n");
    12. }
    13. // 获取节点数据
    14. int ret = zoo_get(zh, "/test", 0, buffer, &bufferlen, NULL);
    15. if (ret != ZOK) {
    16. // 处理错误
    17. printf("zookeeper 获取/test 节点数据异常! \n");
    18. }
    19. // do something with the node data
    20. // 关闭zookeeper客户端
    21. zookeeper_close(zh);
    22. return 0;
    23. }
    • 编译代码的时候需要加链接的库及库的路径,那么编译命令如下
    gcc zookeeper_demo.c -o zookeeper_demo -L/usr/local/lib/ -lzookeeper_st
    

    在执行的时候如果出现动态库无法加载,请进行如下配置。

    /etc/ld.so.conf.d/ 目录下新建文件 usr-libs.conf ,内容是: /usr/local/lib
    vim /etc/ld.so.conf.d/usr-libs.conf
    • 然后使用命令 /sbin/ldconfig 更新一下配置即可。
    sbin/ldconfig

    知识拓展:Linux 编译zookeeper 默认填充库文件地址和头文件地址

    zookeeper 库文件地址:在/usr/local/lib目录下的libzookeeper_mt(集群模式)/libzookeeper_st(单列模式)

    1. [root@localhost zookeeper_demo]# cd /usr/local/lib
    2. [root@localhost lib]# ll
    3. 总用量 6820
    4. -rw-r--r--. 1 root root 532172 1010 09:44 libhiredis.a
    5. lrwxrwxrwx. 1 root root 19 1010 09:44 libhiredis.so -> libhiredis.so.1.1.0
    6. lrwxrwxrwx. 1 root root 19 1010 09:44 libhiredis.so.1 -> libhiredis.so.1.1.0
    7. -rwxr-xr-x. 1 root root 318840 1010 09:44 libhiredis.so.1.1.0
    8. -rw-r--r--. 1 root root 2262492 94 15:28 libjpeg.a
    9. -rwxr-xr-x. 1 root root 918 94 15:28 libjpeg.la
    10. lrwxrwxrwx. 1 root root 16 94 15:28 libjpeg.so -> libjpeg.so.9.5.0
    11. lrwxrwxrwx. 1 root root 16 94 15:28 libjpeg.so.9 -> libjpeg.so.9.5.0
    12. -rwxr-xr-x. 1 root root 1237096 94 15:28 libjpeg.so.9.5.0
    13. -rw-r--r--. 1 root root 883484 831 16:56 libzookeeper_mt.a
    14. -rwxr-xr-x. 1 root root 987 831 16:56 libzookeeper_mt.la
    15. lrwxrwxrwx. 1 root root 24 831 16:56 libzookeeper_mt.so -> libzookeeper_mt.so.2.0.0
    16. lrwxrwxrwx. 1 root root 24 831 16:56 libzookeeper_mt.so.2 -> libzookeeper_mt.so.2.0.0
    17. -rwxr-xr-x. 1 root root 453944 831 16:56 libzookeeper_mt.so.2.0.0
    18. -rw-r--r--. 1 root root 835950 831 16:56 libzookeeper_st.a
    19. -rwxr-xr-x. 1 root root 977 831 16:56 libzookeeper_st.la
    20. lrwxrwxrwx. 1 root root 24 831 16:56 libzookeeper_st.so -> libzookeeper_st.so.2.0.0
    21. lrwxrwxrwx. 1 root root 24 831 16:56 libzookeeper_st.so.2 -> libzookeeper_st.so.2.0.0
    22. -rwxr-xr-x. 1 root root 433840 831 16:56 libzookeeper_st.so.2.0.0
    23. drwxr-xr-x. 2 root root 42 1010 09:44 pkgconfig

     zookeeper 头文件地址:在/usr/local/include目录下的zookeeper目录中。

    1. [root@localhost zookeeper_demo]# cd /usr/local/include/
    2. [root@localhost include]# ll
    3. 总用量 88
    4. drwxr-xr-x. 3 root root 116 1010 09:44 hiredis
    5. -rw-r--r--. 1 root root 3301 94 15:28 jconfig.h
    6. -rw-r--r--. 1 root root 14588 94 15:28 jerror.h
    7. -rw-r--r--. 1 root root 14925 94 15:28 jmorecfg.h
    8. -rw-r--r--. 1 root root 49408 94 15:28 jpeglib.h
    9. drwxr-xr-x. 2 root root 132 831 16:56 zookeeper
    10. [root@localhost include]# cd zookeeper/
    11. [root@localhost zookeeper]# ll
    12. 总用量 108
    13. -rw-r--r--. 1 root root 1361 831 16:56 proto.h
    14. -rw-r--r--. 1 root root 3077 831 16:56 recordio.h
    15. -rw-r--r--. 1 root root 72869 831 16:56 zookeeper.h
    16. -rw-r--r--. 1 root root 20328 831 16:56 zookeeper.jute.h
    17. -rw-r--r--. 1 root root 1747 831 16:56 zookeeper_log.h
    18. -rw-r--r--. 1 root root 1055 831 16:56 zookeeper_version.h

    3、ZooKeeper 核心方法

    • 查看ZooKeeper.h 头文件涉及核心方法
    1. [root@localhost zookeeper]# pwd
    2. /usr/local/include/zookeeper
    3. [root@localhost zookeeper]# cat zookeeper.h
    4. ********************

     

    个人认为的核心方法如下:

    1. create():此方法由客户端使用来创建新的znode。它需要znode的路径和数据作为参数。
     
    2. exists():这个方法由客户端用来检查特定的znode是否存在。它需要znode的路径作为参数。

    3. getData():此方法用于从特定的znode获取数据。它需要znode路径作为参数。

    4. setData():这个方法用于设置特定znode的数据。它需要znode路径作为参数。

    5. getChildren():此方法用于得到特定znode的所有子节点。它需要znode路径作为参数。

    6. delete():这个方法允许客户端删除一个特定的znode。它需要znode的路径作为参数。

    7. sync():此方法用于同步znode的状态到当前客户端。

    8. close():此方法用于关闭客户端与ZooKeeper服务的连接。

    9. addAuthInfo():在此ZooKeeper会话上添加授权信息。

    10. getState():返回ZooKeeper客户端的状态。

    以上这些方法的目的是让客户端能够在ZooKeeper的znode树中浏览、读写数据,监控znode状态的改变等等。

    备注:ZooKeeper API中的所有读方法get*在成功返回时都会提供一个Stat对象。Stat对象包含了关于znode的元数据,比如它的czxid、mzxid、pzxid、version等。

  • 相关阅读:
    7款最佳的图片编辑App
    笔试强训day35(抄送列表,年会抽奖)
    【代码源每日一题】饿饿 饭饭「二分答案」
    C盘如何扩容
    经典算法----迷宫问题(找出所有路径)
    全套3D游戏建模自学资料
    第三期:gRPC客户端与服务端连接失败后,是否会有重试机制?
    CSMACD协议与CSMACA协议
    HTML
    【Kafka三】Kakfa API
  • 原文地址:https://blog.csdn.net/zhouzhiwengang/article/details/133748836