做互联网服务最怕的是服务不可及,虽然我的博客访问人不多,但是我依然用了两台VPS来互为主备,用来保障网站随时可打开。
一、整体架构图
架构不复杂,网站服务链路上全部都是一主一备用两个服务器,任何节点挂了都会有其他节点扛住,同时有严格的数据复制以及同步机制,保障数据一致性。
二、基础条件
要达到以上高可用目标,需要有具备以下基础条件
1.域名要支持智能解析,当S1或者S2挂了的时候可以主动切换
2.s1,s2上nginx要配置后切换策略,当web1或者web2挂了的时候可以切换备用线路
3.web1,web2要做好rsync文件同步策略,保证两端网站数据文件同步
4.db1,db2要做好互为主从配置,保证两台数据库服务器数据一致
三、配置过程记录
- CDN前置服务器配置
s1及s2的采用nginx反代web1,web2的形式,其中nginx做好负载均衡配置,保障下游站点发生错误时切换,下附一宝塔面板里网站的conf配置文件
upstream fuzai {
server web1:443;
server web2:443 backup;
}
server
{
listen 80;
listen 443 ssl http2 ;
server_name www.39.la;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/www.39.la;
#CERT-APPLY-CHECK--START
# 用于SSL证书申请时的文件验证相关配置 -- 请勿删除
include /www/server/panel/vhost/nginx/well-known/www.39.la.conf;
#CERT-APPLY-CHECK--END
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
ssl_certificate /www/server/panel/vhost/cert/www.39.la/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/www.39.la/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#ERROR-PAGE-START 错误页配置,可以注释、删除或修改
error_page 404 /404.html;
#error_page 502 /502.html;
#ERROR-PAGE-END
#PHP-INFO-START PHP引用配置,可以注释或修改
#清理缓存规则
location ~ /purge(/.*) {
proxy_cache_purge cache_one $host$1$is_args$args;
#access_log /www/wwwlogs/www.39.la_purge_cache.log;
}
#引用反向代理规则,注释后配置的反向代理将无效
location / {
proxy_pass https://fuzai;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 配置代理超时
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 30;
# 配置在遇到错误时切换到下一个上游节点
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
# 配置在发生错误时重试的次数
proxy_next_upstream_tries 3;
}
include enable-php-00.conf;
#PHP-INFO-END
#REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
include /www/server/panel/vhost/rewrite/www.39.la.conf;
#REWRITE-END
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
{
return 404;
}
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
#禁止在证书验证目录放入敏感文件
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
access_log /www/wwwlogs/www.39.la.log;
error_log /www/wwwlogs/www.39.la.error.log;
}
2. web服务器配置
web1,web2网站正常配置,保证域名或者ip:端口可以访问到网站,重点配置两台服务器的网站文件同步,以及数据库主从同步。
2.1网站文件同步命令如下:
rsync -avz /www/wwwroot/www.39.la/ root@web2:/www/wwwroot/www.39.la/
需要额外做两个动作,1.web1与web2之间可以做到无密码互相登陆;2.做个计划任务每隔1分钟跑一次上面的同步命令。
2.2mysql的主-主复制
配置两个MySQL实例:确保两个MySQL实例都已安装并运行,每个实例都需要有一个唯一的server-id
。
创建复制用户:在两个MySQL实例中,都需要创建一个用于复制的用户,并授权。例如:
CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
修改主服务器mysql配置
[mysqld]
log-bin=mysql-bin
server-id=1 # 对于第一个实例
binlog-format=ROW
replicate-do-db = 39la #确定同步的数据库
binlog-ignore-db = mysql #减轻服务器压力,不记录二进制日志
binlog-ignore-db = information_schema #减轻服务器压力,不记录二进制日志
auto_increment_offset = 1 #避免主从冲突起始ID为1
auto_increment_increment = 2 #增量为2
对于第二个实例,修改配置如下:
server-id = 2
replicate-do-db = www39la
binlog-ignore-db = mysql
binlog-ignore-db = information_schema
auto_increment_offset = 2 #避免主从冲突起始ID为2
auto_increment_increment = 2
配置从服务器:在每个MySQL实例中,配置change master to
命令,指向另一个MySQL实例的相关信息。例如,在第一个实例(将成为第二个实例的从服务器)中执行:master的log_file以及log_pos可以同步在主服务器上运行SHOW MASTER STATUS;获取到。
STOP SLAVE;
CHANGE MASTER TO
MASTER_HOST='第二个实例的IP',
MASTER_USER='replica',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='第一个实例的binlog文件名',
MASTER_LOG_POS=第一个实例的binlog位置;
START SLAVE;
- 检查复制状态:在每个实例中,使用
SHOW SLAVE STATUS\G
命令检查复制状态,确保Slave_IO_Running
和Slave_SQL_Running
都是Yes
。 - 处理冲突:在双主复制中,冲突是不可避免的。需要有策略来处理冲突,比如使用冲突解决策略或者在应用层面处理。
- 测试和验证:在主服务器上进行写操作,然后在从服务器上检查数据是否被复制过来。同样,在从服务器上进行写操作,检查是否也被复制到了主服务器。
- 监控和维护:定期检查复制状态和性能,确保复制的连续性和数据的一致性。
附:两台web服务器免密登陆:
1.生成密钥对:
ssh-keygen -t rsa
2.将公钥复制到远程服务器
ssh-copy-id server_username@server_ip_address
详细配置可以看视频演示