Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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.
- Az MSDTC-ügyfél kapcsolatot létesít a Kubernetes-gazdagép 135-ös portjához.
- A rendszer a kapcsolatot a tároló 135-ös portjára továbbítja.
- 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ó.
- 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).
- 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.
- 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.
- A rendszer a kapcsolatot a második példány tárolóján lévő 135-ös portra továbbítja.
- 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ó.
- 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).
- 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:
A fürtben a következő objektumokat hozzuk létre:
StorageClass, két SQL Server-pod üzembe helyezésestatefulsetimplementációként, valamint két terheléselosztó szolgáltatás a megfelelő SQL Server-példányokhoz való csatlakozáshoz.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.
A következő szkriptben láthatja, hogy az 13500-s portot a
MSSQL_RPC_PORTkörnyezeti változóhoz, az 51000-s portot pedig azMSSQL_DTC_TCP_PORTkörnyezeti változóhoz használják, mindkettőre szükség van az MSDTC-hez.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 atargetPortmegfelelő 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