Ubuntu上配置SQL Server Always On Availability Group

下面简单介绍一下如何在Ubuntu上一步一步创建一个SQL Server AG(Always On Availability Group),以及配置过程中遇到的坑的填充方法。

 

目前在Linux上可以搭建两种类型的SQL Server AG,一种是高可用性的结构同时使用Cluster服务器提供业务连续性。这种结构包括read-scale节点。接下来就会介绍这种AG的搭建方法。另外一种是没有Cluster服务的read-scale AG,这种结构仅仅提供只读的可扩展性,不提供高可用性功能。关于如何创建这种简单的AG请参考:Configure read-scale availability group for SQL Server on Linux。

另外在CREATE AVAILABILITY GROUP时可以指定CLUSTER TYPE:

  • WSFC:Windows server failover cluster。这个是Windows系统上的默认值;

  • EXTERNAL:非Windows server上的failover cluster,比如Linux上的Pacemaker;

  • NONE:不包含cluster manager,指的是创建read-scale类型的Availability Group。

其中Linux可以使用EXTERNAL或NONE,我理解的是EXTENRAL功能就是类似目前SQL Server中的AG,NONE则是一种新类型,没有Cluster功能的不支持高可用性和灾难恢复的AG。主要作用是分担主服务器的负载,支持多个只读备用节点,同时这种类型也支持Windows上使用,是SQL Server 2017新支持的功能。更多详细的信息请参考这里:Read-scale availability groups。

 

接下来进入主题主要介绍一下高可用性结构的Availability Group的搭建方法。

 

1.      安装及配置SQL Server

一个SQL AG至少有两个以上的节点,由于环境有限,这里只安装一个最简单的包含两个节点的AG。首先是按照SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)中的介绍,安装两个Ubuntu机器和SQL Server。

Note:同一个AG的多个节点必须都是实体机或者虚拟机,当都是虚拟机的时候也必须都在同一个虚拟化平台上,原因是由于Linux需要用fencing agent去隔离节点上的资源,不同平台fencing agent类型是不同的,详细参考Policies for Guest Clusters。

 

2.      创建AG

在Linux上,必须先创建AG才能把它当成一个资源加到Cluster中进行管理。下面介绍一下如何创建AG。

a)       准备工作:

更新每一个节点服务器的机器名符合这个要求:15个字符或者更少;网络上是唯一的。如果不符合要求可以使用如下命令更改机器名:

sudo vi /etc/hostname

使用如下命令修改Hosts文件以保证同一个AG中多个节点可以互相通信

sudo vi /etc/hosts

这里一定注意:修改后可以用ping命令尝试ping hostname,必须返回对应的真正IP地址才行,也就是Hosts文件中不能包含类似hostname和127.0.0.1的对应记录,配置后如下,注意其中”127.0.1.1   Ubuntu1604Bob2”这行被我注释了,否则开启Cluster 服务的时候可能会有问题:

 

如果不注释,ping hostname的返回结果是127.0.1.1,注释后返回的是真正IP:

需要返回真正IP后期配置才好使。

另外可以用这个命令查看当前server的IP:

sudo ip addr show

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

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled  1sudo systemctl restart mssql-server

c)       在所有节点上执行SQL语句开启AlwaysOn_health事件会话以方便诊断问题:

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

更多关于Event Session信息可以参考:AlwaysOn Extended Events。

d)      创建db mirroring endpoint使用的用户:

CREATE LOGIN dbm_login WITH PASSWORD = '**<Your Password>**';CREATE USER dbm_user FOR LOGIN dbm_login;

e)      创建证书:

Linux上的SQL Server Mirroring Endpoint是用证书去认证通信的。下面的命令创建一个master key和证书并备份。连接到Primary端SQL Server并执行如下命令:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';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 = '**<Private_Key_Password>**');

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

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

cd /var/opt/mssql/datascp dbm_certificate.* root@**<node2>**:/var/opt/mssql/data/

Note:如果遇到Permission denied,可以使用sz和rz命令通过主机来传输文件。

再在目的端Secondary节点上执行如下命令给用户mssql添加足够的权限:

cd /var/opt/mssql/datachown mssql:mssql dbm_certificate.*

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

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '**<Master_Key_Password>**';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 = '**<Private_Key_Password>**');

