蓝鲸开源组件常用命令操作

-
-
2024-07-23

嘉为蓝鲸-蓝鲸开源组件常用命令操作

一、MySQL

1.1 登录操作

# 1. 加载蓝鲸环境变量  
source $CTRL_DIR/utils.fc

# 2. 登录交互式命令行

# @2.5 版本
mysql -u $MYSQL_USER -p $MYSQL_PASS -h $MYSQL_IP

# @3.0 版本
mysql_config_editor print --all			# 查看配置的数据库快捷登陆账号列表
mysql --login-path=mysql-default		# 使用 mysql-default 配置进行登录
 
# 在 MySQL 本机,以 socket 形式登录,一般用于赋权
mysql \
    -u$BK_MYSQL_ADMIN_USER \
    -p$BK_MYSQL_ADMIN_PASSWORD \
    --socket /var/run/mysql/default.mysql.socket

1.2 常用 SQL 语句

-- 1. 创建 MySQL 用户, 并设置密码为 blueking
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'blueking';
    -- 注:'user1'@'localhost' 和 'user1'@'127.0.0.1' 会被识别为两个不同的用户
    
-- 2. 查看所有用户信息
SELECT user,host FROM mysql.user;

-- 3. 删除用户
DROP USER 'user1'@'localhost';

-- 4. 创建密码为 blueking 的用户 user1,并赋予其对所有数据库有所有的操作权限(ALL)
GRANT ALL ON *.* TO 'user1'@'%' IDENTIFIED BY 'blueking' WITH GRANT OPTION;
FLUSH PRIVILEGES;	-- 刷新权限

-- 5. 创建密码为 blueking 的用户 user2,并赋予其对所有数据库只有只读权限(SELECT)
GRANT SElECT ON *.* TO 'user2'@'%' IDENTIFIED BY "blueking";
FLUSH PRIVILEGES;	-- 刷新权限

-- 6. 查看 user1 的权限
SHOW GRANTS FOR 'user1'@'%';

-- 7. 创建数据库(如果不存在)
CREATE DATABASE IF NOT EXISTS dbname DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 8. 查看所有数据库
SHOW DATABASES;

-- 9. 查看数据库的建库语句
SHOW CREATE DATABASE dbname;

-- 10. 查看某表的创建语句
SHOW CREATE TABLE tablename;

-- 11. 查看所有数据库大小
SELECT 
    table_schema AS '数据库',
    SUM(table_rows) AS '记录数',
    SUM(TRUNCATE(data_length/1024/1024/1024, 2)) AS '数据容量(GB)',
    SUM(TRUNCATE(index_length/1024/1024/1024, 2)) AS '索引容量(GB)'
FROM 
    information_schema.tables
GROUP BY 
    table_schema
ORDER BY
    SUM(data_length) DESC, 
    SUM(index_length) DESC;
    
-- 12. 查看某个库中的表大小
SELECT 
    table_schema AS '数据库', 
    table_name AS '表名', 
    table_rows AS '记录数', 
    TRUNCATE(data_length/1024/1024/1024, 2) as '数据容量(GB)', 		
    TRUNCATE(index_length/1024/1024/1024, 2) as '索引容量(GB)' 
FROM 
    information_schema.tables 
WHERE 
    table_schema='bkmonitorv3_alert' /* 数据库名 */
ORDER BY 
    table_rows DESC, 
    index_length DESC;
    
    
-- 13. 查询当前 MySQL 版本
SELECT @@VERSION;

-- 14. 查询定义的packet大小
select @@max_allowed_packet;

-- 15. 查看当前mysqld的所有参数,包括默认值
SHOW VARIABLES;

-- 16. 查询当前 MySQL 实例的端口
SHOW VARIABLES LIKE 'port';

-- 17. 查询 MySQL 实例的 socket 文件路径
SHOW VARIABLES LIKE 'socket';

-- 18. 查看实例的数据路径
SHOW VARIABLES LIKE 'datadir';

-- 19. 查看是否开启了慢查询日志, 以及慢日志的路径, ON代表开启
SHOW VARIABLES LIKE 'slow_query_log%';

-- 20. 查看从服务器是否开启慢查询日志,ON代表开启
SHOW VARIABLES LIKE 'log_slow_slave_statements';

-- 21. 查看慢查询时间,查询超过这个时间即被标记为慢查询
SHOW VARIABLES LIKE 'long_query_time';

-- 22. 在线开启慢日志
SET GLOBAL slow_query_log=1;

-- 23. 在线修改慢日志路径
SET GLOBAL slow_query_log_file='/tmp/slow.log';

-- 24. 在线修改慢日志查询时间
SET GLOBAL long_query_time=0.2;		/* 需要重新登录命令行 */

-- 25. 查看日志的输出格式
SHOW VARIABLES LIKE 'log_output';  /* FILE 或 TABLE */

-- 26. 查看日志的时间信息
SHOW VARIABLES LIKE 'log_timestamps';  /* UTC时间或者SYSTEM时间 */

-- 27. 查看是否开启 '将没有使用索引的SQL语句记录到慢查询日志中' 的功能
SHOW VARIABLES LIKE 'log_queries_not_using_indexes';

-- 28. 限制每分钟内,在慢查询日志中,记录没有使用索引的次数
/* 一般与上面的参数一起使用, 避免日志快速增长。 */
SHOW VARIABLES LIKE 'log_throttle_queries_not_using_indexes';

-- 29. 查看创建的临时表的存储引擎类型
SHOW VARIABLES LIKE "default%tmp%";

-- 30. 查询log文件大小
SHOW VARIABLES LIKE 'innodb_log_file_size';

-- 31. 查询页的大小
/* 
    1) 一旦数据库通过innodb_page_size设置完成,则后续无法更改,
    2) innodb_page_size 是针对普通表的,压缩表不受限制。 
*/
SHOW VARIABLES LIKE 'innodb_page_size';

-- 32. 查看缓冲池的大小
/*
    1) 每次读写数据都是通过buffer pool,当buffer pool中没有所需的数据时,才去硬盘中获取。
    2) 该值设置的越大越好,buffer pool也是以页(page)为单位的,且大小和innodb_page_size一致。
*/
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

