Cara mengonfigurasi Koordinator Transaksi Terdistribusi Microsoft (MSDTC) di Linux

Berlaku untuk:SQL Server - Linux

Artikel ini menjelaskan cara mengonfigurasi Koordinator Transaksi Terdistribusi Microsoft (MSDTC) di Linux.

Catatan

MSDTC di Linux didukung pada SQL Server 2017 dimulai dengan pembaruan kumulatif 16.

Gambaran Umum

Transaksi terdistribusi diaktifkan di SQL Server di Linux dengan memperkenalkan fungsionalitas pemeta titik akhir MSDTC dan RPC dalam SQL Server. Secara default, proses pemetaan titik akhir RPC mendengarkan pada port 135 untuk permintaan RPC masuk dan menyediakan informasi komponen terdaftar untuk permintaan jarak jauh. Permintaan jarak jauh dapat menggunakan informasi yang dikembalikan oleh pemeta titik akhir untuk berkomunikasi dengan komponen RPC terdaftar, seperti layanan MSDTC. Proses memerlukan hak istimewa pengguna super untuk mengikat port terkenal (nomor port kurang dari 1024) di Linux. Untuk menghindari memulai SQL Server dengan hak istimewa root untuk proses pemetaan titik akhir RPC, administrator sistem harus menggunakan iptable untuk membuat Terjemahan Alamat Jaringan untuk merutekan lalu lintas pada port 135 ke proses pemetaan titik akhir RPC SQL Server.

MSDTC menggunakan dua parameter konfigurasi untuk utilitas mssql-conf:

pengaturan mssql-conf Deskripsi
network.rpcport Port TCP yang diikat oleh proses pemeta titik akhir RPC.
distributedtransaction.servertcpport Port yang didengarkan server MSDTC. Jika tidak diatur, layanan MSDTC menggunakan port ephemeral acak pada mulai ulang layanan, dan pengecualian firewall perlu dikonfigurasi ulang untuk memastikan bahwa layanan MSDTC dapat melanjutkan komunikasi.

Untuk informasi selengkapnya tentang pengaturan ini dan pengaturan MSDTC terkait lainnya, lihat Mengonfigurasi SQL Server di Linux dengan alat mssql-conf.

Standar transaksi yang didukung

Konfigurasi MSDTC berikut didukung:

Standar transaksi Sumber data Driver ODBC Driver JDBC
Transaksi OLE-TX SQL Server di Linux Ya Tidak
Transaksi Terdistribusi XA Sumber data SQL Server, ODBC lainnya, dan JDBC yang mendukung XA Ya (memerlukan versi 17.3 atau yang lebih tinggi) Ya
Transaksi terdistribusi di server Tertaut SQL Server Ya Tidak

Untuk informasi selengkapnya, lihat Memahami Transaksi XA.

Langkah-langkah konfigurasi MSDTC

Ada tiga langkah untuk mengonfigurasi komunikasi dan fungsionalitas MSDTC. Jika langkah-langkah konfigurasi yang diperlukan tidak dilakukan, SQL Server tidak akan mengaktifkan fungsionalitas MSDTC.

  • Konfigurasikan network.rpcport dan distributedtransaction.servertcpport menggunakan mssql-conf.
  • Konfigurasikan firewall untuk memungkinkan komunikasi pada distributedtransaction.servertcpport dan port 135.
  • Konfigurasikan perutean server Linux sehingga komunikasi RPC pada port 135 dialihkan ke network.rpcport SQL Server.

Bagian berikut ini memberikan instruksi terperinci untuk setiap langkah.

Mengonfigurasi port RPC dan MSDTC

Pertama, konfigurasikan network.rpcport dan distributedtransaction.servertcpport menggunakan mssql-conf. Langkah ini jika khusus untuk SQL Server dan umum di semua distribusi yang didukung.

  1. Gunakan mssql-conf untuk mengatur nilai network.rpcport . Contoh berikut mengaturnya ke 13500.

    sudo /opt/mssql/bin/mssql-conf set network.rpcport 13500
    
  2. Atur nilai distributedtransaction.servertcpport . Contoh berikut mengaturnya ke 51999.

    sudo /opt/mssql/bin/mssql-conf set distributedtransaction.servertcpport 51999
    
  3. Mulai ulang SQL Server.

    sudo systemctl restart mssql-server
    

