- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
前言:为了减少三维数据中心可视化管理系统的停工时间,保持其服务的高度可用性。同时部署多套同样的三维可视化系统,让三维数据中心可视化系统同时部署并运行到多个服务器上。同时提供一个虚拟IP,然后外面通过这个虚拟IP来访问三维可视化管理系统,当一台实体服务器挂掉时会自动的切到另一条服务器,但是这个虚拟IP依然能提供服务.
要实现高可用性,需要保证数据的一致,因此需要保证这几台服务器上的数据库中的数据一致;同时还需要保证上传的文件信息一致。最后需要通过软件监听程序来监听并且挂掉时进行自动切换。
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间.
假设系统一直能够提供服务,我们说系统的可用性是100%.
如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%.
很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时.
百度的搜索首页,是业内公认高可用保障非常出色的系统,甚至人们会通过www.baidu.com 能不能访问来判断“网络的连通性”,百度高可用的服务让人留下啦“网络通畅,百度就能访问”,“百度打不开,应该是网络连不上”的印象,这其实是对百度HA最高的褒奖。-----摘选自知乎 。
我们都知道,单点是系统高可用的大敌,单点往往是系统高可用最大的风险和敌人,应该尽量在系统设计的过程中避免单点。方法论上,高可用保证的原则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其他backup能够顶上.
保证系统高可用,架构设计的核心准则是:冗余.
有了冗余之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的不可服务实践。所以,又往往是通过“自动故障转移”来实现系统的高可用。-----摘选自知乎 。
类似服务器:冗余,类似服务器有2-4个电源,但是比较贵 。
准备条件
需要三个ip,并且保证是局域网,相互之间ping的通,前面两个ip好理解,两台服务器,第三个ip就是一个虚拟ip,就是空余ip没被启用的即可,我们访问系统的话就是通过这个虚拟ip访问 。
VRRP根据优先级来确定虚拟路由器中每台路由器的地位,
如果Backup路由器工作在非抢占方式下,则只要Master路由器没有出现故障Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器,
如果Backup路由器工作在抢占方式下,当它收到VRRP报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master路由器的优先级高,就会主动抢占成为Master路由器;否则,将保持Backup状态. 。
yum install keepalived-y
1.首先把文件传到opt下面 。
cd /opt
tar -zxvf keepalived-2.0.20.tar.gz
cd keepalived-2.0.20
./configure --prefix=/usr/local/keepalived
会发现有一个报错 。
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
执行完之后也报错了 。
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
chkconfig —add keepalived
chkconfig keepalived on
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
主机: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的状态,下图表示已经启动
启动后看对应的虚拟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数据库,这里采用的时主-主备份机制进行同步的。
主一数据库:192.168.10.51 。
主二数据库:192.168.10.65 。
编辑数据库 。
vi /etc/my.cnf
# 开启二进制同步
log-bin=mysql-bin
# 设置ID,不能重复,可以使用IP最后一位数字
server-id=129
# 需要同步的数据名称,多个数据库则要重复设置: bin-do-db,bin-ignore-db为互斥关系, 只需设置其中一项即可
replicate-do-db=itv
# 自增长字段初始值为1
auto-increment-offset=1
# 自增长字段增量值
auto-increment-increment=2
# 跳过所有复制的错误
slave-skip-errors=all
systemctl restart mysqld //重启mysql服务
编辑数据库 。
vi /etc/my.cnf
# 开启二进制同步
log-bin=mysql-bin
# 设置ID,不能重复,可以使用IP最后一位数字
server-id=128
# 需要同步的数据名称,多个数据库则要重复设置: bin-do-db,bin-ignore-db为互斥关系, 只需设置其中一项即可
replicate-do-db=itv
# 自增长字段初始值为1
auto-increment-offset=1
# 自增长字段增量值
auto-increment-increment=2
# 跳过所有复制的错误
slave-skip-errors=all
systemctl restart mysqld //重启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
主主同步还有主从同步都是基于binlog的原理进行,相当于我们打开了这个开关,每次操作数据库都会产生一个binlog日志,然后把binlog日志进行发给对方进行执行,这样数据就保持同步了 。
首先进入MySQL命令行
查看日志: 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;
灰常完美 。
这里其实跟上面的主数库一是一样的操作 。
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 stop
fi
然后关掉keepalived的服务:
service keepalived stop
现在我们继续访问主机的程序,然后在访问虚拟ip 。
可以看到,主机程序已经访问不到,那么虚拟ip呢(这里注意虚拟ip机大的防火墙一定要关闭或者是开放8081端口) 。
可以看到,虚拟ip已经飘到备用服务器上了,这时候备机上面已经有了虚拟ip 。
如果现在主机重新上线,虚拟ip还会从备机飘到主机上,这时候就会产生一个现象,就是脑裂 。
我们启动主机的机房并且启动keepalived 。
最后此篇关于高可用(keepalived)部署方案的文章就讲到这里了,如果你想了解更多关于高可用(keepalived)部署方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在寻找一种方法来创建根据价格选择我的产品的过滤器(选择下拉菜单)。 我知道这样的查询是完全可能的: SELECT * FROM products ORDER BY price ASC SELECT
函数参数中或显示尺寸时(高度,宽度)的顺序是否有约定? 最佳答案 我不知道大量的语言,但我使用过的语言(宽度,高度)。它更适合沿着 (x, y) 坐标线。 关于language-agnostic -
在我的表单中,我让用户输入房间的长度高度和宽度以获得 m2、m3 和瓦特的计算值。但是用户也应该能够直接输入 height 和 m2 来获取值。我尝试了很多语法,但 if else 不能正常工作。我知
我在 Elasticsearch 中创建了一个索引,看起来像 {"amazingdocs":{"aliases":{},"mappings":{"properties":{"Adj Close":{"
我有以下功能,我需要清除数据库中的所有图片列并移动到文件系统。当我一次性完成这一切时,内存太多并且会崩溃。我切换到递归函数并执行 20 次写入和批量操作。 我需要为大约 6 个表执行此操作。我的 Re
我正在编写一个函数来计算 PI 的值,并将其作为 double 值返回。到目前为止,一切都很好。但是一旦函数到达小数点后14位,它就不能再保存了。我假设这是因为 double 有限。我应该怎么做才能继
2020年是中国CDN行业从98年诞生到今天快速发展的第二十四年,相关数据显示,全国感知网速持续上扬,达到了3.29兆/秒,标志着在宽带中国的政策指导下,中国的网速水平正在大步赶上世界发达国家的水平
在 aerospike 集合中,我们有四个 bin userId、adId、timestamp、eventype,主键是 userId:timestamp。在 userId 上创建二级索引以获取特定用
$('#container').highcharts('Map', { title : { text : 'Highmaps basic demo'
有没有办法显示自定义宽度/高度的YouTube视频? 最佳答案 在YouTube网站上的this link中: You can resize the player by editing the obj
我使用 Highcharts ,我想在 Highcharts 状态下悬停时制作动态不同的颜色。 正如你可以看到不同的颜色,这就是我做的 var usMapChart , data = [] ; va
在所有节点上运行 tpstats 后。我看到很多节点都有大量的 ALL TIME BLOCKED NTR。我们有一个 4 节点集群,NTR ALL TIME BLOCKED 的值为: 节点 1:239
我发现 APC 上存在大量碎片 (>80%),但实际上性能似乎相当不错。我有 read another post这建议在 wordpress/w3tc 中禁用对象缓存,但我想知道减少碎片是否比首先缓存
对于我的脚本类(class),我们必须制作更高/更低的游戏。到目前为止,这是我的代码: import random seedVal = int(input("What seed should be u
我发现 APC 上存在大量碎片 (>80%),但实际上性能似乎相当不错。我有 read another post这建议在 wordpress/w3tc 中禁用对象缓存,但我想知道减少碎片是否比首先缓存
对于我的脚本类(class),我们必须制作更高/更低的游戏。到目前为止,这是我的代码: import random seedVal = int(input("What seed should be u
我已经 seen >2 字节的 unicode 代码点,如 U+10000 可以成对编写,如 \uD800\uDC00。它们似乎以半字节 d 开头,但我只注意到了这一点。 这个 split Actio
有人可以帮我理解为什么我的饼图百分比计算不正确吗?看截图: 根据我的计算,如 RHS 上所示,支出百分比应为 24.73%。传递给 Highcharts 的值如下:- 花费:204827099.36-
我阅读了有关该问题的所有答案,但我还没有找到任何解决方案。 我有一个应用程序,由我的 api 服务器提供。 Wildfly 8.1 和 Mysql 5.6。当查看时间到来时(Wildfly 服务器连接
我正在用选定的项目创建圆形导航。当用户单击任何项目时,它将移动到定义的特定点。一切都很好,除了当你继续点击项目时,当动画表现不同并且项目在 360 度圆中移动并且它被重置直到你重复场景时,我希望它
我是一名优秀的程序员,十分优秀!