Rao's Blog

  • 首页

  • 标签

  • 分类

  • 归档

  • 搜索

MySQL · 备份工具 · Percona XtraBackup

发表于 2019-06-18 | 更新于 2019-10-22 | 分类于 MySQL

简介

Percona XtraBackup 是 Percona 公司基于 C++ 开发的一个用于 MySQL 数据库 物理热备 的 免费开源 的备份工具。

XtraBackup 优势

  • 支持 InnoDB 热备和增量备份
  • 支持流压缩传输到其它服务器
  • 备份速度快,比较容易地创建主从同步
  • 备份时不会增加服务器负载

安装

1、下载 Percona-XtraBackup

1
$ wget http://devops-files.oss-cn-qingdao.aliyuncs.com/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

2、rpm 方式安装

1
$ rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

报错信息:

1
2
3
4
5
warning: percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
libev.so.4()(64bit) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64
perl(DBD::mysql) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64
perl(Digest::MD5) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64

解决方法:

1
2
3
4
$ wget http://devops-files.oss-cn-qingdao.aliyuncs.com/libev-4.15-1.el6.x86_64.rpm
$ yum -y install perl-DBD-MySQL
$ yum -y install perl-Digest-MD5
$ rpm -ivh libev-4.15-1.el6.x86_64.rpm
1
2
3
4
5
6
7
$ rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:percona-xtrabackup-24-2.4.12-1.el ################################# [100%]

$ xtrabackup --version
xtrabackup version 2.4.12 based on MySQL server 5.7.19 Linux (x86_64)

报错信息:

1
2
3
4
5
[root@hop02 src]# rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
warning: percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:
​ libc.so.6(GLIBC_2.14)(64bit) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64
​ libstdc++.so.6(GLIBCXX_3.4.15)(64bit) is needed by percona-xtrabackup-24-2.4.12-1.el7.x86_64

解决方法:

查看操作系统版本,CentOS 6 下载 el6 的安装包即可。

1
2
3
4
$ cat /etc/redhat-release
CentOS release 6.5 (Final)

$ wget http://devops-files.oss-cn-qingdao.aliyuncs.com/percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm

Tips:不要轻易在真实生产环境中直接安装,因为升级的过程中比较容易出现系统出错。

原理

备份原理

innobackupex 在后台线程不断追踪 InnoDB 的日志文件,然后复制 InnoDB 的数据文件。数据文件复制完成之后,日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始备份以后的事务日志。完成上面的步骤之后,就可以使用 InnoDB 崩溃恢复代码执行事务日志(redo log),以达到数据的一致性。备份分为两个过程:

  • backup,备份阶段,追踪事务日志和复制数据文件(物理备份)。
  • preparing,重放事务日志,使所有的数据处于同一个时间点,达到一致性状态。

备份过程

PXB

1
2
3
4
5
6
7
8
9
10
1)复制已有的redo log,然后监听redo log变化并持续复制
2)复制事务引擎数据文件
3)等到数据文件复制完成
4)加锁:全局读锁
5)备份非事务引擎数据文件及其他文件
6)获取binlog点位信息等元数据
7)停止复制redo log
8)解锁:全局读锁
9)复制buffer pool dump
10)备份完成

XtraBackup 基于 InnoDB 的 crash recovery 机制,在备份还原时利用 redo log 得到完整的数据文件,并通过全局读锁,保证 InnoDB 数据与非 InnoDB 数据的一致性,最终完成备份还原的功能。

恢复过程

apply-log

  • 模拟 MySQL 进行 recover,将 redo log 回放到数据文件中。
  • 等到 recover 完成 。
  • 重建 redo log,为启动数据库做准备。

copy-back

  • 将数据文件复制回 MySQL 数据目录。
  • 还原完成。

InnoDB 数据会被恢复至备份结束时(全局读锁时)的状态,而非 InnoDB 数据本身即是在全局读锁时被复制出来,它们的数据一致。

实践

全量备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# !/bin/bash

#############################################################################
# Full Backup Using XtraBackup For MySQL
#############################################################################

mode=$1
backupdir='/data/backup' # backup dir

backup() {
if [ ! -d $backupdir ]; then
mkdir -p $backupdir
fi

# 备份主库:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=Haier@123 --no-timestamp /$backupdir/full-`date +%Y%m%d%H%M`-bak
find $backupdir -mtime +2 -name 'full-*-bak' -exec rm -rf {} \;

# 传输到从库:
# scp -r /data/backup/* root@10.133.7.19:/data/backup
return 0
}

