搭建一个高可用负载均衡的集群架构(第三部分)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
应用型负载均衡 ALB,每月750个小时 15LCU
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

1.使用脚本编写一个简单的文件分发系统即可,首先expect编写一个脚本文件rsync.expect,这个脚本是实现文件同步的脚本,内容如下:
expect编写一个脚本文件rsync.expect,这个脚本是实现文件同步的脚本,内容如下:

[root@localhost ~/syncList]# vim syncFile.expect
#!/usr/bin/expect
set host [lindex $argv 0]
set file [lindex $argv 1]
set passwd [lindex $argv 2]

# 核心命令,同步多个文件
spawn rsync -avR --files-from=$file / root@$host:/

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}

expect eof
[root@localhost ~/syncList]# chmod a+x syncFile.expect

提示:如果你的rsync命令没有加-R选项的话,就需要确保目标机器也有这个文件列表中所定义的目录路径,不然就会报错。而且存放文件路径列表的文件内容不能有空格,不然会把这个空格看作为文件路径的一部分。

2.然后再编辑一个文本文件,这个文件用来放需要同步的文件列表,例如我这里需要同步以下几个文件:

[root@localhost ~/syncList]$ cat /tmp/fileList.txt 
/usr/local/nginx/conf/vhost/dedecms.com.conf 
/usr/local/nginx/conf/vhost/discuz.com.conf 
/usr/local/nginx/conf/vhost/zrlog.com.conf 
/usr/local/sbin/nginx_log_rotate.sh 
/var/spool/cron/root
[root@localhost ~/syncList]$

3.还需要编辑一个ip.txt文件,用于存放需要同步的目标机器的IP地址,例如我需要将文件都同步这几个IP的机器上:

[root@localhost ~/syncList]$ cat /root/webServerIP.txt 
192.168.200.153
192.168.200.154
192.168.200.155
192.168.200.156
192.168.200.157
192.168.200.158
192.168.200.159
192.168.200.160

4.再编写一个shell脚本syncFile.sh,这个脚本比较简单,只是遍历出ip.list文件内容然后交给syncFile.expect脚本去执行而已,示例:

#!/bin/bash
ipList="$1"
fileList="$2"
password="$3"
for ip in `cat $ipList`
do  
    # 第二个参数就是需要同步的文件列表
    ./syncFile.expect $ip $fileList $password
done

5.最后我们只需要执行syncFile.sh脚本即可实现批量同步多个文件:

[root@localhost ~/syncList]$ sh ./syncFile.sh "/root/webServerIP.txt" "/tmp/fileList.txt" "lri35krJF;ba"

我运行完之后,没有报错,文件也正常同步了,这样我们就实现了一个简单的文件分发系统,这个需求就实现了。

11 制定合理的mysql数据备份方案,并写备份脚本,要求把备份数据传输到备份服务器
这个mysql的主从已经可以满足备份的需求了,如果需要通过脚本另外备份,可以参考以下代码:

假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,远程提供了一个rsync服务,备份的地址是 192.168.200.149::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

#! /bin/bash
### backup mysql data
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin

d1=`data +%w`

d2=`date +%d`

pass="123456"

bakdir=/bak/mysql

r_bakdir=192.168.200.149::module/data/mysqlBackup

exec 1>/var/log/mysqlbak.log 2>/var/log/mysqlbak.log

echo "mysql backup begin at `date +"%F %T"`."

mysqldump -uroot -p$pass –default-character-set=utf8 ultrax >$bakdir/ultrax$d1.sql
mysqldump -uroot -p$pass –default-character-set=utf8 DedeCMS >$bakdir/DedeCMS$d1.sql
mysqldump -uroot -p$pass –default-character-set=utf8 zrlog >$bakdir/zrlog$d1.sql

rsync -az $bakdir/ultrax$d1.sql $r_bakdir/ultrax$d2.sql
rsync -az $bakdir/DedeCMS$d1.sql $r_bakdir/DedeCMS$d2.sql
rsync -az $bakdir/zrlog$d1.sql $r_bakdir/zrlog$d2.sql

echo "mysql backup end at `date +"%F %T"`."

接着加入cron:

0 3 * /bin/bash /usr/local/sbin/mysqlbak.sh

然后就会每天凌晨3点进行备份了。

12 制定代码、静态文件的备份方案,并写备份脚本,要求备份
13 编写数据恢复文档,能保证当数据丢失在2小时内恢复所有数据
以上这两个需求可以一起实现,结合起来就是两个小时同步一次文件,因为提到需要恢复所有数据,所以需要备份整个站点目录,备份的脚本修改一下分发系统那个expect脚本就可以了,代码如下:

[root@localhost ~]$ vim syncList/syncWebFile.expect
#!/usr/bin/expect
set host [lindex $argv 0]
set file [lindex $argv 1]
set passwd [lindex $argv 2]

spawn rsync -az $file root@$host:$file

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}

interact
[root@localhost ~]$ chmod a+x /root/syncList/syncWebFile.expect

## shell 脚本
[root@localhost ~]$ vim /root/syncList/webBak.sh
#!/bin/bash
ip="$1"
webDir="$2"
password=`cat /etc/sync.passwd`
d=`date +%F" "%T`

echo "webdir backup begin at `date +"%F %T"`."

for dir in `cat $webDir`
do
    /root/syncList/syncWebFile.expect $ip $dir $password
done

echo "backup =  ip:$ip   time:$d;" >> /tmp/webSync.log

echo "webdir backup end at `date +"%F %T"`."

创建密码文件:

[root@localhost ~]$ vim /etc/sync.passwd
lri35krJF;ba
[root@localhost ~]$ chmod 600 /etc/sync.passwd

创建文件存放需要同步的目录路径列表:

[root@localhost ~]$ vim /tmp/webDir.txt
/data/wwwroot/discuz.com
/data/wwwroot/dedecms.com
/data/wwwroot/zrlog.com

在备份服务上创建目录:

mkdir -p /data/wwwroot/

8.测试一下能否进行同步:

[root@localhost ~]$ /bin/bash /root/syncList/webBak.sh "192.168.200.149" "/tmp/webDir.txt"
webdir backup begin at 2017-12-22 16:53:07.
spawn rsync -az -e ssh -i .ssh/id_rsa /data/wwwroot/discuz.com user1@192.168.200.149:/data/wwwroot/discuz.com
Enter passphrase for key '.ssh/id_rsa': 
spawn rsync -az -e ssh -i .ssh/id_rsa /data/wwwroot/dedecms.com user1@192.168.200.149:/data/wwwroot/dedecms.com
Enter passphrase for key '.ssh/id_rsa': 
spawn rsync -az -e ssh -i .ssh/id_rsa /data/wwwroot/zrlog.com user1@192.168.200.149:/data/wwwroot/zrlog.com
Enter passphrase for key '.ssh/id_rsa': 
webdir backup end at 2017-12-22 16:53:16.
[root@localhost ~]$

9.执行完脚本后到备份服务器上确认一下:

[root@localhost ~]$ ls /data/wwwroot/
dedecms.com  discuz.com  zrlog.com
[root@localhost ~]$ ls /data/wwwroot/dedecms.com/
dedecms.com
[root@localhost ~]$ ls /data/wwwroot/dedecms.com/dedecms.com/
a  data  dede  favicon.ico  images  include  index.php  logs  m  member  plus  robots.txt  tags.php  templets  uploads
[root@localhost ~]$ ls /data/wwwroot/zrlog.com/zrlog.com/
admin  assets  attached  error  favicon.ico  include  install  logs  META-INF  WEB-INF
[root@localhost ~]$ ls /data/wwwroot/discuz.com/discuz.com/
admin.php  api.php   config       cp.php           data         fileList.txt       forum.php  home.php   member.php  plugin.php  robots.txt  source  template   uc_server
api        archiver  connect.php  crossdomain.xml  favicon.ico  filePermission.sh  group.php  index.php  misc.php    portal.php  search.php  static  uc_client  userapp.php
[root@localhost ~]$

10.看看日志文件里有没有记录每次同步的时间:

[root@localhost ~]$ cat /tmp/webSync.log 
backup =  ip:192.168.200.149   time:2017-12-22 17:13:18;
[root@localhost ~]$

11.添加到任务计划里:

0 */2 * * * /bin/bash /root/syncList/webBak.sh "192.168.200.149" "/tmp/webDir.txt"

7 所有服务器要求只能普通用户登录,而且只能密钥登录,root只能普通用户sudo
1.首先使用visudo命令编辑配置文件,设置用户的alias:

User_Alias ADMINS = user1, user2, user3

然后批量执行useradd命令在全部服务器上添加user1、user2、user3用户

2.找到Allow root to run any commands anywhere,在这行下面添加以下内容:

ADMINS  ALL=(ALL)       NOPASSWD: /usr/bin/su, /usr/bin/ls, /usr/bin/cat, /usr/bin/mkdir