-- 33. 在线调整innodb_buffer_pool_size
/* MySQL 5.7之前的版本,修改该值,需要重启 */
SET GLOBAL innodb_buffer_pool_size=2*1024*1024*1024;

-- 34. 设置了多少个缓冲池
/* 设置多个instance可将热点打散,提高并发性能(建议设置成cpu 个数值) */
SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';

-- 35. 是否在停机时 dump 出 buffer pool数据
/* 
    在MySQL 5.6 以后,可以在停机的时候dump出buffer pool的数据,然后在启动的时候Load进buffer pool。该功能可以在MySQL启动时自动预热,无需人工干预。 
*/
SHOW VARIABLES LIKE 'innodb_buffer_pool_dump_at_shutdown';

-- 36. 启动时加载dump的文件
/* 恢复到buffer pool中。dump的越多,启动的越慢 */
SHOW VARIABLES LIKE 'innodb_buffer_pool_load_at_startup';

-- 37. 查看 dump 百分比
/* 是每个buffer pool文件,而不是整体 */
SHOW VARIABLES LIKE 'innodb_buffer_pool_dump_pct'; 

-- 38. 查看隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';

-- 39. 设置隔离级别
SEt transaction_isolation='read-committed';

-- 40. 是否将死锁信息打印到err_log中
SHOW VARIABLES LIKE 'innodb_print_all_deadlocks'; 

-- 41. master thread 每秒刷新redo的buffer到logfile
/* 5.7版本可以设置刷新间隔时间, 默认是1秒。 */
SHOW VARIABLES LIKE "%innodb_flush_log_at_timeout%";

-- 42. 查看binlog的类型
/*
    STATEMENT: 记录SQL语句
    ROW: 记录SQL语句操作的那些行(行的变化)
    MIXED: mixed 混合statement 和 Row 格式(不推荐)。
*/
SHOW VARIABLES LIKE 'binlog_format';

-- 43. 查看timeout参数
SHOW VARIABLES LIKE "%timeout%"

-- 44. 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';

-- 45. 查看 binlog 过期时间
show variables like 'expire_logs_days';

-- 46. 修改 binlog 过期时间
set global expire_logs_days=7;

-- 47. 显示表结构和列结构的命令
DESC dbname.tablename;

-- 48. 显示正在执行的线程
SHOW PROCESSLIST;

-- 49. 查看buffer pool的状态
SHOW ENGINE INNODB STATUS\G;

-- 50. 查看表的索引情况
SHOW INDEX FROM tablename;

-- 51. 查看锁的信息
SELECT * FROM sys.innodb_lock_waits;

-- 52. 查看 master 状态
SHOW MASTER STATUS\G;	/*在主节点上执行*/

-- 53. 查看所有的log文件
SHOW MASTER LOGS;		/*在主节点上执行*/

-- 54. 查看 slave 状态
SHOW SLAVE STATUS\G;	/*在从节点上执行*/

-- 55. 在线清理 mysql-bin3306.000003 之前的日志
PURGE BINARY LOGS TO 'mysql-bin3306.000003';

1.3 命令行操作

# 操作主机:MySQL_IP
source /data/install/

# @2.5 版本
# 1. 全库备份
/data/src/service/mysql/bin/mysqldump \
      -h$MYSQL_IP \
      -u$MYSQL_USER \
      -p$MYSQL_PASS \
      --skip-opt \
      --create-options \
      --single-transaction \
      -q \
      --no-autocommit \
      -R \
      --triggers \
      --default-character-set=utf8 \
    --all-databases | gzip > /data/dbbak/all_db_$(date +%Y%m%d_%H%M%S).gz;

# 2. 备份 testdb 数据库
/data/src/service/mysql/bin/mysqldump \
      -h$MYSQL_IP \
      -u$MYSQL_USER \
      -p$MYSQL_PASS \
      --skip-opt \
      --create-options \
      --single-transaction \
      -q \
      --no-autocommit \
      -R \
      --triggers \
      --default-character-set=utf8 \
      --events testsdb | gzip > /data/dbbak/testdb_$(date +%Y%m%d_%H%M%S).gz;
      

# 3. 还原 testdb 数据库
gunzip /data/dbbak/testdb_$(date +%Y%m%d_%H%M%S).gz

/data/src/service/mysql/bin/mysql \
      -h$MYSQL_IP \
      -u$MYSQL_USER \
      -p$MYSQL_PASS \
      testdb < /data/dbbak/testdb_$(date +%Y%m%d_%H%M%S)
      

# @3.0 版本
source /data/install/utils.fc
# 1. 全库备份
mysqldump \
      -h$BK_MYSQL_IP \
      -u$BK_MYSQL_ADMIN_USER \
      -p$BK_MYSQL_ADMIN_PASSWORD \
      --socket /var/run/mysql/default.mysql.socket \
      --skip-opt \
      --create-options \
      --single-transaction \
      -q \
      --no-autocommit \
      -R \
      --triggers \
      --default-character-set=utf8 \
    --all-databases | gzip > /data/dbbak/all_db_$(date +%Y%m%d_%H%M%S).gz;
    
# 2. 备份 testdb 数据库
mysqldump \
      -h$BK_MYSQL_IP \
      -u$BK_MYSQL_ADMIN_USER \
      -p$BK_MYSQL_ADMIN_PASSWORD \
      --socket /var/run/mysql/default.mysql.socket \
      --skip-opt \
      --create-options \
      --single-transaction \
      -q \
      --no-autocommit \
      -R \
      --triggers \
      --default-character-set=utf8 \
      --events testsdb | gzip > /data/dbbak/testdb_$(date +%Y%m%d_%H%M%S).gz;
      

# 3. 还原 testdb 数据库
gunzip /data/dbbak/testdb_$(date +%Y%m%d_%H%M%S).gz

mysql \
      -h$BK_MYSQL_IP \
      -u$BK_MYSQL_ADMIN_USER \
      -p$BK_MYSQL_ADMIN_PASSWORD \
      --socket /var/run/mysql/default.mysql.socket \
      testdb < /data/dbbak/testdb_$(date +%Y%m%d_%H%M%S)
      
 mysql \
      -h$LAN_IP \
      -u$BK_MYSQL_ADMIN_USER \
      -p$BK_MYSQL_ADMIN_PASSWORD \
      bk_monitorv3 < bk_monitorv3_20210713_112829

