SqlServer 高可用
大约 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
提示
- 1.先在此官网上注册账号:https://www.redhat.com/wapps/ugc/register.html
- 2.注册完后同意相关协议
- 3.常见错误
- 无法确认服务器身份:[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:618)
- vi /etc/rhsm/rhsm.conf #将insecure = 0改为insecure = 1保存
列出可用的注册池。(每个节点)
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]