Tosgaire. 1. Ro-ràdh

Beannachdan! Is e artaigil goirid a tha seo a tha a’ freagairt nan ceistean: “Dè a th’ ann an tosgaire?”, “Carson a tha feum air?” agus "càit an tòisich thu?".

Dè tha seo

Tha Envoy na chothromachadh L4-L7 sgrìobhte ann an C ++, le fòcas air àrd-choileanadh agus ruigsinneachd. Air an aon làimh, tha seo ann an dòigh air choreigin mar analogue de nginx agus haproxy, an coimeas ri coileanadh riutha. Air an làimh eile, tha e nas dìriche gu ailtireachd microservice agus chan eil comas-gnìomh aige nas miosa na java and go balancers, leithid zuul no traefik.

Clàr coimeas de haproxy/nginx/tosgaire, chan eil e ag ràdh gur e an fhìrinn iomlan a th’ ann, ach tha e a’ toirt dealbh coitcheann.

nginx
sgaoileadh
tosgaire
traefik

rionnagan air github
11.2k / sgàthan
1.1k / sgàthan
12.4k
27.6k

sgrìobhte ann an
C
C
C ++
go

API
sam bith
socaid a-mhàin/putadh
plèana dàta/tarraing
tarraing

sgrùdadh slàinte gnìomhach
sam bith
tha
tha
tha

Lorg fosgailte
plugan taobh a-muigh
sam bith
tha
tha

J.W.T.
plugan taobh a-muigh
sam bith
tha
sam bith

leudachan
Lua/C
Lua/C
Lua/C++
sam bith

Carson

Is e pròiseact òg a tha seo, tha tòrr rudan a dhìth, cuid ann an alpha tràth. Ach tosgaire, cuideachd air sgàth òige, a’ leasachadh gu luath agus tha mòran fheartan inntinneach ann mu thràth: rèiteachadh fiùghantach, mòran sìoltachain deiseil, eadar-aghaidh sìmplidh airson na sìoltachain agad fhèin a sgrìobhadh.
Tha raointean tagraidh a’ leantainn bho seo, ach an toiseach tha 2 antipatterns ann:

  • Ath-chuairteachadh statach.

Is e an fhìrinn gu bheil an-dràsta ann an tosgaire gun taic caching. Tha na balaich Google a’ feuchainn seo a rèiteachadh. Thèid am beachd a chuir an gnìomh aon uair a-staigh tosgaire bidh a h-uile subtleties (cinn-sù) de ghèilleadh RFC, agus airson buileachadh sònraichte a’ dèanamh eadar-aghaidh. Ach airson a-nis chan e eadhon alpha a th’ ann, tha an ailtireachd fo dheasbad, PR fosgailte (fhad ‘s a bha mi a’ sgrìobhadh an artaigil PR, chaidh am PR a reothadh, ach tha a ’phuing seo fhathast buntainneach).

Airson a-nis, cleachd nginx airson statics.

  • Suidheachadh statach.

Faodaidh tu a chleachdadh, ach tosgaire Chan ann airson sin a chaidh a chruthachadh. Cha nochd feartan ann an rèiteachadh statach. Tha mòran amannan ann:

Nuair a bhios tu a’ deasachadh an rèiteachaidh ann an yaml, bidh thu ceàrr, cuir tàir air an luchd-leasachaidh airson briathrachas agus smaoinich gu bheil na configs nginx/haproxy, ged nach eil iad cho structarail, nas pongail. Sin a’ phuing. Chaidh rèiteachadh Nginx agus Haproxy a chruthachadh airson deasachadh le làimh, agus tosgaire airson ginealach bho chòd. Tha an rèiteachadh gu lèir air a mhìneachadh ann an protobuf, ga ghineadh bho fhaidhlichean proto mòran nas duilghe mearachd a dhèanamh.

Mar as trice chan eil suidheachaidhean cleachdadh Canary, b / g agus mòran a bharrachd air an cur an gnìomh ach ann an rèiteachadh fiùghantach. Chan eil mi ag ràdh nach gabh seo a dhèanamh gu staitigeach, bidh sinn uile ga dhèanamh. Ach airson seo feumaidh tu a chuir air crutches, ann an gin de na balancers, a-steach tosgaire gabhail a-steach.