二、MongoDB

2.1 登录操作

# 1. 加载蓝鲸环境变量  
source $CTRL_DIR/utils.fc

# @2.5
# 单机连接(使用admin) 用户
/data/src/service/mongodb/bin/mongo \
    -u $MONGODB_USER \
    -p $MONGODB_PASS \
    mongodb://mongodb.service.consul:27017/admin \
    --authenticationDatabase admin

# 单机连接(使用cmdb) 用户
/data/src/service/mongodb/bin/mongo \
    -u bk_cmdb \
    -p $(_app_token bk_cmdb) \
    mongodb://mongodb.service.consul:27017/cmdb \
    --authenticationDatabase cmdb
    
    
# 复制集连接(使用admin) 用户
/data/src/service/mongodb/bin/mongo \
    -u $MONGODB_USER \
    -p $MONGODB_PASS \
    mongodb://mongodb.service.consul:27017/admin?replicatSet=rs0 \
    --authenticationDatabase admin

# 复制集连接(使用 cmdb) 用户
/data/src/service/mongodb/bin/mongo \
    -u bk_cmdb \
    -p $(_app_token bk_cmdb) \
    mongodb://mongodb.service.consul:27017/cmdb?replicatSet=rs0 \
    --authenticationDatabase cmdb
    
# @3.0 连接
mongo \
    -u $BK_MONGODB_ADMIN_USER \
    -p $BK_MONGODB_ADMIN_PASSWORD \
    mongodb://mongodb.service.consul:27017/admin \
    --authenticationDatabase admin

PS:2024年7月26日

 

2.2 常用查询

// 1. 创建管理员
db.createUser({
    user:"exporter",
    pwd:"blueking",
    roles:[{
        role:"root",
        db:"admin"
    }]
})

// 2. 为 cmdb 库创建读写用户
db.createUser({
    user: "bk_cmdb",
    pwd: "7ujm*IK<",
    roles:[{ 
        role: "readWrite", 
        db: "cmdb"
    }]
})

// 3. 创建 backup 用户
db.getSiblingDB("local").createUser({
  user: "exporter",
  pwd: "blueking",
  roles: ["backup"]
})

// 4. 查看所有数据库
show dbs;

// 5. 查看当前数据库的用户
db.getUsers();

// 6. 修改 bk_cmdb 用户密码
db.updateUser(
    "bk_cmdb",
    {
        pwd:"blueking"
    }
)

// 7. 查看所有数据库
show dbs;

// 8. 查看数据库中集合
show collections;

// 9. 查询数据多条数据
db.collection_name.find({
    "bk_host_innerip": "xxxxxx"
}}

db.collection_name.find().skip(Number).limit(Number).sort({x:1})
// skip: 跳过查询的最开始的数量
// limit: 限制返回数量
// sort: 当 x:1 表示正序,x:-1 表示逆序

// 10. 条件筛选
db.collection_name.find(
{
    key_name:{$gt:value}
})
// $gt,$lt,$get,$lte,$ne

// 11. 查询单条
db.collection_name.findOne()

// 12. 计算符合查询条件的文档的数量
db.collection_name.find().count()

// 13. 获取结果的唯一值
db.collection_name.distinct('key_name')

// 14. 更新数据
db.collection_name.update(
    {original_key:original_value},
    {new_key:new_value}
)
// 只要原 collection 中包含 original_key:original_value 就会被选中成为操作对象
// 整个collection都会被更新成new_key:new_value,而不单单就只是更新original_key:original_value

// 相较于上面会更新整个集合,下面添加了 $set: 的形式来只进行部分字段的更新
db.collection_name.update(
    {original_key:original_value},
    {
        $set:{new_key:new_value}
    }
)

// 15. 删除所有查找到的数据
db.coolection_name.remove({key:value})

// 16. 删除一张表
db.collection_name.drop()

// 17. 查看集合的索引
db.collection_name.getIndexes()

// 18. 创建索引
db.collection_name.ensureIndex({key:value})

// 19. 前面是根据key:value的形式创建索引的,接下来就为一集合的某一字段全部创建索引
db.collection_name.ensureIndex({key:1})

// 20. 删除索引
db.collection_name.dropIndex({key:value})

// 21. 删除所有索引
db.collection_name.dropIndexes()

// 22. 查看复制集状态及角色
rs.status()

2.3 命令行操作

# 1. 备份
# @2.5
source /data/install/utils.fc
mkdir -p /data/dbbak
/data/src/service/mongodb/bin/mongodump \
    -h $MONGODB_IP:$MONGODB_PORT \
    -u bk_cmdb \
    -p $(_app_token bk_cmdb) \
    --archive=/data/dbbak/mongodb_cmdb_$(date +%F_%T).gz \
    --gzip \
    --db cmdb \
    --excludeCollection=cc_OperationLog

# @3.0
mongodump \
    -h $BK_CMDB_MONGODB_HOST:$BK_CMDB_MONGODB_PORT \
    -u $BK_CMDB_MONGODB_USERNAME \
    -p $BK_CMDB_MONGODB_PASSWORD \
    --archive=/data/dbbak/mongodb_cmdb_$(date +%F_%T).gz \
    --gzip \
    --db cmdb

# 参数说明:
# -h: MongoDB IP地址:MongoDB 端口
# -u: 用户名
# -p: 密码
# --archive: 备份文件存放路径
# --gzip: 备份格式
# --db: 备份的数据库名
# --excludeCollection: 排除的集合
# --collection: 只备份某个集合
# 注:cc_OperationLog为CMDB的操作审计日志,如果需要进行备份,可把 --excludeCOllection 选项去掉。
    
# 2. 还原
# @2.5
/data/src/service/mongodb/bin/mongorestore \
    -h $MONGODB_IP:$MONGODB_PORT \
    -u bk_cmdb \
    -p $(_app_token bk_cmdb) \
    -d cmdb \
    --gzip \
    --archive=/data/mongodb_cmdb.tgz \
    --drop

