1 實時同步應用場景
- 透過rsync+定時任務實現定時備份/同步
- 對於NFS我們需要進行實時同步
2 實時同步工具選型
實時同步工具 |
特點 | 選型 |
inotify工具+指令碼 |
inotify監控指定的目錄,監控 目錄下是否有變化,顯示變化了的檔案. 透過rsync服務端與客戶端傳送,書寫指令碼. |
不推薦,有效能問題. |
sersync服務 |
國產開源,sersync整合了inotify監控功能和rsync推送的功能. |
可以使用,二進位制安裝,效能較高,inotify的根本問題沒有解決. 很久沒有更新了. |
lsyncd服務 |
整合inotify和rsync |
效能好,yum安裝,更新及時,配置簡單 |
drbd |
基於磁碟的block(磁碟分割槽)級別的資料同步,備節點不可用. |
一般用於資料量巨大TB,PB或資料庫. |
3 Lsyncd極速上手指南
角色 |
說明 | 共享目錄 |
backup伺服器(172.16.1.67) |
rsync服務端 | 共享/nfsbackup/ |
nfs01伺服器(172.16.1.68) |
部署lsyncd實時同步服務 | 監控/data/ |
web01伺服器(172.16.1.69) |
掛載nfs01伺服器目錄 |
lsync服務使用流程
1. 先準備rsync服務與客戶端
2. 部署,配置lsyncd服務
3. 測試
3.1 準備lsyncd環境-rsync服務端與客戶端
# 1. 修改rsyncd配置檔案
[nfsbackup]
comment = nfsbackup
path = /nfsbackup
# 2. 準備共享目錄與修改許可權
# 3. 客戶端(nfs伺服器)建立密碼檔案
# 4. nfs機器上測試,傳輸資料到backup的nfsbackup模組
rsync -av /etc/hostname rsync_backup@backup::nfsbackup --password-file=/etc/rsync.client
3.2 lsyncd部署
#在哪臺機器部署? nfs01
#1.安裝
yum install -y lsyncd
#2.檢查
rpm -qa |grep lsyncd
#3.配置
3.3 lsync配置詳解
/etc/lsyncd.conf配置詳解,lua語言,註釋--表示註釋
配置整體2個部分
settings全域性配置部分.pid檔案,日誌檔案.
sync部分用於指定rsync命令和intofiy的選項.
[root@nfs01 ~ ]# grep -v '\-\-' /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd.log",
pidfile = "/var/run/lsyncd.pid",
statusFile = "/var/log/lsyncd.status",
nodaemon = true,
maxProcesses = 2
}
sync {
default.rsync,
source = "/data/",
target = "rsync_backup@172.16.1.67::nfsbackup",
delay = 15,
delete = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
password_file = "/etc/rsync.client"
}
}
--全域性部分主要配置lsyncd服務,日誌,pid檔案.
settings {
--※※※※※日誌檔案,主要檢視日誌檔案.
logfile = "/var/log/lsyncd.log",
--pid檔案
pidfile = "/var/run/lsyncd.pid",
--服務狀態檔案
statusFile = "/var/log/lsyncd.status",
--改為非守護程序模式,預設.rsync命令,lsyncd
nodaemon = true,
--控制最多用於傳輸資料的程序數量 rsync程序數(最大)
--※※※※※根據cpu核心數來 一致或2倍
maxProcesses = 2
}
--配置rsync命令,rsync服務端與客戶端模式
--sync部分可以有多個.
sync {
--指定rsync工作模式
default.rsync,
--※※※※※ 指定lsyncd監控目錄,源目錄
source = "/data/",
--※※※※※ 指定目標 rsync服務端 使用者名稱@ip地址::模組名字
target = "rsync_backup@172.16.1.67::nfsbackup",
--※※※※※ 每隔15秒同步一次.
delay = 15,
--rsync命令的 --delete 選項
delete = true,
-- 配置rsync命令位置,rsync命令選項,
rsync = {
-- 命令位置
binary = "/usr/bin/rsync",
-- rsync命令的 -a選項
archive = true,
-- rsync命令的 -z選項 壓縮
compress = true,
-- ※※※※※配置rsync--password-file密碼檔案
password_file = "/etc/rsync.client"
}
}
lsyncd中rsync模式 |
說明 |
default.rsync⭐ ⭐ ⭐ ⭐ ⭐ |
使用rsync守護程序模式 |
dsfalut.direct |
直接模式,本地模式rsync當前cp,mv |
default.rsyncssh |
透過ssh通道方式連線,rsync命令2個節點,需要配置金鑰認證 |
官方文件:https://lsyncd.github.io/lsyncd/
3.4 啟動lsyncd服務與測試
配置檔案
settings {
logfile = "/var/log/lsyncd.log",
pidfile = "/var/run/lsyncd.pid",
statusFile = "/var/log/lsyncd.status",
nodaemon = true,
maxProcesses = 3
}
sync {
default.rsync,
source = "/data/",
target = "rsync_backup@172.16.1.67::backup",
delay = 15,
delete = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
password_file = "/etc/rsync.client"
}
}
啟動lsyncd
systemctl enable lsyncd
systemctl start lsyncd
systemctl status lsyncd
ps -ef |grep lsyncd
檢查與測試
3.6 麒麟sp2部署(編譯安裝lsyncd過程)
麒麟sp2系統 需要編譯安裝lsyncd 部署流程參考:https://www.yuque.com/lidao996/sre/ri259i7194d82258?singleDoc#
關於編譯安裝的本質:
./configure #cmake . #根據配置生成Makefile檔案,用於提供給make使
用,gcc,cc編譯指令.
#lsync使用cmake生成Makefile
make #呼叫Makefile裡面的指令進行編譯. 生成二進位制檔案.
make install #建立目錄,複製檔案,配置. 收尾工作.
systemctl配置書寫
未來參考系統中其他服務即可sshd,crond,nginx
/usr/lib/systemd/system/xxxx.service 我們自己建立,服務安裝後建立都在這裡.
/etc/systemd/system/xxx.service 系統安裝後自帶
systemctl .service檔案組成 |
說明 | 具體的指令 |
[Unit] |
基本資訊註釋 服務依賴關係 |
Description After 在指定服務啟動後在啟動當前服務 |
[Service] |
型別(判斷服務執行方法) 用於指定服務開啟命令 服務的關閉命令 服務的重啟命令 服務自動重啟 ...這裡可以是具體命令或指令碼 |
Type預設是Simple,一般用simple,forking或notify,需要測試 ExecStart= ExecStop= ExecRestart= ExecReload(如果服務支援) |
[Install] |
內容基本固定用於指定執行級別 |
WantedBy=multi-user.target |
lsyncd服務的systemctl檔案
lsyncd.service
cat >/usr/lib/systemd/system/lsyncd.service<<EOF
[Unit]
Description=Live Syncing (Mirror) Daemon
[Service]
Type=simple
ExecStart=/usr/local/bin/lsyncd -nodaemon /etc/lsyncd.conf
ExecStop=pkill lsyncd
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
#書寫或修改systemctl檔案後要執行 如下指令,讓系統重新讀取systemctl配置.
systemctl daemon-reload
溫馨提示:如果ExecStart/ExecStop/ExecRestart對應的指令較為複雜,或者呼叫變數. 需要書寫指令碼
/etc/init.d/lsyncd {start|stop|restart}
服務管理指令碼
#!/bin/bash
#desc: 服務管理指令碼.
choice=$1
function start_lsyncd() {
}
function stop_lsyncd() {
}
function restart_lsyncd() {
}
case "$choice" in
start) start_lsyncd ;;
stop) stop_lsyncd ;;
restart) restart_lsyncd ;;
* ) echo "error "
esac
定時任務服務systemctl配置檔案
####定時任務服務systemctl配置檔案
systemctl cat crond
# /usr/lib/systemd/system/crond.service
[Unit]
Description=Command Scheduler
After=auditd.service nss-user-lookup.target systemd-usersessions.service time-sync.target ypbind.service
autofs.service
[Service]
EnvironmentFile=/etc/sysconfig/crond
ExecStart=/usr/sbin/crond -n $CRONDARGS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
Alias=cron.service
###遠端連線服務
systemctl cat sshd
# /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/backends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd-permitrootlogin
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
$PERMITROOTLOGIN
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
###nginx服務
systemctl cat nginx
# /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nsslookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists
but has the wrong
# SELinux context. This might happen when running `nginx -t`
from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
##nfs服務配置
[root@nfs01 ~/lsyncd-2.3.1]# systemctl cat nfs
# /usr/lib/systemd/system/nfs-server.service
[Unit]
Description=NFS server and services
DefaultDependencies=no
Requires= network.target proc-fs-nfsd.mount
Requires= nfs-mountd.service
Wants=rpcbind.socket network-online.target
Wants=rpc-statd.service nfs-idmapd.service
Wants=rpc-statd-notify.service
Wants=nfsdcld.service
After= network-online.target local-fs.target
After= proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service
After= nfs-idmapd.service rpc-statd.service
After= nfsdcld.service
Before= rpc-statd-notify.service
# GSS services dependencies and ordering
Wants=auth-rpcgss-module.service
After=rpc-gssd.service gssproxy.service rpc-svcgssd.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/sbin/exportfs -r
ExecStart=/usr/sbin/rpc.nfsd
ExecStop=/usr/sbin/rpc.nfsd 0
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f
ExecReload=/usr/sbin/exportfs -r
[Install]
WantedBy=multi-user.target
# /run/systemd/generator/nfs-server.service.d/order-withmounts.conf
# Automatically generated by nfs-server-generator
[Unit]
RequiresMountsFor=/nfs/pics
RequiresMountsFor=/nfsdata
麒麟sp2部署-完成
4 Lsyncd監控多個目錄
cat /etc/lsyncd.conf
[root@nfs01 /data2]# cat /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd.log",
pidfile = "/var/run/lsyncd.pid",
statusFile = "/var/log/lsyncd.status",
nodaemon = true,
maxProcesses = 2
}
# 監控/data/目錄同步到備份伺服器的nfs01backup模組
sync {
default.rsync,
source = "/data/",
target = "rsync_backup@backup::nfs01backup",
delay = 3,
delete = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
password_file = "/etc/rsync.client"
}
}
# 監控/data2/目錄同步到備份伺服器的nfs01backup2模組
sync {
default.rsync,
source = "/data2/",
target = "rsync_backup@backup::nfs01backup2",
delay = 3,
delete = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
password_file = "/etc/rsync.client"
}
}
檢視結果:/var/log/lsyncd.status 看到有2個sync
/var/log/lsyncd.status
[root@nfs01 /var/log]# cat lsyncd.status
Lsyncd status report at Fri Oct 18 16:48:13 2024
Sync1 source=/data/
There are 0 delays
Filtering:
nothing.
Sync2 source=/data2/
There are 0 delays
Filtering:
nothing.
Inotify watching 2 directories
1: /data/
2: /data2/
5 實時同步案例
5.1 專案背景
- 我們要給網站儲存做個實時同步.
- 透過對比發現lsyncd符合需求.
- 透過lsyncd給nfs服務端做個資料實時同步,同步到backup伺服器
5.2 專案架構圖
專案流程
1. 準備備份伺服器(rsync)服務端與客戶端
2. nfs服務(準備共享目錄,客戶端掛載)
3. 實時同步lsyncd監控指定的nfs目錄(先建立好對應的目錄)
4. 聯調 在web伺服器上建立檔案,檔案應該出現儲存和備份上.
5.3 專案主機規劃
角色 |
主機 | ip | 目錄 |
web伺服器 |
web01 | 10.0.0.69/172.16.1.69 | /mnt (nfs掛載點) |
儲存伺服器 |
nfs01 |
10.0.0.68/172.16.1.68 |
/data www(3999)使用者 |
備份伺服器 |
backup | 10.0.0.67/172.16.1.67 |
共享目錄 /nfs01backup/ 模組nfs01backup |
設定hosts解析
cat /etc/hosts
[root@nfs01 /var/log]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.69 web01
172.16.1.70 web02
172.16.1.68 nfs01
172.16.1.67 backup
172.16.1.71 m01
5.4 備份服務準備
5.4.1 服務端配置
/etc/rsyncd.conf
# 修改配置檔案
cat >/etc/rsyncd.conf <<EOF
##rsyncd.conf start##
fake super =yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
#[data]
#comment = www by xk 14:18 2024-1-13
#path = /data
[nfs01backup]
comment = www by xk 14:18 2024-1-13
path = /nfs01backup
[nfs01backup2]
comment = www by xk 14:18 2024-1-13
path = /nfs01backup2
EOF
# 建立目錄
mkdir -p /nfs01backup
#修改所有者
chown -R rsync.rsync nfs01backup
# 新增使用者
useradd -s /sbin/nologin -M rsync
#新增密碼
echo 'rsync_backup:Xk123456' > /etc/rsync.password
chmod 600 /etc/rsync.password
# 啟動服務
systemctl enable --now rsync
systemctl restart rsync
5.4.2 客戶端測試
目錄&密碼
# 建立目錄
mkdir -p /data
# 建立密碼
echo 'Xk123456' > $secret
chmod 600 $secret
5.5 儲存服務準備
5.5.1 服務端
server
# 1.安裝nfs
yum install -y rpcbind nfs-utils
# 2.啟動rpc和nfs
systemctl start rpcbind
systemctl start nfs
# 3.修改配置 (可以加上all_squash)
cat >/etc/exports<<EOF
/nfs01data 172.16.1.0/24(rw,all_squash,anonuid=3999,anongid=3999)
EOF
# 4. 新增使用者
groupadd -g 3999 www
useradd -u 3999 -g www -s /sbin/nologin -M www
# 5.準備共享目錄
mkdir /data
chown www.www /data
5.5.2 客戶端掛載
deploy_nfs_client.sh
[root@web01 /server/scripts]# cat deploy_nfs_client.sh
#!/bin/bash
##############################################################
# File Name:deploy_nfs_client.sh
# Version:V1.0
# Author:xk
#
# Desc:
##############################################################
# 部署nfs客戶端 deploy nfs_client
backup_ip="$1"
share_data="/data"
mount_point="/mnt"
# 新增使用者
groupadd -g 3999 www
useradd -u 3999 -g www -s /sbin/nologin -M www
# 1. 臨時掛載
mount -t nfs $backup_ip:$share_data $mount_point
touch $mount_point/1.txt
5.6 實時同步服務準備
5.6.1 修改conf配置檔案
/etc/lsyncd.conf
[root@nfs01 /server/scripts]# cat /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd.log",
pidfile = "/var/run/lsyncd.pid",
statusFile = "/var/log/lsyncd.status",
nodaemon = true,
maxProcesses = 2
}
sync {
default.rsync,
source = "/data/",
target = "rsync_backup@backup::nfs01backup",
delay = 3,
delete = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
password_file = "/etc/rsync.client"
}
}
5.6.2 其他配置參考(Lsyncd極速上手指南)
5.6.3 測試
在web01伺服器/mnt目錄下建立檔案,先看到nfs01伺服器/data目錄下有資料,過幾秒看到backup伺服器/nfs01backup目錄下有資料
實時檢視資料:watch ls /data/