Gnìomhan air a bheil Tosgaire riatanach:

  • Cothromachadh trafaic ann an siostaman iom-fhillte agus fiùghantach. Tha seo a’ toirt a-steach mogal na seirbheis, ach gu riatanach chan e seo an aon fhear.
  • An fheum air gnìomhachd lorg sgaoilte, cead iom-fhillte no gnìomh eile a tha ri fhaighinn tosgaire a-mach às a’ bhogsa no air a chuir an gnìomh gu goireasach, ach ann an nginx / haproxy feumaidh tu a bhith air do chuairteachadh le lua agus plugins amharasach.

Bidh an dà chuid, ma tha sin riatanach, a 'toirt seachad àrd-choileanadh.

Ciamar a tha an obair seo

Tha tosgaire air a chuairteachadh ann am binaries a-mhàin mar ìomhaigh docker. Tha eisimpleir san ìomhaigh mu thràth de rèiteachadh statach. Ach tha ùidh againn ann a-mhàin airson an structar a thuigsinn.

rèiteachadh statach envoy.yaml

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  host_rewrite: www.google.com
                  cluster: service_google
          http_filters:
          - name: envoy.router
  clusters:
  - name: service_google
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    # Comment out the following line to test on v6 networks
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_google
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: www.google.com
                port_value: 443
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
        sni: www.google.com

Rèiteachadh fiùghantach

Dè an duilgheadas a tha sinn a’ coimhead airson fuasgladh? Chan urrainn dhut dìreach an rèiteachadh cothromachaidh luchd ath-luchdachadh fo luchd; èiridh duilgheadasan “beaga”:

  • Dearbhadh rèiteachaidh.

Faodaidh an rèiteachadh a bhith mòr, faodaidh e a bhith gu math mòr, ma chuireas sinn cus thairis air uile aig an aon àm, bidh na cothroman gum bi mearachd an àiteigin ag àrdachadh.

  • Ceanglaichean fad-beatha.

Nuair a thòisicheas tu neach-èisteachd ùr, feumaidh tu aire a thoirt do na ceanglaichean a tha a’ ruith air an t-seann fhear; ma thachras atharrachaidhean gu tric agus gu bheil ceanglaichean fad-ùine ann, feumaidh tu co-rèiteachadh a lorg. Halo, kubernetes a-steach air nginx.

  • Sgrùdaidhean slàinte gnìomhach.

Ma tha sgrùdaidhean slàinte gnìomhach againn, feumaidh sinn sgrùdadh dùbailte a dhèanamh orra uile san config ùr mus cuir sinn trafaic. Ma tha tòrr sruthan shuas, bheir seo ùine. Halo haproxy.

Ciamar a tha seo air a rèiteachadh ann an tosgaireLe bhith a ’luchdachadh an config gu dinamach, a rèir modal an amar, faodaidh tu a roinn ann am pàirtean fa leth agus gun a bhith ag ath-thòiseachadh a’ phàirt nach eil air atharrachadh. Mar eisimpleir, neach-èisteachd, a tha daor a reinitialize agus glè ainneamh atharrachadh.

Rèiteachadh tosgaire (bhon fhaidhle gu h-àrd) aig a bheil na buidhnean a leanas:

  • èisdeachd - neach-èisteachd crochte air ip / port sònraichte
  • aoigheachd mas-fhìor - aoigheachd brìgheil a rèir ainm fearainn
  • slighe - riaghailt cothromachaidh
  • bhagaide - buidheann de shruthan suas le crìochan cothromachaidh
  • aig an deireadh - seòladh eisimpleir shuas an abhainn

Faodar gach aon de na buidhnean sin agus cuid eile a lìonadh a-steach gu dinamach; airson seo, tha an rèiteachadh a’ sònrachadh seòladh na seirbheis às am faighear an config. Faodaidh an t-seirbheis a bhith REST no gRPC, tha gRPC nas fheàrr.

Tha na seirbheisean air an ainmeachadh fa leth: LDS, VHDS, RDS, CDS agus EDS. Faodaidh tu rèiteachadh statach is fiùghantach a chur còmhla, leis a’ chuingealachadh nach urrainnear goireas fiùghantach a shònrachadh ann an tè statach.

