TR-4992:使用 NFS 在NetApp C 系列上简化、自动化 Oracle 部署
Allen Cao、Niyaz Mohamed, NetApp
该解决方案概述并详细介绍了在NetApp AFF C 系列中通过 NFS 协议自动部署 Oracle 作为主数据库存储。 Oracle 数据库部署为启用了 dNFS 的容器数据库。
目的
NetApp AFF C 系列是一种大容量闪存存储,它使全闪存对于统一存储来说更易于访问且更经济实惠。对于许多第 1 层或第 2 层 Oracle 数据库工作负载而言,其性能已经足够。 AFF C 系列系统由NetApp ONTAP数据管理软件提供支持,可提供业界领先的效率、卓越的灵活性、一流的数据服务和云集成,帮助您扩展 IT 基础架构、简化数据管理并降低存储成本和功耗。
本文档演示了使用 Ansible 自动化通过 NFS 挂载在NetApp C 系列中简化 Oracle 数据库的部署。 Oracle 数据库部署在容器数据库 (CDB) 和可插拔数据库 (PDB) 配置中,并启用 Oracle dNFS 协议以提高性能。此外,该解决方案还提供了在 C 系列存储控制器上使用 NFS 协议设置存储网络和存储虚拟机 (SVM) 的最佳实践。该解决方案还包括使用NetApp SnapCenter UI 工具快速备份、恢复和克隆 Oracle 数据库的信息。
此解决方案适用于以下用例:
-
在NetApp C 系列存储控制器上自动部署 Oracle 容器数据库。
-
使用SnapCenter UI 工具在 C 系列上进行 Oracle 数据库保护和克隆。
受众
此解决方案适用于以下人群:
-
一位 DBA 想要在NetApp C 系列上部署 Oracle。
-
一位数据库解决方案架构师想要在NetApp C 系列上测试 Oracle 工作负载。
-
一位存储管理员想要在NetApp C 系列上部署和管理 Oracle 数据库。
-
希望在NetApp C 系列上建立 Oracle 数据库的应用程序所有者。
解决方案测试和验证环境
该解决方案的测试和验证是在实验室环境中进行的,可能与最终部署环境不匹配。请参阅部署考虑的关键因素了解更多信息。
架构
硬件和软件组件
硬件 |
||
NetApp C系列 C400 |
ONTAP版本 9.13.1P3 |
两个磁盘架/24 个磁盘,容量为 278 TiB |
数据库服务器虚拟机 |
4 个 vCPU,16GiB RAM |
两个 Linux VM 实例用于并发部署 |
SnapCenter的虚拟机 |
4 个 vCPU,16GiB RAM |
一个 Windows VM 实例 |
软件 |
||
红帽Linux |
RHEL Linux 8.6(LVM)-x64 Gen2 |
部署 RedHat 订阅进行测试 |
Windows Server |
2022 年数据中心 x64 Gen2 |
托管SnapCenter服务器 |
Oracle 数据库 |
19.18 版 |
已应用RU补丁p34765931_190000_Linux-x86-64.zip |
Oracle OPatch |
版本 12.2.0.1.36 |
最新补丁 p6880880_190000_Linux-x86-64.zip |
SnapCenter 服务器 |
5.0 版 |
工作组部署 |
打开 JDK |
版本 java-11-openjdk |
数据库虚拟机上的SnapCenter插件要求 |
NFS |
3.0 版 |
已启用 Oracle dNFS |
Ansible |
核心 2.16.2 |
Python 3.6.8 |
实验室环境中的 Oracle 数据库配置
服务器 |
数据库 |
数据库存储 |
ora_01 |
NTAP1(NTAP1_PDB1、NTAP1_PDB2、NTAP1_PDB3) |
/u01、/u02、/u03 NFS 在 C400 卷上挂载 |
ora_02 |
NTAP2(NTAP2_PDB1、NTAP2_PDB2、NTAP2_PDB3) |
/u01、/u02、/u03 NFS 在 C400 卷上挂载 |
部署考虑的关键因素
-
Oracle 数据库存储布局。在此自动化 Oracle 部署中,我们默认为每个数据库配置三个数据库卷来托管 Oracle 二进制文件、数据和日志。这些卷通过 NFS 安装在 Oracle DB 服务器上,作为 /u01 - 二进制、/u02 - 数据、/u03 - 日志。在 /u02 和 /u03 挂载点上配置双控制文件以实现冗余。
-
*多个数据库服务器部署。*自动化解决方案可以在单个 Ansible 剧本运行中将 Oracle 容器数据库部署到多个 DB 服务器。无论数据库服务器的数量有多少,剧本的执行都保持不变。您可以通过使用不同的数据库实例 ID(Oracle SID)重复部署将多个容器数据库部署到单个 VM 实例。但要确保主机上有足够的内存来支持部署的数据库。
-
*dNFS 配置。*通过使用 dNFS(自 Oracle 11g 起可用),在 DB VM 上运行的 Oracle 数据库可以比本机 NFS 客户端驱动更多的 I/O。自动化 Oracle 部署默认在 NFSv3 上配置 dNFS。
-
*C400 控制器对上的负载平衡。*将 Oracle 数据库卷均匀地放置在 C400 控制器节点上,以平衡工作负载。控制器 1 上的 DB1、控制器 2 上的 DB2,依此类推。将 DB 卷安装到其本地 lif 地址。
-
数据库备份。 NetApp提供了SnapCenter software套件,用于数据库备份、恢复和克隆,并具有用户友好的 UI 界面。 NetApp建议实施这样的管理工具,以实现快速(一分钟内)快照备份、快速(几分钟内)数据库恢复和数据库克隆。
解决方案部署
以下部分提供了 Oracle 19c 自动部署的分步过程以及部署后的 Oracle 数据库保护和克隆的信息。
部署先决条件
Details
部署需要以下先决条件。
-
NetApp C 系列存储控制器对已安装、堆叠,并且已安装和配置最新版本的ONTAP操作系统。必要时请参考本设置指南: "详细指南 - AFF C400"
-
配置两个 Linux VM 作为 Oracle DB 服务器。有关环境设置的详细信息,请参阅上一节中的架构图。
-
配置 Windows 服务器以运行最新版本的NetApp SnapCenter UI 工具。详细信息请参考以下链接:"安装SnapCenter服务器"
-
将 Linux VM 配置为 Ansible 控制器节点,并安装最新版本的 Ansible 和 Git。详细信息请参考以下链接:"NetApp解决方案自动化入门"在第 -
Setup the Ansible Control Node for CLI deployments on RHEL / CentOS`或者
。
`Setup the Ansible Control Node for CLI deployments on Ubuntu / Debian在 Ansible 控制器和数据库虚拟机之间启用 ssh 公钥/私钥认证。
-
从 Ansible 控制器管理员用户主目录,克隆一份用于 NFS 的NetApp Oracle 部署自动化工具包的副本。
git clone https://bitbucket.ngage.netapp.com/scm/ns-bb/na_oracle_deploy_nfs.git
-
在 DB VM /tmp/archive 目录上以 777 权限执行以下 Oracle 19c 安装文件阶段。
installer_archives: - "LINUX.X64_193000_db_home.zip" - "p34765931_190000_Linux-x86-64.zip" - "p6880880_190000_Linux-x86-64.zip"
在 C 系列上为 Oracle 配置网络和 SVM
Details
本部署指南部分介绍了使用ONTAP系统管理器 UI 在 C 系列控制器上为具有 NFS 协议的 Oracle 工作负载设置网络和存储虚拟机 (SVM) 的最佳实践。
-
登录到ONTAP系统管理器以检查初始ONTAP集群安装后,广播域是否已配置并已正确分配给每个域的以太网端口。一般情况下,应该有一个集群的广播域,一个管理的广播域,以及一个数据等工作负载的广播域。
-
从网络 - 以太网端口,单击 `Link Aggregate Group`创建LACP链路聚合组端口a0a,为聚合组端口中的成员端口之间提供负载均衡和故障切换。 C400 控制器上有 4 个数据端口 - e0e、e0f、e0g、e0h。
-
选择组中的以太网端口, `LACP`对于模式,以及 `Port`用于负载分配。
-
验证 LACP 端口 a0a 已创建并广播域 `Data`现在正在 LACP 端口上运行。
-
从
Ethernet Ports
, 点击 `VLAN`在每个控制器节点上为 NFS 协议上的 Oracle 工作负载添加一个 VLAN。 -
通过 ssh 从集群管理 IP 登录到 C 系列控制器,以验证网络故障转移组是否配置正确。 ONTAP自动创建和管理故障转移组。
HCG-NetApp-C400-E9U9::> net int failover-groups show (network interface failover-groups show) Failover Vserver Group Targets ---------------- ---------------- -------------------------------------------- Cluster Cluster HCG-NetApp-C400-E9U9a:e0c, HCG-NetApp-C400-E9U9a:e0d, HCG-NetApp-C400-E9U9b:e0c, HCG-NetApp-C400-E9U9b:e0d HCG-NetApp-C400-E9U9 Data HCG-NetApp-C400-E9U9a:a0a, HCG-NetApp-C400-E9U9a:a0a-3277, HCG-NetApp-C400-E9U9b:a0a, HCG-NetApp-C400-E9U9b:a0a-3277 Mgmt HCG-NetApp-C400-E9U9a:e0M, HCG-NetApp-C400-E9U9b:e0M 3 entries were displayed.
-
从
STORAGE - Storage VMs
,单击“+添加”为 Oracle 创建 SVM。 -
命名您的 Oracle SVM,检查
Enable NFS`和 `Allow NFS client access
。 -
添加 NFS 导出策略 `Default`规则。
-
在
NETWORK INTERFACE
,填写每个节点上用于 NFS lif 地址的 IP 地址。 -
验证 Oracle 的 SVM 是否启动/正在运行以及 NFS lifs 状态是否处于活动状态。
-
从 `STORAGE-Volumes`选项卡为 Oracle 数据库添加 NFS 卷。
-
命名您的卷,分配容量和性能级别。
-
在
Access Permission
,选择上一步创建的默认策略。取消选中 `Enable Snapshot Copies`因为我们更喜欢使用SnapCenter来创建应用程序一致的快照。 -
为每个 DB 服务器创建三个 DB 卷:server_name_u01 - 二进制、server_name_u02 - 数据、server_name_u03 - 日志。
DB 卷命名约定应严格遵循上述格式,以确保自动化正常工作。
这样就完成了 Oracle 的 C 系列控制器配置。
自动化参数文件
Details
Ansible playbook 使用预定义参数执行数据库安装和配置任务。对于此 Oracle 自动化解决方案,有三个用户定义的参数文件需要在剧本执行之前用户输入。
-
主机 - 定义自动化剧本运行的目标。
-
vars/vars.yml - 定义适用于所有目标的变量的全局变量文件。
-
host_vars/host_name.yml - 定义仅适用于命名目标的变量的本地变量文件。在我们的用例中,这些是 Oracle DB 服务器。
除了这些用户定义的变量文件之外,还有几个默认变量文件,其中包含默认参数,除非必要,否则不需要更改。以下部分介绍如何配置用户定义的变量文件。
参数文件配置
Details
-
Ansible 目标 `hosts`文件配置:
# Enter Oracle servers names to be deployed one by one, follow by each Oracle server public IP address, and ssh private key of admin user for the server. [oracle] ora_01 ansible_host=10.61.180.21 ansible_ssh_private_key_file=ora_01.pem ora_02 ansible_host=10.61.180.23 ansible_ssh_private_key_file=ora_02.pem
-
全球的 `vars/vars.yml`文件配置
###################################################################### ###### Oracle 19c deployment user configuration variables ###### ###### Consolidate all variables from ONTAP, linux and oracle ###### ###################################################################### ########################################### ### ONTAP env specific config variables ### ########################################### # Prerequisite to create three volumes in NetApp ONTAP storage from System Manager or cloud dashboard with following naming convention: # db_hostname_u01 - Oracle binary # db_hostname_u02 - Oracle data # db_hostname_u03 - Oracle redo # It is important to strictly follow the name convention or the automation will fail. ########################################### ### Linux env specific config variables ### ########################################### redhat_sub_username: XXXXXXXX redhat_sub_password: XXXXXXXX #################################################### ### DB env specific install and config variables ### #################################################### # Database domain name db_domain: solutions.netapp.com # Set initial password for all required Oracle passwords. Change them after installation. initial_pwd_all: XXXXXXXX
-
本地数据库服务器 `host_vars/host_name.yml`配置如ora_01.yml,ora_02.yml…
# User configurable Oracle host specific parameters # Enter container database SID. By default, a container DB is created with 3 PDBs within the CDB oracle_sid: NTAP1 # Enter database shared memory size or SGA. CDB is created with SGA at 75% of memory_limit, MB. The grand total of SGA should not exceed 75% available RAM on node. memory_limit: 8192 # Local NFS lif ip address to access database volumes nfs_lif: 172.30.136.68
剧本执行
Details
自动化工具包中共有五个剧本。每个执行不同的任务块并服务于不同的目的。
0-all_playbook.yml - execute playbooks from 1-4 in one playbook run. 1-ansible_requirements.yml - set up Ansible controller with required libs and collections. 2-linux_config.yml - execute Linux kernel configuration on Oracle DB servers. 4-oracle_config.yml - install and configure Oracle on DB servers and create a container database. 5-destroy.yml - optional to undo the environment to dismantle all.
有三个选项可以使用以下命令运行剧本。
-
在一次组合运行中执行所有部署剧本。
ansible-playbook -i hosts 0-all_playbook.yml -u admin -e @vars/vars.yml
-
按照 1-4 的数字序列逐个执行剧本。
ansible-playbook -i hosts 1-ansible_requirements.yml -u admin -e @vars/vars.yml
ansible-playbook -i hosts 2-linux_config.yml -u admin -e @vars/vars.yml
ansible-playbook -i hosts 4-oracle_config.yml -u admin -e @vars/vars.yml
-
使用标签执行 0-all_playbook.yml。
ansible-playbook -i hosts 0-all_playbook.yml -u admin -e @vars/vars.yml -t ansible_requirements
ansible-playbook -i hosts 0-all_playbook.yml -u admin -e @vars/vars.yml -t linux_config
ansible-playbook -i hosts 0-all_playbook.yml -u admin -e @vars/vars.yml -t oracle_config
-
撤消环境
ansible-playbook -i hosts 5-destroy.yml -u admin -e @vars/vars.yml
执行后验证
Details
剧本运行后,登录到 Oracle DB 服务器 VM 以验证 Oracle 是否已安装和配置,以及是否已成功创建容器数据库。以下是 DB VM ora_01 或 ora_02 上的 Oracle 数据库验证的示例。
-
验证 NFS 挂载
[admin@ora_01 ~]$ cat /etc/fstab # # /etc/fstab # Created by anaconda on Wed Oct 18 19:43:31 2023 # # Accessible filesystems, by reference, are maintained under '/dev/disk/'. # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info. # # After editing this file, run 'systemctl daemon-reload' to update systemd # units generated from this file. # /dev/mapper/rhel-root / xfs defaults 0 0 UUID=aff942c4-b224-4b62-807d-6a5c22f7b623 /boot xfs defaults 0 0 /dev/mapper/rhel-swap none swap defaults 0 0 /root/swapfile swap swap defaults 0 0 172.21.21.100:/ora_01_u01 /u01 nfs rw,bg,hard,vers=3,proto=tcp,timeo=600,rsize=65536,wsize=65536 0 0 172.21.21.100:/ora_01_u02 /u02 nfs rw,bg,hard,vers=3,proto=tcp,timeo=600,rsize=65536,wsize=65536 0 0 172.21.21.100:/ora_01_u03 /u03 nfs rw,bg,hard,vers=3,proto=tcp,timeo=600,rsize=65536,wsize=65536 0 0 [admin@ora_01 tmp]$ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 7.7G 0 7.7G 0% /dev tmpfs 7.8G 0 7.8G 0% /dev/shm tmpfs 7.8G 18M 7.8G 1% /run tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup /dev/mapper/rhel-root 44G 28G 17G 62% / /dev/sda1 1014M 258M 757M 26% /boot tmpfs 1.6G 12K 1.6G 1% /run/user/42 tmpfs 1.6G 4.0K 1.6G 1% /run/user/1000 172.21.21.100:/ora_01_u01 50G 8.7G 42G 18% /u01 172.21.21.100:/ora_01_u02 200G 384K 200G 1% /u02 172.21.21.100:/ora_01_u03 100G 320K 100G 1% /u03 [admin@ora_02 ~]$ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 7.7G 0 7.7G 0% /dev tmpfs 7.8G 0 7.8G 0% /dev/shm tmpfs 7.8G 18M 7.8G 1% /run tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup /dev/mapper/rhel-root 44G 28G 17G 63% / /dev/sda1 1014M 258M 757M 26% /boot tmpfs 1.6G 12K 1.6G 1% /run/user/42 tmpfs 1.6G 4.0K 1.6G 1% /run/user/1000 172.21.21.101:/ora_02_u01 50G 7.8G 43G 16% /u01 172.21.21.101:/ora_02_u02 200G 320K 200G 1% /u02 172.21.21.101:/ora_02_u03 100G 320K 100G 1% /u03
-
验证 Oracle 侦听器
[admin@ora_02 ~]$ sudo su [root@ora_02 admin]# su - oracle [oracle@ora_02 ~]$ lsnrctl status listener.ntap2 LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 29-MAY-2024 12:13:30 Copyright (c) 1991, 2022, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora_02.cie.netapp.com)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER.NTAP2 Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 23-MAY-2024 16:13:03 Uptime 5 days 20 hr. 0 min. 26 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.0.0/NTAP2/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/ora_02/listener.ntap2/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=ora_02.cie.netapp.com)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=ora_02.cie.netapp.com)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/product/19.0.0/NTAP2/admin/NTAP2/xdb_wallet))(Presentation=HTTP)(Session=RAW)) Services Summary... Service "192551f1d7e65fc3e06308b43d0a63ae.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... Service "1925529a43396002e06308b43d0a2d5a.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... Service "1925530776b76049e06308b43d0a49c3.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... Service "NTAP2.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... Service "NTAP2XDB.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... Service "ntap2_pdb1.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... Service "ntap2_pdb2.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... Service "ntap2_pdb3.solutions.netapp.com" has 1 instance(s). Instance "NTAP2", status READY, has 1 handler(s) for this service... The command completed successfully [oracle@ora_02 ~]$
-
验证 Oracle 数据库和 dNFS
[oracle@ora-01 ~]$ cat /etc/oratab # # This file is used by ORACLE utilities. It is created by root.sh # and updated by either Database Configuration Assistant while creating # a database or ASM Configuration Assistant while creating ASM instance. # A colon, ':', is used as the field terminator. A new line terminates # the entry. Lines beginning with a pound sign, '#', are comments. # # Entries are of the form: # $ORACLE_SID:$ORACLE_HOME:<N|Y>: # # The first and second fields are the system identifier and home # directory of the database respectively. The third field indicates # to the dbstart utility that the database should , "Y", or should not, # "N", be brought up at system boot time. # # Multiple entries with the same $ORACLE_SID are not allowed. # # NTAP1:/u01/app/oracle/product/19.0.0/NTAP1:Y [oracle@ora-01 ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Feb 1 16:37:51 2024 Version 19.18.0.0.0 Copyright (c) 1982, 2022, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.18.0.0.0 SQL> select name, open_mode, log_mode from v$database; NAME OPEN_MODE LOG_MODE --------- -------------------- ------------ NTAP1 READ WRITE ARCHIVELOG SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 NTAP1_PDB1 READ WRITE NO 4 NTAP1_PDB2 READ WRITE NO 5 NTAP1_PDB3 READ WRITE NO SQL> select name from v$datafile; NAME -------------------------------------------------------------------------------- /u02/oradata/NTAP1/system01.dbf /u02/oradata/NTAP1/sysaux01.dbf /u02/oradata/NTAP1/undotbs01.dbf /u02/oradata/NTAP1/pdbseed/system01.dbf /u02/oradata/NTAP1/pdbseed/sysaux01.dbf /u02/oradata/NTAP1/users01.dbf /u02/oradata/NTAP1/pdbseed/undotbs01.dbf /u02/oradata/NTAP1/NTAP1_pdb1/system01.dbf /u02/oradata/NTAP1/NTAP1_pdb1/sysaux01.dbf /u02/oradata/NTAP1/NTAP1_pdb1/undotbs01.dbf /u02/oradata/NTAP1/NTAP1_pdb1/users01.dbf NAME -------------------------------------------------------------------------------- /u02/oradata/NTAP1/NTAP1_pdb2/system01.dbf /u02/oradata/NTAP1/NTAP1_pdb2/sysaux01.dbf /u02/oradata/NTAP1/NTAP1_pdb2/undotbs01.dbf /u02/oradata/NTAP1/NTAP1_pdb2/users01.dbf /u02/oradata/NTAP1/NTAP1_pdb3/system01.dbf /u02/oradata/NTAP1/NTAP1_pdb3/sysaux01.dbf /u02/oradata/NTAP1/NTAP1_pdb3/undotbs01.dbf /u02/oradata/NTAP1/NTAP1_pdb3/users01.dbf 19 rows selected. SQL> select name from v$controlfile; NAME -------------------------------------------------------------------------------- /u02/oradata/NTAP1/control01.ctl /u03/orareco/NTAP1/control02.ctl SQL> select member from v$logfile; MEMBER -------------------------------------------------------------------------------- /u03/orareco/NTAP1/onlinelog/redo03.log /u03/orareco/NTAP1/onlinelog/redo02.log /u03/orareco/NTAP1/onlinelog/redo01.log SQL> select svrname, dirname from v$dnfs_servers; SVRNAME -------------------------------------------------------------------------------- DIRNAME -------------------------------------------------------------------------------- 172.21.21.100 /ora_01_u02 172.21.21.100 /ora_01_u03 172.21.21.100 /ora_01_u01
-
登录 Oracle Enterprise Manager Express 来验证数据库。
使用SnapCenter进行 Oracle 备份、恢复和克隆
Details
NetApp建议使用SnapCenter UI 工具来管理部署在 C 系列中的 Oracle 数据库。参考 TR-4979"VMware Cloud on AWS 中简化的自主管理 Oracle,带有客户机安装的 FSx ONTAP"部分 `Oracle backup, restore, and clone with SnapCenter`有关设置SnapCenter和执行数据库备份、恢复和克隆工作流的详细信息。
在哪里可以找到更多信息
要了解有关本文档中描述的信息的更多信息,请查看以下文档和/或网站: