01
双击热备结构图
02
NGINX热备
准备:两台安装NGINX的服务器,三个IP。
原理:用keepalive挂载虚拟IP,利用心跳脚本监控服务是否在线,不在线则备用服务抢过虚拟IP,主服务重新启动keepalived后重新夺回虚拟IP。
03
准备工作
确保选择的两台服务器都能够支持所需的工作负载,并且硬件、网络和存储配置相似。
这三台机器在高可用 Nginx 集群中的角色如下:10.1.10.90 (Master):
这是主 Nginx 服务器。
在正常情况下,所有流量都会首先路由到此服务器。
它持有虚拟 IP (VIP) 10.1.10.230,除非它宕机或存在其他问题。
10.1.10.190 (Backup):
这是备用 Nginx 服务器。
当 Master 服务器宕机或出现其他问题时,它将接管虚拟 10.1.10.230,从而确保流量继续正常流入。
它始终处于待机状态,随时准备在需要时接管 VIP。
10.1.10.230 (Virtual IP or VIP):
这是虚拟 IP 地址,通常不与任何实际的物理机器绑定。
在正常情况下,此 IP 地址将指向 Master 服务器。
如果 Master 服务器出现故障,此 IP 地址将迅速切换到 Backup 服务器。
使用此技术,可以确保即使其中一台服务器宕机,流量也不会中断,从而实现高可用性。
10.1.10.230(VIP)需要通过 keepalived 服务进行配置,使其在 Master 和 Backup 服务器之间进行切换
简而言之,10.1.10.90 是主服务器,10.1.10.190 是备用服务器,而 10.1.10.230 是虚拟 IP,可以在两台服务器之间迅速切换,以确保高可用性。
04
安装 keepalived
yum install -y keepalived
安装完成后,keepalived 的配置文件位于 /etc/keepalived/keepalivec.conf。
05
高可用配置
5.1主从配置
Master 服务器:
修改 /etc/keepalived/keepalivec.conf 配置文件。配置内容如下:
global_defs {
smtp_server 10.1.10.90
smtp_connect_timeout 30
# 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh" # 执行脚本所在的位置
interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
weight 2
}
vrrp_instance VI_1 {
state MASTER # 备份服务器上将 MASTER 改为 BACKUP
interface ens192 # 绑定的网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔一秒发送一次心跳,确保从服务器是否还活着
authentication { # 心跳检测需要的密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.10.230/24 # VRRP H 虚拟地址
}
}
Backup 服务器:
修改 /etc/keepalived/keepalivec.conf 配置文件。配置内容如下:
global_defs {
smtp_server 10.1.10.190
smtp_connect_timeout 30
# 通过它,可以访问到主机,在hosts文件中,要做映射关系,类似于 127.0.0.1 LVS_DEVEL
router_id LVS_DEVEL
}
vrrp_script chk_http_port {
script "/etc/keepalived/nginx_check.sh" # 执行脚本所在的位置
interval 2 #检测脚本执行的间隔,单位秒,每个2秒执行一次脚本
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens192 # 绑定的网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 50 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 #每隔一秒发送一次心跳,确保从服务器是否还活着
authentication { # 心跳检测需要的密码
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.10.230/24 # VRRP H 虚拟地址
}
5.2心跳检测脚本
主从服务器的配置
在 /etc/keepalived/ 目录下创建检测脚本 nginx_check.sh,内容如下:
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/www/server/nginx/sbin/nginx #Nginx启动命令的位置
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
5.3启动服务
启动 nginx: systemctl start nginx
启动 keepalived: systemctl start keepalived
开机自启:systemctl enable keepalived
5.4使用ipconfig,查看虚拟Ip的绑定
5.5配置 Nginx
主服务器配置
让我们为 Nginx 创建一个简单的配置。首先,备份默认的配置文件:
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
然后,在配置文件加入红框内的内容:
upstream backend {
server 10.1.10.90; # Master Server IP
server 10.1.10.230; # Backup Server IP
}
5.6 测试 Nginx 配置
每次更改 Nginx 配置后,都应该测试配置以确保没有语法错误:
nginx -t
如果测试成功,将看到 syntax is okay 和 test is successful 的消息。
5.7 重新加载 Nginx 服务
为了应用新的配置更改, 重新加载 Nginx:
systemctl reload nginx
06
测试
测试 Master 服务器的故障切换:
正常情况
为了模拟一个故障的情况,我们将停止 Master 服务器上的 Nginx:
sudo systemctl stop nginx
停止后访问
07
数据库热备
原理:主服务器数据改变后会存放至binarylog,从服务器会一直访问主服务器binarylog,从而实现从服务器数据跟随主服务数据变化。
第一步 在A服务上创建B服务的专用备份用户
第二步 开启主服务的binarylog
去/etc/my.cnf下添加下列内容
binlog-do-db 用来表示,只把哪些数据库的改动记录到binary日志中。 可以写上关注hello数据库。不写则是全部数据库记录。
binlog-ignore-db 表示,需要忽略哪些数据库。我这里忽略了其他的4个数据库。
后面两个用于在 双主(多主循环)互相备份。 因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。 解决这个问题的办法就是让每个数据库的自增主键不连续。 上图说是, 我假设需要将来可能需要10台服务器做备份, 所以auto-increment-increment 设为10. 而 auto-increment-offset=1 表示这台服务器的序号。 从1开始, 不超过auto-increment-increment。
Tips:在修改文件前可以先备份一份
第三步 锁定数据库
若数据库不处于使用状态则可以跳过此步
锁定数据库
导出数据
从服务器配置完后, 可以解除锁定:
UNLOCK TABLES;
第四步 查看A服务器的binary日志位置
第五步 设置从服务器 B 需要复制的数据库
server-id 必须保证每个服务器不一样。 这可能和循环同步有关。 防止进入死循环。
replicate-do-db 可以指定需要复制的数据库, 我这里注掉了。 演示一下。
replicate-ignore-db 复制时需要排除的数据库, 我使用了,这个。 除开系统的几个数据库之外,所有的数据库都复制。
relay_log 中继日志的名字。 前面说到了, 复制线程需要先把远程的变化拷贝到这个中继日志中, 在执行。
log-slave-updates 意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。 当你的B服务器需要作为另外一个服务器的主服务器的时候需要打开。 就是双主互相备份,或者多主循环备份。 我们这里需要, 所以打开。
第六步 导入初态, 开始同步。
若没有数据库则优先创建一个数据库,然后再导入
create database hello default charset utf8;
把hello.sql 上传到B上, 然后导入:
mysal -uroot p hello < hello.sql
开启同步, 在B服务器上执行
重启mysql, 然后查看slave线程有没有开启:
Slave_IO_Running: Yes Slave_SQL_Running: Yes
说明开启成功。
如果其中一个是No, 那就说明不成功。需要查看mysql的错误日志。 我在第一次做的时候就遇到这个问题。有时候密码填错了, 有时候防火墙的3306没有打开。ip地址不对,等等。 都会导致失败。
防火墙指定IP开放端口
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.1.10.90/32" port protocol="tcp" port="3306" accept'
firewall-cmd –reload
第七步 仿照上述操作给B服务做备份,设置双向同步
简易说明
B创建A专用备份用户
修改/etc/my.cnf配置文件
A服务上开启中继
启动同步:
重启,查看slave状态是否正常
Slave_IO_Running: Yes Slave_SQL_Running: Yes
说明开启成功。
在两台服务器中分别创建数据表和插入数据看数据是否同步。
- END -
点击蓝字
关注我们
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...