Airson a’ mhòr-chuid de ghnìomhan, tha e gu leòr na trì seirbheisean mu dheireadh a chur an gnìomh, canar ADS (Seirbheis Lorg Co-iomlan) riutha), airson java agus falbh tha buileachadh deiseil de phlèana gRPC anns nach fheum thu ach na stuthan bhon stòr agad a lìonadh.

Tha an rèiteachadh anns an fhoirm a leanas:

rèiteachadh fiùghantach envoy.yaml

dynamic_resources:
  ads_config:
    api_type: GRPC
    grpc_services:
      envoy_grpc:
        cluster_name: xds_clr
  cds_config:
    ads: {}
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          rds:
            route_config_name: local_route
            config_source:
              ads: {}
          http_filters:
          - name: envoy.router
  clusters:
  - name: xds_clr
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: xds_clr
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: xds
                port_value: 6565

Aig toiseach tòiseachaidh tosgaire leis an rèiteachadh seo, ceangailidh e ris an itealan smachd agus feuchaidh e ri rèiteachadh RDS, CDS agus EDS iarraidh. Tha mìneachadh mar a tha am pròiseas eadar-obrachaidh a’ tachairt an seo.

Ann an ùine ghoirid, tosgaire a’ cur iarrtas a’ nochdadh an seòrsa goireas a thathar ag iarraidh, dreach agus crìochan an nód. Mar fhreagairt, gheibh e goireas agus dreach; mura h-eil an dreach air an itealan-smachd air atharrachadh, chan eil e a’ freagairt.
Tha 4 roghainnean eadar-obrachaidh ann:

  • Aon sruth gRPC airson a h-uile seòrsa de ghoireasan, tha inbhe iomlan a 'ghoireis air a chuir.
  • Sruthan air leth, làn staid.
  • Aon sruth, staid mean air mhean.
  • Separate streams, staid mean air mhean.

Leigidh xDS mean air mhean dhut trafaic a lughdachadh eadar an itealan-smachd agus tosgaire, tha seo buntainneach airson rèiteachaidhean mòra. Ach tha e a’ dèanamh an eadar-obrachaidh iom-fhillte; tha liosta de ghoireasan anns an iarrtas airson a bhith gun fho-sgrìobhadh agus fo-sgrìobhadh.

Bidh an eisimpleir againn a’ cleachdadh ADS - aon shruth airson RDS, CDS, EDS agus modh neo-mheudach. Gus am modh meudachaidh a chomasachadh, feumaidh tu sònrachadh api_type: DELTA_GRPC

Leis gu bheil paramadairean nòd anns an iarrtas, is urrainn dhuinn diofar ghoireasan a chuir chun phlèana smachd airson diofar shuidheachaidhean tosgaire, tha seo goireasach airson mogal seirbheis a thogail.

Blàthaich suas

air a ' tosgaire aig toiseach tòiseachaidh no nuair a gheibh thu rèiteachadh ùr bhon phlèana smachd, thèid am pròiseas blàthachadh ghoireasan a chuir air bhog. Tha e air a roinn ann an blàthachadh luchd-èisteachd agus blàthachadh brabhsair. Thèid a’ chiad fhear a chuir air bhog nuair a tha atharrachaidhean ann an RDS/LDS, an dàrna fear nuair a bhios CDS/EDS. Tha seo a’ ciallachadh mura h-atharraich ach sruthan shuas, nach tèid an neach-èisteachd ath-chruthachadh.

Rè a 'phròiseas blàthachaidh, thathar a' sùileachadh stòrasan eisimeileach bhon phlèana smachd rè na h-ùine-ama. Ma thachras an ùine a-mach, cha bhith tòiseachadh soirbheachail agus cha tòisich an neach-èisteachd ùr ag èisteachd air a’ phort.
Òrdugh tòiseachaidh: EDS, CDS, sgrùdadh slàinte gnìomhach, RDS, LDS. Le sgrùdaidhean slàinte gnìomhach air an comasachadh, cha tèid trafaic suas an abhainn ach às deidh aon sgrùdadh slàinte soirbheachail.

Ma chaidh an neach-èisteachd ath-chruthachadh, thèid an seann fhear a-steach don staid DRAIN agus thèid a sguabadh às às deidh a h-uile ceangal a dhùnadh no nuair a thig an ùine seachad --drain-time-s, bunaiteach 10 mionaidean.

Airson a leantainn.

Source: www.habr.com

Cuir beachd ann