Megosztás:


Elosztott tranzakciók használata SQL Server Linux-tárolókkal

A következőkre vonatkozik:SQL Server Linux rendszeren

Ez a cikk bemutatja, hogyan állíthat be SQL Server Linux-tárolókat elosztott tranzakciókhoz, beleértve a speciális követelményeket és forgatókönyveket.

Az SQL Server tárolórendszerképei használhatják az elosztott tranzakciókhoz szükséges Microsoft Distributed Transaction Coordinatort (MSDTC). Az MSDTC kommunikációs követelményeinek megismeréséhez tekintse meg A Microsoft Distributed Transaction Coordinator (MSDTC) konfigurálása Linux.

Jegyzet

Az SQL Server 2017 (14.x) alapértelmezés szerint gyökértárolókban fut, míg az SQL Server 2019 (15.x) és újabb tárolók nem gyökérfelhasználóként futnak.

Konfiguráció

Az MSDTC-tranzakciók SQL Server-tárolókban való engedélyezéséhez két új környezeti változót kell beállítania:

  • MSSQL_RPC_PORT: a TCP-port, amelyhez az RPC-végpontleképező szolgáltatás kapcsolódik és figyel.
  • MSSQL_DTC_TCP_PORT: az a port, amelyen az MSDTC szolgáltatás figyelésre van konfigurálva.

Kód lekérése és futtatás

Az alábbi példa bemutatja, hogyan használhatja ezeket a környezeti változókat az MSDTC-hez konfigurált egyetlen SQL Server 2017-tároló lekéréséhez és futtatásához. Ez lehetővé teszi, hogy bármilyen alkalmazással kommunikáljon bármely gazdagépen.

Fontos

A SA_PASSWORD környezeti változó elavult. Használjon inkább MSSQL_SA_PASSWORD.

docker run \
   -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \
   -e 'MSSQL_RPC_PORT=135' -e 'MSSQL_DTC_TCP_PORT=51000' \
   -p 51433:1433 -p 135:135 -p 51000:51000  \
   -d mcr.microsoft.com/mssql/server:2017-latest
docker run `
   -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" `
   -e "MSSQL_RPC_PORT=135" -e "MSSQL_DTC_TCP_PORT=51000" `
   -p 51433:1433 -p 135:135 -p 51000:51000  `
   -d mcr.microsoft.com/mssql/server:2017-latest

Az alábbi példa bemutatja, hogyan használhatja ezeket a környezeti változókat az MSDTC-hez konfigurált egyetlen SQL Server 2019 -tároló (15.x) lekérésére és futtatására. Ez lehetővé teszi, hogy bármilyen alkalmazással kommunikáljon bármely gazdagépen.

Fontos

A SA_PASSWORD környezeti változó elavult. Használjon inkább MSSQL_SA_PASSWORD.

docker run \
   -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<password>' \
   -e 'MSSQL_RPC_PORT=135' -e 'MSSQL_DTC_TCP_PORT=51000' \
   -p 51433:1433 -p 135:135 -p 51000:51000  \
   -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-20.04
docker run `
   -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<password>" `
   -e "MSSQL_RPC_PORT=135" -e "MSSQL_DTC_TCP_PORT=51000" `
   -p 51433:1433 -p 135:135 -p 51000:51000  `
   -d mcr.microsoft.com/mssql/server:2019-GA-ubuntu-20.04

Figyelem!

A jelszónak az SQL Server alapértelmezett jelszóházirendetkell követnie. Alapértelmezés szerint a jelszónak legalább nyolc karakter hosszúnak kell lennie, és a következő négy készletből három karakterből kell állnia: nagybetűk, kisbetűk, 10 számjegyből és szimbólumokból. A jelszavak legfeljebb 128 karakter hosszúak lehetnek. Használjon olyan jelszavakat, amelyek a lehető legkomplexebbek és hosszúak.

Ebben a parancsban a RPC Endpoint Mapper szolgáltatás a 135-ös porthoz van kötve, az MSDTC szolgáltatás pedig a tároló virtuális hálózatán belüli 51000-s porthoz van kötve. Az SQL Server TDS-kommunikáció az 1433-as porton történik, szintén a tároló virtuális hálózatán belül. Ezek a portok a gazdagép számára külsőleg az 51433-as TDS-portként, a 135-ös RPC-végpontleképező portként, és az 51000-es MSDTC-portként vannak kitéve.

