Aracılığıyla paylaş


Dağıtılmış işlemler SQL Server Linux kapsayıcılarıyla kullanımı

Şunlar için geçerlidir:Linux üzerinde SQL Server

Bu makalede, özel gereksinimler ve senaryolar da dahil olmak üzere dağıtılmış işlemler için SQL Server Linux kapsayıcılarının nasıl ayarlanacağı açıklanmaktadır.

SQL Server kapsayıcı görüntüleri, dağıtılmış işlemler için gereken Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MSDTC) kullanabilir. MSDTC'nin iletişim gereksinimlerini anlamak için bkz. Linux üzerinde Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MSDTC) yapılandırma.

Not

SQL Server 2017 (14.x) varsayılan olarak kök kapsayıcılarda çalışırken, SQL Server 2019 (15.x) ve üzeri kapsayıcılar kök olmayan bir kullanıcı olarak çalışır.

Konfigürasyon

SQL Server kapsayıcılarında MSDTC işlemini etkinleştirmek için iki yeni ortam değişkeni ayarlamanız gerekir:

  • MSSQL_RPC_PORT: RPC uç nokta eşleyici hizmetinin bağlandığı ve dinlediği TCP bağlantı noktası.
  • MSSQL_DTC_TCP_PORT: MSDTC hizmetinin dinlemek üzere yapılandırıldığı bağlantı noktası.

Çekme ve çalıştırma

Aşağıdaki örnekte, MSDTC için yapılandırılmış tek bir SQL Server 2017 kapsayıcısını çekmek ve çalıştırmak için bu ortam değişkenlerinin nasıl kullanılacağı gösterilmektedir. Bu, herhangi bir ana bilgisayar üzerindeki herhangi bir uygulamayla iletişim kurmasına olanak tanır.

Önemli

SA_PASSWORD ortam değişkeni kullanım dışıdır. Bunun yerine MSSQL_SA_PASSWORD kullanın.

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

Aşağıdaki örnekte, MSDTC için yapılandırılmış tek bir SQL Server 2019 (15.x) kapsayıcısını çekmek ve çalıştırmak için bu ortam değişkenlerinin nasıl kullanılacağı gösterilmektedir. Bu, herhangi bir ana bilgisayar üzerindeki herhangi bir uygulamayla iletişim kurmasına olanak tanır.

Önemli

SA_PASSWORD ortam değişkeni kullanım dışıdır. Bunun yerine MSSQL_SA_PASSWORD kullanın.

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

Dikkat

Parolanız, SQL Server varsayılanparola ilkesine uygun olmalıdır. Varsayılan olarak, parola en az sekiz karakter uzunluğunda olmalı ve şu dört kümeden üçünün karakterlerini içermelidir: büyük harfler, küçük harfler, 10 tabanındaki basamaklar ve simgeler. Parolalar en çok 128 karakter uzunluğunda olabilir. Mümkün olduğunca uzun ve karmaşık parolalar kullanın.

Bu komutta, RPC Uç Nokta Eşleyicisi hizmeti 135 numaralı bağlantı noktasına ve MSDTC hizmeti de kapsayıcının sanal ağındaki 51000 numaralı bağlantı noktasına bağlıdır. SQL Server TDS iletişimi, kapsayıcının sanal ağı içinde de 1433 numaralı bağlantı noktasında gerçekleşir. Bu bağlantı noktaları harici olarak konağa TDS bağlantı noktası 51433, RPC uç nokta eşleyici bağlantı noktası 135 ve MSDTC bağlantı noktası 51000 olarak sunulur.

RPC Uç Nokta Eşleyicisi ve MSDTC bağlantı noktasının konakta ve kapsayıcıda aynı olması gerekmez. Bu nedenle RPC Uç Nokta Eşleyicisi bağlantı noktası kapsayıcıda 135 olarak yapılandırılmış olsa da, 13501 numaralı bağlantı noktasına veya konak sunucusundaki diğer kullanılabilir bağlantı noktalarına eşlenebilir.

Güvenlik duvarını yapılandırma

Konak ile ve aracılığıyla iletişim kurmak için, kapsayıcılar için konak sunucusunda güvenlik duvarını da yapılandırmanız gerekir. SQL Server kapsayıcısının dış iletişim için kullanıma açtığı tüm bağlantı noktaları için güvenlik duvarını açın. Önceki örnekte bu 135, 51433 ve 51000 bağlantı noktaları olacaktır. Bunlar, konağın kendisindeki bağlantı noktalarıdır, kapsayıcıda eşledikleri bağlantı noktaları değil. Bu nedenle, kapsayıcının RPC uç noktası eşleyici bağlantı noktası 51000 konağın bağlantı noktası 51001 ile eşlendiyse, konakla iletişim için güvenlik duvarında 51001 numaralı bağlantı noktası (51000 değil) açılmalıdır.

