暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【保姆级教程】在linux服务器搭建sql server always on高可用集群

热衷于分享各种干货知识,大家有想看或者想学的可以评论区留言,秉承着“开源知识来源于互联网,回归于互联网”的理念,分享一些日常工作中能用到或者比较重要的内容,希望大家能够喜欢,不足之处请大家多宝贵地意见,我们一起提升,守住自己的饭碗。

关注公众号,技术道路不迷路

 

一、安装及配置SQL Server

使用一键安装脚本进行安装。(两台机器都安装),测试环境中不用搭建DNS服务器,生产环境需要搭建,这里我再不演示DNS部分了。搭建高可用集群至少需要两台机器。

序号
IP地址
安装服务
1
192.168.59.128
sql server 2019、pacemaker、mssql -server-ha
2
192.168.59.129
sql server 2019、pacemaker、mssql-server-ha


在linux 一键yy安装SQL Server 2019


二、 创建AG

[root@localhost ~]# hostnamectl set-hostname node01 --static  --节点1
[root@localhost ~]# hostnamectl set-hostname node02 --static  --节点2

[root@localhost ~]# echo "192.168.59.128 node01" >> etc/hosts
[root@localhost ~]# echo "192.168.59.129 node02" >> etc/hosts

1、在所有节点SQL Server上开启Always On Availability Group功能并重启服务:

[root@node01 ~]# opt/mssql/bin/mssql-conf set hadr.hadrenabled  1

[root@node01 ~]# systemctl restart mssql-server.service
[root@node01 ~]# systemctl status mssql-server.service


2、在所有节点上执行SQL语句开启AlwaysOn_health事件会话以方便诊断问题:
ALTER EVENT SESSION  AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);
GO

3、创建db mirroring endpoint使用的用户:

CREATE LOGIN dbm_login WITH PASSWORD = 'tiger@123';
CREATE USER dbm_user FOR LOGIN dbm_login;


4、创建证书:

Linux上的SQL Server Mirroring Endpoint是用证书去认证通信的。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'tiger@123';
CREATE CERTIFICATE dbm_certificate WITH SUBJECT = 'dbm';
BACKUP CERTIFICATE dbm_certificate
   TO FILE = '/var/opt/mssql/data/dbm_certificate.cer'
   WITH PRIVATE KEY (
           FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
           ENCRYPTION BY PASSWORD = 'tiger@123'
       );

把证书的备份复制到所有的非Primary节点上,同时使用它创建证书:

先在Primary节点上执行如下命令复制证书的备份到其它节点上:

[root@node01 ~]# cd /var/opt/mssql/data

[root@node01 data]# scp dbm_certificate.* root@node02:/var/opt/mssql/data/

在这里插入图片描述
[root@node02 ~]# cd /var/opt/mssql/data
[root@node02 data]# chown mssql:mssql dbm_certificate.*

5、在目的端Secondary节点上利用备份的证书创建证书:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'tiger@123';
CREATE CERTIFICATE dbm_certificate  
    AUTHORIZATION dbm_user
    FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
    WITH PRIVATE KEY (
    FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
    DECRYPTION BY PASSWORD = 'tiger@123'
            );

在这里插入图片描述

6、在所有节点上创建database mirroring endpoint:
CREATE ENDPOINT [Hadr_endpoint]
    AS TCP (LISTENER_IP = (0.0.0.0), LISTENER_PORT = 5022)
    FOR DATA_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );
ALTER ENDPOINT [Hadr_endpoint] STATE = STARTED;
GRANT CONNECT ON ENDPOINT::[Hadr_endpoint] TO [dbm_login];

7、在Primary节点上创建AG:
-- 假设上一步查询返回的实例名称是 'node01'

SELECT @@SERVERNAME AS CurrentInstanceName;

修改servicename名称(这里主备库都需要一下)

-- 检查当前实例名称
SELECT @@SERVERNAME AS CurrentInstanceName;

-- 如果当前名称是localhost,则进行修改
IF @@SERVERNAME = 'localhost'
BEGIN
    -- 删除旧的服务器名称
    EXEC sp_dropserver 'localhost';
    
    -- 添加新的服务器名称
    EXEC sp_addserver 'node02'local;
    
    -- 再次检查(重启服务前)
    SELECT @@SERVERNAME AS CurrentInstanceNameAfterChange;
    
    -- 提示需要重启服务
    RAISERROR('修改已完成,但需要重启SQL Server服务才能使@@SERVERNAME显示新名称', 10, 1) WITH NOWAIT;
END
ELSE
BEGIN
    RAISERROR('当前实例名称不是localhost,无需修改', 10, 1) WITH NOWAIT;
END

8、重启数据库

-- 切换到master数据库,这是执行可用性组操作的必要条件
USE MASTER;
GO

-- 假设上一步查询返回的实例名称是 'node01'
CREATE AVAILABILITY GROUP RHELAG
    WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)
    FOR REPLICA ON
        N'node01'  -- 这里必须与@@SERVERNAME返回的名称完全一致
        WITH (
            ENDPOINT_URL = N'tcp://node01:5022',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            PRIMARY_ROLE (ALLOW_CONNECTIONS = ALL),
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            ),
        N'node02'
        WITH (
            ENDPOINT_URL = N'tcp://node02:5022',
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            PRIMARY_ROLE (ALLOW_CONNECTIONS = ALL),
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            );
GO

