Fabric agrega orden de forma dinámica

Con respecto a la adición de ordenador en modo balsa, el sitio web oficial da un proceso aproximado

reconfigurar

Los ordenadores de balsa admiten agregar y eliminar nodos dinámicamente (es decir, mientras el canal está en uso), pero solo un nodo a la vez. Antes de intentar reconfigurar, tenga en cuenta que su clúster debe estar en un estado que pueda mantener el mantenimiento y lograr un consenso. Como peor ejemplo, si tiene 3 nodos y 2 nodos fallan, no puede configurar su clúster de balsa para eliminar nodos. Asimismo, si tiene 1 nodo inactivo en un canal con 3 nodos, no debe intentar reemplazar el certificado, ya que esto provocará un error secundario. * Como pauta , a menos que todos los consensores estén en línea y en buen estado, nunca debe intentar realizar cambios de configuración en un consensor de Raft, como agregar o eliminar un consensor, o reemplazar el certificado de un consensor, etc.

Si decide modificar estos parámetros, le recomendamos que solo lo intente durante un ciclo de mantenimiento. La gran mayoría de los problemas con la modificación de configuraciones ocurren en clústeres con solo unos pocos nodos y un nodo deja de funcionar. Por ejemplo, si tiene tres nodos de consenso y uno de ellos falla, eso significa que solo tiene dos nodos vivos. Si escala el clúster a 4 nodos en este estado, todavía tiene solo 2 nodos vivos, lo que no permite un quórum. El cuarto nodo no puede conectarse porque los nodos solo pueden unirse a un clúster en ejecución (casos en los que el tamaño total del clúster es 1 o 2).

Por lo tanto, al escalar un clúster de tres nodos (con solo dos nodos vivos) a cuatro nodos, está completamente atascado hasta que vuelve a funcionar el nodo sin conexión original.

Agregar un nuevo nodo a un clúster de Raft requiere los siguientes pasos:

  1. Una transacción de actualización de la configuración del canal agrega el certificado TLS del nuevo nodo al canal . Nota: un nuevo nodo primero debe unirse a un canal del sistema antes de unirse a uno o más canales de aplicación .
  2. Obtenga el último bloque de configuración del canal del sistema de un pedido , que forma parte del canal del sistema.
  3. Se asegura de que este nodo sea parte del canal del sistema verificando que el bloque de configuración contenga el (futuro) certificado del nodo unido .
  4. Inicia un nuevo nodo Raft con la ruta del bloque de configuración especificada en el parámetro General.BootstrapFilede configuración .
  5. Espere a que el nodo Raft copie el bloque en el canal al que se une su certificado desde un nodo existente . Una vez que se completa este paso, el nodo comienza a servir al canal.
  6. Agregue el punto final del nodo Raft recién agregado a la configuración de todos los canales.

En pocas palabras, los nodos que ya se están ejecutando (y se han unido a algunos canales) se pueden agregar al canal en tiempo de ejecución. Para hacer esto, simplemente agregue el certificado del nodo a la configuración del canal del canal. El nodo detectará automáticamente que se une al nuevo canal (el valor predeterminado es de 5 minutos, pero si desea que el nodo detecte el nuevo canal más rápido, puede reiniciar el nodo), luego extraiga el bloque del canal del orden en el canal y, finalmente, cree un nuevo canal para la cadena Iniciar la instancia de Raft.

Después de completar con éxito los pasos anteriores, la configuración del canal se puede actualizar para incluir el punto final del nuevo ordenante de Raft.

#查看这个介绍,我们可以感觉到官方在介绍这一部分时只给了大概流程,仅看这个的话很难操作。这是因为这类操作,官方在【动态新增组织】中进行了比较详见的流程介绍,主要区别在于
#1.在将orderer节点添加到指定应用通道前,需要先将orderer节点添加到系统通道中。
#2.修改配置区由peer修改为orderer。这部分需要自己寻找

Por lo tanto, en referencia a la introducción oficial, el proceso de adición dinámica se puede diseñar de la siguiente manera

Agregar procesos dinámicamente

Configuración del entorno

