Docker构建zookeeper集群

Docker构建zookeeper集群

zookeeper介绍

介绍

zookeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服务是一个复杂的过程,ZooKeeper通过其简单的架构和API解决了这个问题。Zookeeper允许开发人员专注于核心应用程序逻辑,而不必担心应用程序的分布式特性。

应用场景

  • 分布式协调组件
  • 分布式锁
  • 无状态化的实现

Docker构建zookeeper集群过程

  • docker拉取zookeeper镜像
docker search zookeeper
docker pull zookeeper
  • docker中创建网络,打通各个节点之间的通讯
#创建一个虚拟网络
docker network create mynetwork
#查看创建的虚拟网络
docker network inspect mynetwork
  • 创建对应的目录,为容器的存储映射做好准备
#三个zk节点,总共创建三个目录,用于映射/conf和/data目录
mkdir -m777 /Users/a1/develop/docker/zookeeper/zk1
mkdir -m777 /Users/a1/develop/docker/zookeeper/zk2
mkdir -m777 /Users/a1/develop/docker/zookeeper/zk3
  • 启动对应的zk容器
docker run -d  --network mynetwork --name zk1 -p 2181:2181 \
-v /Users/a1/develop/docker/zookeeper/zk1/conf:/conf \
-v /Users/a1/develop/docker/zookeeper/zk1/data:/data \
zookeeper


docker run -d  --network mynetwork --name zk2 -p 2182:2181 \
-v /Users/a1/develop/docker/zookeeper/zk2/conf:/conf \
-v /Users/a1/develop/docker/zookeeper/zk2/data:/data \
zookeeper

docker run -d  --network mynetwork --name zk3 -p 2183:2181 \
-v /Users/a1/develop/docker/zookeeper/zk3/conf:/conf \
-v /Users/a1/develop/docker/zookeeper/zk3/data:/data \
zookeeper

docker run -d  --network mynetwork --name zk4 -p 2184:2181 \
-v /Users/a1/develop/docker/zookeeper/zk4/conf:/conf \
-v /Users/a1/develop/docker/zookeeper/zk4/data:/data \
zookeeper
  • 修改zk各个节点的myid文件和zoo.cfg配置文件
#修改各自的myid文件中的值为1、2、3
echo 1 > myid
echo 2 > myid
echo 3 > myid
#zoo.cfg 文件中修改如下
dataDir=/data
dataLogDir=/datalog
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
#server.1=localhost:2888:3888;2181
server.1=192.168.228.2:2001:3001;2181
server.2=192.168.228.3:2001:3001;2181
server.3=192.168.228.4:2001:3001;2181
  • 重新启动3个zk节点
docker start zk1
docker start zk2
docker start zk3

至此,使用docker构建zk集群完成,按照zk的ZAB协议,以1、2、3的顺序启动zk节点,则myid为2的节点为集群的leader,其它两个为follower

  • 使用Curator,测试集群的读写锁的使用情况
<!-- 引入Curator的依赖-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>5.1.0</version>
</dependency>

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.1.0</version>
</dependency>
//springboot 配置文件,载入CuratorTemplate组件
@org.springframework.context.annotation.Configuration
@ComponentScan(basePackages = "com.huwc.mvclearn")
public class Configuration {
   

    @Bean
    CuratorFramework curatorFramework(){
   
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);

        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().
                connectString("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183").sessionTimeoutMs(100 * 1000).retryPolicy(retryPolicy).build();

        curatorFramework.start();

        System.out.println("curatorFramework.isStarted() = " + curatorFramework.isStarted());

        return curatorFramework ;
    }
}


//测试读锁和写锁的代码:

	@Autowired
    private CuratorFramework curatorFramework ;
    @Test
    public void testReadLock() throws Exception {
   
        InterProcessReadWriteLock lock = new InterProcessReadWriteLock(curatorFramework, "/lock1");

        // 获取读锁
        InterProcessMutex readLock = lock.readLock();

        readLock.acquire();

        // 模拟读取操作
        for(int i=0;i<100;i++){
   
            System.out.println(i+"读取中...");
            Thread.sleep(3000);
        }

        readLock.release();

    }

    @Test
    public void testWriteLock() throws Exception {
   
        InterProcessReadWriteLock lock = new InterProcessReadWriteLock(curatorFramework, "/lock1");

        // 获取写锁
        InterProcessMutex writeLock = lock.writeLock();

        writeLock.acquire();

        System.out.println("writeLock getted.......");

        writeLock.release();
    }

分布式锁可以采用redis或者zookeeper的特性来实现,但redis的机制是ap而zookeeper的机制是cp,所以在极端情况下,redis的分布式锁可能会出现问题,但zookeeper的锁相对更加安全。

相关推荐

  1. Docker构建zookeeper

    2023-12-29 18:52:02       55 阅读
  2. docker容器单机部署zookeeper+kafka

    2023-12-29 18:52:02       44 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-29 18:52:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-29 18:52:02       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-29 18:52:02       87 阅读
  4. Python语言-面向对象

    2023-12-29 18:52:02       96 阅读

热门阅读

  1. Leetcode 2976. Minimum Cost to Convert String I

    2023-12-29 18:52:02       65 阅读
  2. LeetCode 26 删除有序数组中的重复项

    2023-12-29 18:52:02       55 阅读
  3. 复杂度与顺序表

    2023-12-29 18:52:02       66 阅读
  4. var、let 和 const声明的变量有什么区别

    2023-12-29 18:52:02       69 阅读
  5. 本地缓存Caffeine的使用

    2023-12-29 18:52:02       60 阅读
  6. 入门Python笔记详细介绍

    2023-12-29 18:52:02       63 阅读
  7. SpringCloud实战之Kubernetes项目运行示例

    2023-12-29 18:52:02       48 阅读
  8. js随机生成背景

    2023-12-29 18:52:02       53 阅读
  9. 前端跨页面通信方法

    2023-12-29 18:52:02       56 阅读
  10. 给软件行业年轻人的2024新年寄语

    2023-12-29 18:52:02       66 阅读
  11. c# CultureInfo 总结

    2023-12-29 18:52:02       56 阅读
  12. python合并多个PDF,成为1个PDF

    2023-12-29 18:52:02       62 阅读
  13. 蓝桥杯宝藏排序2题目(快速,归并,桶排序)

    2023-12-29 18:52:02       63 阅读
  14. 蓝桥杯-每日刷题-029

    2023-12-29 18:52:02       54 阅读
  15. 浅识数据库与数据仓库的区别

    2023-12-29 18:52:02       53 阅读
  16. 【AI】图像识别和无人零售

    2023-12-29 18:52:02       53 阅读