# @3.0
mongorestore \
    -h $BK_CMDB_MONGODB_HOST:$BK_CMDB_MONGODB_PORT \
    -u $BK_CMDB_MONGODB_USERNAME \
    -p $BK_CMDB_MONGODB_PASSWORD \
     --authenticationDatabase admin
    -d cmdb \
    --gzip \
    --archive=/data/dbbak/mongodb_cmdb_$(date +%F_%T).gz \
    --drop
## -d 
# 参数说明:
# -h: MongoDB IP地址:MongoDB 端口
# -u: 用户名
# -p: 密码
# -d: 还原的数据库名
# --gzip: 指定还原文件的格式
# --archive: 备份文件的路径
# --drop: 先把数据库删掉再进行还原
# 注:--drop 参数会把现有的数据库进行删除,再从备份文件中还原,请慎用!!!

三、RabbitMQ

RabbitMQ 官网:https://www.rabbitmq.com/documentation.html

#rabbitmq官网  
rabbitmqctl --help #查看帮助

# 1. 新增 vhosts
rabbitmqctl add_vhost vhostname

# 2. 删除 vhosts
rabbitmqctl delete_vhost vhostname 

# 3. vhost并授权
rabbitmqctl set_permissions -p vhostname vhostname ".*" ".*" ".*"

# 4. 查看监控队列
rabbitmqctl list_queues -p prod_bk_monitor

# 5. 服务重启
systemctl restart rabbitmq-server
# 启动: rabbitmq-server –detached
# 关闭: rabbitmqctl stop
 
# 6. 集群配置相关命令
rabbitmqctl stop_app
rabbitmqctl reset
# 在当前集群中加入某节点
rabbitmqctl join_cluster {rabbit_node_name} 
# 某些低版本可以采用rabbitmqctl cluster {rabbit_node_name}
rabbitmqctl start_app

# 7. 查看集群状态
rabbitmqctl cluster_status

# 8. 将某节点剔除出当前集群
rabbitmqctl forget_cluster_node {rabbit_node_name}

# 9. 开启某个插件
rabbitmq-plugins enable {插件名}

# 10. 关闭某个插件
rabbitmq-plugins disable {插件名}
# 有关插件名可以在 rabbitmq 的安装目录下的 plugins 目录中查看:$RABBITMQ_HOME/plugins
# 如:
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins list

# 11. 添加用户
rabbitmqctl add_user {username} {password}

# 12. 删除用户
rabbitmqctl delete_user {username}

# 13. 修改密码
rabbitmqctl change_password {username} {newpassword}

# 14. 设置用户角色
rabbitmqctl set_user_tags {username} {tag}
# tag可以为 administrator, monitoring, management
# 举例:
rabbitmqctl add_user root root
rabbitmqctl set_user_tags root administrator
rabbitmqctl list_users


# 15. 权限设置
rabbitmqctl set_permissions [-p vhostpath] {user} {conf} {write} {read}
# conf:一个正则表达式match哪些配置资源能够被该用户访问。
# write:一个正则表达式match哪些配置资源能够被该用户读。
# read:一个正则表达式match哪些配置资源能够被该用户访问。

# 16. 查看(指定vhost)所有用户的权限信息
rabbitmqctl list_permissions [-p vhostPath]

# 17. 查看指定用户的权限信息
rabbitmqctl list_user_permissions {username}

# 18. 清除用户的权限信息
rabbitmqctl clear_permissions [-p vhostPath] {username}
# 举例
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

# 19. 服务器状态
rabbitmqctl status

# 20. 队列信息
rabbitmqctl list_queues [-p vhostpath] [queueinfoitem …]
# queueinfoitem可以为:
# name,durable,auto_delete,arguments,messages_ready,messages_unacknowled,messages, consumers,memory.

# 21. Exchange信息
rabbitmqctl list_exchanges [-p vhostpath] [exchangeinfoitem …]
# exchangeinfoitem有:
# name, type, durable, auto_delete, internal, arguments.

# 22. Binding信息
rabbitmqctl list_bindings [-p vhostpath] [bindinginfoitem …]
# bindinginfoitem有:
# source_name, source_kind, destination_name, destination_kind, routing_key, arguments.等

# 23. connection信息
rabbitmqctl list_connections [connectioninfoitem …]
# connectioninfoitem有:
# recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。

# 24. channel信息
rabbitmqctl list_channels [channelinfoitem …]
# channelinfoitem有:
# consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked

# 举例:
rabbitmqctl list_queues name messages_ready pid slave_pids

# 25. 更改节点类型
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc
# 或
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app

# 26. 添加vhost
rabbitmqctl add vhost {name}

# 27. 删除vhost:
rabbitmqctl delete vhost {name}

# 28. 镜像队列的配置通过添加policy完成,policy添加的命令为:
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]

# -p Vhost: 可选参数,针对指定vhost下的queue进行设置
# Name: policy的名称
# Pattern: queue的匹配模式(正则表达式)
# Definition: 镜像定义,包括三个部分 ha-mode,ha-params,ha-sync-mode
#    ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
#         all表示在集群所有的节点上进行镜像
#         exactly表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
#         nodes表示在指定的节点上进行镜像,节点名称通过ha-params指定
#    ha-params: ha-mode模式需要用到的参数
#    ha-sync-mode: 镜像队列中消息的同步方式,有效值为automatic,manually
# Priority: 可选参数, policy的优先级

# 例如,对队列名称以hello开头的所有队列进行镜像,并在集群的两个节点上完成镜像,policy的设置命令为:
rabbitmqctl set_policy hello-ha "^hello" '{"ha-mode":"exactly",:ha-params":2,"ha-sync-mode":"automatic"}'

# 29. rabbitmq权限控制 https://blog.csdn.net/qq_35781732/article/details/79807160

# 30. 查看监控队列
rabbitmqctl list_queues -p prod_bk_monitor

# 31. 清理监控队列
ssh $APPO_IP
docker ps    找到bk_monitor的容器ID
docker exec -it 容器ID /bin/bash
#进到容器里,然后执行以清除堵塞的队列
cd /data/app/code && /cache/.bk/env/bin/python /data/app/code/manage.py celery purge

# 32. 查看作业队列
rabbitmqctl list_queues -p bk_job