Az RPC Endpoint Mapper és az MSDTC portoknak nem kell azonosnak lenniük a gazdagépen és a tárolóban. Így bár az RPC Endpoint Mapper portot 135-re konfigurálták a tárolón, lehetséges, hogy az az 13501-es portra, vagy a gazdagépkiszolgáló bármely más elérhető portjára van leképezve.

A tűzfal konfigurálása

Annak érdekében, hogy a gazdagéppel és a gazdagépen keresztül kommunikálhasson, a gazdagépkiszolgálón található tárolók tűzfalát is konfigurálnia kell. Nyissa meg a tűzfalat minden porton, amelyet az SQL Server-tároló külső kommunikációhoz tesz elérhetővé. Az előző példában ezek a 135-ös, az 51433-as és az 51000-es portok lennének. Ezek a gazdagép saját portjai, nem pedig azok a portok, amelyekhez a konténerben társítják őket. Ha tehát a tároló 51000-hez tartozó RPC-végpontleképező portja a gazdagép 51001-s portjára van leképezve, akkor az 51001-s portot (nem 51000) kell megnyitni a tűzfalon a gazdagéppel való kommunikációhoz.

Az alábbi példa bemutatja, hogyan hozhatja létre ezeket a szabályokat az Ubuntu-on.

sudo ufw allow from any to any port 51433 proto tcp
sudo ufw allow from any to any port 51000 proto tcp
sudo ufw allow from any to any port 135 proto tcp

Az alábbi példa bemutatja, hogyan lehet ezt megtenni Red Hat Enterprise Linuxon (RHEL):

sudo firewall-cmd --zone=public --add-port=51433/tcp --permanent
sudo firewall-cmd --zone=public --add-port=51000/tcp --permanent
sudo firewall-cmd --zone=public --add-port=135/tcp --permanent
sudo firewall-cmd --reload

A portforgalom irányításának konfigurálása a kiszolgálón

Az előző példában, mivel egyetlen SQL Server-tároló a 135-ös RPC-portot a gazdagép 135-ös portjára képezi le, a gazdagéppel elvégzett elosztott tranzakcióknak mostantól további konfiguráció nélkül kellene működniük. A 135-ös portot közvetlenül gyökérként futó tárolókban is használhatja, mivel az SQL Server emelt szintű jogosultságokkal fut ezekben a tárolókban. Tárolón kívüli VAGY nem gyökérszintű SQL Server esetén a tárolóban egy másik rövid élettartamú portot (például 13500) kell használnia, és a 135-ös portra szánt forgalmat ezután erre a portra kell irányítani. Emellett konfigurálnia kell a tárolón belüli port-útválasztási szabályokat a 135-ös tárolóporttól a rövid élettartamú portig.

Ha úgy dönt, hogy a tároló 135-ös portját a gazdagép egy másik portjára (például 13500) rendeli le, akkor konfigurálnia kell a gazdagépen a port útválasztását. Ez lehetővé teszi, hogy az SQL Server-tároló részt vegyen az elosztott tranzakciókban a gazdagéppel és más külső kiszolgálókkal.

További információ az útválasztási portokról: Port-útválasztás konfigurálása.

SQL Server-tárolók MSDTC-vel a Kubernetesen

Ha SQL Server-tárolókat helyez üzembe Egy Kubernetes-platformon, tekintse meg az alábbi YAML-telepítési jegyzéket. Ebben a példában a Kubernetes-platform az Azure Kubernetes Service (AKS).

1. forgatókönyv: AZ SQL Serverhez kubernetes-tárolóban csatlakozó MSDTC-ügyfél

Az alábbi ábra azt a folyamatot mutatja be, amikor egy MSDTC-ügyfél csatlakozik az MSDTC-hez a Kubernetesen futó Linux-tárolón futó SQL Serveren.

Diagram azt a folyamatot mutatja be, amikor egy MSDTC-ügyfél csatlakozik az MSDTC-hez egy Linux-tárolón futó SQL Serveren.

  1. Az MSDTC-ügyfél kapcsolatot létesít a Kubernetes-gazdagép 135-ös portjához.
  2. A rendszer a kapcsolatot a tároló 135-ös portjára továbbítja.
  3. A tároló továbbítja a kapcsolatot az RPC-végpontleképezőhöz, amely ebben a példában az 13500-s porton található.
  4. A végpontleképező tájékoztatja az MSDTC-ügyfelet, hogy melyik porton fut az MSDTC a tárolóban (ebben a példában az 51000-s port).
  5. Az MSDTC-ügyfél közvetlenül csatlakozik az MSDTC-hez a 51000-es porton keresztül, amely a konténeren belül van továbbítva az SQL Serverhez.

