家庭数据中心系列 chevereto图床多节点定时自动同步教程

前言

因为我之前在家庭数据中心之中部署了wordpress的主站点和备份站点,在云服务器上布置了镜像站点,并通过wordpress的WPvivid备份插件的定时备份以及syncthing的定时同步功能,成功实现了多个wordpress配置的实时备份及快速恢复(参见文章:docker系列 使用docker基于syncthing实现多点文件夹同步之详细教程docker系列 使用docker基于wordpress架设博客从站点并实现主从站点配置定期备份)。不过我因为前几天家里宽带出问题(非自然故障,博弈还在继续,等有了结果再说),导致我把wordpress切到镜像站点之后,才发现图床还在家里(断网一样连不上)~~,所以只是实现wordpress的冗余还不够,图床也需要冗余。因此后面又花了点时间把chevereto的图床也在镜像站点上创建了冗余,这时博客才算完全恢复。

由此,我想干脆把chevereto也纳入多点同步计划,实现和wordpress站点一样的拓扑结构:主图床、备用图床以及镜像站点图床,并在主图床数据增加的时候,备用图床和镜像站点图床也能够同步增加数据(其实归根结底就是懒,想一步到位~),所以才有了这篇文章。

chevereto是由其程序本身以及数据库里其对应的”库”组成,图片是存放在程序中data/images目录下,数据库中有一个database是chevereto使用的,所以要实现数据同步,必须同时实现chevereto程序数据的同步以及数据库的同步,所以分为2个步骤来实现:chevereto本身数据的同步(主要是图片)以及其对应的数据库的同步。

chevereto本身数据的同步

注:这一步需要依赖于syncthing来实现多个chevereto相关文件夹的同步(syncthing多点同步具体的配置细节参见我另一篇文章:docker系列 使用docker基于syncthing实现多点文件夹同步之详细教程,本文不过多涉及详细配置流程,主要实在是太多了~~)。

根据chevereto的部署方式不同(源码部署或者docker部署),这一步有所差异,不过核心精神都是在syncthing中将chevereto的目录添加为同步文件夹,然后在多个chevereto所在节点之间通过syncthing进行同步,因为我是docker方式部署的chevereto,所以本文就以这种方式的文件的为例。

由于我的主图床、备用图床、镜像图床节点的规划和wordpress的规划是重合的,所以syncthing上都是以macmini节点为主图床节点(同步源),然后向intermini节点(备用站点)和腾讯云服务器(镜像站点)节点进行同步,按照如下步骤操作:

  • 重新部署syncthing-macmini的docker,使用-v参数将macmini上chevereto对应的文件夹映射到syncthing中的对应路径,这里我是映射到/data2目录:
    image.png

同理操作syncthing-intermini以及syncthing-tc节点。

注:此时这2个节点上还没有部署docker版的chevereto,可以先创建其docker对应的文件夹(注意文件夹权限要可写),先解决chevereto数据的同步问题,docker可以之后部署。

  • 在syncthing-macmini上将data2添加到同步文件夹,然后共享给syncthing-intermini和syncthing-tc,之后分别在syncthing-intermini和syncthing-tc上接受来自syncthing-macmini的共享请求,并完成添加,共享最后效果如下:
    image.png

    image.png

    image.png

    此时,docker版chevereto需要挂载到容器内部的数据已经从syncthing-macmini节点成功同步到了另外两个节点上。

注:关于文件夹类型,在syncthing-macmini上选择:

image.png

在其余两个节点上选择:
image.png

数据库中chevereto对应的库的定时导出

我的mariadb中,chevereto对应的库名字就叫”chevereto”:

image.png

这里有3个很关键的问题:导出到哪里、如何导出以及多久导出一次。
1、导出到哪里

这个问题其实好解决,就是利用宿主机上chevereto容器挂载的目录,因为在前面syncthing的配置中,这个目录内的文件就是实时同步的状态,所以最好的方式就是在其中创建一个db子目录,然后把chevereto的库直接以sql文件的形式导出到这个文件夹里:

image.png

最终路径为:

/Volumes/data/docker/chevereto/db #/Volumes/data是macos从Catalina版本以后的写法,这里不深究,大家根据自己的实际环境修改即可。

2、如何导出

导出mariadb的chevereto的库很简单,用mysqldump命令即可,结合上一节的路径,命令如下:

docker exec -u root 你的数据库容器名 mysqldump -uroot -p你的数据库密码 --databases 数据库中chevereto对应的库名字 > /Volumes/data/docker/chevereto/db/chevereto.sql #导出路径根据你的实际情况进行修改,只要是在前面配置的chevereto的同步目录下就行。注意mysqldump后面的-u和-p直接填用户名和密码,不要留空格

3、多久导出一次

这个要根据每个人的不同的需求来确定,我这里和wordpress自动备份的同步周期保持一致就成,就定为一周吧,不过如何实现每周自动导出一次呢?这个根据每个人使用的环境不同而不同,比如macos上本来就有定期任务的设置方法(launchctl 和 crontab,理论上用lanuchctl比较好),但是我不太想折腾,所以为了偷懒,直接把上一节的命令放到了macos特定目录下的一个可执行的脚本”export_cheve_database.sh”中,放在macos的用户目录下,然后通过宝塔面板的计划任务,使用ssh定期登录去执行就好了:
image.png

image.png


注:使用这种SSH到远程设备运行脚本的方式,需要提前配置好到宝塔面板所在设备的SSH客户端到macmini的公钥登录(可以参考我另一篇文章:debian系列 配置ssh公钥登录),不过不同的系统有些细节不太一样,比如macos就多了一步:

ssh-add ~/.ssh/id_rsa

macmini上”export_cheve_database.sh”脚本的内容如下:

#!/bin/sh

# 手动加载环境变量,这个非常重要,默认不会加载。另外不同系统环境变量文件名不一样,需注意。
source ~/.bash_profile

# 执行导出chevereto库命令,导出的路径就在设置的chevereto同步目录下,这样一来导出了库之后就会被实时同步到chevereto的备用节点和镜像节点的对应目录中
docker exec -u root 你的数据库容器名或者容器id mysqldump -uroot -pyourpassword --databases chevereto > /Volumes/data/docker/chevereto/db/chevereto.sql

# 运行完成
echo 'end'

被同步chevereto节点的数据库的定时导入

chevereto节点的数据库导入

经过前面的步骤,我们已经实现了chevereto主站点、备用站点以及镜像站点的程序数据(图片)和导出的数据库文件的同步,最后还剩一步,就是被同步的chevereto节点(备用站点以及镜像站点)定时自动导入同步的数据库文件。

这一步其实反而是最简单的,就是在备用站点以及镜像站点也部署导入数据库的任务就行,只不过说起来倒是简单,但是实现上稍微有点技巧,逻辑流程如下:
1、将同步过来的chevereto.sql从chevereto容器的挂载目录(/docker/chevereto/db)拷贝到mariadb容器的挂载目录(假定为/docker/mariadb/db)下
2、在mariadb容器的挂载目录(/docker/mariadb/db)内新建脚本文件”chevereto_import.sh”,内容如下:

#!/bin/sh

mysql -uroot -pyourpassword  chevereto < /var/lib/mysql/chevereto.sql

注:/var/lib/mysql/是mariadb容器内的被挂载的目录,对应宿主机上的/docker/mariadb/db目录。
3、给”chevereto_import.sh”赋予执行权限:

chmod +x /var/lib/mysql/chevereto_import.sh

4、在宿主机上运行命令执行

docker exec -u root 你的数据库容器名称 /var/lib/mysql/chevereto_import.sh

实现定时自动导入

如果要定时自动运行上述流程,只需要在宿主机中创建脚本(不要忘记赋予权限),内容如下:

#!/bin/sh
docker exec -u root mariadb01 mysql -u root -pp@ssw0rd -e "DROP TABLE IF EXISTS chv_albums, chv_confirmations, chv_deletions, chv_follows, chv_images, chv_importing, chv_imports, chv_ip_bans, chv_likes, chv_locks, chv_logins, chv_notifications, chv_pages, chv_queues, chv_redirects, chv_requests, chv_settings, chv_stats, chv_storage_apis, chv_storages, chv_users, chv_categories;" chevereto #清除chevereto库中所有的表。

cp /docker/chevereto/db/chevereto.sql /docker/mariadb/db/01/chevereto.sql

docker exec -u root mariadb01 /var/lib/mysql/chevereto_import.sh

然后定时运行该脚本即可。

注:第一条命令是清除chevereto库中现有的表,这个很重要,否则后续导入的时候不会成功,当然,也可以直接删chevererto的库。

定时运行脚本的方式我就不多说了,不同系统有不同的方法,不过我还是可以偷下懒,因为备用站点和镜像站点我都装了宝塔面板,还是使用计划任务功能:

image.png

image.png

大功告成!然后只需要备份站点和镜像站点使用和主站点一样的命令(主要指-v参数挂载正确的同步文件夹)来创建chevereto容器(以及这几个点上数据库参数都相同,相同是指能使用相同的地址或者名称、端口、root密码等),chevereto就能立马正常工作(具体chevereto图床详细的搭建流程参见另一篇文章:docker系列 使用docker基于chevereto搭建属于自己的图床)。

经过上面一番折腾,这下图床也实现了”主站点+备用站点+镜像站点”的多级冗余结构,再加上我已经实施完成的相同的wordpress多级冗余结构,这下我再也不怕2个家庭数据中心最蛋痛的问题:主站点down(macmini洗白)和家里断电断网,因为有云服务器的wordpress和图床的镜像站点,且图床也能保证是7天内的最新数据(图片本身都是自动同步的,这个主要是指数据库导入的频率,可以根据自己需要调整)。从专业角度来说,我目前实现了家庭数据中心内部的应用热备以及同城灾备站点,按照”两地三中心”的规格来看,我还差一个”异地容灾”站点,这个我就计划使用hexo+github+cloudflare pages来实现了,不过只能是博客文字部分,毕竟已经托管到了cloudflare pages,永远在线,图床的”异地容灾”就有点麻烦了,容我想想。

后话

说句老实话,这篇文章比我想象中的麻烦,本来想起来是很简单的,结果实现的时候不停遇到问题(前置知识点太多),归根结底还是我基础太差,知识面太狭窄导致的,很多知识点了解得都很肤浅,真正要用的时候才知道锅儿是铁打的,不得不静下心来仔细研究细节。

不过这样想来,我前面方案里wordpress多点数据同步及快速恢复方案里需要依靠WPvivid备份插件,且还需要人工干预,颇low啊,经过chevereto多点自动同步的磨练,wordpress应该可以达到同样的效果才对,等我把google ads的文章先写了来,就研究下wordpress的多点完全自动同步吧。

博客内容均系原创,转载请注明出处!更多博客文章,可以移步至网站地图了解。博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。

评论

  1. Windows Chrome 125.0.0.0
    8 月前
    2024-5-20 18:01:43

    同样也在研究类似的:WP博客文章cloudflare pages实现备份容灾,图片用R2、B2搞两个S3储存桶备份(10G的免费空间只是放博客的图也够用了)再加一个号称“不限容量”的一刻相册+alist做备份图床。

    • 博主
      秋风于渭水
      Macintosh Chrome 124.0.0.0
      8 月前
      2024-5-20 19:33:25

      对,差不多,cloudflare pages我准备使用hexo博客来备份文章,图床最好也用在R2搞个冗余,这样就是终极的容灾了,至少静态博客这一套是可以实现了永久在线了,是最后的手段。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
       

本站已禁用鼠标右键和各种快捷键,代码块内容可以直接在右上角点击复制按钮进行复制

zh_CN