步骤1:安装Docker
如果你还没有安装Docker,请先安装它。
sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
步骤2:运行MySQL 5.7容器
接下来,启动一个MySQL 5.7容器实例。记得替换your_mysql_root_password
为你自己的密码。
docker run --name fabric-ca-mysql -e MYSQL_ROOT_PASSWORD=your_mysql_root_password -e MYSQL_DATABASE=fabric_ca -p 3306:3306 -d mysql:5.7
[root@localhost ~]# docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=fabric_ca -p 3306:3306 -d mysql:5.7
这个命令将启动一个名为fabric-ca-mysql
的MySQL容器,同时创建一个名为fabric_ca
的数据库。
步骤3:准备Fabric CA服务器配置
-
下载Hyperledger Fabric CA 1.4.9二进制文件并解压。
-
初始化第一个Fabric CA服务器实例。在初始化时,你可以指定管理员的用户名和密码。
fabric-ca-server init -b admin:adminpw
-
编辑
fabric-ca-server-config.yaml
文件,调整数据库配置以使用步骤2中启动的MySQL数据库。假设MySQL运行在同一台机器上,且使用默认端口。db: type: mysql datasource: root:your_mysql_root_password@tcp(localhost:3306)/fabric_ca?parseTime=true
确保将
your_mysql_root_password
替换为你设置的实际密码。
步骤4:启动Fabric CA服务器
-
使用更新后的配置启动Fabric CA服务器。
fabric-ca-server start
有可能会出现这个错误
2024/03/24 03:29:33 [ERROR] Error occurred initializing database: Failed to create MySQL tables: Error creating certificates table: Error 1067: Invalid default value for 'expiry'
这个错误通常是因为MySQL的SQL模式与Fabric CA服务器试图创建的表的默认日期/时间值不兼容。从MySQL 5.7开始,默认的SQL模式包括NO_ZERO_DATE
和NO_ZERO_IN_DATE
,这会阻止使用’0000-00-00’作为日期的默认值。Fabric CA在创建其数据库表时,可能会尝试使用这样的默认值,从而导致上述错误。
解决方案
要解决这个问题,你可以在MySQL数据库中调整SQL模式以允许零日期值。这可以通过在启动MySQL容器时设置MYSQLD_OPTIONS
环境变量来实现,或者在数据库初始化后修改。
方法1:调整Docker容器的启动参数
当你运行MySQL容器时,添加一个环境变量来修改SQL模式:
docker run --name fabric-ca-mysql \
-e MYSQL_ROOT_PASSWORD=your_mysql_root_password \
-e MYSQL_DATABASE=fabric_ca \
-e MYSQLD_OPTIONS="--sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" \
-p 3306:3306 \
-d mysql:5.7
这将从默认SQL模式中移除NO_ZERO_IN_DATE
和NO_ZERO_DATE
,允许Fabric CA正常创建其数据库表。
方法2:修改现有数据库的SQL模式
如果你的MySQL容器已经在运行,或者你希望在已经创建的数据库上应用这个更改,你可以执行以下SQL命令来调整SQL模式:
-
登录到MySQL数据库:
docker exec -it fabric-ca-mysql mysql -uroot -pyour_mysql_root_password
- 在MySQL命令行中,运行以下命令来设置新的SQL模式:
SET GLOBAL sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
扩展CA服务器集群以提高可用性和负载均衡
1. 使用共享数据库
确保所有Fabric CA服务器实例都配置为使用同一个MySQL数据库。这是通过在fabric-ca-server-config.yaml
中正确设置数据库连接来实现的,正如之前所示。这保证了不论哪个CA实例接收到注册或签发证书的请求,都能够访问和更新同一份数据。
这里我们使用这个命令来从一台物理机上启动两个ca服务器
fabric-ca-server start -b admin:adminpw --cacount 2
2. 配置反向代理
使用反向代理(如Nginx或HAProxy)可以帮助你实现负载均衡和高可用性。反向代理将客户端请求分发到不同的CA服务器实例,从而实现负载均衡。它还可以提供TLS终端,加密客户端和服务器之间的通信。
步骤1: 安装HAProxy
首先,确保你已经在你的CentOS 7系统上安装了HAProxy。
sudo yum install -y haproxy
步骤2: 配置HAProxy
接下来,编辑HAProxy的配置文件。这个文件通常位于/etc/haproxy/haproxy.cfg
。你需要为你的Fabric CA服务器集群添加配置。以下是一个配置示例:
global
# 全局日志设置
log /dev/log local0
log /dev/log local1 notice
# 设置HAProxy运行的用户和组
user haproxy
group haproxy
# 以守护进程模式运行
daemon
defaults
# 默认日志设置
log global
# 使用HTTP模式
mode http
# 启用HTTP日志
option httplog
# 空连接不记录日志
option dontlognull
# 连接超时设置
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
# 定义前端,接受进入的客户端连接
frontend fabric_ca_frontend
# 监听端口,*表示所有接口,8054为监听端口
bind *:7054
mode http
# 默认将流量转发到的后端
default_backend fabric_ca_backend
# 定义后端,包含了服务的实际实例
backend fabric_ca_backend
mode http
# 负载均衡算法,roundrobin表示轮询
balance roundrobin
# 定义后端服务器,check表示健康检查
server ca1 localhost:7054 check # 第一个CA服务器实例
server ca2 localhost:7055 check # 第二个CA服务器实例
在这个配置中:
frontend fabric_ca_frontend
定义了一个前端,它监听所有接口上的7054端口。backend fabric_ca_backend
定义了一个后端,包含了两个CA服务器实例,使用roundrobin
策略进行负载均衡。option httpchk GET /cainfo
设置了健康检查,确保只有正常运行的CA实例会接收到请求。
确保替换ca1.example.com
和ca2.example.com
为你实际的CA服务器地址。
步骤3: 启动HAProxy
配置好HAProxy后,你需要重新启动服务以应用配置更改。
systemctl restart haproxy
sudo systemctl enable haproxy