LNMP在Ubuntu上的数据同步实现方法
MySQL主从复制是LNMP架构中最核心的数据库同步方案,通过主服务器(Master)记录二进制日志(binlog),从服务器(Slave)重放日志实现数据一致性。
/etc/mysql/mysql.conf.d/mysqld.cnf,添加以下参数:server-id = 1                # 主服务器唯一ID(从服务器需不同)
log_bin = /var/log/mysql/mysql-bin.log  # 开启二进制日志
binlog_do_db = your_database_name  # 指定同步的数据库(可选,避免同步无用库)
重启MySQL服务:sudo systemctl restart mysql。CREATE USER 'replicator'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
FLUSH PRIVILEGES;
获取主服务器二进制日志状态(记录File和Position值,后续从服务器需要):SHOW MASTER STATUS;
server-id = 2                # 从服务器唯一ID
relay_log = /var/log/mysql/mysql-relay-bin.log  # 开启中继日志
read_only = 1                # 设置为只读(可选,增强安全性)
重启MySQL服务:sudo systemctl restart mysql。CHANGE MASTER TO
MASTER_HOST='master_ip',     # 主服务器IP
MASTER_USER='replicator',    # 主服务器创建的复制用户
MASTER_PASSWORD='your_password',
MASTER_LOG_FILE='mysql-bin.000001',  # 主服务器记录的File值
MASTER_LOG_POS=123;          # 主服务器记录的Position值
启动从服务器复制:START SLAVE;。Slave_IO_Running和Slave_SQL_Running均为Yes表示成功):SHOW SLAVE STATUS\G;
通过以上步骤,从服务器会实时同步主服务器的数据库变更。Redis的发布订阅(Pub/Sub)功能可实现应用层数据的实时同步,适用于需要低延迟的场景(如聊天室、实时通知)。
sudo apt update
sudo apt install redis-server php-redis
sudo systemctl restart redis-server php-fpm
<?php
require 'vendor/autoload.php';
use Redis;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$channel = 'data_sync_channel';
$message = json_encode(['table' => 'users', 'action' => 'update', 'id' => 1]);
$redis->publish($channel, $message);
echo "Message published to $channel\n";
?>  
示例订阅者脚本(subscriber.php):<?php
require 'vendor/autoload.php';
use Redis;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$channel = 'data_sync_channel';
$redis->subscribe([$channel], function ($redis, $channel, $message) {
    $data = json_decode($message, true);
    // 根据消息内容同步数据(如更新数据库、缓存)
    echo "Received message: $message\n";
});
?>  
运行订阅者脚本后,发布者发送的消息会被实时接收并处理。rsync是Linux下高效的文件同步工具,可实现LNMP网站文件(如HTML、CSS、PHP脚本)的多服务器同步。
sudo apt update
sudo apt install rsync
/etc/rsyncd.conf,添加同步模块:[website_data]
path = /var/www/html         # 需要同步的目录
comment = Website Data
read only = no               # 允许写入(根据需求设置)
auth users = sync_user       # 认证用户
secrets file = /etc/rsyncd.secrets  # 密码文件路径
创建密码文件(仅root可读):echo "sync_user:your_password" | sudo tee /etc/rsyncd.secrets
sudo chmod 600 /etc/rsyncd.secrets
启动rsync服务:sudo systemctl start rsync(默认开机自启)。rsync -avz --delete sync_user@server_ip::website_data /var/www/html
可结合crontab设置定时任务(如每小时同步一次):crontab -e
添加以下内容:0 * * * * rsync -avz --delete sync_user@server_ip::website_data /var/www/html
通过rsync,可实现多台服务器网站文件的实时或定时同步。当使用多台Web服务器时,可通过Nginx负载均衡将请求分发到不同服务器,同时结合上述数据同步方案(如MySQL主从、rsync)确保数据一致性。
/etc/nginx/sites-available/default,添加负载均衡规则:upstream lnmp_cluster {
    server web_server1_ip:80;
    server web_server2_ip:80;
    # 可添加更多服务器
}
server {
    listen 80;
    server_name your_domain.com;
    location / {
        proxy_pass http://lnmp_cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
重启Nginx服务:sudo systemctl restart nginx。web_server1和web_server2,配合数据库主从复制和文件同步,实现高可用的数据同步。