case "$mode" in
'full') backup ;;
*)

# usage
basename=`basename "$0"`
echo "Usage: $basename {full}"
exit 1
;;
esac
exit 0

# 每天中午12:00执行全量备份,保留前1天数据
crontab -e
0 12 * * 0 sh /data/backup.sh full

备份报错:

1
2
3
4
5
6
7
8
190812 13:39:54 >> log scanned up to (491275222500)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 2 for mysql/plugin, old maximum was 0
InnoDB: Operating system error number 24 in a file operation.
InnoDB: Error number 24 means 'Too many open files'
InnoDB: Some operating system error numbers are described at http://dev.mysql.com/doc/refman/5.7/en/operating-system-error-codes.html
InnoDB: File ./cosmo_im_1023/bns_io_sapsourcinglist.ibd: 'open' returned OS error 124. Cannot continue operation
InnoDB: Cannot continue operation.

解决方案:

1
2
3
4
1)shell> ulimit -n 65535
2)修改 my.cnf 配置文件的参数
innodb_open_files = 10240
open_files_limit = 10240

总结

  • 优先使用高版本 XtraBackup 。
  • 尽量不要使用 XtraBackup 自带的增量 备份,因为后期使用或者恢复不太方便。
  • 备份结束时,请立即 apply-log ,这样能够知道备份集是否可用。

MySQL · 监控 · PMM

发表于 2019-06-12 | 更新于 2019-12-16 | 分类于 MySQL

简介

Percona Monitoring and Management (PMM):是一款 Percona 发布的用于管理和监控 Linux、MySQL、MongoDB、PostgreSQL 等数据库开源工具,通过 PMM 客户端收集到的监控数据,通过第三方软件 Grafana 展示出来。

PMM功能

  • 支持对主机的硬盘、网络、CPU、内存的监控。
  • 支持对 MyISAM、InnoDB、TokuDB 和 PXC/Glarera 的监控。
  • 支持 Query Analytics 的功能,可以检视执行了哪些 SQL 指令,并对执行性能较差的 SQL 进行优化。
  • 支持了 MySQL 复制拓扑图结构构造。

官网 Demo

架构

PMM架构

PMM Client

  • pmm-admin:用于管理 PMM Client 的命令行工具,例如:添加、删除要监视的数据库实例。

  • node_exporter:采集主机监控指标。

  • mysqld_exporter:采集 MySQL 监控指标。

  • mongodb_exporter:采集 MongoDB 监控指标。

  • proxysql_exporter:采集 ProxySQL 监控指标。

PMM Server

Query Analytics(QAN):主要用来搜集指令并作性能分析。

  • QAN API:作为后端储存和读取 Query 资料用。
  • QAN APP:提供图形化分析界面。

Metrics Monitor(MM):主要提供 MySQL 和 MongoDB 历史监控信息。组件说明如下:

  • Prometheus:一个开源的服务监控系统和时间序列数据库,它连接到 PMM Client 上的 exporter 聚集的监控数据。
  • Consul:提供 API 让 PMM Client 可以远端替 Prometheus 新增、移除 Hosts,同时它也储存了监控的metadata。
  • Grafana: 这是一个第三方 Dashboard 和图形构建器,用于可视化 Prometheus 中聚合的数据,以 Web 方式呈现。
  • Percona Dashboards:是由 Percona 开发的一组用于 Grafana 的仪表板。上述的 Web 页面都能从 PMM Landing Page直接连接。

安装

PMM Server

(1)安装 docker

1
2
3
4
$ yum -y install docker

# 卸载 docker
$ yum remove docker

(2)运行 docker

1
2
3
$ systemctl start docker
$ systemctl enable docker
$ systemctl stop docker

(3)下载容器镜像

1
$ docker pull percona/pmm-server:latest

(4)创建数据卷容器

1
2
3
4
5
6
7
$ docker create \
-v /opt/prometheus/data \
-v /opt/consul-data \
-v /var/lib/mysql \
-v /var/lib/grafana \
--name pmm-data \
percona/pmm-server:latest /bin/true

(5)运行 PMM Server

1
2
3
4
5
6
$ docker run -d \
-p 8090:80 \
--volumes-from pmm-data \
--name pmm-server \
--restart always \
percona/pmm-server:latest

(6)验证,通过 登录 查看是否正常显示,也可以通过如下方式:

1
2
$ curl http://10.133.0.53/ping
{'version': '1.8.0'}

其他命令:

1
2
3
$ docker exec -it 'xx' /bin/bash
$ docker ps -a
$ docker stop pmm-server && docker rm pmm-server (停止 pmm-server)