# 33. 清理作业队列
rabbitmqctl purge_queue -p bk_job

四、Zookeeper

# @2.5 版本
cd /data/bkee/public/zk

# @3.0 版本
cd /opt/zookeeper

# 1. 启动ZK服务
bin/zkServer.sh start

# 2. 查看ZK服务状态
bin/zkServer.sh status

# 3. 停止ZK服务
bin/zkServer.sh stop

# 4. 重启ZK服务
bin/zkServer.sh restart

# 5. 连接服务器
./bin/zkCli.sh -server $LAN_IP:2181

# -- 以下为交互式命令 --

# 6. 查看根目录:
ls /

# 7. 创建 testnode节点,关联字符串"zz"
create /zk/testnode "zz"

# 8. 查看节点内容
get /zk/testnode

# 9. 设置节点内容
set /zk/testnode abc

# 10. 删除节点
delete /zk/testnode

# -- 以下是在蓝鲸ZK服务器中的常用操作 -- 
# 1. 进入 ZK
# @2.5 
/data/bkee/service/zk/bin/zkCli.sh \
    -server zk.service.consul:2181 
# @3.0
/opt/zookeeper/bin/zkCli.sh \
    -server zk.service.consul:2181

# 2. 查看gse_server信息
# 添加 acl 身份认证信息
addauth digest bkzk:密码       
ls /gse/config/server/dataserver/all 

# 3. 查看kafka在zk上注册的节点 
# @2.5
/data/bkee/service/zk/bin/zkCli.sh \
    -server zk.service.consul:2181 ls /common_kafka/brokers/ids
# @3.0	
/opt/zookeeper/bin/zkCli.sh \
    -server zk.service.consul:2181 ls /common_kafka/brokers/ids	

# 4. 查看dataid注册的信息,进入zk后操作
get /gse/config/etc/dataserver/data/1001
 

#  -- 以下是 zk 常用的 4 字命令 --

# 5. 输出server配置
echo conf|nc $ZK_IP 2181 

# 6. 输出指定server上所有客户端连接的详细信息,包括客户端IP,会话ID等
echo cons|nc $ZK_IP 2181 

# crst: 功能性命令。重置所有连接的统计信息。New in 3.3.0
# dump: 这个命令针对Leader执行,用于输出所有等待队列中的会话和临时节点的信息。
# envi: 用于输出server的环境变量。包括操作系统环境和Java环境。
# ruok: 用于测试server是否处于无错状态。如果正常,则返回"imok",否则没有任何响应。 
    ## 注意:ruok不是一个特别有用的命令,它不能反映一个server是否处于正常工作。"stat"命令更靠谱。
# stat: 输出server简要状态和连接的客户端信息。
# srst: 重置server的统计信息。
# wchs: 列出所有watcher信息概要信息,数量等
# wchc: 出所有watcher信息,以watcher的session为归组单元排列
# wchp: 列出所有watcher信息,以watcher的path为归组单元排列
# mntr: 输出一些ZK运行时信息,通过对这些返回结果的解析,可以达到监控的效果。

五、Kafka

# 目录
# @2.5 
cd /data/bkee/service/kafka/bin
# @3.0
cd /opt/kafka/bin

# 列出所有 topic
./kafka-topics.sh \
    --zookeeper zk.service.consul:2181/common_kafka \
    --list

# 列出 topic 的详细
./kafka-topics.sh \
    --zookeeper zk.service.consul:2181/common_kafka \
    --topic <XXX> \
    --describe

# 列出所有消费组
./kafka-consumer-groups.sh \
    --zookeeper zk.service.consul:2181/common_kafka \
    --list

# 实时数据消费
./kafka-console-consumer.sh \
    --bootstrap-server kafka.service.consul:9092 \
    --topic <XXX>

# 注:这是从最开始进行消费数据,量会很大
./kafka-console-consumer.sh \
    --bootstrap-server kafka.service.consul:9092 \
    --topic "0bkmonitor_10000"  \
    --from-beginning | grep "2020-02-07" > ~/0bkmonitor_10000_0207

# 创建 topic(4个分区,2个副本)
./kafka-topics.sh \
    --create --zookeeper zk.service.consul:2181/common_kafka \
    --replication-factor 2 \
    --partitions 4 \
    --topic test
    
## 显示某个消费组的消费详情(仅支持offset存储在zookeeper上的)
./kafka-run-class.sh kafka.toolsonsumerOffsetChecker \
    --zookeeper zk.service.consul:2181/common_kafka \
    --group test
    
## 显示某个消费组的消费详情(0.9版本 - 0.10.1.0 之前)
./kafka-consumer-groups.sh \
    --new-consumer \
    --bootstrap-server kafka.service.consul:9092 \
    --describe \
    --group test-consumer-group

## 显示某个消费组的消费详情(0.10.1.0版本+)
./kafka-consumer-groups.sh \
    --bootstrap-server kafka.service.consul:9092 \
    --describe \
    --group my-group
    
    
## 生产者
./kafka-console-producer.sh \
    --broker-list kafka.service.consul:9092 \
    --topic test

## 消费者
./kafka-console-consumer.sh \
    --zookeeper zk.service.consul:2181/common_kafka \
    --topic test

## 新生产者(支持0.9版本+)
./kafka-console-producer.sh \
    --broker-list kafka.service.consul:9092 \
    --topic test \
    --producer.config config/producer.properties

## 新消费者(支持0.9版本+)
./kafka-console-consumer.sh \
    --bootstrap-server kafka.service.consul:9092 \
    --topic test \
    --new-consumer \
    --from-beginning \
    --consumer.config config/consumer.properties

## 高级点的用法
./kafka-simple-consumer-shell.sh \
    --brist kafka.service.consul:9092 \
    --topic test \
    --partition 0 \
    --offset 1234  \
    --max-messages 10
    
    
# 查看topic某分区偏移量最大(小)值
./kafka-run-class.sh kafka.tools.GetOffsetShell \
    --topic hive-mdatabase-hostsltable \
    --time -1 \
    --broker-list kafka.service.consul:9092 \
    --partitions 0
# 注: time为-1时表示最大值,time为-2时表示最小值
 

