(一)服务注册与发现
服务注册:服务进程在注册中心注册自己的位置。它通常注册自己的主机和端口号,有时还有身份验证信息,协议,版本号,以及运行环境的详细资料。
服务发现:客户端应用进程向注册中心发起查询,来获取服务的位置。服务发现的一个重要作用就是提供一个可用的服务列表,如DNS(缓存机制有时会造成不便),nginx+hosts(人工维护)
(二)zookeeper应用部署
1,关闭防火墙,关闭selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2,安装JDK
yum -y install java-11-openjdk java-11-openjdk-devel
java -version
wget -c -O zookeeper.tar.gz https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz
tar -xvf zookeeper.tar.gz
mv apache-zookeeper-3.5.7-bin/ /usr/local/zookeeper
cd !$
mkdir /usr/local/zookeeper/logs /usr/local/zookeeper/data
cd /usr/local/zookeeper/conf
cat zoo_sample.cfg |grep -v ^$ |grep -v ^"#" > zoo.cfg
vim zoo.cfg
Ps:在使用zookeeper 3.6之后的版本,开启服务器,zk会自动占用8080端口用来支持jmx调用,而后端服务器大部分都需要使用8080端口,因此需要zk的配置文件即可。在zk conf目录里面,修改zoo.cfg,在其中定义admin.serverPort
# admin.serverPort 默认占8080端口
admin.serverPort=8888
Ps:如果不用admin端口,在启动脚本zkServer.sh加上"-Dzookeeper.admin.enableServer=false",重启即可,大概在159行,启动命令那里。
Observer是一种新型的Zookeeper节点,可以在不伤害写性能的情况下扩展Zookeeper。Observer不参与投票,只是简单的接收投票结果,因此我们增加再多的Observer,也不会影响集群的写性能。除了这个差别,其他的和Follower基本上完全一样。使用Observer模式,可以在对应节点的配置文件添加peerType配置及指定observer角色.Zookeeper之基于Observer部署架构
peerType=observer
server.1:localhost:2181:3181:observer
跳过acl检查,如果不设置成yes,则需要superuser权限才能执行reconfig,动态配置时候需要用到,参考文章:zookeeper动态配置
skipACL=yes
#zkp服务端与客户端心跳时间,单位ms,这里是2s。
tickTime=2000
#leader和follwer初始连接时候最多忍受时间。initLimit*tickTime
initLimit=10
#leader和follwer通信超时时间,syncLimit*tickTime,leader认为follwer死掉,从服务器列表中删除follwer。
syncLimit=5
#zkp日志目录(自定义更改)
dataLogDir=/usr/local/zookeeper/logs
#zkp数据目录(自定义更改)
dataDir=/usr/local/zookeeper/data
#客户端连接端口
clientPort=2181
#admin.serverPort 默认占8080端口
admin.serverPort=8080
#IP1指的是组成Zookeeper服务器的IP地址,3188为组成zookeeper服务器之间的通信端口,3288为用来选举leader的端口(这里用单机集群(伪集群)。)
server.1=ip1:3188:3288
server.2=ip1:3388:3488
server.3=ip1:3588:3688:observer
#可合并写成
#server.1=ip1:3188:3288;0.0.0.0:2181
伪集群模式可如上再创建data1,data2,logs1,logs2,zoo.cfg1,zoo.cf2。配置一一对应。clientPort不要冲突,可以用2181,2182,2183.
注意:
- 并不是非得用 2888:3888,若ip是一样的,将端口改成其他都可以。
- server.x ,x必须为数字,并且是唯一的。
- zookeeper 服务集群数必须为奇数,最少支持数为 3
- 集群这里需要配置外,还需要指定一个 myid文件
在对应的data目录下创建文件myid文件并写入id号
echo "1" > data/myid
echo "2" > data1/myid
echo "3" > data2/myid
/usr/local/zookeeper/bin/zkServer.sh start zoo.cfg*
/usr/local/zookeeper/bin/zkServer.sh status zoo.cfg*
/usr/local/zookeeper/bin/zkServer.sh stop zoo.cfg*
使用systemd守护进程管理
[Unit]
Description=Zookeeper server daemon
After=network.target
[Service]
Type=forking
Environment=JAVA_HOME=xxxx
ExecStart=/usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zoo.cfg
#ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/usr/local/zookeeper/bin/zkServer.sh stop
PIDFile=/usr/local/zookeeper/data/zookeeper_server.pid
KillMode=none
#Restart=always
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
使用service管理
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/usr/local/zookeeper'
case $1 in
start)
echo "zookpeeper 启动"
$ZK_HOME/bin/zkServer.sh start $ZK_HOME/conf/zoo.cfg
;;
stop)
echo "zookpeeper 停止"
$ZK_HOME/bin/zkServer.sh stop $ZK_HOME/conf/zoo.cfg
;;
restart)
echo "zookpeeper 重启"
$ZK_HOME/bin/zkServer.sh restart $ZK_HOME/conf/zoo.cfg
;;
status)
echo "zookpeeper 状态"
$ZK_HOME/bin/zkServer.sh status $ZK_HOME/conf/zoo.cfg
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esac
chmod +x /etc/init.d/zkp
chkconfig --add zkp
service zkp status
启动后,会监听leader的集群通信端口,以及所有节点的leader推举端口和cli端口,和admin.serverPort。
参考文档
(三)部署可视化界面zkui
1,安装zkui
cd /usr/local
git clone https://github.com/DeemOpen/zkui.git
cd zkui/
mvn clean install -DskipTests
2,创建守护进程
mkdir -p /data/projects/zkui
cp /usr/local/zkui/target/zkui-2.0-SNAPSHOT-jar-with-dependencies.jar /data/projects/zkui/
cp /usr/local/zkui/config.cfg /data/projects/zkui/
vim /usr/lib/systemd/system/zkui.service
[Unit]
Description=zkui server daemon
After=network.target
[Service]
Type=simple
WorkingDirectory=/data/projects/zkui
ExecStart=/bin/bash -c "exec /usr/bin/java -jar /data/projects/zkui/zkui-2.0-SNAPSHOT-jar-with-dependencies.jar >>/data/projects/zkui/zkui.log 2>&1"
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
KillMode=process
#Restart=always
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start zkui
配置使用https
https=true
keystoreFile=/data/ssl/localip/zkui.jks
keystorePwd=123456
#keystoreManagerPwd=password
3,访问账号admin,密码manager配置文件config.cfg中写死的
点击栏目中的Hosts出现以下内容。
cd /usr/local/zookeeper/bin/
./zkCli.sh -server localhost:2181
[zk: localhost:2181(CONNECTED) 0] create /appconfig
Created /appconfig
[zk: localhost:2181(CONNECTED) 1] create /appconfig/hosts
Created /appconfig/hosts
[zk: localhost:2181(CONNECTED) 0] quit
点击Monitor出现以下内容(使用四字命令或者zk ui界面查看zookeeper集群时)
解决方法1
在zoo.cfg 文件里加入配置项让这些指令放行
#开启四字命令
4lw.commands.whitelist=*
解决方法2
在zk的启动脚本zkServer.sh中新增放行指令
ZOOMAIN="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=$JMXPORT -Dcom.sun.management.jmxremote.authenticate=$JMXAUTH -Dcom.sun.management.jmxremote.ssl=$JMXSSL -Dzookeeper.jmx.log4j.disable=$JMXLOG4J org.apache.zookeeper.server.quorum.QuorumPeerMain"
fi
else
echo "JMX disabled by user request" >&2
ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain"
fi
#添加VM环境变量-Dzookeeper.4lw.commands.whitelist=*
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"
if [ "x$SERVER_JVMFLAGS" != "x" ]
then
JVMFLAGS="$SERVER_JVMFLAGS $JVMFLAGS"
fi
保存修改后重启zookeeper