PMM Client

(1)确保 PMM Server 主机可访问

1
$ ping 10.133.0.52

(2)安装 Client 包

1
2
3
4
5
6
7
8
$ yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ yum install -y pmm-client

$ wget https://devops-files.oss-cn-qingdao.aliyuncs.com/pmm2-client-2.1.0-5.el7.x86_64.rpm
$ rpm -ivh pmm2-client-2.1.0-5.el7.x86_64.rpm

# 卸载 pmm-client
$ yum remove pmm-client

(3)连接 PMM Client 到 PMM Server

1
2
3
4
5
6
7
$ pmm-admin config --server 10.133.0.52
OK, PMM server is alive.
PMM Server | 10.133.0.52
Client Name | cmp15
Client Address | 10.138.228.236

$ pmm-admin config --server 10.133.0.52:8080 (适用于非80端口)

监控

主机

1
2
3
4
5
# 添加监控
$ pmm-admin add linux:metrics

# 取消监控
$ pmm-admin remove linux:metrics

MySQL

1
2
3
# 添加监控
$ pmm-admin add mysql --socket /data/mysql3306/mysql.sock --user root --password Haier@123
$ pmm-admin list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$ wget https://devops-files.oss-cn-qingdao.aliyuncs.com/pmm2-client-2.1.0-5.el7.x86_64.rpm
$ rpm -ivh pmm2-client-2.1.0-5.el7.x86_64.rpm

$ pmm-admin config --server 10.133.0.52:8080
OK, PMM server is alive.
PMM Server | 10.133.0.52:8080
Client Name | GPCMS-DB-P
Client Address | 10.133.7.19

$ pmm-admin add linux:metrics
OK, now monitoring this system.

$ pmm-admin add mysql --user hdm --password Hdm@123!
[linux:metrics] OK, already monitoring this system.
[mysql:metrics] OK, now monitoring MySQL metrics using DSN hdm:***@unix(/data/mysql3306/mysql.sock)
[mysql:queries] OK, now monitoring MySQL queries from slowlog using DSN hdm:***@unix(/data/mysql3306/mysql.sock)

$ pmm-admin check-network
PMM Network Status

Server Address | 10.133.0.52:8080
Client Address | 10.133.7.19

* System Time
NTP Server (0.pool.ntp.org) | 2019-07-26 10:18:20 +0000 UTC
PMM Server | 2019-07-26 10:18:20 +0000 GMT
PMM Client | 2019-07-26 18:18:20 +0800 CST
PMM Server Time Drift | OK
PMM Client Time Drift | OK
PMM Client to PMM Server Time Drift | OK

* Connection: Client --> Server
-------------------- -------
SERVER SERVICE STATUS
-------------------- -------
Consul API OK
Prometheus API OK
Query Analytics API OK

Connection duration | 702.217µs
Request duration | 4.66389ms
Full round trip | 5.366107ms

* Connection: Client <-- Server
-------------- ----------- ------------------ ------- ---------- ---------
SERVICE TYPE NAME REMOTE ENDPOINT STATUS HTTPS/TLS PASSWORD
-------------- ----------- ------------------ ------- ---------- ---------
linux:metrics GPCMS-DB-P 10.133.7.19:42000 OK YES -
mysql:metrics GPCMS-DB-P 10.133.7.19:42002 OK YES -
1
2
3
4
# 开启防火墙端口
firewall-cmd --zone=public --add-port=42000/tcp --permanent
firewall-cmd --zone=public --add-port=42002/tcp --permanent
firewall-cmd --reload
1
2
3
4
5
6
7
8
9
10
# 更改存储类型为MySQL
docker exec -i -t pmm-server /bin/bash
vi /etc/grafana/grafana.ini

查/sqlite改为MYSQL存储
type=mysql
host=127.0.0.1:3306
name=grafana
user=root
password =

在容器进入 mysql 客户端,创建数据库 grafana

1
2
$ create database grafana;
$ docker restart pmm-server
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ pmm-admin --help
Usage:
pmm-admin [flags]
pmm-admin [command]
Available Commands:
config Configure PMM Client. # 配置PMM客户端
add Add service to monitoring. # 增加监控
remove Remove service from monitoring. # 删除监控服务
list List monitoring services for this system. # 列出监控服务
info Display PMM Client information (works offline). # 打印PMM客户端信息
check-network Check network connectivity between client and server. # 检查网络
ping Check if PMM server is alive.
start Start monitoring service. # 开启服务
stop Stop monitoring service. # 停止服务
restart Restart monitoring service. # 重启服务
show-passwords Show PMM Client password information (works offline). # 显示客户端密码
purge Purge metrics data on PMM server. # 删除PMM server端监控信息
repair Repair installation. # 重新安装
uninstall Removes all monitoring services with the best effort. # 删除所有服务
help Help about any command
Flags:
-c, --config-file string PMM config file (default "/usr/local/percona/pmm-client/pmm.yml")
-h, --help help for pmm-admin
--verbose verbose output
-v, --version show version
Use "pmm-admin [command] --help" for more information about a command.

