zk集群在搭建部署的时候,通常选择2n+1奇数台。底层 Paxos 算法支持(过半成功)。
zk部署之前,保证服务器基础环境正常、JDK成功安装。
服务器基础环境
- IP
- 主机名
- hosts映射
- 防火墙关闭
- 时间同步
- ssh免密登录
-
- JDK环境
1、虚拟机克隆
- 前提:是虚拟机处于关闭状态。
- 分类:链接克隆 、完整克隆
链接克隆:表层是互相独立 底层存储是交织在一起;
完整克隆:完全互相独立的两台虚拟机
- 修改克隆机器属性。
完整克隆意味着两台机器一模一样。在局域网网络中,有些属性是决定不能一样的。
比如:IP、MAC、主机名hostname
- 3台虚拟机硬件分配 16G
node1 2*2cpu 4G内存
node2 1*1cpu 2G内存
node3 1*1cpu 2G内存
2、修改IP、主机名
- 命令修改 临时生效 重启无效
- 修改底层配置文件 永久生效 重启才能生效。
vim /etc/hostnamenode2.itcast.cn
#修改IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33TYPE="Ethernet" #网卡类型 以太网
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none" #ip等信息是如何决定的? dhcp动态分配、 static|node 手动静态分配
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33" #网卡名称
UUID="74c3b442-480d-4885-9ffd-e9f0087c9cf7"
DEVICE="ens33"
ONBOOT="yes" #是否开机启动网卡服务
IPADDR="192.168.88.151" #IP地址
PREFIX="24" #子网掩码 等效: NETMASK=255.255.255.0
GATEWAY="192.168.88.2" #网关服务
DNS1="192.168.88.2" #网关DNS解析
DOMAIN="114.114.114.114" #公网DNS解析 114.114.114.114 谷歌:8.8.8.8 阿里百度DNS
IPV6_PRIVACY="no#修改主机名hostname
node2.itcast.cn
重启linxu系统 reboot
3、hosts映射修改
- 背景
在网络中,很少直接通过IP访问机器,原因难记。
通常使用主机名或者域名访问。
此时就会涉及到主机名域名和IP之间的解析
- 实现
-
- 本地hosts文件 进行本地查找解析
localhost 127.0.0.1
寻找DNS服务器 域名解析服务
- 配置本地hosts文件实现
- linux上
vim /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.239.151 node1.itcast.cn node1
192.168.239.152 node2.itcast.cn node2
192.168.239.153 node3.itcast.cn node3
- windows上
C:\Windows\System32\drivers\etc\hosts192.168.88.151 node1.itcast.cn node1
192.168.88.152 node2.itcast.cn node2
192.168.88.153 node3.itcast.cn node3
4、 防火墙关闭
- firewalld
#查看防火墙状态
systemctl status firewalld#关闭防火墙
systemctl stop firewalld#关闭防火墙开机自启动
systemctl disable firewalld#centos服务开启关闭命令
centos6:(某些可以在centos7下使用)service 服务名 start|stop|status|restartchkconfig on|off 服务名centos7: systemctl start|stop|status|restart 服务名systemctl disable|enable 服务名 #开机自启动 关闭自启
- selinux
vim /etc/selinux/config# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
-
- 需要重启生效
5、 集群时间同步
- 背景:分布式软件主从角色之间通常基于心跳时间差来判断角色工作是否正常。
- 国家授时中心 北京时间
-
- 授时服务器 国家级 企业级 院校级
- linux上如何同步时间
-
- ntp 网络时间协议 实现基于网络授时同步时间。
- date
查看当前的系统时间 也可以手动指定设置时间 不精准[root@node1 ~]# date
Thu May 20 14:50:30 CST 2021
-
- ntpdate
#ntpdate 授时服务器ntpdate ntp5.aliyun.com[root@node1 ~]# ntpdate ntp5.aliyun.com
20 May 14:53:07 ntpdate[2187]: step time server 203.107.6.88 offset -1.354309 sec#企业中运维往往不喜欢ntpdate 原因是这个命令同步时间是立即的。不是平滑过渡的。
-
- ntpd软件
通过配置 平滑的和授时服务器进行时间的同步
-
- VMware软件可以提高让虚拟机的时间和windows笔记本保持一致。
6、ssh免密登录
- 背景
#在进行集群操作的时候 需要从一台机器ssh登录到其他机器进行操作 默认情况下需要密码[root@node1 ~]# ssh node2
The authenticity of host 'node2 (192.168.227.152)' can't be established.
ECDSA key fingerprint is SHA256:5d9A04L+QfYuW7X1J44cKNbyUtuwPkhg+//0OfEczHI.
ECDSA key fingerprint is MD5:74:f0:65:22:af:fd:65:af:ff:91:37:83:3f:ef:ac:81.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'node2,192.168.227.152' (ECDSA) to the list of known hosts.
root@node2's password:
Last login: Thu May 20 11:48:37 2021 from 192.168.227.1[root@node2 ~]# exit
logout
Connection to node2 closed.
- 需求:能否实现免密ssh登录。
-
- 技术:SSH方式2:免密登录功能。 原理见课堂画图
- 实现
#实现node1----->node2#step1
在node1生成公钥私钥
[root@node1 ~]# ssh-keygen 一顿回车 在当前用户的home下生成公钥私钥 隐藏文件[root@node1 .ssh]# pwd
/root/.ssh
[root@node1 .ssh]# ll
total 12
-rw------- 1 root root 1675 May 20 11:59 id_rsa
-rw-r--r-- 1 root root 402 May 20 11:59 id_rsa.pub
-rw-r--r-- 1 root root 183 May 20 11:50 known_hosts#step2
copy公钥给node2
ssh-copy-id node2
注意第一次需要密码#step3
[root@node1 .ssh]# ssh node2
Last login: Thu May 20 12:03:30 2021 from node1.itcast.cn
[root@node2 ~]# exit
logout
Connection to node2 closed.
- 课程要求
#至少打通node1---->node1 node2 node3 这三个免密登录 #至于所有机器之间要不要互相免密登录 看你心情
7、JDK的安装、环境变量配置
- 简单:解压即可使用 但是通常配置环境变量,以便于在各个路径下之间使用java。
- 要求:JDK1.8版本。
- 步骤
#上传安装包到/export/server下
jdk-8u241-linux-x64.tar.gz#解压到当前目录
tar zxvf jdk-8u241-linux-x64.tar.gz#删除红色安装包(可选)
rm -rf jdk-8u241-linux-x64.tar.gz#配置环境变量
vim /etc/profile #G + o export JAVA_HOME=/export/server/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar#重新价值环境变量文件 让配置生效
source /etc/profile[root@node1 ~]# java -version
java version "1.8.0_241"
- 将node1的JDK安装包scp给其他机器
#scp安装包cd /export/server/scp -r jdk1.8.0_241/ root@node2:$PWD#scp环境变量文件scp /etc/profile node2:/etc/#别忘了 其他机器source哦source /etc/profile
8、zk具体安装部署
- zk具体安装部署(选择node1安装 scp给其他节点)
安装包
-
- zookeeper-3.4.6.tar.gz
- 上传解压重命名
cd /export/servertar zxvf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6/ zookeeper修改配置文件zoo.cfg
#zk默认加载的配置文件是zoo.cfg 因此需要针对模板进行修改。保证名字正确。
cd zookeeper/conf
mv zoo_sample.cfg zoo.cfgvi zoo.cfg#修改
dataDir=/export/data/zkdata
#文件最后添加 2888心跳端口 3888选举端口
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
- 扩展:心跳机制
-
- 分布式软件中从角色向主角色进行心跳 heartbeat
- 目的:报活
- myid
#在每台机器的dataDir指定的目录下创建一个文件 名字叫做myid
#myid里面的数字就是该台机器上server编号。server.N N的数字就是编号
[root@node1 conf]# mkdir -p /export/data/zkdata
[root@node1 conf]# echo 1 >/export/data/zkdata/myid把安装包同步到其他节点上
cd /export/server
scp -r zookeeper/ node2:$PWD
scp -r zookeeper/ node3:$PWD
创建其他机器上myid和datadir目录
[root@node2 ~]# mkdir -p /export/data/zkdata
[root@node2 ~]# echo 2 > /export/data/zkdata/myid [root@node3 ~]# mkdir -p /export/data/zkdata
[root@node3 ~]# echo 3 > /export/data/zkdata/myid