Aşağıdaki örnekte Ubuntu'da bu kuralların nasıl oluşturulacağı gösterilmektedir.

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

Aşağıdaki örnekte bunun Red Hat Enterprise Linux (RHEL) üzerinde nasıl yapılabilmesi gösterilmektedir:

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

Sunucuda bağlantı noktası yönlendirmesi yapılandırın

Önceki örnekte, tek bir SQL Server kapsayıcısı RPC bağlantı noktası 135'i konaktaki 135 numaralı bağlantı noktasına eşlediğinden, konakla dağıtılmış işlemler artık ek bir yapılandırma gerektirmeksizin çalışmalıdır. SQL Server bu kapsayıcılarda yükseltilmiş ayrıcalıklarla çalıştığından, doğrudan kök olarak çalışan kapsayıcılarda 135 numaralı bağlantı noktasını kullanmak mümkündür. Kapsayıcının dışındaki SQL Server veya kök olmayan kapsayıcılar için kapsayıcıda farklı bir kısa ömürlü bağlantı noktası (örneğin 13500) kullanmanız ve 135 numaralı bağlantı noktasına yönelik trafiğin bu bağlantı noktasına yönlendirilmesi gerekir. Ayrıca 135 numaralı kapsayıcı bağlantı noktasından kısa ömürlü bağlantı noktasına kapsayıcı içinde bağlantı noktası yönlendirme kurallarını yapılandırmanız gerekir.

Ayrıca, kapsayıcının 135 numaralı bağlantı noktasını konakta 13500 gibi farklı bir bağlantı noktasıyla eşlemeye karar verirseniz, konakta bağlantı noktası yönlendirmeyi yapılandırmanız gerekir. Bu, SQL Server kapsayıcısının konakla ve diğer dış sunucularla dağıtılmış işlemlere katılmasını sağlar.

Yönlendirme bağlantı noktaları hakkında daha fazla bilgi için bkz. Bağlantı Noktası Yönlendirmesini Yapılandırma.

Kubernetes üzerinde MSDTC ile SQL Server kapsayıcıları

Kubernetes platformunda SQL Server kapsayıcıları dağıtıyorsanız aşağıdaki örnek YAML dağıtım bildirimine bakın. Bu örnekte Kubernetes platformu Azure Kubernetes Service (AKS) platformudur.

Senaryo 1: Kubernetes kapsayıcısında SQL Server'a bağlanan MSDTC istemcisi

Aşağıdaki diyagramda, bir MSDTC istemcisinin Kubernetes'te bir Linux kapsayıcısı içinde çalışan SQL Server'da MSDTC'ye bağlanma işlemi gösterilmektedir.

bir MSDTC istemcisinin Linux kapsayıcısı içinde çalışan SQL Server'da MSDTC'ye bağlandığını gösteren Diyagramı.

  1. MSDTC istemcisi, Kubernetes konağındaki 135 numaralı bağlantı noktasına bağlantı kurar.
  2. Bağlantı, kapsayıcıdaki 135 numaralı bağlantı noktasına iletilir.
  3. Kapsayıcı, bağlantıyı bu örnekteki 13500 numaralı bağlantı noktasındaki RPC uç nokta eşleyicisine iletir.
  4. Uç nokta eşleyici MSDTC istemcisine KAPSAYıCı içinde hangi bağlantı noktasının (bu örnekte 51000 numaralı bağlantı noktası) çalıştığını bildirir.
  5. MSDTC istemcisi, 51000 numaralı bağlantı noktasındaki sunucuya bağlanarak doğrudan MSDTC'ye bağlanır ve bu bağlantı, kapsayıcının içindeki SQL Server'a iletilir.

Senaryo 2: Kubernetes kapsayıcısında SQL Server'a bağlanan SQL Server

Aşağıdaki diyagramda bir SQL Server Linux kapsayıcısının Kubernetes'te ikinci bir SQL Server Linux kapsayıcısı üzerinde MSDTC'ye bağlanması işlemi gösterilmektedir.

