前言:为了缩小三维数据中心可视化管理系统的复工工夫,放弃其服务的高度可用性。同时部署多套同样的三维可视化零碎,让三维数据中心可视化零碎同时部署并运行到多个服务器上。同时提供一个虚构IP,而后里面通过这个虚构IP来拜访三维可视化管理系统,当一台实体服务器挂掉时会主动的切到另一条服务器,然而这个虚构IP仍然能提供服务。

要实现高可用性,须要保证数据的统一,因而须要保障这几台服务器上的数据库中的数据统一;同时还须要保障上传的文件信息统一。最初须要通过软件监听程序来监听并且挂掉时进行主动切换。

一、什么是高可用?

高可用HA(High Availability)是分布式系统架构设计中必须思考的因素之一,它通常是指,通过设计缩小零碎不能提供服务的工夫。

假如零碎始终可能提供服务,咱们说零碎的可用性是100%。

如果零碎每运行100个工夫单位,会有1个工夫单位无奈提供服务,咱们说零碎的可用性是99%。52.56分钟。

百度的搜寻首页,是业内公认高可用保障十分杰出的零碎,甚至人们会通过www.baidu.com 能不能拜访来判断“网络的连通性”,百度高可用的服务让人留下啦“网络通顺,百度就能拜访”,“百度打不开,应该是网络连不上”的印象,这其实是对百度HA最高的贬责。-----摘选自知乎

二、如何保障系统的高可用

咱们都晓得,单点是零碎高可用的大敌,单点往往是零碎高可用最大的危险和敌人,应该尽量在零碎设计的过程中防止单点。方法论上,高可用保障的准则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其余backup可能顶上。

保证系统高可用,架构设计的外围准则是:冗余。

有了冗余之后,还不够,每次呈现故障须要人工染指复原势必会减少零碎的不可服务实际。所以,又往往是通过“主动故障转移”来实现零碎的高可用。-----摘选自知乎

人话:两台服务器启动着雷同的服务,如果有一台故障,另一台主动接管,咱们将这个称之为高可用;

相似服务器:冗余,相似服务器有2-4个电源,然而比拟贵

上图:

装置keepalived:

离线装置办法:因为咱们的大部分客户都是属于数据中心,并不会连贯外网,所以采取离线装置的形式比拟多,在线装置的办法非常简单,如下命令即可,在装置keepalived之前确保装置了摄像头的那一套货色,因为这里波及到须要装置openssl的模块,如果没有装请先装nginx摄像头相应的软件

keepalived的运行模式:

筹备条件:

须要三个ip,并且保障是局域网,相互之间ping的通,后面两个ip好了解,两台服务器,第三个ip就是一个虚构ip,就是空余ip没被启用的即可,咱们拜访零碎的话就是通过这个虚构ip拜访

优先级

VRRP依据优先级来确定虚构路由器中每台路由器的位置;

非抢占形式

如果Backup路由器工作在非抢占形式下,则只有Master路由器没有呈现故障Backup路由器即便随后被配置了更高的优先级也不会成为Master路由器;

抢占形式

如果Backup路由器工作在抢占形式下,当它收到VRRP报文后,会将本人的优先级与通告报文中的优先级进行比拟。如果本人的优先级比以后的Master路由器的优先级高,就会被动抢占成为Master路由器;否则,将放弃Backup状态.

yum install keepalived-y

1.上传文件

1.首先把文件传到opt上面

2.解压装置

cd /opt   
tar -zxvf keepalived-2.0.20.tar.gz

3.编译

cd  keepalived-2.0.20

./configure --prefix=/usr/local/keepalived

会发现有一个报错

4.报错信息而后装置

cd /opt
rpm -ivh libnl-1.1.4-3.el7.x86_64.rpm --force --nodeps
rpm -ivh libnl-devel-1.1.4-3.el7.x86_64.rpm --force --nodeps
cd keepalived-2.0.20
./configure --prefix=/usr/local/keepalived

没有报错了,持续往下执行

 make && make install

输出下面的命令会报以下谬误

解决:

cd /usr/local/lib64
export LIBRARY_PATH=/usr/local/lib64
cd /opt/keepalived-2.0.20
./configure --prefix=/usr/local/keepalived
 make && make install

执行完之后也报错了

5.初始化keepalived

 cp /opt/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
 cp /opt/keepalived-2.0.20/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
chmod +x /etc/init.d/keepalived

6.增加keepalived到开机启动

chkconfig —add keepalived 

chkconfig keepalived on 

7.启动、敞开、重启

service keepalived start  //启动
service keepalived stop   //进行
service keepalived restart   //重启

当咱们启动应用 service keepalived start 启动的时候会报错

解决:

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

在输出命令启动

service keepalived start

以上的1-7步骤在备机上也须要装一下,请留神

8.配置keepalived

主机:192.168.10.51

备机:192.168.10.65

虚构ip:192.168.10.77

在主机下操作:

vi /etc/keepalived/keepalived.conf

以下就是咱们须要批改的内容

填完间接 :wq!保留退出即可