实践

  • 安装 pmm-client
1
2
$ wget https://devops-files.oss-cn-qingdao.aliyuncs.com/pmm2-client-2.1.0-5.el7.x86_64.rpm
$ rpm -ivh pmm2-client-2.1.0-5.el7.x86_64.rpm
  • 监控主机
1
2
3
4
5
6
7
8
# 将client_name修改为服务器ip
$ vi /usr/local/percona/pmm-client/pmm.yml

# 重启pmm-client
$ pmm-admin restart --all

# 添加监控
$ pmm-admin add linux:metrics
  • 监控 MySQL
1
2
$ pmm-admin add mysql --user hdm --password Hdm@123! x.x.x.x:port
$ pmm-admin list
  • 配置告警
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 进入docker
$ docker exec -it pmm-server /bin/bash

# 编缉 grafana.ini
vim /etc/grafana/grafana.ini

[smtp]
enabled = true
host = [smtp.healthmall.cn](http://smtp.healthmall.cn/):25
user = liuqian@healthmall.cn
password = 123456
from_address = liuqian@healthmall.cn
from_name = Grafana

# 重启pmm-server容器
$ docker restart pmm-server

# 钉钉报警配置
http://docs.grafana.org/alerting/notifications/
  • 升级 pmm-server
1
2
3
$ docker pull percona/pmm-server:latest
$ docker stop pmm-server && docker rm pmm-server
$ docker run -d -p 80:80 -p 9090:9090 --volumes-from pmm-data --name pmm-server -e SERVER_USER=pmm -e SERVER_PASSWORD=ngiISI0Q4g9gfqWz89folKJSi --restart always --init percona/pmm-server:latest

FA&Q

(1)docker 默认目录 /var/lib/docker 修改为 /data/dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker info
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 6
Total Memory: 15.66 GiB
Name: console
ID: 7MYD:NQPC:4TNL:IT3W:6KZS:TY6L:CORW:L432:UE3M:4LBJ:OFUU:HSMB
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 停止docker服务
$ systemctl stop docker

# 将docker文件迁移到指定目录
$ mkdir /data/dockerfile
$ mv /var/lib/docker/* /data/dockerfile

# 删除原目录
$ rm -rf /var/lib/docker

# 创建软连接
$ ln -s/data/dockerfile/ /var/lib/docker

# 启动docker服务
$ systemctl start docker
1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker info
Kernel Version: 3.10.0-693.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
Number of Docker Hooks: 3
CPUs: 6
Total Memory: 15.66 GiB
Name: console
ID: 7MYD:NQPC:4TNL:IT3W:6KZS:TY6L:CORW:L432:UE3M:4LBJ:OFUU:HSMB
Docker Root Dir: /data/dockerfile
Debug Mode (client): false
Debug Mode (server): false

(2)PMM 修改主机名作为唯一标识,修改为 ip、port

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$ pmm-admin check-network
PMM Network Status

Server Address | 10.133.0.53:8090
Client Address | 10.133.0.51

*** System Time**
NTP Server (0.pool.ntp.org) | 2019-09-02 08:59:28 +0000 UTC
PMM Server | 2019-09-02 08:59:28 +0000 GMT
PMM Client | 2019-09-02 16:59:28 +0800 CST
PMM Server Time Drift | **OK**
PMM Client Time Drift | **OK**
PMM Client to PMM Server Time Drift | **OK**

*** Connection: Client --> Server**
-------------------- -------
SERVER SERVICE STATUS
-------------------- -------
Consul API **OK**
Prometheus API **OK**
Query Analytics API **OK**

Connection duration | 433.939µs
Request duration | 3.335106ms
Full round trip | 3.769045ms

*** Connection: Client <-- Server**
-------------- ----------------- ------------------ ------- ---------- ---------
SERVICE TYPE NAME REMOTE ENDPOINT STATUS HTTPS/TLS PASSWORD
-------------- ----------------- ------------------ ------- ---------- ---------
linux:metrics 10.133.0.51 10.133.0.51:42000 **OK** **YES** -
mysql:metrics 10.133.0.51:3306 10.133.0.51:42002 **OK** **YES** -

Github Page + Hexo + Next 搭建个人博客

发表于 2019-04-29 | 更新于 2019-11-15 | 分类于 其他

介绍

Github Page:是 Github 提供的一种免费的静态网页托管服务,可以用来托管博客、项目官网等静态网页。支持 Jekyll、Hugo、Hexo 等编译静态资源。

Hexo:是基于 Node.js 驱动的一款快速、简洁且高效的博客框架,有多个 主题 可选。通过 Hexo 你可以轻松地使用 Markdown 编写文章,除了 Markdown 本身的语法之外,还可以使用 Hexo 提供的 标签插件 来快速的插入特定形式的内容。

Next:是一款高质量的 Hexo 主题。

搭建流程

安装 Node.js

下载地址

注意:在安装时,勾选 Add to PATH 选项

安装 Git

下载地址

1
2
3
$ git version
$ node -v
$ npm -v

安装 Hexo

1
2
3
4
$ npm install -g hexo-cli
$ hexo init blog
$ cd blog
$ npm install

文件夹目录说明:

1
2
3
4
5
6
7
8
.
├── _config.yml # 站点配置文件
├── package.json
├── scaffolds # 模版文件夹
├── source # 资源文件夹
| ├── _drafts # 草稿文件
| └── _posts # *.md文件
└── themes # 主题文件夹

如果上面的命令都没报错的话,运行 hexo s 命令,在浏览器中输入 http://localhost:4000 可以看到 Hello World,说明安装成功了。

1
$ hexo s

hexo 命令说明:

1
2
3
4
5
6
7
8
$ hexo generate            # 生成静态文件至public目录
$ hexo deploy # 将.deploy目录部署到github
$ hexo new "postName" # 新建文章
$ hexo new page "pageName" # 新建页面
$ hexo server # 启动服务
$ hexo clean # 清除部署緩存
$ hexo g -d # 生成加部署
$ hexo g -s # 生成加预览

设置主题 Next

站点配置文件:E:\Rao's Blog\hexo\_config.yml

主题配置文件:E:\Rao's Blog\hexo\themes\next\_config.yml

安装主题的方式非常简单,只需要将主题文件拷贝至站点目录的 themes 目录下, 然后修改下配置文件即可。

1
2
$ cd hexo
$ git clone https://github.com/iissnan/hexo-theme-next themes/next

当下载完成后,打开站点配置文件, 找到 theme 字段,并将其值更改为 next。

1
theme: next

最好使用 hexo clean 来清除 Hexo 的缓存,然后即可使用浏览器访问 http://localhost:4000,检查站点是否正确运行。

至此,你本地的博客就已经搭建成功,也可以对主题进行个性化设定,接下来就是部署到 Github Page 了。

设置 Github Page

首先如果你还没有 Github 账号的先注册 一个,点击 Start project 或者下面的 new repository 创建一个新的仓库 blog,GitHub Pages 选择 master 分支,出现地址 https://huiraoo.github.io/blog/ 就是你的个人博客。

部署到 Github

1
2
3
4
5
6
# 配置SSH key
cat ~/.ssh/id_rsa.pub
git config --global user.name "用户名"
git config --global user.email "邮箱地址"
ssh-keygen -t rsa -C '上面的邮箱'
ssh -T git@github.com

修改站点配置文件,把仓库的 git 地址添加进去就行了

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repository: git@github.com:huiraoo/blog.git
branch: master

执行部署命令

1
2
$ hexo clean
$ hexo g -d

配置图床

阿里云OSS

配置搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 下载插件
cd /Users/raohui/Blog/hexo
npm install hexo-generator-searchdb --save

# 站点配置
search:
path: search.xml
field: post
format: html
limit: 10000

# 主题配置
local_search:
enable: true

FA&Q

问题描述:Hexo 主题无法加载到 Github Page,访问 https://huiraoo.github.io/blog 显示乱码

解决办法:修改站点配置文件,填写 url 和 root

1
2
3
4
5
6
# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: https://huiraoo.github.io/blog
root: /blog/
permalink: :year/:month/:day/:title/
permalink_defaults:
1…1718
Hui Rao

Hui Rao

最好的成长是分享
173 日志
19 分类
14 标签
GitHub E-Mail
© 2021 Hui Rao
由 Hexo 强力驱动 v3.9.0
|
主题 – NexT.Gemini v7.1.0
|