zoukankan      html  css  js  c++  java
  • postgresql 主从复制并切换

    1 环境

    * Kylin 3.3 mysqlhq  9.5.2  psql_master
    * Kylin 3.3 mysql3    9.5.2  psql_standby
    postgres=# select version();
    version
    -------------------------------------------------------------------------------------------------------------
    PostgreSQL 9.5.2 on x86_64-kylin-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11), 64-bit
    prot=5432

    2 yum 安装pgsql

    [root@mysqlhq ~]# yum list | grep postgresql
    [root@mysqlhq ~]# yum install postgresql-server postgresql-contrib
    [root@mysqlhq ~]# service postgresql initdb
    [root@mysqlhq ~]# systemctl start postgresql
    [root@mysqlhq ~]# systemctl status postgresql
    [root@mysqlhq ~]# netstat -lnt|grep 5432
    tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN
    [root@mysqlhq ~]# ps -ef|grep postgres
    [root@mysqlhq ~]# su - postgres
    -bash-4.2$ psql
    psql (9.5.2)
    Type "help" for help.

    3 修改主库的配置文件

    #default 路径///var/lib/pgsql/data
    [root@mysqlhq ~]# cd /var/lib/pgsql/data/
    [root@mysqlhq data]# cp postgresql.conf postgresql.conf.bk20181213
    [root@mysqlhq data]# vim postgresql.conf
    listen_addresses = '*'
    max_connections = 1000
    wal_level = hot_standby
    #synchronous_commit = on(同步复制,-- 实时,如果需要异步改为off)
    checkpoint_timeout = 5min
    archive_mode = on
    archive_command = '/bin/date'
    max_wal_senders = 2
    wal_keep_segments = 16
    hot_standby = on
    max_standby_archive_delay = 300s
    max_standby_streaming_delay = 30s
    wal_receiver_status_interval = 1s
    hot_standby_feedback = on
    wal_receiver_timeout = 60s

    -bash-4.2$ cat /var/lib/pgsql/data/pg_hba.conf | grep -v '^#' | grep -v '^$'
    local all all peer
    host all all 127.0.0.1/32 trust
    host all all */32 trust
    host all all */32 md5
    host all all ::1/128 ident
    host replication repuser */32 md5

    [root@mysqlhq data]# su - postgres
    Last login: Tue Dec 11 16:34:47 CST 2018 on pts/3
    -bash-4.2$ psql
    psql (9.5.2)
    Type "help" for help.

    postgres=# create role repuser login replication encrypted password 'pgreplication';
    CREATE ROLE

    -bash-4.2$ /usr/bin/pg_ctl stop
    waiting for server to shut down.... done
    server stopped
    -bash-4.2$ /usr/bin/pg_ctl start
    server starting
    -bash-4.2$ netstat -lnt|grep 5432
    tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN
    tcp6 0 0 :::5432 :::* LISTEN
    查看日志
    tail -f -n 100 /var/lib/pgsql/data/pg_log/postgresql-Thu.log

    从库配置
    1 基础备份
    从库安装完成后,不初始化,若已经初始化,删除其data目录
    [root@mysql3 pgsql]# rm -rf data/

    [root@mysql3 pgsql]# /usr/bin/pg_basebackup -D /var/lib/pgsql/data -F p -X stream -R -v -P -h * -p 5432 -U repuser
    口令:
    事务日志起始于时间点: 0/7000028, 基于时间表1
    pg_basebackup: 启动后台 WAL 接收进程
    73823/73876 kB (100%), 2/2 表空间
    pg_basebackup: 无法得到来自服务器的事务日志终止位置: ERROR: could not open file "./postgresql.conf.bk20181213": Permission denied
    删除文件./postgresql.conf.bk20181213,这些配置文件的备份需要放在非data目录

    -R 备份后对文件recovery.conf进行写操作
    删除数据目录,重新pg_basebackup
    [root@mysql3 pgdata]# /usr/bin/pg_basebackup -D /var/lib/pgsql/data -F p -X stream -R -v -P -h * -p 5432 -U repuser
    口令:
    事务日志起始于时间点: 0/9000028, 基于时间表1
    pg_basebackup: 启动后台 WAL 接收进程
    73859/73859 kB (100%), 2/2 表空间
    transaction log end point: 0/90000F8
    pg_basebackup: 等待后台进程结束流操作...
    pg_basebackup: base backup completed
    2 配置备库参数postgresql.conf
    [root@mysql3 data]# vim postgresql.conf
    #在基础备份时,初始化文件是从主库复制来的,所以配置文件一致,注释掉
    wal_level,
    max_wal_senders 
    wal_keep_segments等参数
    打开如下参数:

    hot_standby = on   #在备份的同时允许查询
    max_standby_streaming_delay = 30s #可选,流复制最大延迟
    wal_receiver_status_interval = 10s #可选,从向主报告状态的最大间隔时间
    hot_standby_feedback = on #可选,查询冲突时向主反馈
    max_connections = 1000 #默认参数,非主从配置相关参数,表示到数据库的连接数,一般从库做主要的读服务时,设置值需要高于主库
    3 创建恢复文件recovery.conf
    yum安装的pg,所以在pg_basebackup的时候加上-R参数,生成recovery.conf
    [root@mysql3 data]# cat recovery.conf
    standby_mode = 'on' #指明从库身份
    primary_conninfo = 'user=repuser password=pgreplication host=* port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres' #连接到主库信息
    [root@mysql3 data]# vim recovery.conf
    recovery_target_timeline = 'latest' #同步到最新数据

    #trigger_file = '/postgres/data/trigger_activestandby'
    指定触发文件,文件存在时,将触发从库提升为主库,前提是必须设置”standby_mode = on”;如果不设置此参数,也可采用”pg_ctl promote“触发从库切换成主库

    chown -R postgres:postgres /var/lib/pgsql/data
    chown -R postgres:postgres /usr/local/pgdata
    [root@mysql3 data]# /usr/bin/pg_ctl start
    pg_ctl: 无法以 root 用户运行
    请以服务器进程所属用户 (非特权用户) 登录 (或使用 "su")

    [root@mysql3 data]# su - postgres
    上一次登录:四 12月 13 18:01:23 CST 2018pts/1 上
    -bash-4.2$ /usr/bin/pg_ctl start
    正在启动服务器进程
    -bash-4.2$ LOG: redirecting log output to logging collector process
    HINT: Future log output will appear in directory "pg_log".

    4 验证主从
    1 主库进程 sender
    -bash-4.2$ ps -ef|grep postgres
    postgres 4087 26671 0 09:44 ? 00:00:00 postgres: wal sender process repuser *(55336) streaming 0/D000140
    postgres 4093 24928 31 09:45 pts/3 00:00:00 ps -ef
    postgres 4094 24928 7 09:45 pts/3 00:00:00 grep --color=auto postgres
    root 24927 30012 0 Dec13 pts/3 00:00:00 su - postgres
    postgres 24928 24927 0 Dec13 pts/3 00:00:00 -bash
    postgres 26671 1 0 Dec13 pts/3 00:00:04 /usr/bin/postgres
    postgres 26672 26671 0 Dec13 ? 00:00:00 postgres: logger process
    postgres 26674 26671 0 Dec13 ? 00:00:02 postgres: checkpointer process
    postgres 26675 26671 0 Dec13 ? 00:00:00 postgres: writer process
    postgres 26676 26671 0 Dec13 ? 00:00:01 postgres: wal writer process
    postgres 26677 26671 0 Dec13 ? 00:00:04 postgres: autovacuum launcher process
    postgres 26678 26671 0 Dec13 ? 00:00:00 postgres: archiver process last was 00000001000000000000000C
    postgres 26679 26671 0 Dec13 ? 00:00:05 postgres: stats collector process

    2 验证从库 recovering
    -bash-4.2$ ps -ef|grep postgres
    root 32525 9758 0 09:44 pts/1 00:00:00 su - postgres
    postgres 32526 32525 0 09:44 pts/1 00:00:00 -bash
    postgres 32563 1 0 09:44 pts/1 00:00:00 /usr/bin/postgres
    postgres 32564 32563 0 09:44 ? 00:00:00 postgres: logger process
    postgres 32565 32563 0 09:44 ? 00:00:00 postgres: startup process recovering 00000001000000000000000D
    postgres 32566 32563 0 09:44 ? 00:00:00 postgres: checkpointer process
    postgres 32567 32563 0 09:44 ? 00:00:00 postgres: writer process
    postgres 32568 32563 0 09:44 ? 00:00:00 postgres: stats collector process
    postgres 32569 32563 0 09:44 ? 00:00:00 postgres: wal receiver process streaming 0/D000140
    postgres 32586 32526 0 09:46 pts/1 00:00:00 ps -ef
    postgres 32587 32526 0 09:46 pts/1 00:00:00 grep --color=auto postgres

    3 sql查询主从状态
    -bash-4.2$ psql
    psql (9.5.2)
    Type "help" for help.

    postgres=# select * from pg_stat_replication;
    pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay
    _location | sync_priority | sync_state
    ------+----------+---------+------------------+----------------+-----------------+-------------+-------------------------------+--------------+-----------+---------------+----------------+----------------+-------
    ----------+---------------+------------
    4087 | 25404 | repuser | walreceiver | * | | 55336 | 2018-12-14 09:44:45.165618+08 | 2103 | streaming | 0/D000140 | 0/D000140 | 0/D000140 | 0/D000
    140 | 0 | async
    (1 row)
    select pg_is_in_recovery();

    4 主从数据测试
    主库 192.168.19.145
    postgres-# c yhq1
    yhq1=# CREATE TABLE yhq22(id integer not null,date TIMESTAMP NOT NULL DEFAULT LOCALTIMESTAMP(0));
    CREATE TABLE
    yhq1=# INSERT INTO yhq22 (id) VALUES (1);
    INSERT 0 1
    yhq1=# INSERT INTO yhq22 (id) VALUES (1);
    INSERT 0 1
    yhq1=# INSERT INTO yhq22 (id) VALUES (1);
    INSERT 0 1
    yhq1=# commit;
    WARNING: there is no transaction in progress
    COMMIT
    yhq1=# select * from yhq22;
    id | date
    ----+---------------------
    1 | 2018-12-14 09:52:51
    1 | 2018-12-14 09:52:53
    1 | 2018-12-14 09:52:53
    (3 rows)
    从库
    postgres=# c yhq1
    您现在已经连接到数据库 "yhq1",用户 "postgres".
    yhq1=# d
    关联列表
    架构模式 | 名称 | 类型 | 拥有者
    ----------+-------+--------+----------
    public | yhq | 数据表 | postgres
    public | yhq22 | 数据表 | postgres
    (2 行记录)

    yhq1=# select * from yhq22;
    id | date
    ----+---------------------
    1 | 2018-12-14 09:52:51
    1 | 2018-12-14 09:52:53
    1 | 2018-12-14 09:52:53
    (3 行记录)
    yhq1=# INSERT INTO yhq22 (id) VALUES (2);
    ERROR: cannot execute INSERT in a read-only transaction

    5命令查看主从状态
    *
    -bash-4.2$ pg_controldata /var/lib/pgsql/data/
    pg_control version number: 942
    Catalog version number: 201510051
    Database system identifier: 6606088538881141528
    Database cluster state: in production
    pg_control last modified: Fri 14 Dec 2018 10:33:14 AM CST
    Latest checkpoint location: 0/D017540
    Prior checkpoint location: 0/D017460
    Latest checkpoint's REDO location: 0/D017508
    Latest checkpoint's REDO WAL file: 00000001000000000000000D
    Latest checkpoint's TimeLineID: 1
    Latest checkpoint's PrevTimeLineID: 1
    Latest checkpoint's full_page_writes: on
    Latest checkpoint's NextXID: 0/2107
    Latest checkpoint's NextOID: 33597
    Latest checkpoint's NextMultiXactId: 1
    Latest checkpoint's NextMultiOffset: 0
    Latest checkpoint's oldestXID: 1823
    Latest checkpoint's oldestXID's DB: 1
    Latest checkpoint's oldestActiveXID: 2107
    Latest checkpoint's oldestMultiXid: 1
    Latest checkpoint's oldestMulti's DB: 24598
    Latest checkpoint's oldestCommitTsXid:0
    Latest checkpoint's newestCommitTsXid:0
    Time of latest checkpoint: Fri 14 Dec 2018 10:33:14 AM CST
    *
    -bash-4.2$ pg_controldata /var/lib/pgsql/data/
    pg_control 版本: 942
    Catalog 版本: 201510051
    数据库系统标识符: 6606088538881141528
    数据库簇状态: 正在归档恢复
    pg_control 最后修改: 2018年12月14日 星期五 10时34分46秒
    最新检查点位置: 0/D017540
    优先检查点位置: 0/D017460
    最新检查点的 REDO 位置: 0/D017508
    最新检查点的重做日志文件: 00000001000000000000000D
    最新检查点的 TimeLineID: 1
    最新检查点的PrevTimeLineID: 1
    最新检查点的full_page_writes: 开启
    最新检查点的 NextXID: 0/2107
    最新检查点的 NextOID: 33597
    最新检查点的NextMultiXactId: 1
    最新检查点的NextMultiOffsetD: 0
    最新检查点的oldestXID: 1823
    最新检查点的oldestXID所在的数据库:1
    最新检查点检查oldestActiveXID: 2107
    最新检查点检查oldestMultiXid: 1
    最新检查点的oldestMulti所在的数据库:24598
    Latest checkpoint's oldestCommitTsXid:0
    Latest checkpoint's newestCommitTsXid:0
    最新检查点的时间: 2018年12月14日 星期五 10时33分14秒
    不带日志的关系: 0/1使用虚假的LSN计数器

    6 主从切换
    *
    -bash-4.2$ pg_ctl stop
    waiting for server to shut down...... done
    server stopped
    -bash-4.2$ pg_controldata /var/lib/pgsql/data/
    pg_control version number: 942
    Catalog version number: 201510051
    Database system identifier: 6606088538881141528
    Database cluster state: shut down
    pg_control last modified: Fri 14 Dec 2018 10:38:54 AM CST
    Latest checkpoint location: 0/E000028
    Prior checkpoint location: 0/D017620
    Latest checkpoint's REDO location: 0/E000028
    从 *
    从库日志
    -bash-4.2$ tail -n 100 /var/lib/pgsql/data/pg_log/postgresql-Fri.log
    LOG: database system is ready to accept read only connections
    LOG: started streaming WAL from primary at 0/D000000 on timeline 1
    ERROR: syntax error at or near "select" at character 35
    STATEMENT: INSERT INTO yhq22 (id) VALUES (2)
    select * from yhq22;
    LOG: replication terminated by primary server
    DETAIL: End of WAL reached on timeline 1 at 0/E000098.
    FATAL: could not send end-of-streaming message to primary: no COPY in progress

    LOG: invalid record length at 0/E000098
    FATAL: could not connect to the primary server: could not connect to server: Connection refused
    Is the server running on host "192.168.19.145" and accepting
    TCP/IP connections on port 5432?
    .....
    LOG: received promote request
    LOG: redo done at 0/E000028
    LOG: last completed transaction was at log time 2018-12-14 09:52:53.356998+08
    LOG: selected new timeline ID: 2
    LOG: archive recovery complete
    LOG: MultiXact member wraparound protections are now enabled
    LOG: database system is ready to accept connections
    LOG: autovacuum launcher started

    -bash-4.2$ pg_ctl promote
    服务器重新加载中
    -bash-4.2$ pg_controldata /var/lib/pgsql/data/
    pg_control 版本: 942
    Catalog 版本: 201510051
    数据库系统标识符: 6606088538881141528
    数据库簇状态: 在运行中
    pg_control 最后修改: 2018年12月14日 星期五 10时40分21秒
    最新检查点位置: 0/E000100
    优先检查点位置: 0/E000028
    最新检查点的 REDO 位置: 0/E0000C8
    最新检查点的重做日志文件: 00000002000000000000000E
    从库正常读写
    yhq1=# INSERT INTO yhq22 (id) VALUES (2);
    INSERT 0 1
    yhq1=# select * from yhq22;
    id | date
    ----+---------------------
    1 | 2018-12-14 09:52:51
    1 | 2018-12-14 09:52:53
    1 | 2018-12-14 09:52:53
    2 | 2018-12-14 10:41:04
    从库的文件 变成recovery.conf
    -rw-r--r-- 1 postgres postgres 195 12月 14 09:41 recovery.done

    原主库操作(恢复原主库为从库)
    1 重新搭建新主从 ?
    2 增量搭建
    这时候原从库已经写入了很多其他数据
    yhq1=# select count(*) from yhq22;
    count
    -------
    8
    测试1
    从 *
    新建文件recovery.conf 并修改文件postgresql.conf
    -bash-4.2$ vim recovery.conf
    standby_mode = 'on'
    primary_conninfo = 'user=repuser password=pgreplication host=* port=5432 sslmode=prefer sslcompression=1 krbsrvname=postgres'
    recovery_target_timeline = 'latest'
    -bash-4.2$ vim postgresql.conf
    #max_wal_senders 
    #wal_keep_segments
    -bash-4.2$ /usr/bin/pg_ctl start
    server starting
    -bash-4.2$ LOG: redirecting log output to logging collector process
    HINT: Future log output will appear in directory "pg_log".

    从 *
    -bash-4.2$ pg_controldata /var/lib/pgsql/data/
    pg_control version number: 942
    Catalog version number: 201510051
    Database system identifier: 6606088538881141528
    Database cluster state: in archive recovery
    pg_control last modified: Fri 14 Dec 2018 11:31:48 AM CST
    Latest checkpoint location: 0/E000028
    Prior checkpoint location: 0/E000028
    Latest checkpoint's REDO location: 0/E000028
    Latest checkpoint's REDO WAL file: 00000001000000000000000E
    Latest checkpoint's TimeLineID: 1
    Latest checkpoint's PrevTimeLineID: 1
    Latest checkpoint's full_page_writes: on
    Latest checkpoint's NextXID: 0/2107
    主 *
    -bash-4.2$ pg_controldata /var/lib/pgsql/data/
    pg_control 版本: 942
    Catalog 版本: 201510051
    数据库系统标识符: 6606088538881141528
    数据库簇状态: 在运行中
    pg_control 最后修改: 2018年12月14日 星期五 11时30分22秒
    最新检查点位置: 0/E000E00
    优先检查点位置: 0/E000D20
    最新检查点的 REDO 位置: 0/E000DC8
    最新检查点的重做日志文件: 00000002000000000000000E
    最新检查点的 TimeLineID: 2
    最新检查点的PrevTimeLineID: 2
    最新检查点的full_page_writes: 开启
    最新检查点的 NextXID: 0/2112
    yhq1=# select * from pg_stat_replication;
    pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay_location | sync_priorit
    y | sync_state
    -----+----------+---------+------------------+-------------+-----------------+-------------+---------------+--------------+-------+---------------+----------------+----------------+-----------------+-------------
    --+------------
    (0 行记录)

    新从--是没有新增加的数据的
    postgres=# c yhq1
    You are now connected to database "yhq1" as user "postgres".
    yhq1=# select *from yhq22;
    id | date
    ----+---------------------
    1 | 2018-12-14 09:52:51
    1 | 2018-12-14 09:52:53
    1 | 2018-12-14 09:52:53
    yhq1=# select * from pg_stat_replication;
    pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay_location | sync_priorit
    y | sync_state
    -----+----------+---------+------------------+-------------+-----------------+-------------+---------------+--------------+-------+---------------+----------------+----------------+-----------------+-------------
    --+------------
    -bash-4.2$ tail -n 100 /var/lib/pgsql/data/pg_log/postgresql-Fri.log
    FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "192.168.19.145", user "repuser", SSL off

    FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "192.168.19.145", user "repuser", SSL off

    主 *
    -bash-4.2$ vim pg_hba.conf
    host replication repuser */32 md5
    -bash-4.2$ /usr/bin/pg_ctl reload

    yhq1=# select * from pg_stat_replication;
    pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay
    _location | sync_priority | sync_state
    ------+----------+---------+------------------+----------------+-----------------+-------------+-------------------------------+--------------+-----------+---------------+----------------+----------------+-------
    ----------+---------------+------------
    2061 | 25404 | repuser | walreceiver | * | | 52776 | 2018-12-14 11:40:34.130154+08 | 2112 | streaming | 0/E001068 | 0/E001068 | 0/E001068 | 0/E001
    068 | 0 | async
    (1 行记录)
    新从 *
    数据同步
    yhq1=# select *from yhq22;
    id | date
    ----+---------------------
    1 | 2018-12-14 09:52:51
    1 | 2018-12-14 09:52:53
    1 | 2018-12-14 09:52:53
    2 | 2018-12-14 10:41:04
    2 | 2018-12-14 11:24:06
    2 | 2018-12-14 11:24:07
    2 | 2018-12-14 11:24:07
    2 | 2018-12-14 11:24:08
    (8 rows)
    -bash-4.2$ tail -n 100 /var/lib/pgsql/data/pg_log/postgresql-Fri.log
    LOG: fetching timeline history file for timeline 2 from primary server
    LOG: started streaming WAL from primary at 0/E000000 on timeline 1
    LOG: replication terminated by primary server
    DETAIL: End of WAL reached on timeline 1 at 0/E000098.
    LOG: new target timeline is 2
    LOG: restarted WAL streaming at 0/E000000 on timeline 2
    LOG: redo starts at 0/E000098
    -bash-4.2$ ps -ef|grep postgres
    root 4627 13226 0 10:37 pts/2 00:00:00 su - postgres
    postgres 4628 4627 0 10:37 pts/2 00:00:00 -bash
    postgres 4806 1 0 11:31 pts/3 00:00:01 /usr/bin/postgres
    postgres 4807 4806 0 11:31 ? 00:00:00 postgres: logger process
    postgres 4808 4806 0 11:31 ? 00:00:00 postgres: startup process recovering 00000002000000000000000E
    postgres 4809 4806 0 11:31 ? 00:00:00 postgres: checkpointer process
    postgres 4810 4806 0 11:31 ? 00:00:00 postgres: writer process
    postgres 4811 4806 0 11:31 ? 00:00:00 postgres: stats collector process
    postgres 4861 24928 0 11:35 pts/3 00:00:00 psql
    postgres 4864 4806 0 11:35 ? 00:00:00 postgres: postgres yhq1 [local] idle
    postgres 4940 4806 0 11:40 ? 00:00:04 postgres: wal receiver process streaming 0/E002E40
    postgres 5117 4628 0 14:31 pts/2 00:00:00 ps -ef
    postgres 5118 4628 0 14:31 pts/2 00:00:00 grep --color=auto postgres
    root 24927 30012 0 Dec13 pts/3 00:00:00 su - postgres
    postgres 24928 24927 0 Dec13 pts/3 00:00:00 -bash
    yhq1=# show synchronous_commit ;
    synchronous_commit
    --------------------
    on
    (1 row)


    yhq1=# select txid_current_snapshot(); #返回主库记录点、备库记录点;主库每增加一条写入,记录点的值就会加1
    txid_current_snapshot
    -----------------------
    2117:2117:
    (1 行记录)

    yhq1=# select txid_current_snapshot();
    txid_current_snapshot
    -----------------------
    2117:2117:
    (1 row)
    查看备库落后主库多少个字节的wal日志
    yhq1=# select pg_xlog_location_diff(pg_current_xlog_location(),replay_location) from pg_stat_replication;
    pg_xlog_location_diff
    -----------------------
    (0 rows)

  • 相关阅读:
    POJ 1659 Frogs' Neighborhood
    zoj 2913 Bus Pass(BFS)
    ZOJ 1008 Gnome Tetravex(DFS)
    POJ 1562 Oil Deposits (DFS)
    zoj 2165 Red and Black (DFs)poj 1979
    hdu 3954 Level up
    sgu 249 Matrix
    hdu 4417 Super Mario
    SPOJ (BNUOJ) LCM Sum
    hdu 2665 Kth number 划分树
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10119556.html
Copyright © 2011-2022 走看看