zookeeper 集群搭建
<p>[TOC]</p>
<h2>一、准备环境(最少三个节点):</h2>
<table>
<thead>
<tr>
<th>服务器ip</th>
<th>zookeeper节点名</th>
<th>使用端口</th>
<th>需要环境</th>
</tr>
</thead>
<tbody>
<tr>
<td>192.168.5.160</td>
<td>160</td>
<td>2181、2888、3888</td>
<td>JDK</td>
</tr>
<tr>
<td>192.168.5.162</td>
<td>162</td>
<td>2181、2888、3888</td>
<td>JDK</td>
</tr>
<tr>
<td>192.168.5.163</td>
<td>163</td>
<td>2181、2888、3888</td>
<td>JDK</td>
</tr>
</tbody>
</table>
<p>[点击下载zookeeper安装包](<a href="http://101.69.243.254:5010/share/hTzyyf0c">http://101.69.243.254:5010/share/hTzyyf0c</a> "点击下载zookeeper安装包")</p>
<p><strong>1配置前记得检查主备机的防火墙状态,使用root用户检查</strong></p>
<pre><code class="language-shell">systemctl status firewalld.service #查看防火墙状态
firewall-cmd --list-all #查看已开放端口列表</code></pre>
<p><strong>2每个节点需开放以下端口:</strong></p>
<pre><code class="language-shell">firewall-cmd --zone=public --add-port=2888/tcp --permanent
firewall-cmd --zone=public --add-port=3888/tcp --permanent
firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --reload</code></pre>
<h2>二、为什么zookeeper节点是奇数</h2>
<p> 我们知道,在每台机器数据保持一致的情况下,zookeeper集群可以保证,客户端发起的每次查询操作,集群节点都能返回同样的结果。
但是对于客户端发起的修改、删除等能改变数据的操作呢?集群中那么多台机器,你修改你的,我修改我的,最后返回集群中哪台机器的数据呢?
这就是一盘散沙,需要一个领导,于是在zookeeper集群中,leader的作用就体现出来了,只有leader节点才有权利发起修改数据的操作,而follower节点即使接收到了客户端发起的修改操作,也要将其转交给leader来处理,leader接收到修改数据的请求后,会向所有follower广播一条消息,让他们执行某项操作,follower 执行完后,便会向 leader 回复执行完毕。当 leader 收到半数以上的 follower 的确认消息,便会判定该操作执行完毕,然后向所有 follower 广播该操作已经生效。
所以zookeeper集群中leader是不可缺少的,但是 leader 节点是怎么产生的呢?其实就是由所有follower 节点选举产生的,讲究民主嘛,而且leader节点只能有一个,毕竟一个国家不能有多个总统。
这个时候回到我们的小标题,为什么 zookeeper 节点数是奇数,我们下面来一一来说明:
<strong>①、容错率</strong>
首先从容错率来说明:(需要保证集群能够有半数进行投票)
2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉,但是相对于 单节点服务器,2台服务器还有两个单点故障,所以直接排除了。
3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉
4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉
5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉
<strong>②、防脑裂</strong>
脑裂集群的脑裂通常是发生在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自选出自己的leader节点,导致原有的集群出现多个leader节点的情况,这就是脑裂。
3台服务器,投票选举半数为1.5,一台服务裂开,和另外两台服务器无法通行,这时候2台服务器的集群(2票大于半数1.5票),所以可以选举出leader,而 1 台服务器的集群无法选举。
4台服务器,投票选举半数为2,可以分成 1,3两个集群或者2,2两个集群,对于 1,3集群,3集群可以选举;对于2,2集群,则不能选择,造成没有leader节点。
5台服务器,投票选举半数为2.5,可以分成1,4两个集群,或者2,3两集群,这两个集群分别都只能选举一个集群,满足zookeeper集群搭建数目。
以上分析,我们从容错率以及防止脑裂两方面说明了3台服务器是搭建集群的最少数目,4台发生脑裂时会造成没有leader节点的错误。</p>
<h2>三、安装zookeeper</h2>
<p>上传zookeeper压缩包至/risen/soft/目录下</p>
<p><strong>1解压</strong></p>
<pre><code class="language-shell">unzip zookeeper-3.4.13.zip</code></pre>
<p><strong>2修改配置文件zoo.cfg(三个节点配置文件一致)</strong>
进入zookeeper的conf文件下,编辑zoo.cfg文件</p>
<pre><code class="language-shell">vim zookeeper-3.4.13/conf/zoo.cfg</code></pre>
<p>修改下面红框中的内容:
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/f869579b7f3a0964f0d65d53ffb19bf6" alt="" />
集群节点ip及端口根据情况修改</p>
<pre><code class="language-shell">server.160=192.168.5.160:2888:3888
server.162=192.168.5.162:2888:3888
server.163=192.168.5.163:2888:3888</code></pre>
<p>注释:集群设置结构为server.A=B:C:D
A:其中 A 是一个数字,表示这个是服务器的编号;
B:是这个服务器的 ip 地址;
C:Zookeeper服务器之间的通信端口;
D:Leader选举的端口。
<strong>3创建数据存储路径</strong></p>
<pre><code class="language-shell">mkdir -p /risen/soft/zookeeper-3.4.13/data</code></pre>
<h2>四、创建 myid 文件</h2>
<p>在 上一步 dataDir 指定的目录下,创建 myid 文件
参考如下配置
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/8812119ba56c8401289d6e4415830bc2" alt="" /></p>
<pre><code class="language-shell">echo &quot;160&quot; &gt; /risen/soft/zookeeper-3.4.13/data/myid</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/96ff8a53cda630c9eecfea3581e25d47" alt="" />
第一个节点192.168.5.160的myid编号是160,第二个节点192.168.5.162的myid编号是162,以此类推,后面的节点依次在相应的路径myid文件,写上相应配置数字即可</p>
<h2>五、配置环境变量(可忽略)</h2>
<p>为了能够在任意目录启动zookeeper集群,配置环境变量</p>
<pre><code class="language-shell">vim /etc/profile</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/0a02cf2c8cb15ac76b1865a0dcbd1181" alt="" /></p>
<pre><code class="language-shell">export ZK_HOME=/risen/soft/zookeeper-3.4.13
export PATH=$PATH:$ZK_HOME/bin</code></pre>
<p>使环境变量生效</p>
<pre><code class="language-shell">source /etc/profile</code></pre>
<h2>六、启动zookeeper服务</h2>
<p>授权</p>
<pre><code class="language-shell">chmod -R 755 /risen/soft/zookeeper-3.4.13/
chmod +x /risen/soft/zookeeper-3.4.13/bin/*.sh</code></pre>
<p>启动命令:</p>
<pre><code class="language-shell">zkServer.sh start</code></pre>
<p>停止命令:</p>
<pre><code class="language-shell">zkServer.sh stop</code></pre>
<p>重启命令:</p>
<pre><code class="language-shell">zkServer.sh restart</code></pre>
<p>查看集群节点状态:</p>
<pre><code class="language-shell">zkServer.sh status</code></pre>
<h2>七、设置开机自启</h2>
<p>注册服务
<code>vi /usr/lib/systemd/system/zookeeper.service</code></p>
<pre><code>[Unit]
# Zookeeper服务的描述
Description=Zookeeper Service
# 服务依赖—在什么服务之后启动,一般为在网络服务启动后启动
After=network.target
[Service]
Type=forking
# 启动环境参数
Environment=JAVA_HOME=/risen/soft/jdk/jdk8
# 启动命令
ExecStart=/risen/soft/zookeeper/bin/zkServer.sh start
# 停止命令
ExecStop=/risen/soft/zookeeper/bin/zkServer.sh stop
# 重启命令
ExecReload=/risen/soft/zookeeper/bin/zkServer.sh restart
[Install]
WantedBy=multi-user.target</code></pre>
<p>重载
<code>systemctl daemon-reload</code>
服务启动
<code>systemctl start zookeeper</code>
设置自启
<code>systemctl enable zookeeper</code></p>
<h2>七、验证集群是否成功</h2>
<p>分别对集群三个节点执行启动命令。执行完毕后,分别查看集群节点状态
出现如下即是集群搭建成功:
节点1
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/885f81b7261cefecef3d700de7020806" alt="" />
节点2
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/7e553985b645c33c0017d6a88343f7b6" alt="" />
节点3
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/e467fb0ba63f54ed084f989925a14b9b" alt="" />
三台机器,163成功的通过了选举成为了 leader,而剩下的两台成为了 follower。这时候,如果你将163的zookeeper关掉,会发现剩下两台又会有一台变成了 leader节点</p>
<h2>八、zookeeper集群连接</h2>
<p>zookeeper集群搭建完毕之后,可以通过客户端脚本连接到zookeeper集群上面</p>
<pre><code class="language-shell">zkCli.sh -server 192.168.5.163:2181</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/510336b59292e9bf77ffaf6728a33223" alt="" />
通过上图可以看出整个zookeeper集群已经搭建并测试完成</p>