下面图外面说的网卡名称查询方法:

ip addr

而后重启keepalived

service keepalived restart

service keepalived status     //查看keepalived的状态,下图示意曾经启动

在备机下操作:

vi /etc/keepalived/keepalived.conf

以下就是咱们须要批改的内容

填完间接 :wq!保留退出即可

而后重启keepalived

service keepalived restart

service keepalived status     //查看keepalived的状态,下图示意曾经启动

9.验证

启动后看对应的虚构IP地址是否生成,当主机关掉或者其对应的keepalived挂掉后备机是否生成对应的虚构IP,以及主机重启工作时虚构IP是否从新漂移到主机上。

咱们能够互相ping一下,能够看见是通的

下面咱们讲过,默认拜访就是主机,主机挂了就是切换到备机,咱们只须要查看主机下面的ip,下面很显著有两个ip,其中有一个就是虚拟机ip

当咱们把主机关掉或者主机的keepalived服务关掉之后看是否从新漂移回来呢?

咱们再看看ip addr,很显著曾经没有了虚构ip

咱们曾经胜利关掉了主机的keepalived服务,咱们看下备机上可能看到虚构ip吗

咱们在备机上操作,咱们能够看到虚构ip跑到了这下面,看到这里你是不是对keepalived的工作模式有了一个通俗的意识,接下来咱们开启主机的keepalived服务,可能在跳过去嘛.这就是模仿当主机曾经复原服务了,看是否主动跳转过来

启动主机的keepalived服务:

service keepalived start
service keepalived status

查看ip,很显著曾经切换回来了,自此曾经配置实现了keepalived服务

mysql主主备份:

保障各服务器上的数据库中的数据统一,因而须要开启数据库同步机制。因为是一整套零碎,并且零碎内含数据库。因为任何一台服务器都有可能被选中,因而要让所有的数据库上的数据都是最新的,任何一个服务器上的数据发生变化时都要主动的同步到其余的服务器上。三维可视化管理系统应用的时Mysql数据库,这里采纳的时主-主备份机制进行同步的。

主一数据库:192.168.10.51

主二数据库:192.168.10.65

主数据库1:

编辑数据库

vi /etc/my.cnf
# 开启二进制同步log-bin=mysql-bin# 设置ID,不能反复,能够应用IP最初一位数字 server-id=129# 须要同步的数据名称,多个数据库则要反复设置: bin-do-db,bin-ignore-db为互斥关系, 只需设置其中一项即可replicate-do-db=itv# 自增长字段初始值为1auto-increment-offset=1# 自增长字段增量值auto-increment-increment=2# 跳过所有复制的谬误slave-skip-errors=all

systemctl restart mysqld   //重启mysql服务

主数据库2:

编辑数据库

vi /etc/my.cnf
# 开启二进制同步log-bin=mysql-bin# 设置ID,不能反复,能够应用IP最初一位数字 server-id=128# 须要同步的数据名称,多个数据库则要反复设置: bin-do-db,bin-ignore-db为互斥关系, 只需设置其中一项即可replicate-do-db=itv# 自增长字段初始值为1auto-increment-offset=1# 自增长字段增量值auto-increment-increment=2# 跳过所有复制的谬误slave-skip-errors=all

systemctl restart mysqld   //重启mysql服务

创立mysql复制账户:

在主一数据库操作:

为主二的所在的ip创立一个账号密码为root1,这样就可能容许近程拜访本机数据库了

登录mysql:

mysql -uroot -proot   //登录mysql
grant replication slave on *.* to root1@'192.168.10.68' identified by 'root1';

赋予权限:如果就这样连贯的话尽管能拜访但还是看不了数据的,所以须要赋予root1权限

update user set `Select_priv` = 'Y',`Insert_priv` = 'Y',`Update_priv` = 'Y',`Delete_priv` = 'Y',`Create_priv` = 'Y',`Drop_priv` = 'Y',`Reload_priv` = 'Y',`Shutdown_priv` = 'Y',`Process_priv` = 'Y',`File_priv` = 'Y',`Grant_priv` = 'Y',`References_priv` = 'Y',`Index_priv` = 'Y',`Alter_priv` = 'Y',`Show_db_priv` = 'Y',`Super_priv` = 'Y',`Create_tmp_table_priv` = 'Y',`Lock_tables_priv` = 'Y',`Execute_priv` = 'Y',`Repl_slave_priv` = 'Y',`Repl_client_priv` = 'Y',`Create_view_priv` = 'Y',`Show_view_priv` = 'Y',`Create_routine_priv` = 'Y',`Alter_routine_priv` = 'Y',`Create_user_priv` = 'Y',`Event_priv` = 'Y',`Trigger_priv` = 'Y',`Create_tablespace_priv` = 'Y'where user='root1';

立刻失效:

flush privileges;

在主二数据库操作:

为主一的所在的ip创立一个账号密码为root1,这样就可能容许近程拜访本机数据库了

登录mysql:

mysql -uroot -proot   //登录mysql
grant replication slave on *.* to root1@'192.168.10.67' identified by 'root1';