El dispositivo ya tiene 3 nodos de pedido y 1 nodo par

Generar certificado de pedido

Fabric proporciona dos formas de generar certificados generación fabric-ca y generación de herramientas cryptogen, usamos la herramienta cryptogen para generar

Modificar el archivo de configuración

El archivo de generación de certificados crypto-config.yaml agrega la configuración de orderer4

OrdererOrgs:
  # ---------------------------------------------------------------------------
  # Orderer
  # ---------------------------------------------------------------------------
  - Name: Orderer
    Domain: example.com.local
    # ---------------------------------------------------------------------------
    # "Specs" - See PeerOrgs below for complete description
    # ---------------------------------------------------------------------------
    Specs:
      - Hostname: orderer1
      - Hostname: orderer2
      - Hostname: orderer3
      - Hostname: orderer4     #新增

generar certificado

comando nativo de tela

cryptogen extend --input crypto-config  --config ./crypto-config.yaml    

después de todo en transformación

#allin改造中使用证书合并模式。复制orderer1的证书,修改路径及证书名称

inserte la descripción de la imagen aquí

Prepare el archivo de configuración del canal que contiene los datos que se actualizarán

opcion uno

Modifique el archivo configtx.yaml y agregue información sobre orderer 4. Este proceso se refiere principalmente al proceso de agregar organizaciones dinámicamente. Genere automáticamente archivos json a través de los propios comandos de fabric, que está altamente automatizado

    SampleMultiNodeEtcdRaft:
        <<: *ChannelDefaults
        Capabilities:
            <<: *ChannelCapabilities
        Orderer:
            <<: *OrdererDefaults
            OrdererType: etcdraft
            EtcdRaft:
                Consenters:
                - Host: orderer1.example.com.local
                  Port: 7050 
                  ClientTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer1.example.com.local/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer1.example.com.local/tls/server.crt
                - Host: orderer2.example.com.local
                  Port: 8050 
                  ClientTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer2.example.com.local/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer2.example.com.local/tls/server.crt
                - Host: orderer3.example.com.local
                  Port: 9050 
                  ClientTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer3.example.com.local/tls/server.crt
                  ServerTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer3.example.com.local/tls/server.crt
                - Host: orderer4.example.com.local                                                                                        #新增
                  Port: 10050                                                                                                             #新增
                  ClientTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer4.example.com.local/tls/server.crt  #新增
                  ServerTLSCert: crypto-config/ordererOrganizations/example.com.local/orderers/orderer4.example.com.local/tls/server.crt  #新增
            Addresses:
                - orderer1.example.com.local:7050 
                - orderer2.example.com.local:8050 
                - orderer3.example.com.local:9050
                - orderer4.example.com.local:10050                                                                                         #新增
            Organizations:
            - *OrdererOrg
            Capabilities:
                <<: *OrdererCapabilities
        Application:
            <<: *ApplicationDefaults
            Organizations:
            - <<: *Org1
        Consortiums:
            SampleConsortium:
                Organizations:
                - *Org1

Después de modificar la prueba, se encuentra que los comandos provistos por fabric solo admiten la selección a nivel de organización, pero la parte que debemos modificar es que el módulo Perfiles no se puede usar.

    configtxgen -configPath $FABRIC_CFG_PATH/configs -printOrg ${SET_MSP_ID} >$FABRIC_CFG_PATH/configs/${SET_PEER_ORG_NAME}.json
     -printOrg    string   将组织的定义打印为JSON。(对于手动向通道添加组织非常有用)

Opción II

No prepare los datos que se agregarán con anticipación, al actualizar, genere directamente y luego actualice al archivo correspondiente

Obtener el perfil del canal actual

establecer variables de entorno

export FABRIC_CFG_PATH=/root/raft/configs
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPCONFIGPATH=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/org1.example.local/users/[email protected]/msp
export CORE_PEER_ADDRESS=peer1.org1.example.local:7051
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_TLS_ROOTCERT_FILE=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/org1.example.local/peers/peer1.org1.example.local/tls/ca.crt
export CORE_PEER_TLS_KEY_FILE=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/org1.example.local/peers/peer1.org1.example.local/tls/server.key
export CORE_PEER_TLS_CERT_FILE=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/org1.example.local/peers/peer1.org1.example.local/tls/server.crt
export ordererCa=${FABRIC_CFG_PATH}/crypto-config/ordererOrganizations/example.local/orderers/orderer1.example.local/msp/tlscacerts/tlsca.example.local-cert.pem