# 为topic t_cdr 增加10个分区
./kafka-topics.sh \
    --zookeeper zk.service.consul:2181/common_kafka  \
    --alter \
    --topic t_cdr \
    --partitions 10

# 删除topic,慎用,只会删除zookeeper中的元数据,消息文件须手动删除
./kafka-run-class.sh kafka.admin.DeleteTopicCommand \
    --zookeeper zk.service.consul:2181/common_kafka \
    --topic t_cdr

# 查看topic消费进度
# 这个会显示出consumer group的offset情况,
# 必须参数为--group, 不指定--topic,默认为所有topic
./kafka-run-class.sh kafka.tools.ConsumerOffsetChecker \
    --group pv
# 返回
Group           Topic              Pid Offset   logSize    Lag    Owner 
pv              page_visits        0   21       21         0      none 
pv              page_visits        1   19       19         0      none 
pv              page_visits        2   20       20         0      none

# Kafka 压测命令
./kafka-producer-perf-test.sh \
    --topic test \
    --num-records 100 \
    --record-size 1 \
    --throughput 100  \
    --producer-props bootstrap.servers=kafka.service.consul:9092 
    
# Kafka 给某个topic设置清理策略	
# 其中retention.bytes=xxxxx  可以替换成别的,例如retention.ms等等
    /opt/kafka/bin/kafka-configs.sh --zookeeper zk.service.consul:2181/common_kafka --entity-type topics --entity-name xxxxx--alter --add-config retention.bytes=1073741824
    
    
#kafka 查询某个topic策略详情
   /opt/kafka/bin/kafka-configs.sh --zookeeper zk.service.consul:2181/common_kafka --entity-type topics --describe |grep xxxx
    

六、REDIS

# 进入redis
source /data/install/utils.fc

# @2.5
redis-cli -h $REDIS_IP -p $REDIS_PORT -a $REDIS_PASS
# @3.0
redis-cli -h $BK_REDIS_IP -p 6379 -a $BK_REDIS_ADMIN_PASSWORD
    
#获取配置信息
CONFIG GET XXXXX
CONFIG GET *
#编辑配置
CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

#查看信息
info all

#查看客户端连接情况
client list

#Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 
key
    keys * 获取所有的key
    select 0 选择第一个库
    move myString 1 将当前的数据库key移动到某个数据库,目标库有,则不能移动
    flush db      清除指定库
    randomkey     随机key
    type key      类型
    
    set key1 value1 设置key
    get key1    获取key
    mset key1 value1 key2 value2 key3 value3
    mget key1 key2 key3
    del key1   删除key
    exists key      判断是否存在key
    expire key 10   10过期
    pexpire key 1000 毫秒
    persist key     删除过期时间

string
    set name cxx
    get name
    getrange name 0 -1        字符串分段
    getset name new_cxx       设置值,返回旧值
    mset key1 key2            批量设置
    mget key1 key2            批量获取
    setnx key value           不存在就插入(not exists)
    setex key time value      过期时间(expire)
    setrange key index value  从index开始替换value
    incr age        递增
    incrby age 10   递增
    decr age        递减
    decrby age 10   递减
    incrbyfloat     增减浮点数
    append          追加
    strlen          长度
    getbit/setbit/bitcount/bitop    位操作
    
hash
    hset myhash name cxx
    hget myhash name
    hmset myhash name cxx age 25 note "i am notes"
    hmget myhash name age note   
    hgetall myhash               获取所有的
    hexists myhash name          是否存在
    hsetnx myhash score 100      设置不存在的
    hincrby myhash id 1          递增
    hdel myhash name             删除
    hkeys myhash                 只取key
    hvals myhash                 只取value
    hlen myhash                  长度

list
    lpush mylist a b c  左插入
    rpush mylist x y z  右插入
    lrange mylist 0 -1  数据集合
    lpop mylist  弹出元素
    rpop mylist  弹出元素
    llen mylist  长度
    lrem mylist count value  删除
    lindex mylist 2          指定索引的值
    lset mylist 2 n          索引设值
    ltrim mylist 0 4         删除key
    linsert mylist before a  插入
    linsert mylist after a   插入
    rpoplpush list list2     转移列表的数据
    
set
    sadd myset redis 
    smembers myset       数据集合
    srem myset set1         删除
    sismember myset set1 判断元素是否在集合中
    scard key_name       个数
    sdiff | sinter | sunion 操作:集合间运算:差集 | 交集 | 并集
    srandmember          随机获取集合中的元素
    spop                 从集合中弹出一个元素
    
zset
    zadd zset 1 one
    zadd zset 2 two
    zadd zset 3 three
    zincrby zset 1 one              增长分数
    zscore zset two                 获取分数
    zrange zset 0 -1 withscores     范围值
    zrangebyscore zset 10 25 withscores 指定范围的值
    zrangebyscore zset 10 25 withscores limit 1 2 分页
    Zrevrangebyscore zset 10 25 withscores  指定范围的值
    zcard zset  元素数量
    Zcount zset 获得指定分数范围内的元素个数
    Zrem zset one two        删除一个或多个元素
    Zremrangebyrank zset 0 1  按照排名范围删除元素
    Zremrangebyscore zset 0 1 按照分数范围删除元素
    Zrank zset 0 -1    分数最小的元素排名为0
    Zrevrank zset 0 -1  分数最大的元素排名为0
    Zinterstore
    zunionstore rank:last_week 7 rank:20150323 rank:20150324 rank:20150325  weights 1 1 1 1 1 1 1
    
    
排序:
    sort mylist  排序
    sort mylist alpha desc limit 0 2 字母排序
    sort list by it:* desc           by命令
    sort list by it:* desc get it:*  get参数
    sort list by it:* desc get it:* store sorc:result  sort命令之store参数:表示把sort查询的结果集保存起来

订阅与发布:
    订阅频道:subscribe chat1
    发布消息:publish chat1 "hell0 ni hao"
    查看频道:pubsub channels
    查看某个频道的订阅者数量: pubsub numsub chat1
    退订指定频道: unsubscrible chat1   , punsubscribe java.*
    订阅一组频道: psubscribe java.*
    
