Linux 生产环境搭建 Zookeeper 集群
大纲
- Docker 搭建 ZooKeeper 集群
- Docker 安装 ZooKeeper 单机实例
- Linux 安装 ZooKeeper 单机实例
- Linux 单机搭建 Zookeeper 集群
- Linux 生产环境搭建 Zookeeper 集群
前言
本文适用于在 Centos/Debian/Ubuntu 等 Linux 发行版系统上,使用多台物理机器搭建 Zookeeper 集群。
Zookeeper 简介
Zookeeper 是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务。它不适合用来存储大量信息,可以用来存储一些配置、发布与订阅等少量信息。Hadoop、Storm、消息中间件、RPC 服务框架、分布式数据库同步系统,这些都是 Zookeeper 的应用场景。
Zookeeper 集群简介
在 Linux 生产环境上搭建 Zookeeper 集群,至少需要三个节点(服务器)。
角色划分
Zookeeper 集群有三种角色划分,分别是 leader
、follower
、observer
:
领导者(leader)
:负责进行投票的发起和决议,更新系统状态。跟随者(follower)
:用于接收客户端请求,并向客户端返回结果,以及在选举过程中参与投票观察者(observer)
:可以接收客户端连接,将写请求转发给leader
节点,但是不参与投票过程,只同步leader
的状态,通常用作对查询操作做负载。
Java 虚拟机入门教程之一 JVM 内存结构
大纲
- Java 虚拟机入门教程之一 JVM 内存结构
- Java 虚拟机入门教程之二 JVM 垃圾收集
- Java 虚拟机入门教程之三 JVM 参数调优
- Java 虚拟机入门教程之四 JVM 四种引用
- Java 虚拟机入门教程之五 JVM 性能优化
- Java 虚拟机入门教程之六 JVM 类加载机制
JVM 的内存结构
JVM 内存结构主要有三大块:栈、堆内存、方法区。堆内存是 JVM 中最大的一块,由新生代和老年代组成,不包括永久代(方法区);而新生代内存又被分成 Eden 空间、From Survivor 空间、To Survivor 空间,默认情况下新生代按照 8:1:1 的比例来分配。方法区存储类信息、静态变量、常量、常量池等数据,是线程共享的区域,为了与 Java 堆区分,方法区还有一个别名 Non-Heap (非堆)。栈又分为 Java 虚拟机栈和本地方法栈,主要用于方法的执行。
MyBatis 入门教程之一
大纲
- MyBatis 入门教程之一
- MyBatis 入门教程之二
- MyBatis 入门教程之三
- MyBatis 入门教程之四
- MyBatis 入门教程之五
- MyBatis 入门教程之六
- MyBatis 入门教程之七
- MyBatis 入门教程之八
前言
MyBatis 简介
MyBatis 是支持定制化 SQL、存储过程以及高级映射的持久层框架(ORM)。MyBatis 可以使用简单的 XML 或注解用于配置和映射数据表,将 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据表中的记录。
Linux 单机搭建 Zookeeper 集群
大纲
- Docker 搭建 ZooKeeper 集群
- Docker 安装 ZooKeeper 单机实例
- Linux 安装 ZooKeeper 单机实例
- Linux 单机搭建 Zookeeper 集群
- Linux 生产环境搭建 Zookeeper 集群
前言
本文适用于在 Centos/Debian/Ubuntu 等 Linux 发行版系统上,使用单机搭建 Zookeeper 集群。
Zookeeper 简介
Zookeeper 是一个高效的分布式协调服务,可以提供配置信息管理、命名、分布式同步、集群管理、数据库切换等服务。它不适合用来存储大量信息,可以用来存储一些配置、发布与订阅等少量信息。Hadoop、Storm、消息中间件、RPC 服务框架、分布式数据库同步系统,这些都是 Zookeeper 的应用场景。
Zookeeper 集群简介
在 Linux 单机上搭建 Zookeeper 集群,至少需要三个节点。
角色划分
Zookeeper 集群有三种角色划分,分别是 leader
、follower
、observer
:
领导者(leader)
:负责进行投票的发起和决议,更新系统状态。跟随者(follower)
:用于接收客户端请求,并向客户端返回结果,以及在选举过程中参与投票观察者(observer)
:可以接收客户端连接,将写请求转发给leader
节点,但是不参与投票过程,只同步leader
的状态,通常用作对查询操作做负载。
手写 JDK 1.7 的 HashMap 实现
前言
这里将参考 JDK 1.7 的 HashMap 底层源码,模拟手写一个简易版的 HashMap。
思路
JDK 1.7 是如何处理哈希冲突的?
在 JDK 1.7 中,HashMap 在处理哈希冲突时采用的是链地址法(Separate Chaining)。当发生哈希冲突时,即多个键被映射到了同一个哈希桶(数组的位置),HashMap 会将这些键值对存储在同一个哈希桶对应的链表中。具体来说,在 JDK 1.7 中,HashMap 的每个哈希桶(数组的位置)实际上是一个链表,每个链表存储了哈希值相同的键值对。当执行 Put 操作时,HashMap 首先会计算键的哈希值,然后确定该键应该存储在数组的哪个位置。如果该位置已经存在了链表,HashMap 就会遍历该链表,检查是否已经存在相同键的键值对。如果存在相同的键,则 HashMap 会更新相应的值;如果不存在相同的键,则 HashMap 会将新的键值对添加到链表的末尾。链地址法的优点是它能够处理哈希冲突,并且在一定程度上保持了 HashMap 的性能。然而,在负载因子较高的情况下,即链表较长的情况下,查询键值对的效率可能会降低,因为需要遍历链表来找到目标键值对。
JDK 1.8+ 是如何处理哈希冲突的?
在 JDK 1.8 之后,HashMap 的实现发生了变化。JDK 1.8 引入了红黑树来替代链表,以改善在负载因子较高时的性能,这种结构称为 “链表与红黑树混合实现”。具体来说,当哈希冲突发生时,如果链表的长度超过一定阈值(默认为 8),HashMap 会将链表转换为红黑树。这样做的目的是为了在链表长度较长时提高查询、修改和删除操作的效率,因为红黑树的时间复杂度更稳定,为 O (log n)。而当链表长度较短时,仍然保持使用链表结构,因为在较短的链表中,链表的遍历效率更高。值得一提的是,当红黑树中元素个数小于一定数量时,会转换回原来的链表结构,JDK 设置这个默认数量为 6 个。
Docker 可视化管理工具介绍
前言
谈及 Docker,避免不了需要熟练地记住许多命令及其用法。对于熟悉 Shell 的技术开发人员而言,命令行操作相对容易,熟练之后,命令行便于操作及脚本化。然而,对于对命令行不熟悉的非技术人员来说,进行 Docker 的部署和管理可能会感到困难,学习成本较高。市面上有多种可视化管理工具,各有优缺点。以下是对 DockerUI、Shipyard、Rancher、Portainer 进行简单对比。
DockerUI
优点:
- 支持容器的批量操作。
- 支持镜像管理(功能相对薄弱)。
缺点:
- 不支持多主机、多环境。
- 管理平台无登录认证机制。
结论:
- 由于 Web 管理平台缺乏登录认证机制,考虑到使用过程中人员管理、权限管理等因素,难以长期使用,故不推荐。
- 项目已停止维护,个人临时使用可以考虑。
Java Object 的划分
前端入门基础之 HTML 与 CSS 之五
大纲
- 前端入门基础之 HTML 与 CSS 之一
- 前端入门基础之 HTML 与 CSS 之二
- 前端入门基础之 HTML 与 CSS 之三
- 前端入门基础之 HTML 与 CSS 之四
- 前端入门基础之 HTML 与 CSS 之五
版心
在 PC 端,由于分辨率和屏幕较大,网页版心一般是固定宽度且水平居中的。网页版心的宽度设置示例如下:
屏幕分辨率 | 版心宽度 |
---|---|
低分辨率 | 900 ~ 100 |
高分辨率 | 1100 ~ 1300 |