Mengonfigurasi firewall

Langkah kedua adalah mengonfigurasi firewall untuk memungkinkan komunikasi pada servertcpport dan port 135. Ini memungkinkan proses pemetaan titik akhir RPC dan proses MSDTC untuk berkomunikasi secara eksternal ke manajer transaksi dan koordinator lainnya. Langkah-langkah aktual untuk ini akan bervariasi tergantung pada distribusi Linux dan firewall Anda.

Contoh berikut menunjukkan cara membuat aturan ini di Ubuntu.

sudo ufw allow from any to any port 51999 proto tcp
sudo ufw allow from any to any port 135 proto tcp
sudo ufw allow from any to any port 13500 proto tcp

Contoh berikut menunjukkan bagaimana hal ini dapat dilakukan di Red Hat Enterprise Linux (RHEL):

sudo firewall-cmd --zone=public --add-port=51999/tcp --permanent
sudo firewall-cmd --zone=public --add-port=135/tcp --permanent
sudo firewall-cmd --reload

Penting untuk mengonfigurasi firewall sebelum mengonfigurasi perutean port di bagian berikutnya. Menyegarkan firewall dapat menghapus aturan perutean port dalam beberapa kasus.

Mengonfigurasi perutean port

Konfigurasikan tabel perutean server Linux sehingga komunikasi RPC pada port 135 dialihkan ke network.rpcport SQL Server. Mekanisme konfigurasi untuk penerusan port pada distribusi yang berbeda mungkin berbeda. Bagian berikut memberikan panduan untuk Ubuntu, SUS Enterprise Linux (SLES), dan Red Hat Enterprise Linux (RHEL).

Perutean port di Ubuntu dan SLES

Ubuntu dan SLES tidak menggunakan layanan firewall , sehingga aturan iptable adalah mekanisme yang efisien untuk mencapai perutean port. Aturan iptable mungkin tidak bertahan selama mulai ulang, sehingga perintah berikut juga memberikan instruksi untuk memulihkan aturan setelah restart.

  1. Buat aturan perutean untuk port 135. Dalam contoh berikut, port 135 diarahkan ke port RPC, 13500, yang ditentukan di bagian sebelumnya. Ganti <ipaddress> dengan alamat IP server Anda.

    sudo iptables -t nat -A PREROUTING -d <ip> -p tcp --dport 135 -m addrtype --dst-type LOCAL  \
       -j DNAT --to-destination <ip>:13500 -m comment --comment RpcEndPointMapper
    sudo iptables -t nat -A OUTPUT -d <ip> -p tcp --dport 135 -m addrtype --dst-type LOCAL \
       -j DNAT --to-destination <ip>:13500 -m comment --comment RpcEndPointMapper
    

    Parameter --comment RpcEndPointMapper dalam perintah sebelumnya membantu mengelola aturan ini dalam perintah selanjutnya.

  2. Lihat aturan perutean yang Anda buat dengan perintah berikut:

    sudo iptables -S -t nat | grep "RpcEndPointMapper"
    
  3. Simpan aturan perutean ke file di komputer Anda.

    sudo iptables-save > /etc/iptables.conf
    
  4. Untuk memuat ulang aturan setelah menghidupkan ulang, tambahkan perintah berikut ke /etc/rc.local (untuk Ubuntu) atau ke /etc/init.d/after.local (untuk SLES):

    iptables-restore < /etc/iptables.conf
    

    Catatan

    Anda harus memiliki hak istimewa pengguna super (sudo) untuk mengedit file rc.local atau after.local .

Perintah iptables-save dan iptables-restore, bersama dengan rc.local/after.local konfigurasi startup, menyediakan mekanisme dasar untuk menyimpan dan memulihkan entri iptables. Bergantung pada distribusi Linux Anda, mungkin ada opsi yang lebih canggih atau otomatis yang tersedia. Misalnya, alternatif Ubuntu adalah paket iptables-persistent untuk membuat entri persisten.

Penting

