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
,配合數據庫主從復制和文件同步,實現高可用的數據同步。