g)       在所有节点上创建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];

Note:这里Listener IP暂时不能修改,只能是0.0.0.0,目前有BUG,未来可能会修复。

h)      在Primary节点上创建AG:

CREATE AVAILABILITY GROUP [UbuntuAG]WITH (DB_FAILOVER = ON, CLUSTER_TYPE = EXTERNAL)    FOR REPLICA ONN'**<node1>**'WITH (ENDPOINT_URL = N'tcp://**<node1>**:**<5022>**',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,FAILOVER_MODE = EXTERNAL,SEEDING_MODE = AUTOMATIC),N'**<node2>**'WITH (ENDPOINT_URL = N'tcp://**<node2>**:**<5022>**',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,FAILOVER_MODE = EXTERNAL,SEEDING_MODE = AUTOMATIC);ALTER AVAILABILITY GROUP [UbuntuAG] GRANT CREATE ANY DATABASE;

Note:执行过程中可能会出现这个警告”Attempt to access non-existent or uninitialized availability group with ID”,暂时忽略即可,未来版本可能会修复。

下图中UbuntuAG2是新创建的AG,Secondary节点还处于OFFLINE状态:

i)        把其它Secondary节点加入到AG中:

ALTER AVAILABILITY GROUP [UbuntuAG] JOIN WITH (CLUSTER_TYPE = EXTERNAL);ALTER AVAILABILITY GROUP [UbuntuAG] GRANT CREATE ANY DATABASE;

下图为添加完节点后的状态:

j)        测试:创建一个DB并加入到刚刚创建的AG中:

CREATE DATABASE [db1];ALTER DATABASE [db1] SET RECOVERY FULL;BACKUP DATABASE [db1]TO DISK = N'var/opt/mssql/data/db1.bak';ALTER AVAILABILITY GROUP [UbuntuAG] ADD DATABASE [db1];

k)       验证:在Secondary端查看DB是否已经成功同步过去了:

SELECT * FROM sys.databases WHERE name = 'db1';GOSELECT DB_NAME(database_id) AS 'database', synchronization_state_desc FROM sys.dm_hadr_database_replica_states;

这时,一个简单的AG就创建好了,但是它不能提供高可用性和灾难恢复功能,必须配置一个Cluster技术才能好使。如果上述h)和i)步骤的TSQL更换成以下两个,则创建出来的就是read-scale类型的AG。

  • 创建AG命令:

CREATE AVAILABILITY GROUP [UbuntuAG]WITH (CLUSTER_TYPE = NONE)    FOR REPLICA ONN'**<node1>**' WITH (ENDPOINT_URL = N'tcp://**<node1>**:**<5022>**',AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,FAILOVER_MODE = MANUAL,SEEDING_MODE = AUTOMATIC,SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)),N'**<node2>**' WITH (ENDPOINT_URL = N'tcp://**<node2>**:**<5022>**',AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,FAILOVER_MODE = MANUAL,SEEDING_MODE = AUTOMATIC,SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL));ALTER AVAILABILITY GROUP [UbuntuAG] GRANT CREATE ANY DATABASE;

把Secondary节点加到AG中命令:

ALTER AVAILABILITY GROUP [UbuntuAG] JOIN WITH (CLUSTER_TYPE = NONE);ALTER AVAILABILITY GROUP [UbuntuAG] GRANT CREATE ANY DATABASE;

Note:这时的AG是没有Listener的,目前版本也暂时无法创建Listener。

 

3.      配置一个集群资源管理器,如Pacemaker

具体步骤如下:

a)       在所有的Cluster节点上安装和配置Pacemaker:

先设置防火墙允许相关端口通过(包括Pacemaker high-availability service、SQL Server Instance和Availability Group Endpoint),

sudo ufw allow 2224/tcpsudo ufw allow 3121/tcpsudo ufw allow 21064/tcpsudo ufw allow 5405/udpsudo ufw allow 1433/tcp # Replace with TDS endpointsudo ufw allow 5022/tcp # Replace with DATA_MIRRORING endpointsudo ufw reload

或者也可以直接禁用防火墙:

sudo ufw disable

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

sudo apt-get install pacemaker pcs fence-agents resource-agents

