其中应用主机使用高可用组创建, LB 后端直接挂载高可用组。使用高可用组的目标是实现业务高峰期故障时,计算资源能自动加入负载均衡后端,自动化扩展业务处 理能力。减少运维干预成本。| 项目 | 规格 | 数量 | 说明 | |
| 主机 | 2C8G 50G 系统盘 | 2~3 | 为保障验证效果,主机能临时绑定公网 IP (生产环境无需绑 定) 100.126.38.2 (公) 10.0.1.16 100.126.38.3 (公) 10.0.1.13 10.0.1.16 演示过程中会有新主机生成 | |
| 高可用组 | 使用应用主机 模板 | 1 | 配置弹性伸缩,配置告警条件,在业务压力大导致 CPU 触发 阈值后,自动扩容主机,提升负载能力 | |
| 数据库 | 2C8G 50GSSD 存储 MySQL 5.7 | 1 | mysql -1-a0b7e160c1xxxx.jdcloud.com | |
| Redis | 4G | 1 | redis-1kn4b5zwgzc5-xxxn-1.jdcloud.com | |
| 公网 IP | 4 个,主机及 LB 各一个 | 4 | 5M 带宽 | |
| LB | 1 个,配 1 个公 网 IP 作为业务 入口 | 1 | LB 绑定公网 IP,配置轮询模式。例如, Vip: 10.0.1.27 公网 IP: 100.126.35.4 | |
| CFS | 1 个 | 1 | 共享存储作为业务应用数据存储目录挂载于高可用组主机特 定目录下:例如, mount -t nfs -o vers=3 -o noresvport 10.0.0.200:/cfs /wp |
#创建应用数据目录 配置目录权限、安装docker等
mkdir -p /wp
chmod 777 /wp
yum install docker vim -y
systemctl enable docker
systemctl start docker
#挂载CFS文件作为应用数据目录
yum install nfs-utils -y
systemctl enable rpcbind
systemctl start rpcbind
mount -t nfs -o vers=3 -o noresvport 10.0.0.200:/cfs /wp
#配置启动自动挂载CFS及启动服务,通过rc.local实现:
#[root@wpha0 wp]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
mount -t nfs -o vers=3 -o noresvport 10.0.0.200:/cfs /wp
#(说明,生产环境可在/etc/fstab挂载)
bash /root/start.sh
start.sh见以下代码
[root@wpha0 wp]# cat /root/start.sh
docker stop wordpress
sleep 3
docker rm wordpress
sleep 3
docker run -d --name=wordpress --restart=unless-stopped -p 443:443 -p 80:80 -v /wp:/var/www/html wordpress
#[root@wpha0 wp]#
#启动脚本编辑完成后,并写入rc.local后,rc.local调整成可执行,以实现启动主机运行脚本, rc.local实现了主机启动后自动挂载CFS到指定目录,然后,通过start.sh自动清除旧数据,重新拉起wordpress服务。
chmod +x /etc/rc.d/rc.local
#拉取应用所需镜像
docker pull wordpress
#拉取镜像后,运行服务。
docker run -d --name=wordpress --restart=unless-stopped -p 443:443 -p 80:80 -v /wp:/var/www/html wordpress
到这里基础主机环境准备完成。下一步,进行 wordpress 应用的配置,实现高可用可视化的演示效果。
配置 redis 动态缓存加速:redis 的角色,在这个案例里边,在 wordpress 里 redis 作为一个动态加速缓存使用,对加速网站访问, 减轻数据库压力起到一定作用。下载 wordpress 的 redis 插件,redis-cache。下载后通过 wordpress 的管理页面 -plugin --addnew 直接上传,然后依据插件操作手册安装配置即可。
安装 redis-cache 以后,会在 /wp/wp-content/plugins 目录下生成一个 redis-cache 目录。需要同时在 /wp/wp- content 下生成一个 object-cache.php 文件,正常来讲,需要调整一个参数 host 改成 redis 的域名即可。如果配置了密码,就需要调整这个以及 redis-cache 目录下的配置文件把密码配置进去,这个因为是 演示环境,redis 设置 了免密,生产环境一定要设置密码。
安装配置完成后,在管理界面的 setting 里会有 redis 的配置选项,这个和版本有关系,有些版本可能会让 在这里做参数配置。直接改文件参数效果是一样的。
mysql 及 redis 管理及相关登录方式介绍:function get_the_user_ip() {
if ( ! empty( $_SERVER["HTTP_CLIENT_IP"] ) ) {
//check ip from share internet
$ip = $_SERVER["HTTP_CLIENT_IP"];
} elseif ( ! empty( $_SERVER["HTTP_X_FORWARDED_FOR"] ) ) {
//to check ip is pass from proxy
$ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$ip = $_SERVER["REMOTE_ADDR"];
}
return apply_filters( "wpb_get_ip", $ip );
}
add_shortcode("show_ip", "get_the_user_ip");
function get_hostname()
{
$hostname = gethostname();
echo "$hostname\n";
return apply_filters( "hostname", $hostname );
}
add_shortcode("show_hostname", "get_hostname");
保存后,看到页面可以显示相关的 IP 及 hostname 信息了。
到这里, wordpress 的应用环境配置完成。下一步配置业务的高可用环境,实现跨 AZ 的高可用组及主机自动弹性伸缩。
高可用组:高可用组使用制作好了 wordpress 的应用主机的镜像。做到高可用组自动弹性伸缩出新主机 -- 新主机自动 拉起 wordpress 应用 -- 新主机自动挂载到 LB 接收业务流量的模式。

