• GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者:蟹黄瓜子
  • 文章来源:GreatSQL社区投稿

1.Zookeeper概述

Zookeeper对于很多人开始可能都有所耳闻,他的使用场景也很多,可以以节点的形式存储持久化数据,也可以使用这一特性来作为微服务的服务注册中心,简单来说,Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目。

Zookeeper从设计模式角度来理解,是一个基于观察者模式设计的分布式服务管理框架。是一个文件系统,负责存储和管理大家都关心的数据,然后接受观察者的注册;也是一种通知机制,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。

2.Zookeeper的应用场景和一些注意事项

ZooKeeper 数据模型的结构与 Unix 文件系统很类似,整体上可以看作是一棵树,每个节点称做一个 ZNode。每一个 ZNode 默认能够存储 1MB 的数据,每个 ZNode 都可以通过其路径唯一标识。

Zookeeper的应用场景有许多,比如统一的配置管理,在许多分布式环境中,通常一个服务集群的配置文件信息是一致的,如果需要修改配置信息内容,不可能逐个对每个服务做修改,而是希望修改一次配置信息就可以同步给所有服务节点,Zookeeper就可以实现这个业务,十分简单,可以将服务的配置信息写入ZooKeeper上的一个Znode中,让每个集群节点的服务器都去监听这个Znode,一旦数据被修改,ZooKeeper将通知各个服务器,达到同步的效果。还可以做统一的集群管理、服务器的动态上下线、以及软负载均衡的效果。

在实践Zookeeper前还需要注意的内容:

  • Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。
  • 集群正常运行的前提条件是集群节点大于半数,因此集群节点数最好采用奇数个。
  • 全局数据一致:每个Server保存一份相同的数据副本,Client无论连接到哪个Server,数据都是一致的。
  • 更新请求顺序执行,来自同一个Client的更新请求按其发送顺序依次执行。
  • 数据更新原子性,一次数据更新要么成功,要么失败。
  • 实时性,在一定时间范围内,Client能读到最新数据。

3.简单部署Zookeeper集群

官网地址:https://zookeeper.apache.org/,本文采用VMware创建3台虚拟机构建集群,XShell工具连接虚拟机进行操作:

首先为机子安装jdk,采用yum源安装,注意设置yum,静等安装成功出现“Complete”即可:

[root@localhost ~]# yum install -y java-1.8.0-openjdk.x86_64
  • 进入/usr/local/目录,将提前准备好的“zookeeper-3.4.5.tar.gz”文件传入目录,并解压:
[root@localhost ~]# cd /usr/local/[root@localhost local]# tar zxvf zookeeper-3.4.5.tar.gz 
  • 修改文件名为“zookeeper”:
[root@localhost local]# mv zookeeper-3.4.5 zookeeper
  • 修改环境变量:
[root@localhost local]# vi /etc/profile# 进入insert模式后在上方添加一下内容后保存退出export ZOOKEEPER_HOME=/usr/local/zookeeperexport PATH=$PATH:$ZOOKEEPER_HOME/bin
  • 重新编译“/etc/profile”:
[root@localhost zookeeper]# source /etc/profile
  • 进入conf目录下,将“zoo_sample.cfg”拷贝生成“zoo.cfg”文件作为zookeeper的配置文件:
[root@localhost zookeeper]# cd conf/[root@localhost conf]# cp zoo_sample.cfg zoo.cfg 
  • 修改“zoo.cfg”文件:

    • 配置文件中主要要配置数据存放路径和日志路径,zookeeper默认的数据存放路径为”dataDir=/tmp/zookeeper”,为临时数据,会过期,本文将重新指定相关位置,存放在“自己”的路径下,当然也可以根据需要建立单独路径进行存放。
# 将配置文件中的dataDir替换为此路径dataDir=/usr/local/zookeeper/data# 在配置文件中添加以下配置,ip地址根据规划# 其中server.1代表集群的第几胎集群,后续会配置myid文件,myid文件内容和对应的数字保存一致,例如1.131这台机器myid就是1# ip地址为集群的三台机器,也可以配置host使用主机名,两个端口号心跳端口和数据端口dataLogDir=/usr/local/zookeeper/logserver.1=192.168.1.11:2888:3888server.2=192.168.1.12:2888:3888server.3=192.168.1.13:2888:3888
  • 简单解释下集群配置:

    • server.A=B:C:D
    • A 是一个数字,表示这个是第几号服务器;集群模式下配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面有一个数据就是 A 的值,Zookeeper 启动时读取此文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个 server。
    • B 是这个服务器的地址;
    • C 是这个服务器 Follower 与集群中的 Leader 服务器交换信息的端口;
    • D 是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
  • 回到”zookeeper“目录下,创建配置文件中提到的两个路径并赋予权限:

[root@localhost conf]# cd ..[root@localhost zookeeper]# mkdir -m 755 data[root@localhost zookeeper]# mkdir -m 755 log
  • 来到“data/”路径下,创建myid文件,并给相应值1
[root@localhost zookeeper]# cd data/[root@localhost data]# vi myid
  • 此刻对于集群节点的第一台机器就配置完成了,另外两台机器需要在准备好环境并设置好环境变量的前提下进行
  • 通过第一台机器将配置好的zookeeper及集群配置下发到另外两台机器上,注意修改对应机器的myid:
[root@localhost data]# scp -r /usr/local/zookeeper root@192.168.1.12:/usr/local/[root@localhost data]# scp -r /usr/local/zookeeper root@192.168.1.13:/usr/local/
  • 修改myid值为2和3后,集群部署完毕。
  • 进入到01机器的zookeeper目录下,启动zookeeper:
[root@localhost zookeeper]# bin/zkServer.sh startJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED[root@localhost zookeeper]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgError contacting service. It is probably not running.
  • 此时集群没办法起来,因为目前只有一个节点开启
  • 当第二台启动以后,集群节点超过半数,第二台机器就会选举成为leader
[root@localhost zookeeper]# bin/zkServer.sh startJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED[root@localhost zookeeper]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode: leader[root@localhost zookeeper]# 
  • 第一台就变成follower了
[root@localhost zookeeper]# bin/zkServer.sh statusJMX enabled by defaultUsing config: /usr/local/zookeeper/bin/../conf/zoo.cfgMode: follower
  • 开启第三台后,第二台机器已经是leader了,除非机器宕机会触发重新选举
  • 关于zookeeper的操作可以通过启动启动客户端:
[root@localhost zookeeper]# bin/zkCli.shWatchedEvent state:SyncConnected type:None path:null[zk: localhost:2181(CONNECTED) 0] 
  • 至此测试完成,zookeeper集群部署完毕,更多zookeeper操作可以参照zookeeper官方文档。

Enjoy GreatSQL ?

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区GiteeGitHubBilibili

GreatSQL社区:

捉虫活动详情:https://greatsql.cn/thread-97-1-1.html

社区博客有奖征稿详情:https://greatsql.cn/thread-100-1-1.html

技术交流群:

微信:扫码添加GreatSQL社区助手微信好友,发送验证信息加群