PostgreSQL+Pgpool实现HA读写分离
环境说明和主机规划:操作系统主机名 主机角色端口CentOS7.3 master 10.0.40.191 PG-Master54321CentOS7.3 slave 10.0.40.192 PG-Slave54321CentOS7.3 pool 10.0.40.193 pgpool 54321基础环境配置(所有主机操作)配置HOSTSecho-e"10.0.40.191master\n10.0.40.192slave\n10.0.40.193pool">>/etc/hosts#执行一次即可[root@pgpool-tdb01~]#echo-e"10.0.40.191master\n10.0.40.192slave\n10.0.40.193pool">>/etc/hosts[root@pgpool-tdb01~]#cat/etc/hosts127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostlocalhost.localdomainlocalhost6localhost6.localdomain610.0.40.191master10.0.40.192slave10.0.40.193pool配置统一的时间(若已配置,请忽略)也可以配置本地自己的ntp服务器。yuminstall-yntpdate&&ntpdatentp1.aliyun.comecho-e"#synctimefromntp1.aliyun.com\n5****/usr/sbin/ntpdatentp1.aliyun.com>/dev/null2>&1">>/var/spool/cron/root#写入定时任务,执行一次即可[root@pgpool-tdb01~]#yuminstall-yntpdate&&ntpdatentp1.aliyun.comLoadedplugins:fastestmirror,langpacks......DependencyUpdated:openssl.x86_641:1.0.2k-16.el7openssl-libs.x86_641:1.0.2k-16.el7Complete!17Feb17:15:16ntpdate[32460]:steptimeserver120.25.115.20offset1.439184sec[root@pgpool-tdb01~]#echo-e"#synctimefromntp1.aliyun.com\n5****/usr/sbin/ntpdatentp1.aliyun.com>/dev/null2>&1">>/var/spool/cron/root[root@pgpool-tdb01~]#cd/var/spool/cron[root@pgpool-tdb01cron]#lltotal4-rw-r--r--.1rootroot94Feb1717:29root[root@pgpool-tdb01cron]#catroot#synctimefromntp1.aliyun.com5****/usr/sbin/ntpdatentp1.aliyun.com>/dev/null2>&1[root@pgpool-tdb01cron]#crontab-l#synctimefromntp1.aliyun.com5****/usr/sbin/ntpdatentp1.aliyun.com>/dev/null2>&1创建postgres用户:useraddpostgres&&echo"your_password"|passwd--stdinpostgresuseraddpostgres&&echo"XXXX"|passwd--stdinpostgres[root@pgpool-tdb02~]#useraddpostgres&&echo"XXXX"|passwd--stdinpostgresChangingpasswordforuserpostgres.passwd:allauthenticationtokensupdatedsuccessfully.配置免密钥登陆:su-postgresssh-keygen-trsa-f/home/postgres/.ssh/id_rsa-P""cd~/.ssh/ssh-copy-idpostgres@master#三台主机执行scpauthorized_keyspostgres@slave:~/.ssh#只在master主机执行scpauthorized_keyspostgres@pool:~/.ssh#只在master主机执行[root@pgpool-tdb01~]#su-postgres[postgres@pgpool-tdb01~]$ssh-keygen-trsa-f/home/postgres/.ssh/id_rsa-P""Generatingpublic/privatersakeypair.Createddirectory'/home/postgres/.ssh'.Youridentificationhasbeensavedin/home/postgres/.ssh/id_rsa.Yourpublickeyhasbeensavedin/home/postgres/.ssh/id_rsa.pub.Thekeyfingerprintis:d7:39:7d:00:55:47:0f:4f:bf:ae:85:31:9c:f6:e8:9fpostgres@pgpool-tdb01Thekey'srandomartimageis:+--[RSA2048]----+|..oo=||.++||.+||..o...||S.+*...||...B.||o+||.o.||o.E|+-----------------+[postgres@pgpool-tdb01~]$cd~/.ssh/[postgres@pgpool-tdb01.ssh]$ssh-copy-idpostgres@masterTheauthenticityofhost'master(10.0.40.191)'can'tbeestablished.ECDSAkeyfingerprintis1a:f7:cc:f3:f8:4e:af:40:cf:fe:26:f6:12:7e:5f:46.Areyousureyouwanttocontinueconnecting(yes/no)?yPleasetype'yes'or'no':yes/bin/ssh-copy-id:INFO:attemptingtologinwiththenewkey(s),tofilteroutanythatarealreadyinstalled/bin/ssh-copy-id:INFO:1key(s)remaintobeinstalled--ifyouarepromptednowitistoinstallthenewkeyspostgres@master'spassword:Numberofkey(s)added:1Nowtryloggingintothemachine,with:"ssh'postgres@master'"andchecktomakesurethatonlythekey(s)youwantedwereadded.[postgres@pgpool-tdb01.ssh]$scpauthorized_keyspostgres@slave:~/.sshTheauthenticityofhost'slave(10.0.40.192)'can'tbeestablished.ECDSAkeyfingerprintis37:ec:17:87:c6:8e:ee:6a:ba:47:a5:22:38:65:6b:21.Areyousureyouwanttocontinueconnecting(yes/no)?yesWarning:Permanentlyadded'slave,10.0.40.192'(ECDSA)tothelistofknownhosts.postgres@slave'spassword:authorized_keys100%12071.2KB/s00:00[postgres@pgpool-tdb01.ssh]$scpauthorized_keyspostgres@pool:~/.sshTheauthenticityofhost'pool(10.0.40.193)'can'tbeestablished.ECDSAkeyfingerprintis95:2e:fd:0c:2f:4e:54:4d:1f:5e:eb:b3:95:61:aa:5d.Areyousureyouwanttocontinueconnecting(yes/no)?yesWarning:Permanentlyadded'pool,10.0.40.193'(ECDSA)tothelistofknownhosts.postgres@pool'spassword:authorized_keys安装Postgresql数据库(PG10.7)yum安装:[root@pgpool-tdb01~]#yuminstallhttps://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm-y[root@pgpool-tdb01~]#yuminstallpostgresql10-contribpostgresql10-serverpostgresql10postgresql10-libs-y创建统一的目录结构:[root@pgpool-tdb01~]#mkdir/data1/pg_{data,bin,logs}-p[root@pgpool-tdb01~]#ll/data1/total0drwxr-xr-x.2rootroot6Feb1719:00pg_bindrwxr-xr-x.2rootroot6Feb1719:00pg_datadrwxr-xr-x.2rootroot6Feb1719:00pg_logs[root@pgpool-tdb01~]#chown-Rpostgres.postgres/data1/修改系统变量:vi/etc/profile#增加以下内容exportPGHOME=/usr/pgsql-10/exportPGDATA=/data1/pg_dataexportPGPORT=54321exportPATH=$PATH:$PGHOME/bin#生效source/etc/profilePostgreSQL流复制结构(master和slave主机操作)master主机操作初始化系统[root@pgpool-tdb01~]#/usr/pgsql-10/bin/postgresql-10-setupinitdbInitializingdatabase...OK删除pg_data后重新初始化:[postgres@wmsexpress-db01~]$pg_ctl-D/data1/pg_data/initdb修改postgresql-10.servicevi/usr/lib/systemd/system/postgresql-10.service#Includethedefaultconfig:#.include/usr/lib/systemd/system/postgresql-10.service[Service]Environment=PGDATA=/data1/pg_data重启PG服务:systemctldaemon-reloadsu-postgres-c'/usr/pgsql-10/bin/initdb-D/data1/pg_data'systemctlrestartpostgresql-10systemctlenablepostgresql-10.servicesystemctlstatuspostgresql-10/usr/pgsql-10/bin/pg_ctl-D/data1/pg_data-llogfilestart每次改postgresql.conf,需要执行下面的stop命令,再重启pg服务。/usr/pgsql-10/bin/pg_ctl-D/data1/pg_data-llogfilestop修改系统配置(以下用postgres用户操作):也可以用root账号操作,注意目录权限。[root@pgpool-tdb01pg_data]#cp/data1/pg_data/pg_hba.conf{,.bak}[root@pgpool-tdb01pg_data]#cat>/data1/pg_data/pg_hba.conf<<EOF>localallalltrust>hostallall10.0.40.191/32trust>hostallall10.0.40.192/32trust>hostallall0.0.0.0/0md5>hostallall::1/128trust>hostreplicationstream_replication0.0.0.0/0md5>EOFcp/data1/pg_data/postgresql.conf{,.bak}cat>/data1/pg_data/postgresql.conf<<EOFlisten_addresses='*'port=54321max_connections=3000shared_buffers=1GBeffective_cache_size=2GBwork_mem=64MBmaintenance_work_mem=128MBmin_wal_size=128MBmax_wal_size=256MBcheckpoint_completion_target=0.9wal_buffers=16MBdefault_statistics_target=100wal_level=hot_standbywal_log_hints=onmax_wal_senders=10hot_standby=onlogging_collector=onlog_directory='pg_log'log_timezone='PRC'timezone='PRC'EOF#操作完记得重启pg_ctlrestart[root@pgpool-tdb01~]#cat>/data1/pg_data/postgresql.conf<<EOF>listen_addresses='*'>port=54321>max_connections=200>shared_buffers=512MB>effective_cache_size=2GB>work_mem=64MB>maintenance_work_mem=256MB>min_wal_size=256MB>max_wal_size=512MB>checkpoint_completion_target=0.9>wal_buffers=16MB>default_statistics_target=100>wal_level=hot_standby>wal_log_hints=on>max_wal_senders=1>hot_standby=on>logging_collector=on>log_directory='pg_log'>EOF[root@pgpool-tdb01~]#su-postgresLastlogin:SunFeb1720:02:31CST2019onpts/0[postgres@pgpool-tdb01~]$pg_ctlrestartwaitingforservertoshutdown....doneserverstoppedwaitingforservertostart....2019-02-1712:25:10.486GMT[3174]LOG:listeningonIPv4address"0.0.0.0",port543212019-02-1712:25:10.486GMT[3174]LOG:listeningonIPv6address"::",port543212019-02-1712:25:10.489GMT[3174]LOG:listeningonUnixsocket"/var/run/postgresql/.s.PGSQL.54321"2019-02-1712:25:10.492GMT[3174]LOG:listeningonUnixsocket"/tmp/.s.PGSQL.54321"2019-02-1712:25:10.520GMT[3174]LOG:redirectinglogoutputtologgingcollectorprocess2019-02-1712:25:10.520GMT[3174]HINT:Futurelogoutputwillappearindirectory"pg_log".doneserverstarted在主库中创建流复制用户(stream_replication)和PGPool用户(srcheck):[postgres@pgpool-tdb01~]$psqlpsql(10.7)Type"help"forhelp.postgres=#psqlpostgres-#\q[postgres@pgpool-tdb01~]$psqlpsql(10.7)Type"help"forhelp.postgres=#CREATEUSERstream_replicationreplicationLOGINCONNECTIONLIMIT5ENCRYPTEDPASSWORD'XXXX';CREATEROLEpostgres=#CREATEUSERsrcheckreplicationLOGINCONNECTIONLIMIT5ENCRYPTEDPASSWORD'XXXX';CREATEROLE修改主库pg_hba.conf文件(已操作见cat>/data1/pg_data/pg_hba.conf<<EOF):hostreplicationstream_replication0.0.0.0/0md5slave主机操作初始化系统[root@pgpool-tdb02~]#/usr/pgsql-10/bin/postgresql-10-setupinitdbInitializingdatabase...OK修改postgresql-10.service[root@pgpool-tdb02~]#vi/usr/lib/systemd/system/postgresql-10.service内容如下:#Includethedefaultconfig:#.include/usr/lib/systemd/system/postgresql-10.service[Service]Environment=PGDATA=/data1/pg_data重启PG服务systemctldaemon-reload基础备份复制到备库服务器rm-rf/data1/pg_data#如果没有重要数据可操作,主要为同步主库路径[root@pgpool-tdb02~]#su-postgres-c'pg_basebackup-D$PGDATA--format=p-hmaster-p54321-Ustream_replication-W'关闭所有主机防火墙:(也可以在防火墙上设置端口限制)如果你的系统上没有安装,使用命令安装安装firewalld防火墙yum install firewalld开启服务关闭防火墙systemctl stop firewalld.service开机自动启动systemctl enable firewalld.service关闭开机制动启动systemctl disable firewalld.service赋权:[root@pgpool-tdb01pg_data]#chownpostgres.postgrespg_hba.conf.bak[root@pgpool-tdb01pg_data]#chownpostgres.postgrespostgresql.conf.bakerror:pg_basebackup:couldnotconnecttoserver:couldnotconnecttoserver:NoroutetohostIstheserverrunningonhost"master"(10.0.40.191)andacceptingTCP/IPconnectionsonport54321?pg_basebackup:couldnotconnecttoserver:FATAL:numberofrequestedstandbyconnectionsexceedsmax_wal_senders(currently1)pg_basebackup:couldnotgetwrite-aheadlogendpositionfromserver:ERROR:couldnotopenfile"./pg_hba.conf.bak":Permissiondenied以上报错需要关闭防火墙或在防火墙上设置端口限制。[root@pgpool-tdb02~]#su-postgres-c'pg_basebackup-D$PGDATA--format=p-hmaster-p54321-Ustream_replication-W'Password:[root@pgpool-tdb02~]#ll/data1/total4drwxr-xr-x.2postgrespostgres6Feb1719:03pg_bindrwx------.21postgrespostgres4096Feb1721:18pg_datadrwxr-xr-x.2postgrespostgres6Feb1719:03pg_logs修改备库配置信息:cp$PGHOME/share/recovery.conf.sample$PGDATA/recovery.confvi$PGDATA/recovery.conf[postgres@pgpool-tdb02~]$vi$PGDATA/recovery.conf增加以下内容standby_mode='on'primary_conninfo='host=masterport=54321user=stream_replicationpassword=1qaz.com'restore_command=''recovery_target_timeline='latest'重启PG服务:systemctlrestartpostgresql-10systemctlenablepostgresql-10.service验证主节点执行createtabletest(idint4,create_timetimestamp(0)withouttimezone);insertintotestvalues(3,now());select*fromtest;备节点执行select*fromtest;其他查询进入测试数据库test,主库上执行如下命令返回f,备库上返回t。selectpg_is_in_recovery();执行如下命令查看快照,它返回主库记录点、备库记录点;主库每增加一条写入,记录点的值就会加1。selecttxid_current_snapshot();执行如下命令可以查看主备同步状态。select*frompg_stat_replication;字段state显示的同步状态有:startup(连接中)、catchup(同步中)、streaming(同步);字段sync_state显示的模式有:async(异步)、sync(同步)、potential(虽然现在是异步模式,但是有可能升级到同步模式)。主:postgres=#selectpg_is_in_recovery();pg_is_in_recovery-------------------f(1row)备:postgres=#selectpg_is_in_recovery();pg_is_in_recovery-------------------t(1row)主备切换假设主库崩溃了,备库如何从只读状态切换为读写状态呢?只要把备库的postgresql.conf中hot_standby修改为off,并且删除recovery.conf,然后重启库就可以提供服务了。PGPool2(pool主机操作)安装PGPool2yuminstall-yhttp://www.pgpool.net/yum/rpms/3.6/redhat/rhel-7-x86_64/pgpool-II-release-3.6-1.noarch.rpmyum-yinstallpgpool-II-pg96pgpool-II-pg96-debuginfopgpool-II-pg96-develpgpool-II-pg96-extensionssystemctlenablepgpool.service#开启自动启动下面的可以都安装:yuminstall-yhttp://www.pgpool.net/yum/rpms/3.6/redhat/rhel-7-x86_64/pgpool-II-pg10-3.6.14-1pgdg.rhel7.x86_64.rpmyuminstall-yhttp://www.pgpool.net/yum/rpms/3.6/redhat/rhel-7-x86_64/pgpool-II-pg10-debuginfo-3.6.14-1pgdg.rhel7.x86_64.rpmyuminstall-yhttp://www.pgpool.net/yum/rpms/3.6/redhat/rhel-7-x86_64/pgpool-II-pg10-devel-3.6.14-1pgdg.rhel7.x86_64.rpmyuminstall-yhttp://www.pgpool.net/yum/rpms/3.6/redhat/rhel-7-x86_64/pgpool-II-pg10-extensions-3.6.14-1pgdg.rhel7.x86_64.rpmyuminstall-yhttp://www.pgpool.net/yum/rpms/3.6/redhat/rhel-7-x86_64/pgpool-II-release-3.6-1.noarch.rpmyum-yinstallpgpool-II-pg10pgpool-II-pg10-debuginfopgpool-II-pg10-develpgpool-II-pg10-extensionssystemctlenablepgpool.service#开启自动启动添加Pgpool-II运行用户useraddpostgres#环境准备时已操作chown-Rpostgres.postgres/etc/pgpool-IIchown-Rpostgres.postgres/var/run/pgpool/配置pool_hba.confcp/etc/pgpool-II/pool_hba.conf{,.bak}vi/etc/pgpool-II/pool_hba.conf增加内容hostallall0.0.0.0/0md5配置pcp.conf主节点登陆后执行:postgres=#selectrolname,rolpasswordfrompg_authid;rolname|rolpassword--------------------+-------------------------------------pg_signal_backend|srcheck|md5662c10f61b27a9ab38ce69157186b25fpostgres|md5d3612d57ee8d4c147cf27b11e3a0974dstream_replication|md59279ef6b904bc483e4f85e6d44cfc0ed(4rows)[root@pgpool-tdb01~]#su-postgresLastlogin:MonFeb1800:05:49CST2019onpts/0[postgres@pgpool-tdb01~]$psqlpsql(10.7)Type"help"forhelp.主节点上执行:要postgres用户有MD5值,给postgres用户加密码。alteruserpostgreswithpassword'123';postgres=#createuserdevuserwithpassword'XXXX';CREATEROLEpostgres=#createdatabasewmsexpressdb;CREATEDATABASEpostgres=#GRANTALLPRIVILEGESONDATABASEwmsexpressdbtodevuser;GRANTpostgres=#selectrolname,rolpasswordfrompg_authid;rolname|rolpassword----------------------+-------------------------------------pg_monitor|pg_read_all_settings|pg_read_all_stats|pg_stat_scan_tables|pg_signal_backend|stream_replication|md5b90626724a074c98507b58e9937298cbsrcheck|md544f2f6847b7c760bfb8331b345d2591fpostgres|md5289451de0ccee765f70bb6146e4d6c20devuser|md5e75b559c51552b755247ecae024a6f24(9rows)加入MD5认证:[root@wmsexpress-pgpool01pgpool-II]#vipool_passwdstream_replication:md5b90626724a074c98507b58e9937298cbsrcheck:md544f2f6847b7c760bfb8331b345d2591fpostgres:md5289451de0ccee765f70bb6146e4d6c20devuser:md5e75b559c51552b755247ecae024a6f24重启pgpool让设置生效:[root@wmsexpress-pgpool01pgpool-II]#psql-p54321-h10.0.4.37-Udevuser-dpostgrespsql:FATAL:md5authenticationfailedDETAIL:pool_passwdfiledoesnotcontainanentryfor"devuser"[root@wmsexpress-pgpool01pgpool-II]#pgpoolstop2019-03-0411:56:08:pid16620:LOG:stoprequestsenttopgpool.waitingfortermination....done.[root@wmsexpress-pgpool01pgpool-II]#pgpool-C-D[root@wmsexpress-pgpool01pgpool-II]#psql-p54321-h10.0.4.37-Udevuser-dpostgresPasswordforuserdevuser:psql(10.7)Type"help"forhelp.postgres=>postgres=#selectrolname,rolpasswordfrompg_authid;rolname|rolpassword----------------------+-------------------------------------pg_monitor|pg_read_all_settings|pg_read_all_stats|pg_stat_scan_tables|pg_signal_backend|stream_replication|md5cbdf308c01aeea690cefb040a85dd4eesrcheck|md5ed70f2fcca0c9060ac658734adbae8bbpostgres|md510220e27448e3d1bf2531c9d99ad7b9e(8rows)[root@pgpool-t01pgpool-II]#vi/etc/pgpool-II/pool_passwd增加SQL执行结果的内容,形式为$rolname:$rolpassword例如:srcheck:md5662c10f61b27a9ab38ce69157186b25f#建议用这个方式1或者:pg_md5-upostgresyour_passwordvi/etc/pgpool-II/pcp.conf##加入postgres:上一命令的输出增加devuser,并设置superuser权限,加入MD5认证。配置pgpool.confcp/etc/pgpool-II/pgpool.conf{,.bak}vi/etc/pgpool-II/pgpool.conf#CONNECTIONSlisten_addresses='*'port=54321socket_dir='/var/run/pgpool'pcp_listen_addresses='*'pcp_port=9898pcp_socket_dir='/var/run/pgpool'#-BackendConnectionSettings-backend_hostname0='master'backend_port0=54321backend_weight0=1backend_data_directory0='/data1/pg_data'backend_flag0='ALLOW_TO_FAILOVER'backend_hostname1='slave'backend_port1=54321backend_weight1=1backend_data_directory1='/data1/pg_data'backend_flag1='ALLOW_TO_FAILOVER'#-Authentication-enable_pool_hba=onpool_passwd='pool_passwd'#FILELOCATIONSpid_file_name='/var/run/pgpool/pgpool.pid'logdir='/data1/pg_logs'replication_mode=offload_balance_mode=onmaster_slave_mode=onmaster_slave_sub_mode='stream'sr_check_period=5sr_check_user='srcheck'sr_check_password='XXXX'sr_check_database='postgres'#HEALTHCHECK健康检查health_check_period=10health_check_timeout=20health_check_user='srcheck'health_check_password='XXXX'health_check_database='postgres'#FAILOVERANDFAILBACKfailover_command='/data1/pg_bin/failover_stream.sh%H'failover_stream.sh脚本vim/data1/pg_bin/failover_stream.sh[root@pgpool-t01pg_bin]#chownpostgres.postgresfailover_stream.shchmod777/data1/pg_bin/failover_stream.shchmodu+s/sbin/ifconfigchmodu+s/usr/sbinpgpool-n-d-D>/data1/pg_logs/pgpool.log2>&1&##启动pgpool-mfaststop##关闭[root@pgpool-t01~]#pgpool-n-d-D>/data1/pg_logs/pgpool.log2>&1&[1]3404[root@pgpool-t01~]#pgpool-mfaststop2019-02-1800:49:29:pid3439:LOG:stoprequestsenttopgpool.waitingfortermination....done.[1]+Donepgpool-n-d-D>/data1/pg_logs/pgpool.log2>&1failover_stream.sh内容:#!/bin/sh#Failovercommandforstreamingreplication.#Arguments:$1:newmasterhostname.new_master=$1trigger_command="$PGHOME/bin/pg_ctlpromote-D$PGDATA"#Promptestandbydatabase./usr/bin/ssh-T$new_master$trigger_commandexit0;登陆设置当执行 pgpool-n-d-D>/data1/pg_logs/pgpool.log2>&1& 后可查看集群状态:[root@pgpool-t01~]#psql-p54321-h10.0.40.193-Usrcheck-dpostgresPasswordforusersrcheck:psql(10.7)Type"help"forhelp.postgres=>showpool_nodes;node_id|hostname|port|status|lb_weight|role|select_cnt|load_balance_node|replication_delay---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------0|master|54321|up|0.500000|primary|0|true|01|slave|54321|up|0.500000|standby|0|false|0(2rows)如果未发现集群状态,请在master和slave主机分别执行以下操作:[postgres@pool~]$pcp_attach_node-d-Upostgres-hpool-p9898-n0[postgres@pool~]$pcp_attach_node-d-Upostgres-hpool-p9898-n1#详情查询命令pcp_attach_node查看pgpool的服务状态:[root@pgpool-t01pgpool-II]#systemctlstatuspgpool.service[root@pgpool-t01pgpool-II]#systemctlstatuspgpool[root@pgpool-t01pgpool-II]#systemctlstartpgpool.service[root@pgpool-t01pgpool-II]#systemctlstartpgpool[root@pgpool-t01pgpool-II]#systemctlstoppgpool.service测试SQL:insertintotestvalues(20,now());select*fromtest;psql-p54321-h10.0.40.193-Usrcheck-dpostgressystemctldaemon-reloadsu-postgres-c'/usr/pgsql-10/bin/initdb-D/data1/pg_data'systemctlrestartpostgresql-10systemctlenablepostgresql-10.servicesystemctlstatuspostgresql-10所有应用连接到PGPOOL节点,写入会话会自动分配到PG主节点,只读会话会以会话级平均分配到PG主从两个节点上。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。