3.修改sshd.config配置文件,修改以下内容:

[root@localhost ~]$ vim /etc/ssh/sshd_config
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no

重启服务:

systemctl restart sshd.service

4.新建/root/.ssh 文件夹,然后生成密钥

[root@localhost ~]$ mkdir /root/.ssh/
[root@localhost ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   # 直接回车
Enter passphrase (empty for no passphrase):  # 设置密钥的密码
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
95:e1:79:b3:a0:4b:a0:d8:83:77:4e:88:96:8b:af:56 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|          .      |
|         . +     |
|      .   * o    |
|   * o . o o o   |
|  * * o S   .    |
| o E = . .       |
|. o   . .        |
| o               |
|o..              |
+-----------------+
[root@localhost ~]$

查看生成的密钥文件:

[root@localhost ~]$ cd .ssh/
[root@localhost ~/.ssh]$ ls
id_rsa  id_rsa.pub
[root@localhost ~/.ssh]$

把公钥的文件名修改成authorized_keys,并复制一份到user1用户的家目录下:

mv id_rsa.pub authorized_keys
mkdir /home/user1/.ssh/
touch /home/user1/.ssh/authorized_keys
cat /root/.ssh/authorized_keys > /home/user1/.ssh/authorized_keys

设置权限:

chmod 700 /home/user1/.ssh/
chmod 600 /home/user1/.ssh/authorized_keys
chown -R user1:user1 /home/user1/.ssh/

5.将id_rsa文件下载到本地。
搭建一个高可用负载均衡的集群架构(第三部分)

6.连接时选择这个文件,或者导入Xshell中:
搭建一个高可用负载均衡的集群架构(第三部分)

登录成功:
搭建一个高可用负载均衡的集群架构(第三部分)

7.然后把/etc/sudoers、/etc/ssh/sshd_config配置文件同步到所有机器上,密钥也一并同步,同步完之后记得重启sshd服务。

完成以上操作后,无论使用密钥或者是密码都无法远程登录root用户,只能登录普通用户了。

因为我们禁止了root远程登录,并且普通用户也只能密钥登录,所以之前写的那个备份文件的脚本需要进行更改,改成通过ssh指定密钥进行连接远程机器。
1.给刚刚生成的密钥文件授予700权限:

chmod 700 .ssh/id_rsa

2.使用ssh测试一下看看能否进行同步文件(user1的密钥文件我已经同步到所有机器上了):

[root@localhost ~]$ rsync -av -e  "ssh -i .ssh/id_rsa" /tmp/fileList.txt user1@192.168.200.149:/tmp/fileList.txt
Enter passphrase for key '.ssh/id_rsa':   ## 这是生成密钥时设置的密码
sending incremental file list
fileList.txt

sent 269 bytes  received 31 bytes  28.57 bytes/sec
total size is 189  speedup is 0.63
[root@localhost ~]$

从结果可以看到,能够成功同步文件。

好,接下来修改之前的脚本,首先修改的是密码文件,将之前的登录密码改为生成密钥时设置的密码:

[root@localhost ~]$ vim /etc/sync.passwd
123456
[root@localhost ~]$ 

shell脚本不用修改,修改expect脚本如下:

[root@localhost ~]$ vim syncList/syncWebFile.expect
#!/usr/bin/expect
set host [lindex $argv 0]
set file [lindex $argv 1]
set passwd [lindex $argv 2]

spawn rsync -az -e  "ssh -i .ssh/id_rsa" $file user1@$host:$file

expect {
"yes/no" { send "yes\r"}
"'.ssh/id_rsa':" { send "$passwd\r" }
}

expect eof

到备份服务器上给/data/wwwroot/目录授予777权限:

chmod 777 /data/wwwroot/

然后测试一下该脚本:

[root@localhost ~]$ /bin/bash /root/syncList/webBak.sh "192.168.200.149" "/tmp/webDir.txt"
webdir backup begin at 2017-12-22 16:53:07.
spawn rsync -az -e ssh -i .ssh/id_rsa /data/wwwroot/discuz.com user1@192.168.200.149:/data/wwwroot/discuz.com
Enter passphrase for key '.ssh/id_rsa': 
spawn rsync -az -e ssh -i .ssh/id_rsa /data/wwwroot/dedecms.com user1@192.168.200.149:/data/wwwroot/dedecms.com
Enter passphrase for key '.ssh/id_rsa': 
spawn rsync -az -e ssh -i .ssh/id_rsa /data/wwwroot/zrlog.com user1@192.168.200.149:/data/wwwroot/zrlog.com
Enter passphrase for key '.ssh/id_rsa': 
webdir backup end at 2017-12-22 16:53:16.
[root@localhost ~]$

可以看到没有报错,同步成功,到备份服务器上看看:

[root@localhost ~]$ ls /data/wwwroot/
dedecms.com  discuz.com  zrlog.com
[root@localhost ~]$ ls /data/wwwroot/dedecms.com/
dedecms.com
[root@localhost ~]$ ls /data/wwwroot/dedecms.com/dedecms.com/
a  data  dede  favicon.ico  images  include  index.php  logs  m  member  plus  robots.txt  tags.php  templets  uploads
[root@localhost ~]$ ls /data/wwwroot/zrlog.com/zrlog.com/
admin  assets  attached  error  favicon.ico  include  install  logs  META-INF  WEB-INF
[root@localhost ~]$ ls /data/wwwroot/discuz.com/discuz.com/
admin.php  api.php   config       cp.php           data         fileList.txt       forum.php  home.php   member.php  plugin.php  robots.txt  source  template   uc_server
api        archiver  connect.php  crossdomain.xml  favicon.ico  filePermission.sh  group.php  index.php  misc.php    portal.php  search.php  static  uc_client  userapp.php
[root@localhost ~]$

没毛病 ,到目前为止这个项目就告一段落了,其中有一些细节还需慢慢处理,这些都是日后维护的问题了。



本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/2052429,如需转载请自行联系原作者

相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
19天前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
1月前
|
弹性计算 负载均衡 网络协议
阿里云SLB深度解析:从流量分发到架构优化的技术实践
本文深入探讨了阿里云负载均衡服务(SLB)的核心技术与应用场景,从流量分配到架构创新全面解析其价值。SLB不仅是简单的流量分发工具,更是支撑高并发、保障系统稳定性的智能中枢。文章涵盖四层与七层负载均衡原理、弹性伸缩引擎、智能DNS解析等核心技术,并结合电商大促、微服务灰度发布等实战场景提供实施指南。同时,针对性能调优与安全防护,分享连接复用优化、DDoS防御及零信任架构集成的实践经验,助力企业构建面向未来的弹性架构。
203 76
|
1月前
|
消息中间件 存储 设计模式
RocketMQ原理—5.高可用+高并发+高性能架构
本文主要从高可用架构、高并发架构、高性能架构三个方面来介绍RocketMQ的原理。
278 21
RocketMQ原理—5.高可用+高并发+高性能架构
|
27天前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
1月前
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
|
2月前
|
并行计算 PyTorch 算法框架/工具
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
本文探讨了如何通过技术手段混合使用AMD与NVIDIA GPU集群以支持PyTorch分布式训练。面对CUDA与ROCm框架互操作性不足的问题,文章提出利用UCC和UCX等统一通信框架实现高效数据传输,并在异构Kubernetes集群中部署任务。通过解决轻度与强度异构环境下的挑战,如计算能力不平衡、内存容量差异及通信性能优化,文章展示了如何无需重构代码即可充分利用异构硬件资源。尽管存在RDMA验证不足、通信性能次优等局限性,但该方案为最大化GPU资源利用率、降低供应商锁定提供了可行路径。源代码已公开,供读者参考实践。
148 3
融合AMD与NVIDIA GPU集群的MLOps:异构计算环境中的分布式训练架构实践
|
2月前
|
存储 SQL 并行计算
【赵渝强老师】达梦数据库MPP集群的架构
达梦数据库提供大规模并行处理(MPP)架构,以低成本实现高性能并行计算,满足海量数据存储和复杂查询需求。DM MPP采用完全对等无共享体系,消除主节点瓶颈,通过多节点并行执行提升性能。其执行流程包括主EP生成计划、分发任务、各EP并行处理及结果汇总返回。为确保高可用性,建议结合数据守护部署。
|
18天前
|
负载均衡 前端开发 应用服务中间件
Tomcat的负载均衡和动静分离(与nginx联动)
总的来说,负载均衡和动静分离是提高Web应用性能的两个重要手段。通过合理的配置和使用,我们可以让Web应用更好地服务于用户。
74 20
|
11月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
191 2
|
5月前
|
负载均衡 前端开发 应用服务中间件
负载均衡指南:Nginx与HAProxy的配置与优化
负载均衡指南:Nginx与HAProxy的配置与优化
355 3

热门文章

最新文章