Langkah-langkah sebelumnya mengasumsikan alamat IP tetap. Jika alamat IP untuk instans SQL Server Anda berubah (karena intervensi manual atau DHCP), Anda harus menghapus dan membuat ulang aturan perutean jika dibuat dengan iptable. Jika Anda perlu membuat ulang atau menghapus aturan perutean yang ada, Anda bisa menggunakan perintah berikut untuk menghapus aturan lama RpcEndPointMapper :

sudo iptables -S -t nat | grep "RpcEndPointMapper" | sed 's/^-A //' | while read rule; do iptables -t nat -D $rule; done

Perutean port di RHEL

Pada distribusi yang menggunakan layanan firewall , seperti Red Hat Enterprise Linux, layanan yang sama dapat digunakan untuk membuka port di server dan penerusan port internal. Misalnya, di Red Hat Enterprise Linux, Anda harus menggunakan layanan firewalld (melalui utilitas konfigurasi firewall-cmd dengan -add-forward-port atau opsi serupa) untuk membuat dan mengelola aturan penerusan port persisten alih-alih menggunakan iptable.

sudo firewall-cmd --permanent --add-forward-port=port=135:proto=tcp:toport=13500
sudo firewall-cmd --reload

Verifikasi

Pada titik ini, SQL Server harus dapat berpartisipasi dalam transaksi terdistribusi. Untuk memverifikasi bahwa SQL Server mendengarkan, jalankan perintah netstat (jika Anda menggunakan RHEL, Anda mungkin harus terlebih dahulu menginstal paket net-tools ):

sudo netstat -tulpn | grep sqlservr

Anda akan melihat output yang mirip dengan hal berikut:

tcp 0 0 0.0.0.0:1433 0.0.0.0:* LISTEN 13911/sqlservr
tcp 0 0 127.0.0.1:1434 0.0.0.0:* LISTEN 13911/sqlservr
tcp 0 0 0.0.0.0:13500 0.0.0.0:* LISTEN 13911/sqlservr
tcp 0 0 0.0.0.0:51999 0.0.0.0:* LISTEN 13911/sqlservr
tcp6 0 0 :::1433 :::* LISTEN 13911/sqlservr
tcp6 0 0 ::1:1434 :::* LISTEN 13911/sqlservr
tcp6 0 0 :::13500 :::* LISTEN 13911/sqlservr
tcp6 0 0 :::51999 :::* LISTEN 13911/sqlservr

Namun, setelah menghidupkan ulang, SQL Server tidak mulai mendengarkan di servertcpport hingga transaksi terdistribusi pertama. Dalam hal ini, Anda tidak akan melihat SQL Server mendengarkan port 51999 dalam contoh ini sampai transaksi terdistribusi pertama.

Mengonfigurasi autentikasi pada komunikasi RPC untuk MSDTC

MSDTC untuk SQL Server di Linux tidak menggunakan autentikasi pada komunikasi RPC secara default. Namun, ketika komputer host bergabung ke domain Direktori Aktif, dimungkinkan untuk mengonfigurasi MSDTC untuk menggunakan komunikasi RPC terautentikasi menggunakan pengaturan mssql-conf berikut:

Pengaturan Deskripsi
distributedtransaction.allowonlysecurerpccalls Konfigurasikan panggilan RPC yang aman hanya untuk transaksi terdistribusi. Nilai default-nya adalah 0.
distributedtransaction.fallbacktounsecurerpcifnecessary Konfigurasikan panggilan RPC keamanan hanya untuk transaksi terdistribusi. Nilai default-nya adalah 0.
distributedtransaction.turnoffrpcsecurity Mengaktifkan atau menonaktifkan keamanan RPC untuk transaksi terdistribusi. Nilai default-nya adalah 0.

Panduan tambahan

Direktori aktif

Microsoft merekomendasikan penggunaan MSDTC dengan RPC diaktifkan jika SQL Server terdaftar ke konfigurasi Direktori Aktif. Jika SQL Server dikonfigurasi untuk menggunakan autentikasi Direktori Aktif, MSDTC menggunakan keamanan RPC autentikasi bersama secara default.

Windows dan Linux

Jika klien pada sistem operasi Windows perlu mendaftar ke dalam transaksi terdistribusi dengan SQL Server di Linux, klien harus memiliki versi minimum sistem operasi Windows berikut:

Sistem operasi Versi minimum OS Build
Windows Server 1903 18362.30.190401-1528
Windows 10 1903 18362.267