redis事物:
     隔离性,原子性, 
     步骤:  开始事务,执行命令,提交事务
             multi  //开启事务
             sadd myset a b c
             sadd myset e f g
             lpush mylist aa bb cc
             lpush mylist dd ff gg

服务器管理
    dump.rdb
    appendonly.aof
    //BgRewriteAof 异步执行一个aop(appendOnly file)文件重写
    会创建当前一个AOF文件体积的优化版本
    
    //BgSave 后台异步保存数据到磁盘,会在当前目录下创建文件dump.rdb
    //save同步保存数据到磁盘,会阻塞主进程,别的客户端无法连接
    
    //client kill 关闭客户端连接
    //client list 列出所有的客户端
    
    //给客户端设置一个名称
      client setname myclient1
      client getname
      
     config get port
     //configRewrite 对redis的配置文件进行改写
     

INFLUXDB


influxdb常用操作命令

#进入数据库查询
ssh $INFLUXDB_IP
influx -host influxdb.service.consul -port 8086 -precision rfc3339 
> select * from "_internal"."monitor"."write" order by "time" desc limit 2
> help  #查看帮助
> use system_2; 
> select * from system_load_2 limit 1; 

#查看表
show measurements

# 显示所有数据库
show databases

# 创建数据库
create database test
# 删除数据库
drop database test
# 使用数据库
use test
# 显示表,需要先use数据库
show measurements
# 插入数据
insert devops-idc-sz,host=server01 cpu=23.1,mem=0.63 
# 显示表里所有tag keys
show tag keys
# 显示表里所有field keys
show field keys
# 显示series
show series from devops-idc-sz
# 查询数据
select * from devops-idc-sz
# 删除一行数据
delete from devops-idc-sz where "host"='server01' and time=1567158293s
# 删除时序数据序列
drop series from devops-idc-sz where "host"='server01'
# 删除表
drop measurement devops-idc-sz

# 改变时间显示格式
precision rfc3339

#备份
for i in `ls /data/bkee/public/influxdb/data`;do influxd backup -host 127.0.0.1:8088 -database $i  /data/backup/influxdb_$(date +%Y-%m-%d);done

#还原
for db in $(ls *.rp_* | sed 's/\.rp_.*//' | sort -u); do influxd restore -database $db -datadir /data/bkee/public/influxdb/data /data/influxdb-backup-data; done

DOCKER


docker常用操作命令

#常用命令
#显示 Docker 版本信息
docker version

#显示 Docker 系统信息,包括镜像和容器数
docker info

#列出本地所有镜像
docker images

#列出所有容器
docker ps 
docker ps -a |grep itsm #含沉睡镜像

#从本地移除一个或多个指定的镜像
docker rmi

#删除容器 -f 强行 -l移除容器间的网络连接,而非容器本身 -v 移除与容器关联的空间
docker rm

#查看指定镜像的创建历史
docker history

#启动、停止和重启一个或多个指定容器
docker start|stop|restart

#杀死一个或多个指定容器进程。
docker kill 

#查看一个正在运行容器进程,支持 ps 命令参数。
docker top

#获取容器运行时的输出日志
docker logs

#启动一个容器,在其中运行指定命令
docker run

#实时显示容器资源使用情况的统计信息
docker stats 

#以下是命令大全
管理命令:
  container   管理容器
  image       管理镜像
  network     管理网络
  node        管理Swarm节点
  plugin      管理插件
  secret      管理Docker secrets
  service     管理服务
  stack       管理Docker stacks
  swarm       管理Swarm集群
  system      查看系统信息
  volume      管理卷
  
  如:docker container ls 显示所有容器
  
普通命令:
    
  attach     进入一个运行的容器
  build      从一个DockerFile构建镜像
  commit     从容器创建一个镜像
  cp          从容器和主机文件系统之间拷贝文件 
  create      创建一个容器
  diff        检查容器文件系统上的更改
  events      从服务器获取实时事件
  exec        在正在运行的容器中运行命令
  export      将容器的文件系统导出为tar存档
  history     显示镜像的历史记录
  images      查看镜像列表
  import      从归档文件中创建镜像
  info        显示系统范围的信息
  inspect     返回Docker对象的低级信息
  kill        kill运行中的容器
  load        从存档或者STDIN加载镜像
  login       登陆docker镜像仓库
  logout      退出docker镜像仓库
  logs        获取一个容器的日志
  pause       暂停一个或多个容器中的所有进程
  port        查看端口映射或容器的特定映射列表
  ps          查看容器列表
  pull        从镜像仓库拉取镜像
  push        将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
  rename      重命名容器
  restart     重启容器
  rm          删除容器
  rmi         删除镜像
  run         创建一个新的容器并运行一个命令
  save        将指定镜像保存成 tar 归档文件
  search      从Docker Hub搜索镜像
  start       启动容器
  stats       实时显示容器资源使用情况的统计信息
  stop       停止容器
  tag         标记本地镜像,将其归入某一仓库
  top         展示一个容器中运行的进程
  unpause     恢复容器中所有的进程
  update      更新容器配置
  version    显示Docker的版本信息
  wait        阻塞直到容器停止,然后打印退出代码

ETCD


etcd常用操作命令

#通过 list、add、remove 命令列出、添加、删除 etcd 实例到 etcd 集群中
etcdctl member list

#修改etcd集群influxdb注册的节点
endpoint=http://192.168.102.171:2379,http://192.168.102.173:2379,http://192.168.102.174:2379
etcdctl --endpoints $endpoint get /backends/local/url
etcdctl --endpoints $endpoint get /backends/local1/url
etcdctl --endpoints $endpoint set /backends/local1/url  http://192.168.102.175:5260

操作类型
get #获取指定键的值
update #当键存在时,更新值内容
rm #删除某个键值
rmdir #删除键值或者空目录
mkdir #如果给定的键目录不存在,则创建一个新的键目录
setdir #创建一个键目录,无论存在与否
updatedir #更新一个已经存在的目录
watch #监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出
exec-watch #监测一个键值的变化,一旦键值发生更新,就执行给定命令 etcdctl exec-watch testkey -- sh -c 'ls'

ES


es常用操作命令

