本文档使用了三个虚拟机,对应部署模式如下图(NFS服务和NGINX在同一台虚拟机):
防火墙、开端口等按需开放。
开放端口命令示例:
firewall-cmd --zone=public --add-port=6379/tcp --permanent firewall-cmd --reload firewall-cmd --zone=public --query-port=6379/tcp
mkdir -p /usr/java
用 xftp 将 jdk-8u202-linux-x64.tar.gz 上传至 /root 目录
tar -zxvf jdk-8u202-linux-x64.tar.gz mv -f jdk1.8.0_202 /usr/java
vim /etc/profile
修改/etc/profile文件,添加JAVA_HOME、PATH、CLASSPATH三个变量,并用export输出三个变量。
按i键进入编辑模式,在文件末尾添加:
JAVA_HOME=/usr/java/jdk1.8.0_202 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH
编辑完成后按Esc键,输入“:wq”存盘退出
使 profile 文件立即生效
source /etc/profile
java -version javac -version
yum -y install make gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel libtool
mkdir -p /app cd /app wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
解压完成后,将文件夹重命名为nginx
mv nginx-1.20.2 nginx
cd nginx ./configure --prefix=/app/nginx --with-http_stub_status_module --with-http_ssl_module
make && make install
/usr/sbin/groupadd nginx /usr/sbin/useradd -g nginx nginx
此处需要注意:
nginx用户需要有nginx目录下的读写权限,建议执行以下下语句:
# 路径根据安装路径填写 chown -R nginx:nginx /app/nginx ls -l /app/nginx
此部署方案使用两个节点的 ESB 集群。 也就是说,两个 ESB 节点被配置为高可用性和可伸缩性服务请求。 如下图所示,集群中的产品节点前面有一个外部第三方负载均衡器,该负载均衡器以循环方式将请求路由到两个节点。 注意,两个 ESB 节点被配置为众所周知的成员。 始终建议将集群的所有节点都设为知名成员。 在使用 Hazelcast 为集群配置 WSO2 产品时,需要在配置中使用特定的 IP 地址,而不是 localhost。 在上图中,第一个 ESB 节点的 IP 为 192.168.100.115,第二个 ESB 节点的 IP 为 192.168.100.105。 如果想在使用同一服务器的开发环境中测试集群,需要对 ESB 节点之一进行端口偏移。请按照以下步骤操作:
在
/conf/carbon.xml 文件中指定端口偏移值。不建议将其用于生产环境。 如果要为特定节点设置端口偏移,请根据偏移值更改配置中使用的所有端口。
<Ports> ... <Offset>5</Offset> ... </Ports>
负载均衡器自动在多个 WSO2 产品实例之间分配传入流量。 它能够在集群中实现更高级别的容错,并提供分配流量所需的负载平衡。
配置负载均衡器时请注意以下问题:
如果集群设置没有负载均衡器,则不需要这些配置。
上面显示的部署模式的负载均衡器端口是 HTTP 8280 和 HTTPS 8243。如果系统使用其他端口,请确保在执行本节中的配置步骤时将 8280 和 8243 值替换为相应的端口。
负载均衡器以循环方式将请求定向到服务器。 例如,负载均衡器会将请求定向到 ESB 集群的节点 1 (192.168.100.115),如下所示:
HTTP 请求将通过 HTTP 8280 端口使用 http://192.168.100.129:8280/ URL 定向到节点 1。
HTTPS 请求将通过 HTTPS 8243 端口使用 https://192.168.100.129:8243/ URL 定向到节点 1。
节点 1 的管理控制台将通过 HTTPS 9443 端口使用 https://192.168.100.129:9443/carbon/ URL 访问。
推荐使用 NGINX Plus 作为负载均衡器的选择。
按照以下步骤将 NGINX 社区版本 1.20.2 配置为负载均衡器。
在 nginx/conf 目录下创建一个名为 ei.http.conf 的 VHos t文件,添加如下配置。这将 NGINX 配置为通过 HTTP 8280 端口使用 http://192.168.100.129:8280/ URL 将 HTTP 请求定向到两个 ESB 节点(192.168.100.115 和 192.168.100.105)。
vim /app/nginx/conf/ei.http.conf
upstream worker_ng { server 192.168.100.115:8280 weight=10; server 192.168.100.105:8280 weight=10; } server { listen 8280; server_name 192.168.100.129; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_read_timeout 5m; proxy_send_timeout 5m; proxy_pass http://worker_ng; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
在 nginx/conf 目录中创建一个 VHost 文件(ei.https.conf), 将 NGINX 配置为通过 HTTPS 8243 端口使用 https://192.168.100.129:8243/ URL 将 HTTPS 请求定向到两个 ESB 节点(192.168.100.115 和 192.168.100.105)。
vim /app/nginx/conf/ei.https.conf
upstream ssl_worker_ng { server 192.168.100.115:8243 weight=10; server 192.168.100.105:8243 weight=10; ip_hash; } server { listen 8243 ssl; server_name 192.168.100.129; # 自签证书 ssl_certificate /app/nginx/ssl/server.crt; ssl_certificate_key /app/nginx/ssl/server.key; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_read_timeout 5m; proxy_send_timeout 5m; proxy_pass https://ssl_worker_ng; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
配置 NGINX 以通过 HTTPS 9443 端口以 https://192.168.100.129:9443/carbon 访问管理控制台。 为此,请在 nginx/conf 目录创建一个 VHost 文件 ( ui.ei.https.conf ),并将以下配置添加到其中。
Nginx 社区版和 NGINX Plus
vim /app/nginx/conf/ui.ei.https.conf
upstream ssl_mgt_ng { server 192.168.100.115:9443 weight=10; server 192.168.100.105:9443 weight=10; ip_hash; } server { listen 9443 ssl; server_name 192.168.100.129; ssl_certificate /app/nginx/ssl/server.crt; ssl_certificate_key /app/nginx/ssl/server.key; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_read_timeout 5m; proxy_send_timeout 5m; proxy_pass https://ssl_mgt_ng; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } error_log logs/error.log ; access_log logs/access.log; }
在 nginx 目录中创建一个名为 ssl 的目录。
按照以下说明为两个 ESB 节点创建 SSL 证书。
创建密钥时输入 ei.wso2.com 作为通用名称(非公网域名需要添加hosts映射,否则使用 IP )。
签发本地ssl证书示例:
mkdir -p /app/nginx/ssl cd /app/nginx/ssl openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
在 node03 和 node04 执行以下命令将证书添加到/repository/resources/security/client-truststore.jks 文件:
scp -r 192.168.100.129:/app/nginx/ssl/server.crt /app/server.crt keytool -import -trustcacerts -alias server -file /app/server.crt -keystore /app/wso2ei-6.7.0-SNAPSHOT/repository/resources/security/client-truststore.jks
出现提示时,输入默认密码 wso2carbon。
vim /app/nginx/conf/nginx.conf
user nginx; worker_processes auto; error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; include /app/nginx/conf/ei.http.conf; include /app/nginx/conf/ei.https.conf; include /app/nginx/conf/ui.ei.https.conf; }
创建日志文件
# 创建日志文件 mkdir -p /app/nginx/logs touch /app/nginx/logs/error.log touch /app/nginx/logs/access.log # 创建 pid 文件 touch /app/nginx/logs/nginx.pid chown -R nginx:nginx /app/nginx
执行以下命令启动 NGINX
# 停止 /app/nginx/sbin/nginx -s stop # 启动 /app/nginx/sbin/nginx -c /app/nginx/conf/nginx.conf
如果只是对 VHost 文件进行修改时不需要重新启动服务器,请执行以下命令:
# 重载配置文件 /app/nginx/sbin/nginx -s reload
WSO2 EI 的所有配置文件都使用数据库来存储用户管理详细信息和注册表数据等信息。 集群中的所有节点都必须使用一个中央数据库进行配置和治理注册表挂载。 创建以下数据库和关联的数据源。
数据库 | 描述 |
WSO2_USER_DB JDBC | 用户存储和授权管理器 |
REGISTRY_DB | 用于产品节点中的配置和治理注册表挂载的共享数据库 |
REGISTRY_LOCAL1 | 节点 1 中的本地注册表空间 |
REGISTRY_LOCAL2 | 节点 2 中的本地注册表空间 |
对于大多数企业测试和生产环境,建议使用行业标准的 RDBMS,例如 Oracle、PostgreSQL、MySQL、MS SQL 等。 但是,也可以仅将嵌入式 H2 数据库用于 REGISTRYLOCAL1 和 REGISTRYLOCAL2。
按照以下步骤创建必要的数据库。
这些说明假设将 MySQL 安装为关系数据库管理系统 (RDBMS),但可以根据需要安装另一个受支持的 RDBMS。
下载并安装 MySQL 服务器。
下载 MySQL JDBC 驱动程序。
下载并解压 WSO2 EI 二进制发行版。在本文档中,
指的是 WSO2 EI 产品的根目录。解压下载的MySQL驱动,将MySQL JDBC驱动JAR(mysql-connector-java-x.x.xx-bin.jar)复制到两个ESB节点的/lib/目录下。
在终端/命令窗口中执行以下命令,其中用户名是要用于访问数据库的用户名:mysql -u username -p
出现提示时,指定密码以使用指定的用户名访问数据库。
使用以下命令创建数据库:
如果使用的是 MySQL 5.7 或更高版本,则需要使用 mysql5.7.sql 脚本而不是 mysql.sql 脚本。(EI 6.6.0只有mysql.sql文件)
yum install -y unzip unzip wso2ei-6.7.0-SNAPSHOT_ZH.zip cp -r /app/wso2ei-6.7.0-SNAPSHOT/dbscripts/mysql.sql /app/ mysql -u root -p'CWCcwy12'
create database WSO2_USER_DB; use WSO2_USER_DB; source /app/mysql.sql; grant all on *.* TO regadmin@"%" identified by "regadmin"; create database REGISTRY_DB; use REGISTRY_DB; source /app/mysql.sql; grant all on *.* TO regadmin@"%" identified by "regadmin"; /*** REGISTRY_LOCAL1 和 REGISTRY_LOCAL2 不是必须的,可以使用内置H2数据库 **/ create database REGISTRY_LOCAL1; use REGISTRY_LOCAL1; source /app/mysql.sql; grant all on *.* TO regadmin@"%" identified by "regadmin"; create database REGISTRY_LOCAL2; use REGISTRY_LOCAL2; source /app/mysql.sql; grant all on *.* TO regadmin@"%" identified by "regadmin"; /**********************************************************************/ alter user 'regadmin'@'%' identified by 'regadmin'; flush privileges; quit;
对于 Microsoft Windows 用户,在 MySQL 中创建数据库时,将字符集指定为 latin1 很重要。不这样做可能会在启动集群时导致错误(错误代码:1709)。此错误发生在某些版本的 MySQL (5.6.x) 中,与 UTF-8 编码有关。 MySQL 最初默认使用 latin1 字符集,它以 2 字节的序列存储字符。然而,在最近的版本中,为了对国际用户更友好,MySQL 默认使用 UTF-8。因此,必须在数据库创建命令中使用 latin1 作为字符集,如下所示以避免此问题。请注意,这可能会导致非拉丁字符(如希伯来语、日语等)出现问题。以下是数据库创建命令的sql。
create database <DATABASE_NAME> character set latin1;
对于其他操作系统的用户,标准的数据库创建命令就足够了。对于这些操作系统,以下是数据库创建命令的sql。
create database <DATABASE_NAME>;
对集群的所有节点进行以下配置。
mkdir -p /app cd /app yum install -y unzip unzip wso2ei-6.7.0-SNAPSHOT_ZH.zip
vim /app/wso2ei-6.7.0-SNAPSHOT/conf/registry.xml
将以下配置添加到每个 ESB 节点的/conf/registry.xml 文件中,以配置共享注册表数据库和挂载详细信息。 这确保了用于治理和配置的共享注册表(即 REGISTRY_DB 数据库)安装在两个 ESB 节点上。
添加这些配置时请注意以下几点:
不得删除名为 wso2registry 的现有 dbConfig。
新建名为:sharedregistry 的注册表数据库配置,在
标记中指定的数据源必须与在/conf/datasources/master-datasources.xml 文件中指定的 JNDI 配置名称相匹配。注册表装载路径表示注册表的类型。例如,“/system/config”指的是配置注册表,“/system/governance”指的是治理注册表。
此外,在
部分中指定缓存 ID。这使缓存能够在集群环境中正常运行。缓存 ID 与注册表数据库的 JDBC 连接 URL 相同。该值是远程实例的缓存 ID。格式为$databaseusername@$databaseurl,其中$databaseusername 为远程实例数据库的用户名,$databaseurl 为远程实例数据库URL。此 cacheID 表示启用的缓存。在这种情况下,它应该连接的数据库是 REGISTRY_DB,它是所有节点共享的数据库。可以在正在使用的同一数据源的安装配置中找到它。
为每个远程实例定义一个唯一的实例 ID(使用
标记)。请务必从相应的挂载配置中引用相同的实例 ID(使用标记)。在此示例中,远程实例的唯一 ID 是“instanceId”。该 ID 与配置挂载和治理挂载的实例 ID 相同。例如:节点1的id为node03,节点2的id为node04。请注意,如果注册表装载配置(使用
部分指定)没有具有相同实例 ID 的对应远程注册表实例(使用部分指定),则注册表装载将不会成功。如果在和配置下误用了不匹配的实例ID,则需要按照以下步骤纠正错误:删除现有的本地注册表。如果使用的是嵌入式 H2 以外的数据库,则需要执行设置新数据库的添加步骤。
应用 registry.xml 文件中的配置。
重新启动服务器。
在每个挂载配置中指定实际挂载路径和目标挂载路径。目标路径可以是任何有意义的名称。在本例中,它是“/_system/eiconfig”。
<dbConfig name="sharedregistry"> <dataSource>jdbc/WSO2RegistryDB</dataSource> </dbConfig> <remoteInstance url="https://localhost:9443/registry"> <id>node04</id> <dbConfig>sharedregistry</dbConfig> <readOnly>false</readOnly> <enableCache>true</enableCache> <registryRoot>/</registryRoot> <cacheId>regadmin@jdbc:mysql://192.168.100.129:3306/REGISTRY_DB?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8</cacheId> </remoteInstance> <mount path="/_system/config" overwrite="true"> <instanceId>node04</instanceId> <targetPath>/_system/eiconfig</targetPath> </mount> <mount path="/_system/governance" overwrite="true"> <instanceId>node04</instanceId> <targetPath>/_system/governance</targetPath> </mount>
vim /app/wso2ei-6.7.0-SNAPSHOT/conf/datasources/master-datasources.xml
按照下面给出的步骤更新数据源。
打开
/conf/datasources/master-datasources.xml 文件,并将数据源配置为指向每个 ESB 节点的相关数据库。相应地替换 MySQL 环境的用户名、密码和数据库 URL。
如果未启用 SSL,请将 useSSL=false 属性附加到
属性的值。对于 ESB 节点 1,将数据源配置为指向 REGISTRYLOCAL1、WSO2REGISTRYDB 和 WSO2USER_DB 数据库,如下所示:
<datasources-configuration xmlns:svns="http://org.wso2.securevault/configuration"> <providers> <provider>org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader</provider> </providers> <datasources> <datasource> <name>REGISTRY_LOCAL1</name> <description>The datasource used for registry- local</description> <jndiConfig> <name>jdbc/WSO2CarbonDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://192.168.100.129:3306/REGISTRY_LOCAL1?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8</url> <username>regadmin</username> <password>regadmin</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> </configuration> </definition> </datasource> <!--<datasource> <name>REGISTRY_LOCAL1</name> <description>The datasource used for registry- local</description> <jndiConfig> <name>jdbc/WSO2CarbonDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:h2:./repository/database/WSO2CARBON_DB;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=60000</url> <username>wso2carbon</username> <password>wso2carbon</password> <driverClassName>org.h2.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> <defaultAutoCommit>false</defaultAutoCommit> </configuration> </definition> </datasource>--> <datasource> <name>REGISTRY_DB</name> <description>The datasource used for registry- config/governance</description> <jndiConfig> <name>jdbc/WSO2RegistryDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://192.168.100.129:3306/REGISTRY_DB?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8</url> <username>regadmin</username> <password>regadmin</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> </configuration> </definition> </datasource> <datasource> <name>WSO2_USER_DB</name> <description>The datasource used for registry and user manager</description> <jndiConfig> <name>jdbc/WSO2UMDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://192.168.100.129:3306/WSO2_USER_DB?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8</url> <username>regadmin</username> <password>regadmin</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> </configuration> </definition> </datasource> </datasources> </datasources-configuration>
对于节点 2,将数据源配置为指向 REGISTRYLOCAL2、WSO2REGISTRYDB 和 WSO2USER_DB 数据库,如下所示。 根据环境需要更改用户名、密码和数据库 URL。
<datasources-configuration xmlns:svns="http://org.wso2.securevault/configuration"> <providers> <provider>org.wso2.carbon.ndatasource.rdbms.RDBMSDataSourceReader</provider> </providers> <datasources> <datasource> <name>REGISTRY_LOCAL2</name> <description>The datasource used for registry- local</description> <jndiConfig> <name>jdbc/WSO2CarbonDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://carbondb.mysql-wso2.com:3306/REGISTRY_LOCAL2?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8</url> <username>regadmin</username> <password>regadmin</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> </configuration> </definition> </datasource> <!--<datasource> <name>REGISTRY_LOCAL2</name> <description>The datasource used for registry- local</description> <jndiConfig> <name>jdbc/WSO2CarbonDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:h2:./repository/database/WSO2CARBON_DB;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=60000</url> <username>wso2carbon</username> <password>wso2carbon</password> <driverClassName>org.h2.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> <defaultAutoCommit>false</defaultAutoCommit> </configuration> </definition> </datasource>--> <datasource> <name>REGISTRY_DB</name> <description>The datasource used for registry- config/governance</description> <jndiConfig> <name>jdbc/WSO2RegistryDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://carbondb.mysql-wso2.com:3306/REGISTRY_DB?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8</url> <username>regadmin</username> <password>regadmin</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> </configuration> </definition> </datasource> <datasource> <name>WSO2_USER_DB</name> <description>The datasource used for registry and user manager</description> <jndiConfig> <name>jdbc/WSO2UMDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://carbondb.mysql-wso2.com:3306/WSO2_USER_DB?useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8</url> <username>regadmin</username> <password>regadmin</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> </configuration> </definition> </datasource> </datasources> </datasources-configuration>
在
/conf/user-mgt.xml 文件中添加以下配置以配置用户存储。 如下所示更新/conf/user-mgt.xml 文件中所有节点中的 dataSource 属性以配置数据源:jdbc/WSO2UMDB
vim /app/wso2ei-6.7.0-SNAPSHOT/conf/axis2/axis2.xml
WSO2 产品使用 Hazelcast 作为其默认的集群引擎。 下面给出了将产品节点连接到集群的步骤。
打开两个 ESB 节点的
/conf/axis2/axis2.xml 文件,并应用以下集群配置:为每个节点启用集群,如下所示:
<clustering class="org.wso2.carbon.core.clustering.hazelcast.HazelcastClusteringAgent" enable="true">
确认成员资格方案设置为 wka。这启用了众所周知的地址注册方法,如下所示。每个节点向 WKA 成员发送集群启动消息。
<parameter name="membershipScheme">wka</parameter>
指定节点加入的集群的名称:
集群域/组。 同一组中的节点将属于同一个多播域。 不同组的节点之间不会有干扰。
<parameter name="domain">wso2.ei.domain</parameter>
指定主机来传递集群消息。例如,如果两个 ESB 节点的 IP 地址分别为 xxx.xxx.xxx.xx1 和 xxx.xxx.xxx.xx2,则应在配置中指定如下所示。
对于 ESB 节点 1
<parameter name="localMemberHost">192.168.100.115</parameter>
对于 ESB 节点 2
<parameter name="localMemberHost">192.168.100.105</parameter>
指定用于传递集群消息的端口,如下所示:
<parameter name="localMemberPort">4100</parameter>
此端口号不受
/conf/carbon.xml 文件中指定的端口偏移值的影响。如果此端口号已分配给另一台服务器,则集群框架会自动增加此端口号。但是,如果有两个服务在同一台机器上运行,请确保为每台服务器设置一个唯一的端口。例如,可以为节点 1 设置端口 4100,为节点 2 设置端口 4200。
在两个节点中指定集群中的知名成员,如下所示。例如,当配置一个 ESB 节点时,需要将集群中的其他节点指定为知名成员,如下所示。 WKA 节点的端口值必须与其 localMemberPort 的值相同(在本例中为 4100)。
还可以使用 IP 地址范围作为主机名(例如 192.168.1.2-10)。但是,只能为 IP 地址的最后部分定义范围。范围越小,发现成员所需的时间就越快,因为每个节点必须扫描较少数量的潜在成员。最佳实践是在所有节点中添加所有成员(包括自身)以避免配置冲突。
<members> <member> <hostName>192.168.100.115</hostName> <port>4100</port> </member> <member> <hostName>192.168.100.105</hostName> <port>4100</port> </member> </members>
在 transportReceiver 部分的 org.apache.synapse.transport.passthru.PassThroughHttpListener 下取消注释并编辑 WSDLEPRPrefix 元素。
这个是API页面是显示URL
<parameter name="WSDLEPRPrefix" locked="false">http://192.168.100.129:8280</parameter>
取消注释并编辑 transportReceiver 部分中 org.apache.synapse.transport.passthru.PassThroughHttpSSLListener 下的 WSDLEPRPrefix 元素。
<parameter name="WSDLEPRPrefix" locked="false">https://192.168.100.129:8243</parameter>
编辑
/conf/carbon.xml 文件如下配置主机名(当前服务器的ip地址):vim /app/wso2ei-6.7.0-SNAPSHOT/conf/carbon.xml
对于 ESB 节点 1
<HostName>192.168.100.115</HostName>
对于 ESB 节点 2
<HostName>192.168.100.105</HostName>
使用以下属性配置创建 hazelcast.properties 文件,并将该文件复制到
/conf/ 目录。touch /app/wso2ei-6.7.0-SNAPSHOT/conf/hazelcast.properties vim /app/wso2ei-6.7.0-SNAPSHOT/conf/hazelcast.properties
#Disabling the hazelcast shutdown hook hazelcast.shutdownhook.enabled=false #Setting the hazelcast logging type to log4j hazelcast.logging.type=log4j
下面解释上述配置。
Hazelcast shutdown hook:此配置禁用 hazelcast 中的关闭挂钩,确保产品节点关闭时 hazelcast 实例正常关闭。 如果启用了 hazelcast 关闭挂钩(这是产品的默认行为),将看到诸如“Hazelcast 实例未激活!”之类的错误。 在关闭产品节点时:这是因为在启用shutdown hook时hazelcast实例过早关闭。
Hazelcast logging type:此配置将 hazelcast 日志记录类型设置为 log4j,这允许将 hazelcast 日志写入 wso2carbon.log 文件。
如果如上所示为 hazelcast 日志启用了 log4j,请务必在 log4j2.properties 文件(存储在
/conf/ 目录中)中输入如下所示的配置。 这可用于配置 hazelcast 日志记录的日志级别。 对于集群生产环境,建议使用 INFO 作为日志级别,如下所示。vim /app/wso2ei-6.7.0-SNAPSHOT/conf/log4j2.properties
log4j.logger.com.hazelcast=info
将主机条目添加到 DNS 或集群所有节点中的“/etc/hosts”文件(在 Linux 中),以将主机名映射到 IP 地址。 将以下主机名映射到 /etc/host 文件中的 IP 地址。
ei.wso2.com ui.ei.wso2.com carbondb.mysql-wso2.com 例子: xxx.xxx.xxx.xxx ei.wso2.com xxx.xxx.xxx.xxx ui.ei.wso2.comcarbondb.mysql-wso2.com
实际上本例用的全部都是IP地址,不需要再做主机名映射。
根据集群中发生的工件变化率使用以下部署同步建议:
对于高变化率(即,如果变化发生得非常频繁):网络文件共享 (NFS)
对于中等变化率:远程同步(Rsync)
对于低变化率(即,如果每周发生一次变化):使用配置管理系统来处理工件、其他部署选项(例如 Puppet、Chef 等)
选择适合生产环境的部署同步方法
可以使用常见的共享文件系统,例如网络文件系统 (NFS) 或任何其他共享文件系统作为内容同步机制。 需要将两个节点的/repository/deployment/server 目录挂载到共享文件系统,以在两个节点之间共享所有工件。
#检查是否安装NFS rpm -qa nfs-utils rpcbind #关闭防火墙 # 查看防火墙状态 systemctl status firewalld ## 关闭防火墙 systemctl stop firewalld #安装NFS yum install nfs-utils rpcbind -y #检查安装结果 rpm -qa nfs-utils rpcbind
出现上图所示则表明安装成功
建立同步文件夹
mkdir -p /app/file
在挂载文件夹之前,先把/repository/deployment/server 目录下的所有文件复制到 /app/file 目录下
cp -r /app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server/* /app/file
对同步文件夹进行授权
chown root /app/file/ chmod 777 /app/file/
在配置文件中加入如下配置(参数norootsquash的其作用是:NFS客户端使用共享目录的用户,如果是root 的话,所有的操作均在服务器端映射为root用户,拥有共享目录的root权限。不加这个参数在登入 NFS 主机export目录的使用者如果是root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个身份。
因为客户端是使用root登录的,自然权限被压缩为nobody了,所以无法写入。)生产环境慎用norootsquash!!!
创建配置文件
vim /etc/exports
/app/file *(rw,sync,no_root_squash)
# 执行exportfs -rv让配置立即生效 exportfs -rv # 将NFS和rpcbind加入开机启动 systemctl enable nfs systemctl enable rpcbind # 启动NFS和rpcbind systemctl start nfs systemctl start rpcbind # 查看NFS启动状态 systemctl status nfs
# 关闭防火墙 ## 查看防火墙状态 systemctl status firewalld ## 关闭防火墙 systemctl stop firewalld # 安装NFS软件包,并把NFS服务设为开机启动 ## 安装NFS yum install nfs-utils rpcbind -y ## 将NFS加入开启启动 systemctl enable nfs ## 将rpcbind加入开启启动 systemctl enable rpcbind ##启动NFS systemctl start nfs ## 启动RPCbind systemctl start rpcbind # 将应用文件夹挂载到服务器上 mount -t nfs 192.168.100.129:/app/file /app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server df -Th #挂载完成后可以使用mount | grep file命令查看挂载情况 #取消挂载 sudo umount /app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server #直接使用 umount /app/file 可能会报“Device is busy”错误。
如果无法维护共享文件系统,可以使用 Rsync 同步内容。 Rsync 工具是一种文件复制工具,是另一种在所有集群节点之间同步工件的常用方法。 因此,可以先在集群的一个节点中部署工件,然后使用 Rsync 将这些工件复制到其他节点,如下所述。
安装 rsync。
我们走的是 rsync over ssh 协议,因此不需要在服务器端安装 rsyncd,只要服务器开了 ssh 就行。
#首先检查是否已安装 rpm -aq rsync #如果未安装则运行 yum install -y rsync
groupadd wso2ei useradd -r -g wso2ei wso2ei passwd wso2ei mkdir -p /home/wso2ei
chown -R wso2ei:wso2ei /app/wso2ei-6.7.0-SNAPSHOT
sshpass 的作用是 ssh 免密登录
yum install -y sshpass
在 rsync over ssh 的基础上,我们采用sshpass解决非交互模式输入密码的问题。
传统做法是:使用密钥,但是很麻烦。
我们先成功登录一次remotehost,之后就可以使用sshpass了。
特别提醒:如果今后远程主机重装系统,或者换了机器,一定要删除本地~/.ssh/known_host,否则是会无法登录的。
ssh wso2ei@192.168.100.115 ssh wso2ei@192.168.100.105
cd /app wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz tar -zxvf inotify-tools-3.14.tar.gz mv -f inotify-tools-3.14 inotify-tools cd inotify-tools ./configure --prefix=/app/inotify-tools make && make install
inotify 两个监控命令:
inotifywait:用于持续监控,实时输出结果(常用)
inotifywatch:用于短期监控,任务完成后再出结果
cd /app touch rsync_test1_inotify.sh chmod +x rsync_test1_inotify.sh vim rsync_test1_inotify.sh
脚本的作用是:当 node03 的 /app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server 目录下的文件发生增删改操作时,把 node04 的 /app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server 目录同步成 node03 的一样。
#!/bin/bash # 需要同步的本地目录 SRCDIR=/app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server USER=wso2ei PASSWORD=Abc123456 IP=192.168.100.105 # 被同步的节点的目录 DESTDIR=/app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server # 格式:inotifywait -mrq -e 监控动作 1,监控动作 2 /监控目录 & /app/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file do # 上行同步 sshpass -p $PASSWORD rsync -avpgorl --progress --delete-before -e 'ssh -p 22' $SRCDIR/ $USER@$IP:$DESTDIR echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1 echo -e "`date \"+%Y-%m-%d %H:%M:%S\"` \e[32m rsynced done! \e[0m" done
后台启动
nohup /app/rsync_test1_inotify.sh >> /app/rsync_test1_inotify.log 2>&1 &
cd /app touch rsync_test1_inotify.sh chmod +x rsync_test1_inotify.sh vim rsync_test1_inotify.sh
脚本的作用是:当 node04 的 /app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server 目录下的文件发生增删改操作时,把 node03 的 /app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server 目录同步成 node04 的一样。
#!/bin/bash # 需要同步的本地目录 SRCDIR=/app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server USER=wso2ei PASSWORD=Abc123456 IP=192.168.100.115 # 被同步的节点的目录 DESTDIR=/app/wso2ei-6.7.0-SNAPSHOT/repository/deployment/server # 格式:inotifywait -mrq -e 监控动作 1,监控动作 2 /监控目录 & /app/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $SRCDIR | while read file do # 上行同步 sshpass -p $PASSWORD rsync -avpgorl --progress --delete-before -e 'ssh -p 22' $SRCDIR/ $USER@$IP:$DESTDIR echo " ${file} was rsynced" >> /tmp/rsync.log 2>&1 echo -e "`date \"+%Y-%m-%d %H:%M:%S\"` \e[32m rsynced done! \e[0m" done
后台启动
nohup /app/rsync_test1_inotify.sh >> /app/rsync_test1_inotify.log 2>&1 &
cd /app/wso2ei-6.7.0-SNAPSHOT/bin chmod +x integrator.sh # 直接启动 ./integrator.sh # 后台启动 nohup /app/wso2ei-6.7.0-SNAPSHOT/bin/integrator.sh >> /app/wso2ei-6.7.0-SNAPSHOT/bin/wso2ei.log 2>&1 & tail -f /app/wso2ei-6.7.0-SNAPSHOT/bin/wso2ei.log
按照以下步骤测试集群。
将工件部署到每个产品部署位置。
使用部署同步机制来同步
/repository/deployment/ 目录中的工件。始终首先将工件部署到 ESB 服务器配置文件节点,并将注册表配置为读/写。接下来,将工件部署到其他节点。重新启动配置的负载均衡器。
对两个 ESB 节点执行以下命令以启动服务器:/bin/integrator.sh
检查所有控制台中的“成员加入”日志消息。
有关日志和新节点的附加信息
当终止一个节点时,所有节点都会识别该节点已离开集群。当新节点加入集群时也是如此。如果要添加另一个新节点,如果在新服务器上运行现有节点(例如 xxx.xxx.xxx.184),则复制现有节点而不做任何更改。如果打算在运行另一个 WSO2 产品的服务器上使用新节点,请使用节点的副本并在/conf/carbon.xml 文件中相应地更改端口偏移量。如果该产品启用了集群,还必须更改/conf/axis2/axis2.xml 文件中的 localMemberPort。此外,在创建新节点时将所有主机名映射到相关 IP 地址。日志消息指示新节点是否加入集群。
使用以下 URL 通过 LB 访问管理控制台:https://192.168.100.129:9443/carbon
通过以下 URL 测试负载分布:http://192.168.100.129:8280/ 或 https://192.168.100.129:8243/
在 inSequence 中添加一个带有 log mediator 的示例代理服务,使其在终端中显示日志,然后观察发送的集群消息。
通过负载均衡器向端点发送请求,以验证代理服务仅在活动节点上激活,而节点保持被动。这是为了测试负载均衡器是否管理节点的主动和被动状态,根据需要激活节点并将其余节点保持在被动模式。例如,可以将请求发送到以下 URL:http://{LoadBalancerMappedURLforworker}/services/{SampleProxy_Name}
按照以下步骤调整集群的性能:
下面给出的示例参数值可能不是环境中特定硬件配置的最佳值。 因此,建议对环境进行负载测试,以相应地调整负载均衡器和其他配置。
根据预期更改服务器节点的以下默认内存分配设置和服务器启动脚本(即
/bin/integrator.sh 或/bin/integrator.bat 文件)中的 JVM 调优参数 服务器负载:-Xms256m -Xmx1024m -XX:MaxPermSize=256m修改重要的系统文件,这些文件会影响服务器上运行的所有程序。 建议在编辑这些文件之前使用 Unix/Linux 文档熟悉这些文件。