zabbix怎么部署在两个服务器上面,一个服务端(server)一个数据库(MySQL),并且对数据库进行分表

zabbix怎么部署在两个服务器上面,一个服务端(server)一个数据库(MySQL)

环境centos8.2 数据库mysql 5.7.31 zabbix5.2

1、安装前的准备工作,在两台服务器上都要关闭防火墙(还有两台服务器都要进入root,防止后面因为权限问题,运行不了指令)

systemctl stop firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl disable --now firewalld

2、安装的用户密码

zabbix db: root Z@bbix@123

​ zabbix Z@bbix@123

zabbix web: Admin zabbix

3、在server安装zabbix

rpm -Uvh https://repo.zabbix.com/zabbix/5.2/rhel/8/x86_64/zabbix-release-5.2-1.el8.noarch.rpm
dnf clean all
dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent

4、在db服务器上安装MySQL5.7.31

https://www.cnblogs.com/know-more/p/13292741.html(参考网上的做法设置镜像,使得下载数据库能够节省不少时间)
wget https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
(如果下载的慢的话,就取消重新尝试几遍)
tar -zxvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /opt
cd /opt
mv mysql-5.7.31-linux-glibc2.12-x86_64 mysql-5.7.31
mkdir mysql
groupadd mysql
useradd -r -g mysql mysq
mv mysql-5.7.31 mysql
cd /opt/mysql/mysql-5.7.31
chown -R mysql:mysql /opt/mysql/mysql-5.7.31
yum install libaio
./bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/mysql-5.7.31/ --datadir=/opt/mysql/mysql-5.7.31/data/
初始化完成之后查看最后一行的是密码
最后一行里包含了root用户的临时密码如:[Note] A temporary password is generated for root@localhost: 6LkwFig+oi0R
(记得保存下来,后面要用到)
cp -a ./support-files/mysql.server /etc/init.d/mysqld (MySQL加入本地服务器)

  • 然后再 vim /etc/my.cnf ,然后添加以下内容

[mysqld]
bind-address=0.0.0.0 #绑定地址为0.0.0.0只是允许它接受远程连接的步骤的一部分
#设置mysql的安装目录
basedir = /opt/mysql/mysql-5.7.31
#设置mysql数据库的数据存放目录
datadir = /opt/mysql/mysql-5.7.31/data
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
user=mysql
port=3306

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

init_connect='SET NAMES utf8mb4'

symbolic-links=0

max_connections=200

default-storage-engine=INNODB

lower_case_table_names=1

max_allowed_packet=32M

explicit_defaults_for_timestamp=true
[mysqld_safe]
log-error = /opt/mysql/mysql-5.7.31/data/mysqld.log #日志>目录需要赋权限 chown -R mysql:mysql  /var/lib/mariadb

pid-file = /opt/mysql/mysql-5.7.31/data/mysqld.pid
#目录需要赋权限 chown -R mysql:mysql  /var/run/mariadb
#注意:mysql连接localhost通常通过一个Unix域套接字文件进行>@@@       #注意:mysql连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock,这个socket路径不要修改,不然连本地mysql的时候回报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'

[client]
port=3306
socket=/var/lib/mysql/mysql.sock

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

然后按esc,再按:,然后输入wq!回车即可

  • 启动我们的服务器

service mysqld start

在这里插入图片描述

原因没有目录并且没有权限
mkdir /opt/mysql/mysql-5.7.31/data
touch /opt/mysql/mysql-5.7.31/data/mysqld.log
chown -R mysql:mysql /opt/mysql/mysql-5.7.31/data/

  • 再启动服务器

    service mysqld start

在这里插入图片描述

发现并没有/var/log/mariadb/mariadb.log这个路径,那我们就创建, 并给mysql用户授权即可

mkdir /var/lib/mysql

chown -R mysql:mysql /var/lib/mysql

再启动服务

然后再次运行

service mysqld start,这时候有下面这句话就是启动成功了

[admin@DB ~]$ sudo service mysqld start

Starting MySQL. SUCCESS! (提示成功)

但是这时候我们直接mysql -uroot -p
可能是会出现位置问题,导致我们无法正确启动,如果是安装在默认地址,那就不用考虑这个问题,但是如果不是安装在默认地址,我们这边就得修改一些配置才能正确启动

配置环境变量,编辑/etc/profile,方便在任何地方用mysql命令
vim /etc/profile
在最后面添加下面内容:
#mysql
export MYSQL_HOME=/opt/mysql/mysql-5.7.31
export PATH=$PATH:$MYSQL_HOME/bin
重新编译profile让配置生效
source /etc/profile
再输入这条命令下载一些内容
yum install libncurses*

我们再输入

mysql -uroot -p

password(密码是刚刚在上面生成的随机密码)

在这里插入图片描述

  • 这时我们再开始创建和初始化我们的数据库

mysql> alter user user() identified by "Z@bbix@123";
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Z@bbix@123' WITH GRANT OPTION;
mysql> flush privileges;
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by ' Z@bbix@123';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'zabbix'@'localhost'IDENTIFIED BY 'Z@bbix@123' WITH GRANT OPTION;
mysql> flush privileges;
mysql> quit;

  • 然后我们回到我们的server服务器上面去寻找这个文件 create.sql.gz

find / -name create.sql.gz

然后想办法把这个文件拉到我们的db这个服务器上面

然后在我们的db服务器上面运行这条命令

zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -pZ@bbix@123 –Dzabbix

运行好之后,再进去我们的数据库

mysql -uroot -p

password

use zabbix;

show tables;

在这里插入图片描述

5、这时再回到我们的server服务器上面

vim /etc/zabbix/zabbix_server.conf
DBPassword= Z@bbix@123
DBHost=xxx.xxx.xxx.xxx(你db那个服务器上面的ip地址)

  • server改变时区
vim /etc/php-fpm.d/zabbix.conf
php_value[date.timezone] = Asia/Shanghai

  • 启动server
systemctl restart zabbix-server zabbix-agent httpd php-fpm

systemctl enable zabbix-server zabbix-agent httpd php-fpm

6、一些相关文档和目录地址

Server 启动和关闭
systemctl start zabbix-server
systemctl stop zabbix-server
Agent 的启动和关闭
systemctl start zabbix-agent
systemctl stop zabbix-agent
Mysql 的重新启动
systemctl restart mysqld
http、php 的重新启动
systemctl restart httpd php-fpm
自启动配置项目位置
/usr/lib/systemd/system/zabbix-agent.service
/usr/lib/systemd/system/zabbix-server.service
日志文件路径
tail -f /var/log/zabbix/zabbix_agentd.log
tail -f /var/log/zabbix/zabbix_server.log
tail –f /opt/mysql/mysql-5.7.31/data/mysqld.log
tail –f /var/log/httpd/access_log
配置文件路径
/etc/zabbix/zabbix_agent.conf
/etc/zabbix/zabbix_server.conf

7、开始配置我们的前端

浏览器访问:http://(你的server服务器的ip地址)/zabbix

访问成功后可以看到:

在这里插入图片描述

之后就是一步步配置。

默认用户名为Admin,密码为zabbix

  • zabbix配置中文界面

  • 手动安装中文语言包:

dnf install langpacks-zh_CN.noarch
安装glibc-common实现对语言包的识别:
dnf install glibc-common
# 如果已安装过,需要重新安装,用reinstall
dnf reinstall glibc-common
检测是否安装成功:
locale -a | grep zh_CN

这里有一个问题,首先在前端配置数据库的时候出错,无法注册数据,这是因为我们缺少一个文件

vim /etc/zabbix/web/zabbix.conf.php

把下面这段内容全部复制进去,这个文档,然后保存退出

<?php
// Zabbix GUI configuration file.

$DB['TYPE']                             = 'MYSQL';
$DB['SERVER']                   = 'xxx.xxx.xxx.xx';(你db服务器的ip地址)
$DB['PORT']                             = '3306';
$DB['DATABASE']                 = 'zabbix';
$DB['USER']                             = 'zabbix';
$DB['PASSWORD']                 = 'Z@bbix@123';

// Schema name. Used for PostgreSQL.
$DB['SCHEMA']                   = '';

// Used for TLS connection.
$DB['ENCRYPTION']               = false;
$DB['KEY_FILE']                 = '';
$DB['CERT_FILE']                = '';
$DB['CA_FILE']                  = '';
$DB['VERIFY_HOST']              = false;
$DB['CIPHER_LIST']              = '';

// Vault configuration. Used if database credentials are stored in Vault secrets         manager.
$DB['VAULT_URL']                = '';
$DB['VAULT_DB_PATH']    = '';
$DB['VAULT_TOKEN']              = '';