索引状态  curl -XGET "http://es.service.consul:10004/_cat/indices?pretty"
open正常
健康状态  curl -XGET "http://es.service.consul:10004/_cat/health"
green正常
删除索引 
curl -XDELETE "http://es.service.consul:10004/*201806*"

curl -X POST 'http://server_ip:port/索引名/_close'  # 索引支持 “*” 匹配
curl -X POST 'http://server_ip:port/索引名/_open'  # 打开索引

#创建索引
curl -XPUT 'http://server_ip:port/filebeat-2018.07.25.19' -d '
{
    "settings": {
      "index": {
        "mapping": {
          "total_fields": {
            "limit": "10000"
          }
        },
        "refresh_interval": "5s",
        "number_of_shards": "5",
        "number_of_replicas": "1"
      }
    }
}'

'查看集群状态'  :  http://server_ip:port/_cluster/stats

'集群健康状态'  :  http://server_ip:port/_cluster/health

'查看节点状态'  :  http://server_ip:port/_nodes/stats

                  http://server_ip:port/_nodes/ # 和上面的有出入,比上面主机ip全

'索引(indices)状态':  http://server_ip:port/_stats

'查看设置'     : http://server_ip:port/_all/_settings

'查看索引内容' :http://server_ip:port/你的索引名/_search

'查看es集群副本分配节点':http://server_ip:port/_cat/shards?v
--------------------- 

NGINX


nginx常用操作命令

#启动nginx
./sbin/nginx
#查看版本
nginx -v
#起停、重载配置
nginx -s stop 
nginx -s start 
nginx -s reload
#检查配置文件是否正确 
nginx -t
#查看帮助
nginx -h

#参数调整,admin授权业务过多打开cmdb报404
#在paas、CMDB的nginx.conf的HTTP域新增以下参数调整:
    client_header_buffer_size 128k;
    large_client_header_buffers 4 128k;
    proxy_buffer_size 64k;
    proxy_buffers 8 64k;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 128k;    

SUPERVISOR


supervisor常用操作命令

#查看帮助
supervisorctl help

supervisorctl update :配置文件修改后可以使用该命令加载新的配置
supervisorctl reload: 重新启动配置中的所有程序
查看单个任务状态: supervisorctl status 服务名
启动任务:supervisorctl start 服务名
停止任务:supervisorctl stop 服务名
重启任务:supervisorctl restart 服务名

#重启open_paas所有工程
/data/bkee/.envs/open_paas/bin/python /data/bkee/.envs/open_paas/bin/supervisorctl -c /data/bkee/etc/supervisor-open_paas.conf restart all
#单独重启esb工程
/data/bkee/.envs/open_paas/bin/python /data/bkee/.envs/open_paas/bin/supervisorctl -c /data/bkee/etc/supervisor-open_paas.conf restart esb

#esb默认配置worker=2*cpucores,每个worker最多建立20个mysql链接
#查看esb工程数据库连接数
pgrep -f esb/bin/uwsgi   |xargs -n 1 lsof -i:3306 -a -nP -p | grep -c EST
#uwsgitop 查看worker性能 https://github.com/xrmx/uwsgitop
#修改 supervisor配置里,把command的uwsig --ini xxx.ini 改为 uwsgi --stats /tmp/esb.stats --ini xxx.ini  然后uwsgitop /tmp/esb.stats 看

CONSUL


consul常用操作命令

#官网链接 https://www.consul.io/docs/agent/basics.html
#consul service api:  https://www.consul.io/api/agent/service.html
#解析蓝鲸域名 dig consul.service.consul srv
#蓝鲸consul配置和解析json生成,由parse_config(pxs)解析install.config
#主配置文件  /data/bkee/etc/consul.conf
#consul服务配置目录  /data/bkee/etc/consul.d/
consul --version #查看版本
consul -help  #查看帮助
Available commands are:
    agent          Runs a Consul agent
    event          Fire a new event
    exec           Executes a command on Consul nodes
    force-leave    Forces a member of the cluster to enter the "left" state
    info           Provides debugging information for operators.
    join           Tell Consul agent to join cluster
    keygen         Generates a new encryption key
    keyring        Manages gossip layer encryption keys
    kv             Interact with the key-value store
    leave          Gracefully leaves the Consul cluster and shuts down
    lock           Execute a command holding a lock
    maint          Controls node or service maintenance mode
    members        Lists the members of a Consul cluster
    monitor        Stream logs from a Consul agent
    operator       Provides cluster-level tools for Consul operators
    reload         Triggers the agent to reload configuration files
    rtt            Estimates network round trip time between nodes
    snapshot       Saves, restores and inspects snapshots of Consul server state
    validate       Validate config files/directories
    version        Prints the Consul version
    watch          Watch for changes in Consul
    
#consul控制台 http://127.0.0.1:8500/ui/ 
    

#解析异常排查思路:
1.查看/etc/resolv.conf第一行nameserver是否为127.0.0.1 
2.consul monitor 看看日志,主要确认consul集群状态是否正常。观察是否有"no cluster leader" 的输出(查看consul主节点是否为奇数,install.config配置的consul节点)
对于出现"no cluster leader"的输出时,说明consul之间没有成功组成集群,选举出leader:
检查consul server节点是否都running
在任意一台consul上输入 consul join <另外一个consul节点>
查看节点状态:consul operator raft list-peers
3.针对具体的域名,譬如 zk.service.consul,那么登陆到zk所在机器,查看/data/bkce/etc/consul.d/zk.json文件 运行里面的check脚本,看返回的输出


​ 服务发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。

​ 健康检查:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。

​ 键/值存储:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。(蓝鲸2.4 paas monitor中使用此功能)

​ 多数据中心:无需复杂的配置,即可支持任意数量的区域。(蓝鲸暂时未用到)

consul kv get -recurse #获取consul中所有键值    
#服务注册
curl --request PUT --data '{"id":"usermgr-1","name":"usermgr","check":{"name":"usermgr api service","tcp":"10.0.1.34:8009","interval":"10s","timeout":"1s"},"port":8009,"address":"10.0.1.34"}'  http://127.0.0.1:8500/v1/agent/service/register

#获取服务信息
curl http://127.0.0.1:8500/v1/catalog/service/appo

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录