-- 只有当可用性组创建成功后再执行此命令
ALTER AVAILABILITY GROUP RHELAG GRANT CREATE ANY DATABASE;
GO

-- 只有当可用性组创建成功后再执行此命令
ALTER AVAILABILITY GROUP RHELAG GRANT CREATE ANY DATABASE;
GO

9、备库添加

ALTER AVAILABILITY GROUP RHELAG JOIN WITH (CLUSTER_TYPE = EXTERNAL);
ALTER AVAILABILITY GROUP RHELAG GRANT CREATE ANY DATABASE;

在这里插入图片描述

在这里插入图片描述

10、主节点创建一个数据库,查看备库是否同步
CREATE DATABASE test;
ALTER DATABASE test SET RECOVERY FULL;
BACKUP DATABASE test
   TO DISK = N'var/opt/mssql/data/test.bak';
ALTER AVAILABILITY GROUP [RHELAG] ADD DATABASE test;

在这里插入图片描述

11、备库查看数据同步情况
SELECT * FROM sys.databases WHERE name = 'test';
GO
SELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

在这里插入图片描述
在这里插入图片描述

三、配置Pacemaker集群资源管理器

1、配置在线的yum源

[root@node02 yum.repos.d]#curl -o etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

2、在所有节点上安装Pacemaker软件包:

[root@node02 yum.repos.d]#sudo yum install pacemaker pcs fence-agents-all resource-agents

3、设置密码

[root@node02 ~]# sudo passwd hacluster

4、启用并开启pcsd和Pacemaker服务:

[root@node01 ~]# sudo systemctl enable pcsd
Created symlink from etc/systemd/system/multi-user.target.wants/pcsd.service to /usr/lib/systemd/system/pcsd.service.
[root@node01 ~]# sudo systemctl start pcsd

[root@node01 ~]# sudo systemctl enable pacemaker

5、创建Cluster并启动:

[root@node01 ~]# sudo pcs cluster auth node01 node02  -u hacluster -p 123123
[root@node01 ~]# pcs cluster setup --name hacluster node01 node02
[root@node01 ~]# pcs cluster start --all


[root@node01 ~]# pcs property set stonith-enabled=false

[root@node01 ~]# pcs property set start-failure-is-fatal=false

6、添加AG到Cluster集群中
在所有节点上安装与Pacemaker集成的SQL Server资源包:

[root@node01 yum.repos.d]# sudo yum install -y mssql-server-ha

如果下载报错,使用换个源

[root@node01 yum.repos.d]#sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo

7、创建Pacemaker用的SQL Server登录用户(两个节点都执行)

USE [master]
GO
CREATE LOGIN [pacemakerLogin] with PASSWORD= N'tiger@123'
ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]

8、赋权限(两个节点都执行)

GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::RHELAG TO pacemakerLogin
在这里插入图片描述

10、保存SQL Server Login的信息(两个节点都执行)
[root@node02 ~]# echo 'pacemakerLogin' >> ~/pacemaker-passwd
[root@node02 ~]# echo 'tiger@123' >> ~/pacemaker-passwd
[root@node02 ~]# sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
[root@node02 ~]# sudo chown root:root /var/opt/mssql/secrets/passwd
[root@node02 ~]# sudo chmod 400 /var/opt/mssql/secrets/passwd

11、在Cluster中Primary节点上创建AG的资源:

[root@node01 ~]# pcs resource create ag_cluster ocf:mssql:ag ag_name=RHELAG --master meta notify=true
在这里插入图片描述

12、在Cluster中Primary节点上创建虚拟IP资源:
[root@node01 ~]#  pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=192.168.59.250

13、配置Cluster资源的依赖关系和启动顺序
[root@node01 ~]# pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master
[root@node01 ~]# pcs constraint order promote ag_cluster-master then start virtualip


14、查看Cluster状态
[root@node01 ~]# pcs status

15、用VIP地址去登录

参考链接:https://www.cnblogs.com/lavender000/p/6946848.html
下面重点来了,好书推荐:

书籍名称:《SQL Server运维之道》

内容介绍
本书分为4篇,共9章,内容涵盖数据库基础、性能优化、开发、架构高可用性与运维等多个方面。基础篇(第1章和第2章)从安装部署讲起,探讨SQLServer在容器化和云原生环境下的安装部署,以及Linu台上的架构设计与性能表现。性能篇(第3~6章)聚焦数据库性能优化,内容包括新特性加速数据库恢复、事务与锁、索引优化以及数据库自动驾驶能力等。开发篇(第7章和第8章)重点介绍数据库安全性及多模态能力,着重讲解区块链技术在数据库安全方面的创新应用,以及图数据、JSON数据和空间地理数据等多模态数据的支持。架构与运维篇(第9章)围绕数据库高可用性和运维展开,详细讲解AlwaysOn高可用性集群的搭建与高级功能。本书结合实际生产案例,旨在帮助读者学以致用,解决数据库运维中的痛点。
适合人群
适合数据库初学者也适合有一定基础的开发人员还适合作为培训机构和大中专院校的教学用书。
购买链接:
https://item.jd.com/14517897.html

 



END
往期文章回顾

文中的概念来源于互联网,如有侵权,请联系我删除。

欢迎关注公众号:小周的数据库进阶之路,一起交流AI、数据库、中间件和云计算等技术。如果觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。



文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论