Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk:SQL Server di Linux
Artikel ini menjelaskan cara menyiapkan kontainer SQL Server Linux untuk transaksi terdistribusi, termasuk persyaratan dan skenario khusus.
Gambar kontainer SQL Server dapat menggunakan Koordinator Transaksi Terdistribusi Microsoft (MSDTC), yang diperlukan untuk transaksi terdistribusi. Untuk memahami persyaratan komunikasi untuk MSDTC, lihat Cara mengonfigurasi Koordinator Transaksi Terdistribusi Microsoft (MSDTC) di Linux.
Catatan
SQL Server 2017 (14.x) berjalan dalam kontainer root secara default, sedangkan SQL Server 2019 (15.x) dan kontainer yang lebih baru berjalan sebagai pengguna non-root.
Konfigurasi
Untuk mengaktifkan transaksi MSDTC dalam kontainer SQL Server, Anda harus mengatur dua variabel lingkungan baru:
-
MSSQL_RPC_PORT: port TCP yang digunakan dan dipantau oleh layanan pemeta titik akhir RPC. -
MSSQL_DTC_TCP_PORT: port tempat layanan MSDTC dikonfigurasi untuk mendengarkan.
Tarik dan jalankan
Contoh berikut menunjukkan cara menggunakan variabel lingkungan ini untuk menarik dan menjalankan satu kontainer SQL Server 2017 yang dikonfigurasi untuk MSDTC. Ini memungkinkannya untuk berkomunikasi dengan aplikasi apa pun pada host apa pun.
Penting
Variabel SA_PASSWORD lingkungan tidak digunakan lagi. Gunakan MSSQL_SA_PASSWORD sebagai gantinya.
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
Contoh berikut menunjukkan cara menggunakan variabel lingkungan ini untuk menarik dan menjalankan satu kontainer SQL Server 2019 (15.x) yang dikonfigurasi untuk MSDTC. Ini memungkinkannya untuk berkomunikasi dengan aplikasi apa pun pada host apa pun.
Penting
Variabel SA_PASSWORD lingkungan tidak digunakan lagi. Gunakan MSSQL_SA_PASSWORD sebagai gantinya.
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
Perhatian
Kata sandi Anda harus mengikuti kebijakan kata sandi default SQL Server. Secara default, kata sandi harus panjangnya minimal delapan karakter dan berisi karakter dari tiga dari empat set berikut: huruf besar, huruf kecil, digit dasar-10, dan simbol. Panjang kata sandi bisa hingga 128 karakter. Gunakan kata sandi yang panjang dan kompleks mungkin.
Dalam perintah ini, layanan RPC Endpoint Mapper terikat ke port 135, dan layanan MSDTC terikat ke port 51000 dalam jaringan virtual kontainer. Komunikasi TDS SQL Server terjadi pada port 1433, juga dalam jaringan virtual kontainer. Port ini secara eksternal diekspos ke host sebagai port TDS 51433, port pemeta titik akhir RPC 135, dan port MSDTC 51000.
Rpc Endpoint Mapper dan port MSDTC tidak harus sama pada host dan kontainer. Jadi sementara port RPC Endpoint Mapper dikonfigurasi menjadi 135 pada kontainer, itu berpotensi dipetakan ke port 13501 atau port lain yang tersedia di server host.
Mengonfigurasi firewall
Untuk berkomunikasi dengan dan melalui host, Anda juga harus mengonfigurasi firewall di server host untuk kontainer. Buka firewall untuk semua port yang diekspos kontainer SQL Server untuk komunikasi eksternal. Dalam contoh sebelumnya, ini adalah port 135, 51433, dan 51000. Ini adalah port pada host itu sendiri dan bukan port yang mereka petakan dalam kontainer. Jadi, jika port pemeta titik akhir RPC 51000 kontainer dipetakan ke port host 51001, maka port 51001 (bukan 51000) harus dibuka di firewall untuk komunikasi dengan host.
Contoh berikut menunjukkan cara membuat aturan ini di 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
Contoh berikut menunjukkan bagaimana hal ini dapat dilakukan di Red Hat Enterprise Linux (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
Mengonfigurasi perutean port pada host
Dalam contoh sebelumnya, karena satu kontainer SQL Server memetakan port RPC 135 ke port 135 pada host, transaksi terdistribusi dengan host sekarang harus berfungsi tanpa konfigurasi lebih lanjut. Dimungkinkan untuk menggunakan port 135 langsung dalam kontainer yang berjalan sebagai root, karena SQL Server berjalan dengan hak istimewa yang ditingkatkan dalam kontainer tersebut. Untuk SQL Server di luar kontainer atau untuk kontainer non-root, Anda harus menggunakan port ephemeral yang berbeda (misalnya 13500) dalam kontainer, dan lalu lintas yang ditujukan untuk port 135 kemudian harus dirutekan ke port tersebut. Anda juga perlu mengonfigurasi aturan perutean port dalam kontainer dari port kontainer 135 ke port sementara.
Selain itu, jika Anda memutuskan untuk memetakan port kontainer 135 ke port yang berbeda pada host, seperti 13500, maka Anda harus mengonfigurasi perutean port pada host. Ini memungkinkan kontainer SQL Server untuk berpartisipasi dalam transaksi terdistribusi dengan host dan dengan server eksternal lainnya.
Untuk informasi selengkapnya tentang perutean port, lihat Konfigurasi perutean port.
Kontainer SQL Server dengan MSDTC di Kubernetes
Jika Anda menyebarkan kontainer SQL Server pada platform Kubernetes, lihat contoh manifes penyebaran YAML berikut. Dalam contoh ini, platform Kubernetes adalah Azure Kubernetes Service (AKS).
Skenario 1: Klien MSDTC yang terhubung ke SQL Server dalam kontainer Kubernetes
Diagram berikut menunjukkan proses ketika klien MSDTC terhubung ke MSDTC di SQL Server yang berjalan di dalam kontainer Linux di Kubernetes.
- Klien MSDTC membuat koneksi ke port 135 pada host Kubernetes.
- Koneksi diteruskan ke port 135 pada kontainer.
- Kontainer meneruskan koneksi ke pemeta titik akhir RPC, yang ada di port 13500 dalam contoh ini.
- Pemeta titik akhir memberi tahu klien MSDTC port MSDTC mana yang berjalan di dalam kontainer (port 51000 dalam contoh ini).
- Klien MSDTC membuat koneksi langsung ke MSDTC dengan menyambungkan ke host pada port 51000, yang diteruskan ke SQL Server di dalam kontainer.
Skenario 2: SQL Server yang terhubung ke SQL Server dalam kontainer Kubernetes
Diagram berikut menunjukkan proses ketika satu kontainer SQL Server Linux terhubung ke MSDTC pada kontainer Linux SQL Server kedua, pada Kubernetes.
- Instans SQL Server pertama membuat koneksi ke port 135 pada host Kubernetes dari instans SQL Server kedua.
- Koneksi diteruskan ke port 135 pada kontainer instans kedua.
- Kontainer meneruskan koneksi ke pemeta titik akhir RPC, yang ada di port 13500 dalam contoh ini.
- Pemeta titik akhir memberi tahu instans SQL Server pertama port MSDTC mana yang berjalan di dalam kontainer kedua (port 51000 dalam contoh ini).
- Instans SQL Server pertama membuat koneksi langsung ke MSDTC pada instans kedua, dengan menyambungkan ke host kedua pada port 51000, yang diteruskan ke SQL Server di dalam kontainer.
Menyebarkan kontainer SQL Server dengan MSDTC yang dikonfigurasi pada platform Kubernetes
Sebelum menjalankan contoh skrip YAML penyebaran, buat rahasia akses yang diperlukan untuk menyimpan kata sandi sa, dengan menggunakan perintah berikut ini sebagai contoh:
kubectl create secret generic mssql --from-literal=MSSQL_SA_PASSWORD="<password>"
Perhatian
Kata sandi Anda harus mengikuti kebijakan kata sandi default SQL Server. Secara default, kata sandi harus panjangnya minimal delapan karakter dan berisi karakter dari tiga dari empat set berikut: huruf besar, huruf kecil, digit dasar-10, dan simbol. Panjang kata sandi bisa hingga 128 karakter. Gunakan kata sandi yang panjang dan kompleks mungkin.
Anda melihat poin-poin berikut dalam file manifes:
Dalam kluster, kami membuat objek berikut:
StorageClass, dua pod SQL Server yang disebarkan sebagai deploymentstatefulset, dan dua layanan penyeimbang beban untuk terhubung ke masing-masing instans SQL Server.Anda juga melihat bahwa layanan load balancer disebarkan dengan alamat IP statis, yang dapat dikonfigurasi pada Azure Kubernetes Service. Lihat Gunakan alamat IP publik statis dan label DNS dengan load balancer Azure Kubernetes Service (AKS). Membuat layanan load balancer dengan alamat IP statis memastikan bahwa alamat IP eksternal tidak berubah jika layanan load balancer dihapus dan dibuat ulang.
Dalam skrip berikut, Anda dapat melihat bahwa port 13500 digunakan untuk
MSSQL_RPC_PORTvariabel lingkungan, dan port 51000 untukMSSQL_DTC_TCP_PORTvariabel lingkungan, yang keduanya diperlukan untuk MSDTC.Perutean port (yaitu, port perutean 135 hingga 13500) dikonfigurasi dalam skrip load balancer dengan mengonfigurasi
portdantargetPortdengan tepat seperti yang ditunjukkan dalam contoh berikut:
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
Dengan asumsi Anda membuat sumber daya di namespace default, saat Anda menjalankan kubectl get all perintah setelah penyebaran sebelumnya untuk melihat semua sumber daya yang dibuat, Anda akan melihat output yang ditampilkan dalam contoh berikut.
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
Anda dapat menggunakan alat seperti SQL Server Management Studio (SSMS) untuk menyambungkan ke salah satu dari dua instans SQL Server sebelumnya dan menjalankan sampel transaksi DTC. Dalam contoh ini, Anda tersambung ke mssql-1 (10.72.137.129) dan membuat server tertaut ke mssql-0 (10.88.213.209) untuk menjalankan transaksi terdistribusi, seperti yang ditunjukkan dalam contoh berikut.
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
Perhatian
Kata sandi Anda harus mengikuti kebijakan kata sandi default SQL Server. Secara default, kata sandi harus panjangnya minimal delapan karakter dan berisi karakter dari tiga dari empat set berikut: huruf besar, huruf kecil, digit dasar-10, dan simbol. Panjang kata sandi bisa hingga 128 karakter. Gunakan kata sandi yang panjang dan kompleks mungkin.
Sekarang Anda dapat memulai transaksi terdistribusi, dan sampel kode ini menunjukkan sys.sysprocesses dari instans mssql-0:
SET XACT_ABORT ON;
BEGIN DISTRIBUTED TRANSACTION;
SELECT *
FROM [10.88.213.209].master.dbo.sysprocesses;
COMMIT TRANSACTION;
GO