设置Pacemaker和Corosync软件包在安装时创建的默认用户的密码,需保证所有节点上密码一样:

sudo passwd hacluster

b)      启用并开启pcsd和Pacemaker服务:

sudo systemctl enable pcsdsudo systemctl start pcsdsudo systemctl enable pacemaker

执行过程中可能出现这个错误”pacemaker Default-Start contains no runlevels, aborting.”,可以暂时忽略。

c)       创建Cluster并启动:

首先为了防止有Cluster的残余配置文件影响后期搭建,可以先执行如下命令删除已经存在的Cluster:

sudo pcs cluster destroy # On all nodessudo systemctl enable pacemaker

然后创建并配置Cluster:

sudo pcs cluster auth **<nodeName1>** **<nodeName2>**  -u hacluster -p **<password for hacluster>**sudo pcs cluster setup --name **<clusterName>** **<nodeName1>** **<nodeName2…>**sudo pcs cluster start --all

这时可能会出现这个错误”Job for corosync.service failed because the control process exited with error code. See "systemctl status corosync.service" and "journalctl -xe" for details.”诊断解决方法如下:

  • 根据2-a)中的描述查看是否有问题;

  • 使用如下命令查看配置文件中的Log路径是什么。

vi /etc/corosync/corosync.conf

  • 查看相关文件是否存在,如不存在,则创建相关文件,假设上图中logfile路径为/var/log/cluster/corosync.log同时该文件还不存在,则执行如下命令,

sudo mkdir /var/log/clustersudo chmod 777 /var/log/clustersudo echo >> /var/log/cluster/corosync.log

d)      配置隔离:STONITH。目前测试环境为了简单,暂时不配置了,以后会更新。正常来说生产环境需要一个fencing agent去隔离资源,关于支持信息请参考这里:Support Policies for RHEL High Availability Clusters - Virtualization Platforms。

另外我们这里先执行以下命令禁用隔离:

sudo pcs property set stonith-enabled=false

e)      设置start-failure-is-fatal为false:

pcs property set start-failure-is-fatal=false

默认值是true,当为true的时候,如果Cluster第一次启动资源失败,在自动Failover操作后,需要用户手动清空资源启动失败的数量记录,使用这个命令重置资源配置:

pcs resource cleanup <resourceName>

 

4.      添加AG到Cluster集群中

具体步骤如下:

a)       在所有节点上安装与Pacemaker集成的SQL Server资源包:

sudo apt-get install mssql-server-ha

b)      在所有节点上创建Pacemaker用的SQL Server登录用户:

USE [master]GOCREATE LOGIN [pacemakerLogin] with PASSWORD= N'<Your Password>'ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]

也可以不给sysadmin权限,给上如下足够的权限即可:

GRANT ALTER, CONTROL, VIEW DEFINITION ON AVAILABILITY GROUP::UbuntuAG TO pacemakerLogin

c)       在所有节点上,保存SQL Server Login的信息:

echo 'pacemakerLogin' >> ~/pacemaker-passwdecho '<Your Password>' >> ~/pacemaker-passwdsudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwdsudo chown root:root /var/opt/mssql/secrets/passwdsudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root

d)      在Cluster中Primary节点上创建AG的资源:

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=UbuntuAG --master meta notify=true

e)      在Cluster中Primary节点上创建虚拟IP资源:

sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=**<10.2.38.204>**

f)        配置Cluster资源的依赖关系和启动顺序:

sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Mastersudo pcs constraint order promote ag_cluster-master then start virtualip

g)       最后查看Cluster状态如下:

sudo pcs status

可以用虚拟IP(10.2.38.204)访问这个AG:

 

至此,Ubuntu上的Cluster管理的SQL Server Always On Availability Group就搭建完成了。

 

Note:

  • 当把AG加入到Cluster中作为一个资源的时候,就不能再使用TSQL去failover AG了。SQL Server服务端是不知道Cluster的存在的,整个系统是通过Linux Cluster来控制的,在Ubuntu和RHEL中用pcs命令,在SLES中用crm命令。

  • 全部配置完成后,可以使用虚拟IP去访问整个AG,这时可以在DNS中手动注册一个Listener名字指向这个虚拟IP,就可以当成Windows中的AG Listener使用了。

  • SQL Server 2017 CTP 1.4中新引入了一个sequence_number的概念防止数据丢失,详细参考Understand SQL Server resource agent for pacemaker(https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-cluster-ubuntu)。

