Zookeeper集群(linxu)搭建
环境要求:必须要有jdk环境,本次讲课使用jdk1.8
3.1结构
一共三个节点
集群的服务器数量一般为2n+1个,(zk服务器集群规模不小于3个节点),要求服务器之间系统时间保持一致。
3.2上传zk并且解压
进行解压: tar -zxvf zookeeper-3.4.6.tar.gz
重命名: mv zookeeper-3.4.6 zookeeper
3.3 修改zookeeper环境变量
vi /etc/profile
export JAVA_HOME=/opt/jdk1.8.0_71 //jdk安装目录
export ZOOKEEPER_HOME=/usr/local/zookeeper //zookeeper安装目录
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile //使修改的配置生效
3.4 修改zoo_sample.cfg文件
//将zoo_sample.cfg的名称更改为zoo.cfg
cd /usr/local/zookeeper/conf
mv zoo_sample.cfg zoo.cfg
修改conf: vi zoo.cfg 修改两处
(1) dataDir=/usr/local/zookeeper/data(注意同时在zookeeper创建data目录)
(2)最后面添加
server.0=第一台服务器的的ip或者映射名称:2888:3888
server.1=第一台服务器的的ip或者映射名称:2888:3888
server.2=第一台服务器的的ip或者映射名称:2888:3888
3.5 创建服务器标识
服务器标识配置:
创建文件夹: mkdir data
创建文件myid并填写内容为0: vi
myid (内容为服务器标识 : 0)
此值为zoo.cfg文件中server.之后的数,数值对应ip
3.6 克隆虚拟机或者将刚才的配置的东西复制到其他两台服务器上
需要修改对应的ip和myid文件中的值
3.7 启动zookeeper
启动zookeeper:
路径: /usr/local/zookeeper/bin
执行: zkServer.sh start //或者./zkServer.sh start
(注意这里3台机器都要进行启动)
状态: zkServer.sh
status(在三个节点上检验zk的mode,一个leader和俩个follower)
3.8 启动客户端
./zkCli.sh 命令启动客户端
zoo.cfg文件属性值介绍
tickTime:心跳时间,为了确保连接存在的,以毫秒为单位,最小超时时间为两个心跳时间
initLimit:多少个心跳时间内,允许其他server连接并初始化数据,如果ZooKeeper管理的数据较大,则应相应增大这个值
clientPort:服务的监听端口
dataDir:用于存放内存数据库快照的文件夹,同时用于集群的myid文件也存在这个文件夹里(注意:一个配置文件只能包含一个dataDir字样,即使它被注释掉了。)
dataLogDir:用于单独设置transaction log的目录,transaction log分离可以避免和普通log还有快照的竞争
syncLimit:多少个tickTime内,允许follower同步,如果follower落后太多,则会被丢弃。
server.A=B:C:D:
A是一个数字,表示这个是第几号服务器,B是这个服务器的ip地址
C第一个端口用来集群成员的信息交换,表示的是这个服务器与集群中的Leader服务器交换信息的端口
D是在leader挂掉时专门用来进行选举leader所用
zookeeper(windows)单机安装
解压 zookeeper-3.4.6.tar.gz 文件
1.在文件的第一级目录下创建data文件夹
2.将conf目录下的zoo_sample.cfg的名称更改为zoo.cfg
3.修改zoo.cfg中dataDir的路径,更改为第一步创建的data的路径
4.先启动bin目录下的zkServer.cmd(服务端),打开后保持窗口不关闭, 接下来打开zkCil.cmd 启动客户端
命令行工具的一些简单操作如下:
- 1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
- 2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
- 3. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串
- 4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
- 5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置
- 6. 删除文件: delete /zk 将刚才创建的 znode 删除
- 7. 退出客户端: quit
- 8. 帮助命令: help
Java连接zookeeper
导入依赖
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency>
public class ZookeeperDemo { /** * 集群连接地址 */ private static final String CONNECT_ADDR = "192.168.110.138:2181,192.168.110.147:2181,192.168.110.148:2181"; /** * session超时时间 */ private static final int SESSION_OUTTIME = 2000; /** * 信号量,阻塞程序执行,用户等待zookeeper连接成功,发送成功信号, */ private static final CountDownLatch countDownLatch = new CountDownLatch(1); public static void main(String[] args) throws IOException, InterruptedException, KeeperException { ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher() { public void process(WatchedEvent event) { // 获取时间的状态 KeeperState keeperState = event.getState(); EventType tventType = event.getType(); // 如果是建立连接 if (KeeperState.SyncConnected == keeperState) { if (EventType.None == tventType) { // 如果建立连接成功,则发送信号量,让后阻塞程序向下执行 countDownLatch.countDown(); System.out.println("zk 建立连接"); } } } }); // 进行阻塞 countDownLatch.await(); //创建父节点 // String result = zk.create("/testRott", "12245465".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // System.out.println("result:" + result); //创建子节点 String result = zk.create("/testRott/children", "children 12245465".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); System.out.println("result:"+result); zk.close(); } }