2. forgatókönyv: SQL Server csatlakoztatása az SQL Serverhez egy Kubernetes-tárolóban

Az alábbi ábra azt a folyamatot mutatja be, amikor egy SQL Server Linux-tároló csatlakozik az MSDTC-hez egy második SQL Server Linux-tárolón, a Kubernetesen.

Diagram azt a folyamatot mutatja be, amikor egy SQL Server Linux-tároló csatlakozik az MSDTC-hez egy második SQL Server Linux-tárolón.

  1. Az első SQL Server-példány kapcsolatot létesít a 135-ös porttal a második SQL Server-példány Kubernetes-gazdagépén.
  2. A rendszer a kapcsolatot a második példány tárolóján lévő 135-ös portra továbbítja.
  3. A tároló továbbítja a kapcsolatot az RPC-végpontleképezőhöz, amely ebben a példában az 13500-s porton található.
  4. A végpontleképező közli az első SQL Server-példányt, amely az MSDTC portot a második tárolóban futtatja (ebben a példában az 51000-s port).
  5. Az első SQL Server-példány közvetlenül az MSDTC-vel létesít kapcsolatot a második példányon, és csatlakozik az 51000-s porton lévő második gazdagéphez, amelyet a tárolón belül továbbít az SQL Servernek.

SQL Server-tárolók üzembe helyezése Kubernetes-platformon konfigurált MSDTC-vel

A mintatelepítési YAML-szkript futtatása előtt hozza létre a sa jelszó tárolásához szükséges titkos kulcsot az alábbi példaparancs használatával:

kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="<password>"

Figyelem!

A jelszónak az SQL Server alapértelmezett jelszóházirendetkell követnie. Alapértelmezés szerint a jelszónak legalább nyolc karakter hosszúnak kell lennie, és a következő négy készletből három karakterből kell állnia: nagybetűk, kisbetűk, 10 számjegyből és szimbólumokból. A jelszavak legfeljebb 128 karakter hosszúak lehetnek. Használjon olyan jelszavakat, amelyek a lehető legkomplexebbek és hosszúak.

A jegyzékfájlban a következő pontok láthatóak:

  1. A fürtben a következő objektumokat hozzuk létre: StorageClass, két SQL Server-pod üzembe helyezése statefulset implementációként, valamint két terheléselosztó szolgáltatás a megfelelő SQL Server-példányokhoz való csatlakozáshoz.

  2. Azt is láthatja, hogy a terheléselosztó szolgáltatásai statikus IP-címekkel vannak üzembe helyezve, amelyek az Azure Kubernetes Service-ben konfigurálhatók. Lásd: Statikus nyilvános IP-cím és DNS-címke használata az Azure Kubernetes Service (AKS) terheléselosztóval. A terheléselosztó-szolgáltatások statikus IP-címekkel való létrehozása biztosítja, hogy a külső IP-cím ne változzon, ha a terheléselosztó szolgáltatást törölték és újra létrehozták.

  3. A következő szkriptben láthatja, hogy az 13500-s portot a MSSQL_RPC_PORT környezeti változóhoz, az 51000-s portot pedig az MSSQL_DTC_TCP_PORT környezeti változóhoz használják, mindkettőre szükség van az MSDTC-hez.

  4. A port útválasztása (azaz a 135–13500-as útválasztási port) a terheléselosztó szkriptjében van konfigurálva a port és a targetPort megfelelő konfigurálásával, ahogyan az a következő példában látható:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
     name: azure-disk
provisioner: kubernetes.io/azure-disk
parameters:
  storageaccounttype: Standard_LRS
  kind: Managed
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
 name: mssql
 labels:
  app: mssql