注意:新节点在加入一个或更多应用通道前,必须先加入到#系统通道 即syschannel
所以在文档中以syschannel为例,讲解流程。在加入应用通道是,需要经syschannel 更换为对应应用通道的名称

Extraiga el archivo de bloque de configuración más reciente

config_block.pb

peer channel fetch config $FABRIC_CFG_PATH/config_block.pb -o orderer1.example.com:7050 -c syschannel --tls --cafile $ordererCa

Extraer y convertir formatos

Extraiga datos válidos de config_block.pb y conviértalos en formato json editable

configtxlator proto_decode --input $FABRIC_CFG_PATH/config_block.pb --type common.Block | jq .data.data[0].payload.data.config > $FABRIC_CFG_PATH/config.json

Modificar la configuración del pedido

En el archivo json generado, escriba la información de orderer4 (la ruta relacionada con el certificado debe cambiarse al formato del propio archivo de certificado (base64)) en la posición correspondiente recién agregada en la Solución 1. Obtenga el nuevo archivo json config_updated.json

//此处应有图,脚本编写完成,实际执行成功后补

construir una nueva configuración

#把前后的两个json文件重新转换回pb类型文件 
configtxlator proto_encode --input $FABRIC_CFG_PATH/config.json --type common.Config > $FABRIC_CFG_PATH/config_block_origin.pb
configtxlator proto_encode --input $FABRIC_CFG_PATH/config_updated.json --type common.Config > $FABRIC_CFG_PATH/config_block_updated.pb
#比较前后两个pb文件的差异,得到改动部分 
configtxlator compute_update --channel_id byfn-sys-channel --original $FABRIC_CFG_PATH/config_block_origin.pb --updated $FABRIC_CFG_PATH/config_block_updated.pb > $FABRIC_CFG_PATH/config_diff.pb
#把配置变化部分转化为json文件
configtxlator proto_decode --input $FABRIC_CFG_PATH/config_diff.pb --type common.ConfigUpdate > $FABRIC_CFG_PATH/config_diff.json
#为上述json文件添加头部信息(Header),封装成一个完整的config update请求
echo '{"payload":{"header":{"channel_header":{"channel_id":"byfn-sys-channel", "type":2}},"data":{"config_update":'$(cat $FABRIC_CFG_PATH/config_diff.json)'}}}' | jq . > $FABRIC_CFG_PATH/config_diff_envelope.json
#把封装好的json文件转换回pb格式文件
configtxlator proto_encode --input $FABRIC_CFG_PATH/config_diff_envelope.json --type common.Envelope > $FABRIC_CFG_PATH/config_diff_envelope.pb

firmar

peer channel signconfigtx -f $FABRIC_CFG_PATH/config_diff_envelope.pb

Enviar una solicitud de actualización

peer channel update -f $FABRIC_CFG_PATH/config_diff_envelope.pb -c byfn-sys-channel -o orderer.example.com:7050 --tls true --cafile $ORDERER_CA

Finalizar

Después de agregar el canal del sistema, el nombre del canal debe cambiarse por el nombre del canal de la aplicación (al que desea unirse) y el procedimiento de apelación debe realizarse nuevamente.

Inicie el nodo orderer4

El proceso de iniciar el nodo de pedido no es muy diferente del método de inicio original, pero hay algunos puntos que necesitan atención y resolución.

1.新节点的hosts更新
2.peer的客户端维护的orderer列表里,需要把新增的orderer更新进去

Verifique el registro, si se inicia normalmente y comienza a sincronizar bloques (de todos los canales de aplicación unidos), significa que todo el proceso se completa normalmente

documentos de referencia

Documento oficial reconfigurando RAFT: https://hyperledger-fabric.readthedocs.io/en/latest/raft_configuration.html#reconfiguration