参考链接:

  • Configure Always On availability group for SQL Server on Linux

  • Configure Ubuntu Cluster and Availability Group Resource

  • Configure read-scale availability group for SQL Server on Linux

  • Overview of Always On Availability Groups (SQL Server)

 

本文主要介绍了如何配置AG以及如何解决配置过程中遇到的问题,关于AG的管理使用上以后再详细介绍,如有错误或者介绍不够,敬请见谅。


相关文章

  • MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

  • SQL Server on Ubuntu——Ubuntu上的SQL Server(全截图)

  • SQL Server on Linux 理由浅析

  • SQL Server 急救包(First Responder Kit)入门教程

  • SQL Server on Linux 理由浅析

  • SQLServer On Linux Package List on CentOS

  • SQL Server on Linux的文件和目录结构

  • 个性化配置你的SQL Server on Linux

  • SQL on Linux Run on Docker

  • 如何使Mac Docker支持SQL on Linux容器Volume特性

原文地址:http://www.cnblogs.com/lavender000/p/6869757.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《白鹿原》金句摘抄(一)

青年农民情急无路&#xff0c;就从一个高坎上跳了下去&#xff0c;跌得眼冒金星&#xff0c;抬头一看&#xff0c;黄牛正在坎下的土壕里&#xff0c;腹下正有一只紫红皮毛的小牛犊撅着尻子在吮奶&#xff0c;老黄牛悠然舔着牛犊。才子的模样普普通通&#xff0c;走路的姿势也普…

架构必备「RESTful API」设计技巧经验总结

转载自 架构必备「RESTful API」设计技巧经验总结 【译者注】本文是作者在自己的工作经验中总结出来的RESTful API设计技巧&#xff0c;虽然部分技巧仍有争议&#xff0c;但总体来说还是有一定的参考价值的。以下是译文。 简单说一下代码重用 记得在Ken Rogers的Medium博客…

Android 对话框,确定取消

1 添加依赖 //对话框implementation com.nineoldandroids:library:2.4.0implementation com.github.sd6352051.niftydialogeffects:niftydialogeffects:1.0.0aar代码 final NiftyDialogBuilder dialogBuilder NiftyDialogBuilder.getInstance(this);dialogBuilder// 重点设置 …

比较两个title是否相等(差点把我送走)

事情是这样的 把相同的分类找出来返回给前端我就比较了title 我用了两个比较字符串&#xff0c;结果vos里面输出的全是null 后来 想到字符串比较的是地址 结束 总结 忘记基础害人不浅

使用java中的String类操作复杂的字符串

今天自己出了一道题差点把自己难住…… 题目是这样的&#xff1a; 已知有三条查询的sql语句&#xff0c;小明不小心写一块了&#xff0c;你帮他拆分开。sql语句为&#xff1a;"select * from books where bid 1 select * from cate where name ‘java’ select title fr…

开篇有益-解析微软微服务架构eShopOnContainers(一)

为了推广.Net Core&#xff0c;微软为我们提供了一个开源Demo-eShopOnContainers&#xff0c;这是一个使用Net Core框架开发的&#xff0c;跨平台&#xff08;几乎涵盖了所有平台&#xff0c;windows、mac、linux、android、ios&#xff09;的&#xff0c;基于微服务架构的&…

十面阿里,菜鸟,天猫,蚂蚁金服题目总汇

转载自 十面阿里&#xff0c;菜鸟&#xff0c;天猫&#xff0c;蚂蚁金服题目总汇 虽然天猫&#xff0c;蚂蚁金&#xff0c;菜鸟都归属阿里旗下&#xff0c;但每个面试官问的问题都不一样&#xff0c;相同点主要在流程方面。 面试开始会让自我介绍&#xff0c;主要业务架构…

React打包运行

项目打包运行 npm run build //生成打包文件 npm install -g serve //全局下载服务器包 serve build //通过服务器命令运行打包项目 访问: http://localhost:5000 //浏览器访问

