SqlServer 高可用

SunnyFan大约 4 分钟约 1067 字

SqlServer 高可用

高可用版本说明

图

更新每个主机的计算机名

vi /etc/hostname
#自行命名 db241.cluster 服务器主机的 hostname 必须少于等于 15 个字符,否则在配置过程会出现各种莫名其妙的权限报错

hostnamectl #查看命名

更新 /etc/hosts

vi /etc/hosts

#内容
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.6.251.241    db241
10.6.251.242    db242

启用Always On

在托管 SQL Server 实例的每个节点上启用 Always On 可用性组,然后启动 mssql-server。 运行以下脚本:

/opt/mssql/bin/mssql-conf set hadr.hadrenabled 1

systemctl restart mssql-server

启用 AlwaysOn_health 事件会话

可选择性地启用扩展事件 (XE),以便在对可用性组进行故障排除时帮助诊断根本原因。 在每个 SQL Server 实例上运行以下命令:

ALTER EVENT SESSION AlwaysOn_health ON SERVER WITH (STARTUP_STATE=ON);

安装高可用性加载项(每个节点)

yum install subscription-manager

sudo subscription-manager register

提示

列出可用的注册池。(每个节点)

sudo subscription-manager list --available

运行以下命令,将 RHEL 高可用性与订阅相关联(每个节点)

# 其中,“PoolId”是上一步中高可用性订阅的池 ID。
sudo subscription-manager attach --pool=2c94b2c386e9fcae0186fca0707f5993

#PoolId  2c94b2c386e9fcae0186fca0707f5993

启用存储库 RHEL 7(每个节点)

sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms

主节点创建证书

-- sunnyfancore@163.com 为自己定义的密码
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'sunnyfancore@163.com';
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 = 'sunnyfancore@163.com'
        );

--如果需要删除
--DROP CERTIFICATE dbm_certificate
--DROP MASTER KEY        

复制证书到从节点

cd /var/opt/mssql/data
scp dbm_certificate.* root@db242:/var/opt/mssql/data/

在每个目标服务器上,为 mssql 用户授予访问证书的权限。

cd /var/opt/mssql/data
chown mssql:mssql dbm_certificate.*

还原从库的证书

-- sunnyfancore@163.com 为自己定义的密码
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'sunnyfancore@163.com';
CREATE CERTIFICATE dbm_certificate
    FROM FILE = '/var/opt/mssql/data/dbm_certificate.cer'
    WITH PRIVATE KEY (
           FILE = '/var/opt/mssql/data/dbm_certificate.pvk',
           DECRYPTION BY PASSWORD = 'sunnyfancore@163.com'
        );

在所有服务器上创建数据库镜像终结点

-- 5022 为SQL Server AG 节点之间使用 TCP 通信,通过指定的端口传送消息
CREATE ENDPOINT Hadr_endpoint
    AS TCP (LISTENER_PORT = 5022)
    FOR DATABASE_MIRRORING (
        ROLE = ALL,
        AUTHENTICATION = CERTIFICATE dbm_certificate,
        ENCRYPTION = REQUIRED ALGORITHM AES
        );

ALTER ENDPOINT Hadr_endpoint STATE = STARTED;

打开 防火墙对 endpoint 对应的端口的支持

firewall-cmd --zone=public --add-port=5022/tcp --permanent
firewall-cmd --reload

创建可用性组

创建 AG。 设置 CLUSTER_TYPE = NONE。 此外,使用 FAILOVER_MODE = MANUAL 设置每个副本。 运行分析或报告工作负载的客户端应用程序可直接连接到辅助数据库。 还可以创建一个只读路由列表。 与主要副本的连接将读取连接请求循环转发到路由列表中的每个次要副本。

以下 Transact-SQL 脚本创建名为 sunnyfan_ag 的 AG。 脚本使用 SEEDING_MODE = AUTOMATIC 配置 AG 副本。 此设置会导致 SQL Server 在数据库添加到 AG 后自动在每个辅助服务器上创建数据库。 为环境更新以下脚本。 将 db241 和 db242 值替换为托管副本的 SQL Server 实例的名称。 使用为终结点设置的端口替换 <5022> 值。 在主 SQL Server 副本上运行以下 Transact-SQL 脚本:

CREATE AVAILABILITY GROUP [sunnyfan_ag]
    WITH (CLUSTER_TYPE = NONE)
    FOR REPLICA ON
        N'db241' WITH (
            ENDPOINT_URL = N'tcp://db241:5022',
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
                    SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            ),
        N'db242' WITH ( 
            ENDPOINT_URL = N'tcp://db242:5022', 
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
            );

ALTER AVAILABILITY GROUP [sunnyfan_ag] GRANT CREATE ANY DATABASE;

提示

如果SERVERNAME为localhost,可能会出错,需修改成对应的服务器实例名,然后重启sqlserver 服务

SELECT @@SERVERNAME

EXEC sp_dropserver @@SERVERNAME

exec sp_addserver @server = 'db242',@local='LOCAL'

从副本执行加入

ALTER AVAILABILITY GROUP [sunnyfan_ag] Join WITH(cluster_type=NONE);

ALTER AVAILABILITY GROUP [sunnyfan_ag] Grant Create Any Database ;

添加可用数据库到副本

-- 创建数据库视情况
create database [TestDB];  

--修改数据库为完整备份
alter database [TestDB] set recovery full ;

--备份数据库
backup database [TestDB]
    to disk = N'/var/opt/mssql/data/TestDB.bak';

--可用性组增加数据库
alter availability group [sunnyfan_ag]
    add database [TestDB]