// Use IEEE754 compatible value range for 64-bit Numeric (float) history values.
// This option is enabled by default for new Zabbix installations.
// For upgraded installations, please read database upgrade notes before enablin        g this option.
$DB['DOUBLE_IEEE754']   = true;

$ZBX_SERVER                             = 'xxx.xxx.xxx.xxx';(你server服务器的IP地址)
$ZBX_SERVER_PORT                = '10051';
$ZBX_SERVER_NAME                = '';

$IMAGE_FORMAT_DEFAULT   = IMAGE_FORMAT_PNG;

// Uncomment this block only if you are using Elasticsearch.
// Elasticsearch url (can be string if same url is used for all types).
//$HISTORY['url'] = [
//      'uint' => 'http://localhost:9200',
//      'text' => 'http://localhost:9200'
//];
// Value types stored in Elasticsearch.
//$HISTORY['types'] = ['uint', 'text'];

// Used for SAML authentication.
// Uncomment to override the default paths to SP private key, SP and IdP X.509 c        ertificates, and to set extra settings.
//$SSO['SP_KEY']                        = 'conf/certs/sp.key';
//$SSO['SP_CERT']                       = 'conf/certs/sp.crt';
//$SSO['IDP_CERT']              = 'conf/certs/idp.crt';
//$SSO['SETTINGS']              = [];

  • 然后再进去db1这个服务器


Mysql –uroot –p

Password

mysql> GRANT ALL PRIVILEGES ON *.* TO zabbix@"%" IDENTIFIED BY "Z@bbix@123";

mysql> flush privileges;

这样再打开我们的网址,就是zabbix的页面了直接登录账户Admin,密码:zabbix进去就好了

  • 解决中文乱码:

问题在于zabbix默认的字体文件不支持中文,所以中文字符的显示成了乱码;
在windows的C:\Windows\Fonts目录下复制想要的字体(.ttf)到服务器的
/usr/share/zabbix/assets/fonts目录下,
注意大写的字体名要改为小写的,
修改配置文件:
 vim /usr/share/zabbix/include/defines.inc.php
把define('ZBX_GRAPH_FONT_NAME',           'graphfont');
中的‘graphfont‘更改为你的字体名


8、Zabbix数据表分区

  1. 使用truncate命令清空zabbix 所有监控数据

  2. 先进入mysql –uzabbix –pZ@bbix@123

  3. use zabbix;

  4. show tables;

truncate table history;

optimize table history;

\-------------------------------------------------------

truncate table history_str;

optimize table history_str;

\-------------------------------------------------------

truncate table history_uint;

optimize table history_uint;

\-------------------------------------------------------

truncate table trends;

optimize table trends;

\-------------------------------------------------------

truncate table trends_uint; 

optimize table trends_uint; 

\-------------------------------------------------------

SET FOREIGN_KEY_CHECKS=0;

truncate table events;

SET FOREIGN_KEY_CHECKS=1;

optimize table events;

注意:这些命令会把zabbix所有的监控数据清空,只是清空监控数据,添加的主机,配置,拓扑图不会丢失。如果对监控数据比较看重的话注意备份数据库

truncate是删除了表,然后根据表结构重新建立。

  • 创建sql文件在我们的db服务器上

vim partition.sql

DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_create`$$
CREATE PROCEDURE `partition_create`(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)
BEGIN
        /*
           SCHEMANAME = The DB schema in which to make changes
           TABLENAME = The table with partitions to potentially delete
           PARTITIONNAME = The name of the partition to create
        */
        /*
           Verify that the partition does not already exist
        */
 
        DECLARE RETROWS INT;
        SELECT COUNT(1) INTO RETROWS
        FROM information_schema.partitions
        WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_description >= CLOCK;
 
        IF RETROWS = 0 THEN
        /*
           1. Print a message indicating that a partition was created.
           2. Create the SQL to create the partition.
           3. Execute the SQL from #2.
        */
        SELECT CONCAT( "partition_create(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg;
        SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' );
        PREPARE STMT FROM @sql;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
        END IF;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_drop`$$
