参考蚂蚁课堂
1.分布式理论之强一致性概念
假如说有一个mysql集群,然后数据库表中有一个字段name。
如图所示name原来的值都是张三,然后这个时候突然name被更改为李四。这个时候你查MySQL1一定会查到name值为李四,你查MySQL2,name值也为李四,这就是数据库强一致性。但是由于在数据同步的过程中网络会发生抖动,等原因,可能你查的name不是李四,还是张三也就是说数据不会那么及时的同步到MySQL2当中。所以强一致性很难实现。如果想达到这个效果我们可以这样做,就是在数据同步时对MySQL2这个数据库的读操作加锁,等数据同步之后再解锁,在分布式领域中强一致性几乎无法实现。
2.分布式理论之最终一致性概念
最终一致性是指我不需要你在修改的时候,实时同步,也就是说你可以出现读取到原来的数据,但是最终无论你通过什么手段都要达到最终一致性。比如假如说网络发生抖动,那么我就可以通过不断的尝试,啥时候网络好了,啥时候同步。这就跟犯罪了似的,不管逃到天涯海角,海枯石烂,早晚有一天会面临正义的审判,正义会迟到,但永远不会缺席!!!!这就跟最终一致性差不多你中间可能有各种原因导致数据库不同步,但是早晚有一天你得同步。
3. Zookeeper集群选举原理策略
首先介绍一下Zookeeper集群的相关概念,Zookeeper集群的节点最好是奇数而不是偶数。宕机之后剩余集群节点总数一定要大于集群节点总数/2这样的话zk才可以运行。集群当中一定会有的就是主节点和从节点,谁是主节点谁是从节点是通过选举机制选出来的,zookeeper选举的机制很简单就是投票。每台zookeeper服务器都会有配置文件配置文件里面会有myID,谁的myID大就会给谁投票。假设说集群当中只有一台zookeeper,那么这时候的选举就是等额选举,投票的时候肯定会投自己。假设这时候有两台zookeeper一台myID是1记为奥奥,另一台myID是2记为拜拜,那么投票的时候拜拜会得到两票一票是他自己的,另一票是奥奥的,因为他myID大,所以别人都认为它很牛逼。所以这时候拜拜会被选举为President,这个时候myID为3的川川想加入这个这个集群想参与这场竞争,但是这个时候川川输了,尽管他认为自己很牛逼。这主要是因为这届President的选举已经结束了,已经有President了,川川这个时候来就无法成为President,那么什么时候川川才能上位呢?只有拜拜死了(宕机)的时候,他才有机会被重新选举成为新的President。
4.构建Zookeeper集群环境
首先我们准备3台zookeeper机器。
分别是3,7,9这三台机器,然后分别在这3台机器的配置文件/usr/local/zookeeper/conf/zoo.cfg里面添加这3台机器的IP地址和其他底层的一些通信协议。即添加:
server.1=192.168.247.3:2888:3888
server.2=192.168.247.7:2888:3888
server.3=192.168.247.9:2888:3888
然后在/usr/local/zookeeper/data下面创建文件myid,里面分别写上1,2,3就行。
3是1,7是2,9是3。
注意myID不能重复,然后由于我们这3台主机之间需要相互通信所以我们必须把3台节点的防火墙关了。
systemctl stop firewalld
当我们有一台zookeeper节点启动的时候整个集群是无法启动的,因为整个集群一共有3台zookeeper,1 < 3/2,没有过半所以集群无法启动。
这个时候我们把7这台机器启动起来。
然后查看一下status发现他已经加入到这个集群当中而且mode为follower。之后我们再看一下3这台机器的status
3这个时候的角色为leader。
5.为什么zookeeper集群节点最好要是奇数
如果zk集群总数为5的话,能够保证zk可用性问题最多只能宕机2台,因为(5-2)=3 > 5/2。
如果zk集群总数为6的话,能够保证zk可用性问题最多只能宕机2台,因为(6-2)=4 > 6/2。
既然5台和6台效果是一样的那么,5台明显比6台要好,它节约了服务器资源。