赋予权限:如果就这样连贯的话尽管能拜访但还是看不了数据的,所以须要赋予root1权限

update user set `Select_priv` = 'Y',`Insert_priv` = 'Y',`Update_priv` = 'Y',`Delete_priv` = 'Y',`Create_priv` = 'Y',`Drop_priv` = 'Y',`Reload_priv` = 'Y',`Shutdown_priv` = 'Y',`Process_priv` = 'Y',`File_priv` = 'Y',`Grant_priv` = 'Y',`References_priv` = 'Y',`Index_priv` = 'Y',`Alter_priv` = 'Y',`Show_db_priv` = 'Y',`Super_priv` = 'Y',`Create_tmp_table_priv` = 'Y',`Lock_tables_priv` = 'Y',`Execute_priv` = 'Y',`Repl_slave_priv` = 'Y',`Repl_client_priv` = 'Y',`Create_view_priv` = 'Y',`Show_view_priv` = 'Y',`Create_routine_priv` = 'Y',`Alter_routine_priv` = 'Y',`Create_user_priv` = 'Y',`Event_priv` = 'Y',`Trigger_priv` = 'Y',`Create_tablespace_priv` = 'Y'where user='root1';

立刻失效:

flush privileges;

测试是否拜访:

在主一登录主二的数据库:

mysql -h192.168.10.65 -uroot1 -p    //登录主二的数据库

发现连贯失败

咱们查看3306端口发现被占用,咱们开启3306端口,咱们在主备机都须要凋谢此端口

应该是防火墙的起因,

firewall-cmd --zone=public --add-port=3306/tcp --permanent

而后重启防火墙

systemctl restart firewalld.service

持续连贯,发现能够连贯胜利,并且能够查看数据

show databases;  //查看数据库

同理,在主二的数据库能够拜访主一的数据库看下:

mysql -h192.168.10.51 -uroot1 -p    //登录主一的数据库
show databases;  //查看数据库

重启数据库

主数据库1: systemctl restart mysqld
主数据库2: systemctl restart mysqld 

互告bin-log信息

主主同步还有主从同步都是基于binlog的原理进行,相当于咱们关上了这个开关,每次操作数据库都会产生一个binlog日志,而后把binlog日志进行发给对方进行执行,这样数据就放弃同步了

首先进入MySQL命令行:

主数据库1:

查看日志: show master status;

设置同步:

change master to master_host = '192.168.10.65',master_user='root1',master_password='root1',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;

备注: master_log_file与File值统一, master_log_pos与Position值统一

开始同步: start slave;

查看同步状况:

show slave status\G;

当看到了两个yes,即:Slave_IO_Running: Yes

Slave_SQL_Running: Yes

阐明曾经配置胜利了,然而这里有一个显示为no,显著有问题

解决办法:

stop slave;
reset slave;
start slave;

而后咱们持续查看同步状况;

show slave status\G;

灰常完满

主数据库2:

这里其实跟下面的主数库一是一样的操作

show master status;

change master to master_host = '192.168.10.51',master_user='root1',master_password='root1',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;

备注: master_log_file与File值统一, master_log_pos与Position值统一

开始同步:

  start slave;

查看同步状况:

 show slave status\G;

当看到了两个yes,即:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

阐明曾经配置胜利了,如果这里的slave_io_Running显示no仍然采纳下面的方法操作即可

开启我的项目测试:

在主一和主二机器上别离部署我的项目,并且导入雷同的数据库,而后用forever启动,这个在之前的部署环境就有讲过,此处不再赘述,咱们开启我的项目

在主机上开启机房:

在备机上也开启机房:

而后咱们开始拜访这两个我的项目(留神此时的防火墙,把8081端口关上):

咱们发现两个我的项目都能够顺利的关上,这时候咱们就应用虚构ip进行拜访,因为理论咱们也是通过这个虚构ip进行拜访的,咱们的虚构ip是192.168.10.77,一i就那个能够顺利拜访了,当初咱们就关掉主机的机房程序,看他能不能拜访

关掉主机服务:

forever stopall

咱们还须要吧keepalived的服务关了,因为keepalived并不知道咱们的机房程序曾经挂了,所以要时刻监听8081端口的状态,如果8081端口监听不到那么就进行keepalived这个服务,以下是sheel脚本,而后咱们设置监听一分钟即可

A=`netstat -lnp | grep 8081 | wc -l`if [ $A -eq 0 ]; then    # echo "keepalived 应该敞开了"    /usr/sbin/service keepalived stopfi

而后关掉keepalived的服务:

service keepalived stop

当初咱们持续拜访主机的程序,而后在拜访虚构ip

能够看到,主机程序曾经拜访不到,那么虚构ip呢(这里留神虚构ip机大的防火墙肯定要敞开或者是凋谢8081端口)

能够看到,虚构ip曾经飘到备用服务器上了,这时候备机下面曾经有了虚构ip

如果当初主机从新上线,虚构ip还会从备机飘到主机上,这时候就会产生一个景象,就是脑裂

咱们启动主机的机房并且启动keepalived