Bagikan melalui


Cara menggunakan transaksi terdistribusi dengan kontainer SQL Server Linux

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.

Diagram memperlihatkan proses saat klien MSDTC tersambung ke MSDTC di SQL Server yang berjalan di dalam kontainer Linux.

  1. Klien MSDTC membuat koneksi ke port 135 pada host Kubernetes.
  2. Koneksi diteruskan ke port 135 pada kontainer.
  3. Kontainer meneruskan koneksi ke pemeta titik akhir RPC, yang ada di port 13500 dalam contoh ini.
  4. Pemeta titik akhir memberi tahu klien MSDTC port MSDTC mana yang berjalan di dalam kontainer (port 51000 dalam contoh ini).
  5. 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.

Diagram memperlihatkan proses ketika satu kontainer SQL Server Linux tersambung ke MSDTC pada kontainer Linux SQL Server kedua.

  1. Instans SQL Server pertama membuat koneksi ke port 135 pada host Kubernetes dari instans SQL Server kedua.
  2. Koneksi diteruskan ke port 135 pada kontainer instans kedua.
  3. Kontainer meneruskan koneksi ke pemeta titik akhir RPC, yang ada di port 13500 dalam contoh ini.
  4. Pemeta titik akhir memberi tahu instans SQL Server pertama port MSDTC mana yang berjalan di dalam kontainer kedua (port 51000 dalam contoh ini).
  5. 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:

  1. Dalam kluster, kami membuat objek berikut: StorageClass, dua pod SQL Server yang disebarkan sebagai deployment statefulset, dan dua layanan penyeimbang beban untuk terhubung ke masing-masing instans SQL Server.

  2. 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.

  3. Dalam skrip berikut, Anda dapat melihat bahwa port 13500 digunakan untuk MSSQL_RPC_PORT variabel lingkungan, dan port 51000 untuk MSSQL_DTC_TCP_PORT variabel lingkungan, yang keduanya diperlukan untuk MSDTC.

  4. Perutean port (yaitu, port perutean 135 hingga 13500) dikonfigurasi dalam skrip load balancer dengan mengonfigurasi port dan targetPort dengan 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