bir SQL Server Linux kapsayıcısının ikinci bir SQL Server Linux kapsayıcısı üzerinde MSDTC'ye bağlanma işlemini gösteren Diyagramı.

  1. İlk SQL Server örneği, ikinci SQL Server örneğinin Kubernetes konağındaki 135 numaralı bağlantı noktasına bağlantı kurar.
  2. Bağlantı, ikinci örneğin kapsayıcısındaki 135 numaralı bağlantı noktasına iletilir.
  3. Kapsayıcı, bağlantıyı bu örnekteki 13500 numaralı bağlantı noktasındaki RPC uç nokta eşleyicisine iletir.
  4. Uç nokta eşleyici, ilk SQL Server örneğine MSDTC'nin ikinci kapsayıcı içinde hangi bağlantı noktasının çalıştığını bildirir (bu örnekte bağlantı noktası 51000).
  5. İlk SQL Server örneği, kapsayıcı içindeki SQL Server'a iletilen 51000 numaralı bağlantı noktasındaki ikinci konağa bağlanarak, ikinci örnekteki MSDTC ile doğrudan bağlantı kurar.

Kubernetes platformunda yapılandırılmış MSDTC ile SQL Server kapsayıcılarını dağıtma

Örnek dağıtım YAML betiğini çalıştırmadan önce, aşağıdaki örnek komutu kullanarak sa parolasını depolamak için gerekli gizli diziyi oluşturun:

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

Dikkat

Parolanız, SQL Server varsayılanparola ilkesine uygun olmalıdır. Varsayılan olarak, parola en az sekiz karakter uzunluğunda olmalı ve şu dört kümeden üçünün karakterlerini içermelidir: büyük harfler, küçük harfler, 10 tabanındaki basamaklar ve simgeler. Parolalar en çok 128 karakter uzunluğunda olabilir. Mümkün olduğunca uzun ve karmaşık parolalar kullanın.

Bildirim dosyasında aşağıdaki noktaları fark edeceksiniz:

  1. Kümede şu nesneleri oluştururuz: StorageClass, statefulset dağıtımları olarak dağıtılan iki SQL Server podu ve ilgili SQL Server örneklerine bağlanmak için iki yük dengeleyici hizmeti.

  2. Yük dengeleyici hizmetlerinin Azure Kubernetes Service'te yapılandırılabilen statik IP adresleriyle dağıtıldığını da fark edeceksiniz. Bkz. Azure Kubernetes Service (AKS) yük dengeleyiciile statik genel IP adresi ve DNS etiketi kullanma. Yük dengeleyici hizmetlerini statik IP adresleriyle oluşturmak, yük dengeleyici hizmeti silinir ve yeniden oluşturulursa dış IP adresinin değişmemesini sağlar.

  3. Aşağıdaki betikte, MSSQL_RPC_PORT ortam değişkeni için 13500 numaralı bağlantı noktasının ve her ikisi de MSDTC için gerekli olan MSSQL_DTC_TCP_PORT ortam değişkeni için 51000 numaralı bağlantı noktasının kullanıldığını görebilirsiniz.

  4. Bağlantı noktası yönlendirmesi (örneğin, bağlantı noktası 135'in 13500'e yönlendirilmesi), yük dengeleyici betiğinde, aşağıdaki örnekte gösterildiği gibi port ve targetPort uygun şekilde yapılandırılarak ayarlanır.

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

Kaynağı varsayılan ad alanında oluşturduğunuz varsayıldığında, oluşturulan tüm kaynakları görmek için önceki dağıtımdan sonra kubectl get all komutunu çalıştırdığınızda, aşağıdaki örnekte gösterilen çıkışı görmeniz gerekir.

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

Sql Server Management Studio (SSMS) gibi araçları kullanarak önceki iki SQL Server örneğinden herhangi birine bağlanabilir ve örnek bir DTC işlemi çalıştırabilirsiniz. Bu örnekte, aşağıdaki örnekte gösterildiği gibi mssql-1 (10.72.137.129) bağlanır ve dağıtılmış işlemi çalıştırmak için mssql-0 (10.88.213.209) bağlı sunucuyu oluşturursunuz.

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

Dikkat

Parolanız, SQL Server varsayılanparola ilkesine uygun olmalıdır. Varsayılan olarak, parola en az sekiz karakter uzunluğunda olmalı ve şu dört kümeden üçünün karakterlerini içermelidir: büyük harfler, küçük harfler, 10 tabanındaki basamaklar ve simgeler. Parolalar en çok 128 karakter uzunluğunda olabilir. Mümkün olduğunca uzun ve karmaşık parolalar kullanın.

Artık dağıtılmış işlemi başlatabilirsiniz ve bu kod örneği size sys.sysprocesses örneğinden mssql-0 gösterir:

SET XACT_ABORT ON;

BEGIN DISTRIBUTED TRANSACTION;

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

COMMIT TRANSACTION;
GO
  • Linux üzerinde Microsoft Dağıtılmış İşlem Düzenleyicisi'ni (MSDTC) yapılandırma