Nuevas organizaciones dinámicas en documentos oficiales: https://hyperledger-fabric.readthedocs.io/en/latest/channel_update_tutorial.html

Fabric 1.4.2 agrega dinámicamente nodos de orden: https://www.jianshu.com/p/49a915bed152

Fabric configura dinámicamente los nodos Raft: https://www.cnblogs.com/cbkj-xd/p/12123860.html

Agregue dinámicamente el diseño del proceso del pedido

En el límite del producto, tenemos configuraciones que deben seguirse. Hay algunos puntos que deben seguirse en este diseño.

1、每台机器上的orderer节点不允许超过3个。
2、sdk(即peer的客户端),需要动态的更新最新的orderer列表,以便可发送消息给最新的orderer节点
3、私钥不出设备

Bajo la premisa de cumplir con las restricciones anteriores, se lleva a cabo el diseño de procesos.

entorno de ejecución

Durante el proceso de investigación previa, encontramos que los principales factores que determinan el entorno de ejecución del proceso, la generación de certificados y la autoridad de firma apuntan al nodo donde se encuentra el administrador de la organización solicitante.

Autoridad de firma

Aunque podemos otorgar permisos de administrador a todos los miembros del pedido modificando la política de permisos. Pero no podemos compartir la clave privada del ordenante en la cadena con un dispositivo sin un nodo ordenante.

Todo, nuestro objeto de ejecución debe ser

1.如果不将Admin权限下放,执行对象应该是orderer组织Admin在的设备,即联盟的第一台设备。
2.如果将权限下放给组织成员,那执行对象也至少要是一个已存在orderer节点的设备,而不是任意一台机器。

Esto requiere que mantengamos una lista de ordenadores disponibles en la cadena y establezcamos una regla sobre cuándo elegir el dispositivo del ordenante que se debe usar como entorno de ejecución.

generación de certificados

Debido a que la clave privada no sale del dispositivo, no hay un nodo de pedido en el nuevo dispositivo. Se vuelve imposible compartir directamente el certificado de pedido existente.

En este caso, solo puede usar CSR para solicitar un certificado de la organización del ordenante ca para preparar la clave privada y el certificado del ordenante por adelantado en el nuevo dispositivo.

En este caso, el paso de generar un certificado debe reservarse en el proceso, y la diferencia entre los dos procesos no se puede explicar al usuario (el usuario ordenante no puede percibirlo).

Y el producto actual se adapta principalmente al esquema de certificados csr-ca-cert, por lo que incluso si el ordenante se agrega en el dispositivo con el ordenante existente, el modo de uso compartido de certificados ya no está seleccionado.

votar

Consulte el diseño de agregar nodos dinámicamente en el centro de configuración cuando se unen miembros de la organización. Solo necesita ser aceptado una vez por el nodo administrador en la organización.

De esta forma, en el caso de añadir de forma no dinámica un nuevo ordenante de organización, el dispositivo de ejecución seleccionado puede realizar directamente la operación de firma sin votar. Considere que el ordenante debe tratar de no abrir el concepto a los usuarios, en este caso, el proceso de votación no se agregará por el momento.

actualización SDK

Para que el nodo de nuevo ingreso obtenga la IP del dispositivo donde se encuentra el ordenante, con el fin de configurar sus propios hosts. Después de que el primer dispositivo inicializa la red, la lista de pedidos se carga en la cadena. Los datos del enlace ascendente son la ip del dispositivo y el certificado ca/tlsca de orderer1 (para la creación del canal). Así cuando el nuevo ordenante completa la operación, podemos saber los dispositivos actuales que necesitan ser actualizados de una manera muy sencilla, enviamos una notificación a la ip de la lista, y el dispositivo correspondiente irá a la cadena para obtener el último ordenante lista después de recibir la notificación. Actualice la lista de usuarios del pedido en sus propios hosts y sdk.

Cabe señalar que la actualización de la lista de usuarios de SDK también debe ser dinámica y debe realizarse sin afectar el uso normal.

Supongo que te gusta

Origin blog.csdn.net/qq_42750537/article/details/115750635
Recomendado
Clasificación