spec:
 serviceName: "mssql"
 replicas: 2
 selector:
  matchLabels:
   app: mssql
 template:
  metadata:
   labels:
    app: mssql
  spec:
   securityContext:
     fsGroup: 10001
   containers:
   - name: mssql
     image: mcr.microsoft.com/mssql/server:2019-latest
     ports:
     - containerPort: 1433
       name: tcpsql
     - containerPort: 13500
       name: dtcport
     - containerPort: 51000
       name: dtctcpport
     env:
     - name: ACCEPT_EULA
       value: "Y"
     - name: MSSQL_ENABLE_HADR
       value: "1"
     - name: MSSQL_AGENT_ENABLED
       value: "1"
     - name: MSSQL_RPC_PORT
       value: "13500"
     - name: MSSQL_DTC_TCP_PORT
       value: "51000"
     - name: MSSQL_SA_PASSWORD
       valueFrom:
         secretKeyRef:
          name: mssql
          key: MSSQL_SA_PASSWORD
     volumeMounts:
     - name: mssql
       mountPath: "/var/opt/mssql"
 volumeClaimTemplates:
   - metadata:
      name: mssql
     spec:
      accessModes:
      - ReadWriteOnce
      resources:
       requests:
        storage: 8Gi
---
apiVersion: v1
kind: Service
metadata:
  name: mssql-0
spec:
  type: LoadBalancer
  loadBalancerIP: 10.88.213.209
  selector:
    statefulset.kubernetes.io/pod-name: mssql-0
  ports:
  - protocol: TCP
    port: 1433
    targetPort: 1433
    name: tcpsql
  - protocol: TCP
    port: 51000
    targetPort: 51000
    name: dtctcpport
  - protocol: TCP
    port: 135
    targetPort: 13500
    name: nonrootport
---
apiVersion: v1
kind: Service
metadata:
  name: mssql-1
spec:
  type: LoadBalancer
  loadBalancerIP: 10.72.137.129
  selector:
    statefulset.kubernetes.io/pod-name: mssql-1
  ports:
  - protocol: TCP
    port: 1433
    targetPort: 1433
    name: tcpsql
  - protocol: TCP
    port: 51000
    targetPort: 51000
    name: dtctcpport
  - protocol: TCP
    port: 135
    targetPort: 13500
    name: nonrootport

Feltéve, hogy az erőforrást az alapértelmezett névtérben hozta létre, amikor az előző üzembe helyezés után futtatja a kubectl get all parancsot az összes létrehozott erőforrás megtekintéséhez, az alábbi példában látható kimenetnek kell megjelennie.

NAME          READY   STATUS    RESTARTS   AGE
pod/mssql-0   1/1     Running   0          4d22h
pod/mssql-1   1/1     Running   0          4d22h

NAME                 TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                                        AGE
service/kubernetes   ClusterIP      10.0.0.1      <none>          443/TCP                                        6d6h
service/mssql-0      LoadBalancer   10.0.18.186   10.88.213.209   1433:31875/TCP,51000:31219/TCP,135:30044/TCP   2d6h
service/mssql-1      LoadBalancer   10.0.16.180   10.72.137.129   1433:30353/TCP,51000:32734/TCP,135:31239/TCP   2d6h

NAME                     READY   AGE
statefulset.apps/mssql   2/2     5d1h

Az olyan eszközök, mint az SQL Server Management Studio (SSMS) segítségével csatlakozhat az előző két SQL Server-példányhoz, és futtathat egy minta DTC-tranzakciót. Ebben a példában csatlakozik a mssql-1 (10.72.137.129) és létrehozza a csatolt kiszolgálót a mssql-0 (10.88.213.209) számára az elosztott tranzakció futtatásához, ahogyan az az alábbi példában látható.

USE [master];
GO

EXECUTE master.dbo.sp_addlinkedserver
    @server = N'10.88.213.209',
    @srvproduct = N'SQL Server';
GO

EXECUTE master.dbo.sp_addlinkedsrvlogin
    @rmtsrvname = N'10.88.213.209',
    @rmtuser = 'sa',
    @rmtpassword = '<password>',
    @useself = N'False';
GO

Figyelem!

A jelszónak az SQL Server alapértelmezett jelszóházirendetkell követnie. Alapértelmezés szerint a jelszónak legalább nyolc karakter hosszúnak kell lennie, és a következő négy készletből három karakterből kell állnia: nagybetűk, kisbetűk, 10 számjegyből és szimbólumokból. A jelszavak legfeljebb 128 karakter hosszúak lehetnek. Használjon olyan jelszavakat, amelyek a lehető legkomplexebbek és hosszúak.

Most már elindíthatja az elosztott tranzakciót, és ez a kódminta megmutatja a sys.sysprocesses-t a mssql-0 példányból.

SET XACT_ABORT ON;

BEGIN DISTRIBUTED TRANSACTION;

SELECT *
FROM [10.88.213.209].master.dbo.sysprocesses;

COMMIT TRANSACTION;
GO