CREATE PROCEDURE `partition_drop`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), DELETE_BELOW_PARTITION_DATE BIGINT)
BEGIN
        /*
           SCHEMANAME = The DB schema in which to make changes
           TABLENAME = The table with partitions to potentially delete
           DELETE_BELOW_PARTITION_DATE = Delete any partitions with names that are dates older than this one (yyyy-mm-dd)
        */
        DECLARE done INT DEFAULT FALSE;
        DECLARE drop_part_name VARCHAR(16);
 
        /*
           Get a list of all the partitions that are older than the date
           in DELETE_BELOW_PARTITION_DATE.  All partitions are prefixed with
           a "p", so use SUBSTRING TO get rid of that character.
        */
        DECLARE myCursor CURSOR FOR
        SELECT partition_name
        FROM information_schema.partitions
        WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND CAST(SUBSTRING(partition_name FROM 2) AS UNSIGNED) < DELETE_BELOW_PARTITION_DATE;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
 
        /*
           Create the basics for when we need to drop the partition.  Also, create
           @drop_partitions to hold a comma-delimited list of all partitions that
           should be deleted.
        */
        SET @alter_header = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " DROP PARTITION ");
        SET @drop_partitions = "";
 
        /*
           Start looping through all the partitions that are too old.
        */
        OPEN myCursor;
        read_loop: LOOP
        FETCH myCursor INTO drop_part_name;
        IF done THEN
    LEAVE read_loop;
        END IF;
        SET @drop_partitions = IF(@drop_partitions = "", drop_part_name, CONCAT(@drop_partitions, ",", drop_part_name));
        END LOOP;
        IF @drop_partitions != "" THEN
        /*
           1. Build the SQL to drop all the necessary partitions.
           2. Run the SQL to drop the partitions.
           3. Print out the table partitions that were deleted.
        */
        SET @full_sql = CONCAT(@alter_header, @drop_partitions, ";");
        PREPARE STMT FROM @full_sql;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
 
        SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, @drop_partitions AS `partitions_deleted`;
        ELSE
        /*
           No partitions are being deleted, so print out "N/A" (Not applicable) to indicate
           that no changes were made.
        */
        SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, "N/A" AS `partitions_deleted`;
        END IF;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_maintenance`$$
CREATE PROCEDURE `partition_maintenance`(SCHEMA_NAME VARCHAR(32), TABLE_NAME VARCHAR(32), KEEP_DATA_DAYS INT, HOURLY_INTERVAL INT, CREATE_NEXT_INTERVALS INT)
BEGIN
        DECLARE OLDER_THAN_PARTITION_DATE VARCHAR(16);
        DECLARE PARTITION_NAME VARCHAR(16);
        DECLARE OLD_PARTITION_NAME VARCHAR(16);
        DECLARE LESS_THAN_TIMESTAMP INT;
        DECLARE CUR_TIME INT;
 
        CALL partition_verify(SCHEMA_NAME, TABLE_NAME, HOURLY_INTERVAL);
        SET CUR_TIME = UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'));
 
        SET @__interval = 1;
        create_loop: LOOP
        IF @__interval > CREATE_NEXT_INTERVALS THEN
    LEAVE create_loop;
        END IF;
 
        SET LESS_THAN_TIMESTAMP = CUR_TIME + (HOURLY_INTERVAL * @__interval * 3600);
        SET PARTITION_NAME = FROM_UNIXTIME(CUR_TIME + HOURLY_INTERVAL * (@__interval - 1) * 3600, 'p%Y%m%d%H00');
        IF(PARTITION_NAME != OLD_PARTITION_NAME) THEN
    CALL partition_create(SCHEMA_NAME, TABLE_NAME, PARTITION_NAME, LESS_THAN_TIMESTAMP);
        END IF;
        SET @__interval=@__interval+1;
        SET OLD_PARTITION_NAME = PARTITION_NAME;
        END LOOP;
 
        SET OLDER_THAN_PARTITION_DATE=DATE_FORMAT(DATE_SUB(NOW(), INTERVAL KEEP_DATA_DAYS DAY), '%Y%m%d0000');
        CALL partition_drop(SCHEMA_NAME, TABLE_NAME, OLDER_THAN_PARTITION_DATE);
 
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_verify`$$
CREATE PROCEDURE `partition_verify`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), HOURLYINTERVAL INT(11))
BEGIN
        DECLARE PARTITION_NAME VARCHAR(16);
        DECLARE RETROWS INT(11);
        DECLARE FUTURE_TIMESTAMP TIMESTAMP;
 
        /*
         * Check if any partitions exist for the given SCHEMANAME.TABLENAME.
         */
        SELECT COUNT(1) INTO RETROWS
        FROM information_schema.partitions
        WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_name IS NULL;
 
        /*
         * If partitions do not exist, go ahead and partition the table
         */
        IF RETROWS = 1 THEN
        /*
         * Take the current date at 00:00:00 and add HOURLYINTERVAL to it.  This is the timestamp below which we will store values.
         * We begin partitioning based on the beginning of a day.  This is because we don't want to generate a random partition
         * that won't necessarily fall in line with the desired partition naming (ie: if the hour interval is 24 hours, we could
         * end up creating a partition now named "p201403270600" when all other partitions will be like "p201403280000").
         */
        SET FUTURE_TIMESTAMP = TIMESTAMPADD(HOUR, HOURLYINTERVAL, CONCAT(CURDATE(), " ", '00:00:00'));
        SET PARTITION_NAME = DATE_FORMAT(CURDATE(), 'p%Y%m%d%H00');
 
        -- Create the partitioning query
        SET @__PARTITION_SQL = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " PARTITION BY RANGE(`clock`)");
        SET @__PARTITION_SQL = CONCAT(@__PARTITION_SQL, "(PARTITION ", PARTITION_NAME, " VALUES LESS THAN (", UNIX_TIMESTAMP(FUTURE_TIMESTAMP), "));");
 
        -- Run the partitioning query
        PREPARE STMT FROM @__PARTITION_SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
        END IF;
