Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server – Linux
Tento článek vysvětluje, jak nastavit kontejnery SQL Serveru Linux pro distribuované transakce, včetně zvláštních požadavků a scénářů.
Kontejnerové image SQL Serveru mohou používat Microsoft Distributed Transaction Coordinator (MSDTC), který je vyžadován pro distribuované transakce. Pokud chcete porozumět požadavkům na komunikaci pro MSDTC, přečtěte si téma Jak nakonfigurovat Microsoft Distributed Transaction Coordinator (MSDTC) v Linuxu.
Poznámka
SQL Server 2017 (14.x) běží ve výchozím nastavení v kořenových kontejnerech, zatímco SQL Server 2019 (15.x) a novější kontejnery běží jako uživatel, který není root.
Konfigurace
Chcete-li povolit transakci MSDTC v kontejnerech SQL Serveru, musíte nastavit dvě nové proměnné prostředí:
-
MSSQL_RPC_PORT: port TCP, ke kterému se služba mapování koncových bodů RPC připojuje a naslouchá. -
MSSQL_DTC_TCP_PORT: port, na který je služba MSDTC nakonfigurovaná tak, aby naslouchala.
Stáhnout a spustit
Následující příklad ukazuje, jak pomocí těchto proměnných prostředí vyžádat a spustit jeden kontejner SQL Serveru 2017 nakonfigurovaný pro MSDTC. Díky tomu může komunikovat s libovolnou aplikací na všech hostitelích.
Důležitý
Proměnná prostředí SA_PASSWORD je zastaralá. Místo toho použijte 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
Následující příklad ukazuje, jak pomocí těchto proměnných prostředí vyžádat a spustit jeden kontejner SQL Serveru 2019 (15.x) nakonfigurovaný pro MSDTC. Díky tomu může komunikovat s libovolnou aplikací na všech hostitelích.
Důležitý
Proměnná prostředí SA_PASSWORD je zastaralá. Místo toho použijte 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
Opatrnost
Vaše heslo by mělo postupovat podle výchozích zásad hesel SQL Serveru . Ve výchozím nastavení musí heslo obsahovat alespoň osm znaků a musí obsahovat znaky ze tří z následujících čtyř sad: velká písmena, malá písmena, číslice se základem 10 a symboly. Hesla můžou mít délku až 128 znaků. Používejte hesla, která jsou co nejdéle a složitá.
V tomto příkazu je služba mapovač koncového bodu RPC vázána na port 135 a služba MSDTC je vázaná na port 51000 ve virtuální síti kontejneru. Komunikace TDS SQL Serveru probíhá také na portu 1433, a to také ve virtuální síti kontejneru. Tyto porty jsou externě zpřístupněny hostiteli jako TDS port 51433, port mapovač koncového bodu RPC 135 a port MSDTC 51000.
Mapovač koncových bodů RPC a port MSDTC nemusí být na hostiteli a kontejneru stejný. Takže zatímco byl port Mapper koncového bodu RPC nakonfigurovaný na 135 v kontejneru, mohl by být mapován na port 13501 nebo jakýkoli jiný dostupný port na hostitelském serveru.
Nakonfigurujte bránu firewall
Aby bylo možné komunikovat s hostitelem a prostřednictvím hostitele, musíte také nakonfigurovat bránu firewall na hostitelském serveru pro kontejnery. Otevřete bránu firewall pro všechny porty, které kontejner SQL Serveru zveřejňuje pro externí komunikaci. V předchozím příkladu by to byly porty 135, 51433 a 51000. Jedná se o porty samotného hostitele, nikoli porty, na které se mapují v kontejneru. Pokud je port mapovače koncového bodu RPC 51000 kontejneru mapován na port 51001 hostitele, měl by být v bráně firewall pro komunikaci s hostitelem otevřen port 51001 (a ne 51000).
Následující příklad ukazuje, jak vytvořit tato pravidla v Ubuntu.
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
Následující příklad ukazuje, jak to lze provést v Red Hat Enterprise Linuxu (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
Konfigurace směrování portů na hostiteli
V předchozím příkladu by distribuované transakce s hostitelem nyní měly fungovat bez další konfigurace, jelikož jeden kontejner SQL Server mapuje port RPC 135 na port 135 hostitele. Port 135 je možné použít přímo v kontejnerech spuštěných jako kořen, protože SQL Server běží se zvýšenými oprávněními v těchto kontejnerech. Pro SQL Server mimo kontejner nebo pro jiné než kořenové kontejnery musíte v kontejneru použít jiný dočasný port (například 13500) a provoz určený pro port 135 se pak musí směrovat na tento port. Musíte také nakonfigurovat pravidla směrování portů v rámci kontejneru z portu kontejneru 135 na dočasný port.
Pokud se také rozhodnete namapovat port kontejneru 135 na jiný port hostitele, například 13500, musíte nakonfigurovat směrování portů na hostiteli. To umožňuje kontejner SQL Serveru účastnit se distribuovaných transakcí s hostitelem a dalšími externími servery.
Další informace o portech směrování najdete v tématu Konfigurace směrování portů.
Kontejnery SQL Serveru s MSDTC v Kubernetes
Pokud nasazujete kontejnery SQL Serveru na platformu Kubernetes, podívejte se na následující příklad manifestu nasazení YAML. V tomto příkladu je platforma Kubernetes Azure Kubernetes Service (AKS).
Scénář 1: Klient MSDTC, který se připojuje k SQL Serveru v kontejneru Kubernetes
Následující diagram znázorňuje proces, kdy se klient MSDTC připojí k MSDTC na SQL Serveru spuštěném v kontejneru Linuxu v Kubernetes.
- Klient MSDTC vytvoří připojení k portu 135 na hostiteli Kubernetes.
- Připojení se přesměruje na port 135 v kontejneru.
- Kontejner předá připojení mapovači koncového bodu RPC, který je v tomto příkladu na portu 13500.
- Mapovač koncového bodu říká klientovi MSDTC, který port MSDTC běží uvnitř kontejneru (v tomto příkladu port 51000).
- Klient MSDTC se přímo připojí k MSDTC tím, že se připojí k hostu na portu 51000, což je přesměrováno na SQL Server uvnitř kontejneru.
Scénář 2: Připojení SQL Serveru k SQL Serveru v kontejneru Kubernetes
Následující diagram znázorňuje proces, kdy se jeden kontejner SQL Serveru s Linuxem připojí k MSDTC v druhém kontejneru SQL Serveru Linux v Kubernetes.
- První instance SQL Serveru vytvoří připojení k portu 135 na hostiteli Kubernetes druhé instance SQL Serveru.
- Připojení se přesměruje na port 135 v kontejneru druhé instance.
- Kontejner předá připojení mapovači koncového bodu RPC, který je v tomto příkladu na portu 13500.
- Mapovač koncového bodu řekne první instanci SQL Serveru, který port MSDTC běží uvnitř druhého kontejneru (v tomto příkladu port 51000).
- První instance SQL Serveru vytvoří připojení přímo k MSDTC na druhé instanci připojením k druhému hostiteli na portu 51000, který se předá SQL Serveru uvnitř kontejneru.
Nasazení kontejnerů SQL Serveru s nakonfigurovaným MSDTC na platformě Kubernetes
Před spuštěním skriptu YAML ukázkového nasazení vytvořte pomocí následujícího příkladu tajný klíč pro uložení sa hesla:
kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="<password>"
Opatrnost
Vaše heslo by mělo postupovat podle výchozích zásad hesel SQL Serveru . Ve výchozím nastavení musí heslo obsahovat alespoň osm znaků a musí obsahovat znaky ze tří z následujících čtyř sad: velká písmena, malá písmena, číslice se základem 10 a symboly. Hesla můžou mít délku až 128 znaků. Používejte hesla, která jsou co nejdéle a složitá.
V souboru manifestu si všimnete následujících bodů:
V clusteru vytvoříme následující objekty:
StorageClass, dva pody pro SQL Server nasazené jako nasazenístatefulseta dvě služby vyrovnávání zatížení pro připojení k příslušným instancím SQL Serveru.Všimněte si také, že služby nástroje pro vyrovnávání zatížení se nasazují se statickými IP adresami, které je možné nakonfigurovat ve službě Azure Kubernetes Service. Viz Použití statické veřejné IP adresy a popisku DNS s vyrovnávačem zatížení služby Azure Kubernetes (AKS). Vytvoření služeb nástroje pro vyrovnávání zatížení se statickými IP adresami zajistí, že se externí IP adresa nezmění, pokud se služba nástroje pro vyrovnávání zatížení odstraní a znovu vytvoří.
V následujícím skriptu vidíte, že port 13500 se používá pro proměnnou prostředí
MSSQL_RPC_PORTa port 51000 pro proměnnou prostředíMSSQL_DTC_TCP_PORT, z nichž obě jsou požadovány pro MSDTC.Směrování portů (to znamená směrování portu 135 až 13500) je nakonfigurované ve skriptu nástroje pro vyrovnávání zatížení tím, že odpovídajícím způsobem nakonfigurujete
portatargetPort, jak je znázorněno v následujícím příkladu:
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
Za předpokladu, že jste prostředek vytvořili ve výchozím oboru názvů, po spuštění příkazu kubectl get all po předchozím nasazení se zobrazí všechny vytvořené prostředky, měli byste vidět výstup zobrazený v následujícím příkladu.
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
Pomocí nástrojů, jako je SQL Server Management Studio (SSMS), se můžete připojit k některé z předchozích dvou instancí SQL Serveru a spustit ukázkovou transakci DTC. V tomto příkladu se připojíte k mssql-1 (10.72.137.129) a vytvoříte propojený server pro mssql-0 (10.88.213.209), aby se spustila distribuovaná transakce, jak je znázorněno v následujícím příkladu.
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
Opatrnost
Vaše heslo by mělo postupovat podle výchozích zásad hesel SQL Serveru . Ve výchozím nastavení musí heslo obsahovat alespoň osm znaků a musí obsahovat znaky ze tří z následujících čtyř sad: velká písmena, malá písmena, číslice se základem 10 a symboly. Hesla můžou mít délku až 128 znaků. Používejte hesla, která jsou co nejdéle a složitá.
Teď můžete spustit distribuovanou transakci a v této ukázce kódu se zobrazí sys.sysprocesses z instance mssql-0:
SET XACT_ABORT ON;
BEGIN DISTRIBUTED TRANSACTION;
SELECT *
FROM [10.88.213.209].master.dbo.sysprocesses;
COMMIT TRANSACTION;
GO