做互联网服务最怕的是服务不可及,虽然我的博客访问人不多,但是我依然用了两台VPS来互为主备,用来保障网站随时可打开。

一、整体架构图

架构不复杂,网站服务链路上全部都是一主一备用两个服务器,任何节点挂了都会有其他节点扛住,同时有严格的数据复制以及同步机制,保障数据一致性。

二、基础条件

要达到以上高可用目标,需要有具备以下基础条件

1.域名要支持智能解析,当S1或者S2挂了的时候可以主动切换

2.s1,s2上nginx要配置后切换策略,当web1或者web2挂了的时候可以切换备用线路

3.web1,web2要做好rsync文件同步策略,保证两端网站数据文件同步

4.db1,db2要做好互为主从配置,保证两台数据库服务器数据一致

三、配置过程记录

  1. 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;
  1. 检查复制状态:在每个实例中,使用SHOW SLAVE STATUS\G命令检查复制状态,确保Slave_IO_RunningSlave_SQL_Running都是Yes
  2. 处理冲突:在双主复制中,冲突是不可避免的。需要有策略来处理冲突,比如使用冲突解决策略或者在应用层面处理。
  3. 测试和验证:在主服务器上进行写操作,然后在从服务器上检查数据是否被复制过来。同样,在从服务器上进行写操作,检查是否也被复制到了主服务器。
  4. 监控和维护:定期检查复制状态和性能,确保复制的连续性和数据的一致性。

附:两台web服务器免密登陆:

1.生成密钥对:

ssh-keygen -t rsa

2.将公钥复制到远程服务器

ssh-copy-id server_username@server_ip_address

详细配置可以看视频演示

By qidian

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注