END$$
DELIMITER ;
 
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_maintenance_all`$$
CREATE PROCEDURE`partition_maintenance_all`(SCHEMA_NAME VARCHAR(32))
BEGIN
               CALL partition_maintenance(SCHEMA_NAME, 'history', 7, 24, 7);
               CALL partition_maintenance(SCHEMA_NAME, 'history_log', 7, 24, 7);
               CALL partition_maintenance(SCHEMA_NAME, 'history_str', 7, 24, 7);
               CALL partition_maintenance(SCHEMA_NAME, 'history_text', 7, 24, 7);
               CALL partition_maintenance(SCHEMA_NAME, 'history_uint', 30, 24, 7);
               CALL partition_maintenance(SCHEMA_NAME, 'trends', 730, 24, 14);
               CALL partition_maintenance(SCHEMA_NAME, 'trends_uint', 730, 24, 14);
END$$
DELIMITER ;


  • 导入sql文件 在我们的db服务器上

mysql -uzabbix -p Z@bbix@123 zabbix < partition.sql

执行存储过程
[root@zabbix ~]#nohup mysql -uzabbix -p123456 zabbix -e “CALL partition_maintenance_all(‘zabbix’)” &> /root/partition.log&

然后进去数据库查看
mysql –uroot –p
password
use zabbix;
show create table history;

如果是下面这种场景,说明就是分区创建成功,有很多的partition

...
| history | CREATE TABLE `history` (
  `itemid` bigint(20) unsigned NOT NULL,
  `clock` int(11) NOT NULL DEFAULT '0',
  `value` double(16,4) NOT NULL DEFAULT '0.0000',
  `ns` int(11) NOT NULL DEFAULT '0',
  KEY `history_1` (`itemid`,`clock`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
/*!50100 PARTITION BY RANGE (`clock`)
(PARTITION p201906260000 VALUES LESS THAN (1561608000) ENGINE = InnoDB,
 PARTITION p201906270000 VALUES LESS THAN (1561694400) ENGINE = InnoDB,
 PARTITION p201906280000 VALUES LESS THAN (1561780800) ENGINE = InnoDB,
 PARTITION p201906290000 VALUES LESS THAN (1561867200) ENGINE = InnoDB,
 PARTITION p201906300000 VALUES LESS THAN (1561953600) ENGINE = InnoDB,
 PARTITION p201907010000 VALUES LESS THAN (1562040000) ENGINE = InnoDB,
 PARTITION p201907020000 VALUES LESS THAN (1562126400) ENGINE = InnoDB) */ |
  • 导入添加计划任务,在我们的db服务器上

crontab -e

#zabbix partition_maintenance
01 01 * * *  mysql  -uzabbix -p Z@bbix@123 zabbix -e"CALL partition_maintenance_all('zabbix')" &>/var/log/partition.log

然后按esc,再按:,再输入x回车退出即可

然后再查看我们的有没有添加成功

crontab -l
在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有猫腻妖

你的鼓励是我更新的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值