端午将至……想和程序猿Coding个粽子行不行?

端午将至……都说程序猿无所不能……不造 Coding个粽子行不行&#xff1f; Build Tour 2017 世界巡回展已经开始倒计时……大家都报完名了么&#xff1f; 反正&#xff0c;M姐现在已经安排了我软的程序猿们不远万里的来到中国&#xff0c;他们将会在上海和北京两地&#xff0c;…

Android音频处理 PCM格式

Android音频处理——通过AudioRecord去保存PCM文件进行录制&#xff0c;播放&#xff0c;停止&#xff0c;删除功能 Android音频开发&#xff08;2&#xff09;&#xff1a;使用AudioRecord录制pcm格式音频 AudioTrack读取PCM

《白鹿原》金句摘抄(二)

白赵氏已经脱了裤子&#xff0c;用被子偎着下半身&#xff0c;一只手轻轻地拍着依偎在怀里的小孙子牛犊&#xff0c;嘴里哼着猫儿狗儿的催眠曲儿&#xff0c;轻轻摇着身子&#xff0c;看着儿子嘉轩临睡前过着烟瘾。她时不时地把儿子就当成已经故去的丈夫&#xff0c;那挺直腰板…

两年摸爬滚打 Spring Boot,总结了这 16 条最佳实践

转载自 两年摸爬滚打 Spring Boot&#xff0c;总结了这 16 条最佳实践 Spring Boot是最流行的用于开发微服务的Java框架。在本文中&#xff0c;我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验和一些熟知的Spring Boot…

把本地文件上传到gitee

第一步 先克隆远程文件到本地 第二步 上传本地文件到远程

《白鹿原》金句摘抄(三)

人说前悔容易后悔难。三十几名士兵按三个班分头进入不同的村庄&#xff0c;射杀一批吊起来的公鸡母鸡白鸡黑鸡芦花鸡杏黄鸡肉红鸡帽儿鸡&#xff0c;腾起一片血雨肉雹&#xff0c;扬起一片五彩缤纷的鸡毛&#xff0c;留下一摊血红的土地&#xff0c;然后宣布&#xff1a;一亩一…

【活动】HoloLens 黑科技等你来探秘

微软全息眼镜&#xff08;HoloLens&#xff09;是微软最新推出的混合现实头显设备。酷炫的全息图像和包括语音控制和手势控制的全自然交互手段给用户带来前所未有的体验&#xff0c;目前已经在制造、医疗、建筑、娱乐等多个行业展现了非常好的应用前景和市场潜力。HoloLens既是…

Java int 转大端序、小端序

采用小端法&#xff0c; 字节的排序是从最无意义的字节到最有意义的字节。 而大端法中&#xff0c; 字节的排序是从最有意义的字节到最无意义的字节。 public static byte[] intToByteBig(int n) {byte[] b new byte[4];b[0] (byte) (n >> 24 & 0xff);b[1] (byt…

面试必备:30 个 Java 集合面试问题及答案

转载自 面试必备&#xff1a;30 个 Java 集合面试问题及答案 Java集合框架为Java编程语言的基础&#xff0c;也是Java面试中很重要的一个知识点。这里&#xff0c;我列出了一些关于Java集合的重要问题和答案。 1.Java集合框架是什么&#xff1f;说出一些集合框架的优点&…

《白鹿原》金句摘抄(四)

狗蛋吓得浑身筛糠连连求饶。当即作出毫不含糊而又坚决的反应小娥的境况好多了。她拖着浑身流血的身体挪回窑洞&#xff0c;鹿子霖当天晚上就来看护她。太阳冒红时&#xff0c;白鹿原的官道小路上&#xff0c;庄稼汉男女穿着浆捶得平展硬峥的家织布白衫青裤&#xff0c;臂弯里挎…

ASP.NET Core MVC 模型绑定用法及原理

前言 查询了一下关于 MVC 中的模型绑定&#xff0c;大部分都是关于如何使用的&#xff0c;以及模型绑定过程中的一些用法和概念&#xff0c;很少有关于模型绑定的内部机制实现的文章&#xff0c;本文就来讲解一下在 ASP.NET Core MVC 中模型绑定是如何实现的&#xff0c;以及它…