LB 配置。LB 监听器选择后端服务为高可用组,并配置健康检查。
高可用组挂载到 LB 后端以后,应用环境已经搭建完成。可以访问 LB 入口,访问到网站,并且会轮询到不同服务器,同时,访问单台服务器的外网 IP 也可以访问网站业务:LB 访问截图 (2 张,分别访问到了两个主机)
单台主机访问截图(直接访问单台主机 IP,刷新后不会轮询主机):
演示环境就绪。下一步,进行破坏性演练,检验高可用环境的效果。| 验证项目 | 详细描述 | 预期结果 | |
| 云主机 | 模拟主机故障 - 通过底层命令 / 控制台关闭可用区 A 的应用云主机 | 站点访问正常,可以新增、删除、修改 post | |
| 高可用组 | 高可用组配置弹性伸缩,设置最小最 大实例个数,并配置伸缩触发的阈值 (告警配置内配置) | 通过 stress 命令模拟高并发场景,高可用组通 过弹性伸缩特性创建新主机并挂载到 LB 后,实现多主机接收流量 | |
| RDS | 模拟 RDS 实例故障 - 通过底层命令关闭 RDS 的主实例 | - 主从切换,业务不受影响 | |
| RDS | 主从切换从控制台可以看到切换过程 | 切换过程完成后, RDS 状态为运行中 | |
| Redis | 模拟 Redis 实例故障 - 通过底层命令关 闭 Redis 的主实例 | - 主从切换,业务不受影响(本文未截图) | |
| Redis | redis 在模拟故障过程中,业务持续访 问 | 从 redis 返回的数据不受切换影响(本文未截图) |
#!/bin/bash
#for ((i=1;i<=10;i++))
for i in {1..15000}
do
curl 100.126.35.4
echo $i
echo $(date +%T)
sleep 3
done#!/bin/bash
#for ((i=1;i<=10;i++))
for i in {1..15000}
do
curl 100.126.38.16
echo $i
echo $(date +%T)
sleep 3
done
在控制台将一台高可用组内主机关机,然后可见 LB 后端服务健康检查发现挂载的高可用组一台服务器异常,高可用组如配置最小的主机数量,则高可用组也自动扩出一台主机,继续提供服务。在此期间,流量会转发给后端正常主机,健康检查异常的主机不再接收流量,业务访问持续正常。
PAAS 服务的高可用:本演示以 MySQL 及 redis 研发在底层直接杀 docker,然后业务访问不中断,控制台上会出现主从切换现象在这个过程中对业务的访问不会中断。云数据库及缓存的破坏性操作,底层操作由研发操作。底层进行 RDS 主备切换(kill 掉 RDS 主库),业务访问同样不会中断,研发提供截图可以看到主从切换过程。
本文实际部署环境为京东为客户搭建的私有云环境(JDSTACK),公有云与私有云为相同技术栈,搭建及验证过程相似。限于篇幅,redis 验证部分及主机可访问性脚本结果未截图,感兴趣的读者可自行在云上通过本文指引过程搭建验证。 我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解