Docker 容器部署 SQL Server AlwaysOn AG
SQL Server 2016 開始支持 Linux。隨著2017 和2019 版本的推出,它開始支持Linux和Container平臺上的HA/DR、Kubernetes和大數據集群解決方案。
今天我們就直接測試,使用容器構建?SQL Server AlwaysOn AG,這對于學習?AlwaysOn AG 的同學來說,是不錯的選擇。容器可以使用更少的資源,就可配置完成。文章比較詳細,一步步跟蹤操作即可實現!
現在,我們創建了一臺Ubuntu虛擬機,接下來,我們繼續安裝 docker ,并通過模板(docker鏡像)創建3個?SQL Server 實例容器,然后在這3個實例中配置?AlwaysOn AG。不管在 Linux 或是容器環境,沒有配置系統集群的情況下,也是可以配置?SQL Server AlwaysOn AG 的,只是?AlwaysOn AG 并沒有實現自動故障轉移,不過我們可以進行手動故障轉移。
首先安裝 Docker & Docker-Compose?
#如果有之前版本的docker安裝,建議刪除 apt-get remove docker docker-engine docker.io containerd runc apt-get update apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common#添加Docker的官方GPG密鑰 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -#添加 Docker 存儲庫 add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"#安裝Docker引擎 apt-get update apt-get install -y docker-ce docker-ce-cli containerd.io apt-get install -y docker-compose配置SQLServer實例鏡像
# vi dockerfile FROM ubuntu:20.04RUN DEBIAN_FRONTEND="noninteractive" RUN apt-get update && apt-get install -y tzdata ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneRUN apt-get update RUN apt install -y sudo wget curl gnupg gnupg1 gnupg RUN apt install -y software-properties-common systemd vim RUN apt install -y telnetd iputils-pingRUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - RUN add-apt-repository "$(wget -qO- https://packages.microsoft.com/config/ubuntu/18.04/mssql-server-2019.list)"RUN apt-get update RUN apt-get install -y libldap2-dev checkinstall RUN apt-get install -y mssql-serverRUN /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1 RUN /opt/mssql/bin/mssql-conf set sqlagent.enabled true RUN /opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048EXPOSE 1433 EXPOSE 5022ENTRYPOINT /opt/mssql/bin/sqlservr構建SQLServer實例鏡像
配名稱為?dockerfile,build 默認現在當前路徑文件,當然你也可以指定。
# 先拉取系統鏡像 docker pull ubuntu:20.04#構建SQLServer鏡像 docker build -t mssql2019:hadr .#查看 docker images ------------------------------------------------------------------------------------ REPOSITORY TAG IMAGE ID CREATED SIZE ------------------------------------------------------------------------------------ mssql2019 hadr a9134337ba77 2 hours ago 1.8GB ubuntu 20.04 ba6acccedd29 6 weeks ago 72.8MB ------------------------------------------------------------------------------------docker compose 啟動3個 SQL Server 容器
# vi docker-compose.yml version: '3'services:db1:container_name: sqlNode1image: mssql2019:hadrhostname: sqlNode1domainname: lab.localenvironment:SA_PASSWORD: "Str0ngPa@w0rd"ACCEPT_EULA: "Y"ports:- "1501:1433"extra_hosts:sqlNode2.lab.local: "10.10.10.102"sqlNode3.lab.local: "10.10.10.103"networks:internal:ipv4_address: 10.10.10.101db2:container_name: sqlNode2image: mssql2019:hadrhostname: sqlNode2domainname: lab.localenvironment:SA_PASSWORD: "Str0ngPa@w0rd"ACCEPT_EULA: "Y"ports:- "1502:1433"extra_hosts:sqlNode1.lab.local: "10.10.10.101"sqlNode3.lab.local: "10.10.10.103"networks:internal:ipv4_address: 10.10.10.102db3:container_name: sqlNode3image: mssql2019:hadrhostname: sqlNode3domainname: lab.localenvironment:SA_PASSWORD: "Str0ngPa@w0rd"ACCEPT_EULA: "Y"ports:- "1503:1433"extra_hosts:sqlNode1.lab.local: "10.10.10.101"sqlNode2.lab.local: "10.10.10.102"networks:internal:ipv4_address: 10.10.10.103networks:internal:driver: bridgeipam:driver: defaultconfig:- subnet: 10.10.10.0/24啟動時,Docker 將創建一個新的?bridge 網絡,可通過 ifconfig 或?docker network ls 查看。當然,你也可以使用一個已存在的虛擬網絡。接下來,才是啟動!
#Docker Compose 啟動堆棧,-d 后臺運行 docker-compose up -ddocker ps docker-compose ps ------------------------------------------------------------------------------------Name Command State Ports ------------------------------------------------------------------------------------ sqlNode1 /bin/sh -c /opt/mssql/bin/ ... Up 0.0.0.0:1501->1433/tcp, 5022/tcp sqlNode2 /bin/sh -c /opt/mssql/bin/ ... Up 0.0.0.0:1502->1433/tcp, 5022/tcp sqlNode3 /bin/sh -c /opt/mssql/bin/ ... Up 0.0.0.0:1503->1433/tcp, 5022/tcp ------------------------------------------------------------------------------------安裝客戶端工具?sqlcmd
實例已經創建好SQLServer實例了,怎么去連接呢?我們需要一個客戶端工具——sqlcmd。
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add - curl https://packages.microsoft.com/config/ubuntu/21.04/prod.list | sudo tee /etc/apt/sources.list.d/msprod.list apt-get update apt-get install -y mssql-tools unixodbc-dev echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc此時我們可以通過該工具進行連接操作實例了!
sqlcmd -S "127.0.0.1,1501" -d "master" -U SA -P "Str0ngPa@w0rd" -Q "print @@servername"當然,你也可以通過Windows客戶端工具 SSMS 進行連接操作。IP為虛擬機Ubuntu的IP地址,端口為容器對外映射的端口。
SQL Server AlwaysOn AG 配置
3個實例創建登錄名、主密鑰和證書
#創建登錄名、主密鑰和證書 for port in {1501..1503} do sqlcmd -S "127.0.0.1,$port" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " CREATE LOGIN dbm_login WITH PASSWORD = 'MyStr0ngPa@w0rd'; GO CREATE USER dbm_user FOR LOGIN dbm_login; GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'; GO CREATE CERTIFICATE dbm_certificate_$port WITH SUBJECT = 'dbm'; GO CREATE ENDPOINT [Hadr_endpoint]AS TCP (LISTENER_IP = (0.0.0.0), LISTENER_PORT = 5022)FOR DATA_MIRRORING (ROLE = ALL,AUTHENTICATION = CERTIFICATE dbm_certificate_$port,ENCRYPTION = REQUIRED ALGORITHM AES); GO ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED; GO GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [dbm_login]; GO BACKUP CERTIFICATE dbm_certificate_$port TO FILE = '/tmp/dbm_certificate_$port.cer' WITH PRIVATE KEY (FILE = '/tmp/dbm_certificate_$port.pvk',ENCRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'); GO" done將帶有 cer 和 pvk 擴展名的文件從容器復制到其他容器節點
docker cp sqlNode1:/tmp/dbm_certificate_1501.cer . docker cp sqlNode1:/tmp/dbm_certificate_1501.pvk . docker cp sqlNode2:/tmp/dbm_certificate_1502.cer . docker cp sqlNode2:/tmp/dbm_certificate_1502.pvk . docker cp sqlNode3:/tmp/dbm_certificate_1503.cer . docker cp sqlNode3:/tmp/dbm_certificate_1503.pvk .docker cp dbm_certificate_1501.cer sqlNode2:/tmp/ docker cp dbm_certificate_1501.pvk sqlNode2:/tmp/ docker cp dbm_certificate_1501.cer sqlNode3:/tmp/ docker cp dbm_certificate_1501.pvk sqlNode3:/tmp/ docker cp dbm_certificate_1502.cer sqlNode1:/tmp/ docker cp dbm_certificate_1502.pvk sqlNode1:/tmp/ docker cp dbm_certificate_1502.cer sqlNode3:/tmp/ docker cp dbm_certificate_1502.pvk sqlNode3:/tmp/ docker cp dbm_certificate_1503.cer sqlNode1:/tmp/ docker cp dbm_certificate_1503.pvk sqlNode1:/tmp/ docker cp dbm_certificate_1503.cer sqlNode2:/tmp/ docker cp dbm_certificate_1503.pvk sqlNode2:/tmp/各節點相互還原證書
sqlcmd -S "127.0.0.1,1501" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " CREATE CERTIFICATE dbm_certificate_1502 AUTHORIZATION dbm_userFROM FILE = '/tmp/dbm_certificate_1502.cer'WITH PRIVATE KEY (FILE = '/tmp/dbm_certificate_1502.pvk',DECRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'); GO CREATE CERTIFICATE dbm_certificate_1503 AUTHORIZATION dbm_user FROM FILE = '/tmp/dbm_certificate_1503.cer' WITH PRIVATE KEY (FILE = '/tmp/dbm_certificate_1503.pvk',DECRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'); GO"sqlcmd -S "127.0.0.1,1502" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " CREATE CERTIFICATE dbm_certificate_1501 AUTHORIZATION dbm_userFROM FILE = '/tmp/dbm_certificate_1501.cer'WITH PRIVATE KEY (FILE = '/tmp/dbm_certificate_1501.pvk',DECRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'); GO CREATE CERTIFICATE dbm_certificate_1503 AUTHORIZATION dbm_userFROM FILE = '/tmp/dbm_certificate_1503.cer'WITH PRIVATE KEY (FILE = '/tmp/dbm_certificate_1503.pvk',DECRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'); GO"sqlcmd -S "127.0.0.1,1503" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " CREATE CERTIFICATE dbm_certificate_1501 AUTHORIZATION dbm_userFROM FILE = '/tmp/dbm_certificate_1501.cer'WITH PRIVATE KEY (FILE = '/tmp/dbm_certificate_1501.pvk',DECRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'); GO CREATE CERTIFICATE dbm_certificate_1502 AUTHORIZATION dbm_userFROM FILE = '/tmp/dbm_certificate_1502.cer'WITH PRIVATE KEY (FILE = '/tmp/dbm_certificate_1502.pvk',DECRYPTION BY PASSWORD = 'MyStr0ngPa@w0rd'); GO"現在,開始創建 AlwaysOn Availability Group,因為非集群,所以設置?CLUSTER_TYPE = EXTERNAL
sqlcmd -S "127.0.0.1,1501" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " CREATE AVAILABILITY GROUP [MyAG]WITH (CLUSTER_TYPE = NONE)FOR REPLICA ONN'sqlNode1'WITH (ENDPOINT_URL = N'tcp://sqlNode1:5022',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,SEEDING_MODE = AUTOMATIC,FAILOVER_MODE = MANUAL,SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)),N'sqlNode2'WITH (ENDPOINT_URL = N'tcp://sqlNode2:5022',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,SEEDING_MODE = AUTOMATIC,FAILOVER_MODE = MANUAL,SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)),N'sqlNode3'WITH (ENDPOINT_URL = N'tcp://sqlNode3:5022',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,SEEDING_MODE = AUTOMATIC,FAILOVER_MODE = MANUAL,SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)); GO"兩個輔助節點加入 AG
sqlcmd -S "127.0.0.1,1502" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " ALTER AVAILABILITY GROUP [MyAG] JOIN WITH (CLUSTER_TYPE = NONE); GO ALTER AVAILABILITY GROUP [MyAG] GRANT CREATE ANY DATABASE; GO"sqlcmd -S "127.0.0.1,1503" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " ALTER AVAILABILITY GROUP [MyAG] JOIN WITH (CLUSTER_TYPE = NONE); GO ALTER AVAILABILITY GROUP [MyAG] GRANT CREATE ANY DATABASE; GO"現在,我們可以在Primary節點創建數據庫進行測試。我們配置 AG時已經設置自動播種模式(SEEDING_MODE = AUTOMATIC),所以數據庫就不需要通過備份還原初始化了。
sqlcmd -S "127.0.0.1,1501" -d "master" -U SA -P "Str0ngPa@w0rd" -Q " CREATE DATABASE test; GO ALTER DATABASE test SET RECOVERY FULL; GO BACKUP DATABASE test TO DISK = 'NUL:'; GO BACKUP LOG test TO DISK = 'NUL:'; GO ALTER AVAILABILITY GROUP [MyAG] ADD DATABASE [test]; GO"如何切換角色呢?比如我們將primary切換到端口為 1502 的節點。
sqlcmd -S "127.0.0.1,1502" -d "master" -U SA -P "Str0ngPa@w0rd" -Q "ALTER AVAILABILITY GROUP [MyAG] FORCE_FAILOVER_ALLOW_DATA_LOSS"?如果你想用到開發或測試環境,你也可以把數據設置存儲到容器之外的磁盤位置,但資源要提前規劃好(生產環境沒必要容器化數據庫)。當然,容器化的一個好處就是,你可以創建更多的獨立容器實例來模擬各種測試,相比以前我們開很多虛擬機方便多了!
更多資源,請關注公眾號
參考:
Quickstart: Run SQL Server container images with Docker
SQL Server 2019 AlwaysOn Availability Group on Docker Containers
總結
以上是生活随笔為你收集整理的Docker 容器部署 SQL Server AlwaysOn AG的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8s 集群部署问题整理
- 下一篇: 简述UIImagePickerContr