實時同步服務

老虎死了还有狼發表於2024-10-18

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"
}
}

lsyncdrsync模式

說明

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/

實時同步服務

相關文章