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

Mogdb双网卡同步最佳实践

原创 许玉晨 2023-11-28
899

MogDB 支持使用双网卡进行流复制,以确保主备数据库间的数据同步。双网卡配置在MogDB中用于流复制,可以显著提高数据同步的可靠性和系统的整体稳定性,尤其适合于对高可用性有严格要求的应用环境。

原理和优势:

.双重网络路径:两个网络接口卡提供了双重网络路径,增加了冗余性和容错能力。
.故障转移能力:如果其中一个网络接口发生故障,另一个可以接管数据同步任务,从而保持持续的数据一致性。
.提高可靠性:在高负载或网络不稳定的情况下,双网卡配置提供了更高的可靠性和稳定性。

以下是真实生产环境的系统架构图:
image.png

架构描述:
1、使用Mogha组件构建高可用架构,主从复制都为同步模式。
2、主用云和备用云同步是单网模式,线控站有独立的A网和B网双网模式,A\B网通过云出口交换机与主备云主机互通。
3、每个中心都有一组VIP,云主中心(vip1),云备中心(vip2)、线控站(vip3,vip4);
4、每个应用服务器都连接主库,Mogha只会把主库的vip挂载,通过驱动设置ip list,自动连接能ping通的vip,即为主库;

ip规划

机房名 主机名 ip vip
主用云 mogdb01 192.168.1.3 192.168.1.30
主用云 mogdb02 192.168.1.4 192.168.1.30
备用云 mogdb03 192.168.3.3 192.168.3.30
线控站 mogdb04 192.168.4.101/192.168.5.101 192.168.4.100/192.168.5.100

配置步骤

1、查看主机列表

cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.3 1 # ptk added 192.168.1.4 2 # ptk added 192.168.3.3 3 # ptk added 192.168.4.101 4 # ptk added

2、配置pg_hba.conf

添加互信,不然会出现Forbid remote connection with initia1 user的报错。

local all all trust host all omm 192.168.1.3/32 trust host all omm 192.168.1.4/32 trust host all omm 192.168.3.3/32 trust host all omm 192.168.4.101/32 trust host all omm 192.168.5.101/32 trust # IPv4 local connections: host all all 127.0.0.1/32 trust host all all 192.168.1.3/32 sha256 host all all 192.168.1.4/32 sha256 host all all 192.168.3.3/32 sha256 host all all 192.168.4.101/32 sha256 host all all 192.168.5.101/32 sha256

3、流复制通道配置

配置replconninfoN,主备云因为是单网,只需要配置一个流复制通道,线控站有A\B网,因此需要配置两个流复制通道。
参数说明: 设置本端侦听和鉴权的第N个节点信息(N=1, 2, 3, …8)。
具体配置如下:

分别修改4台机器的postgresql.conf 192.168.1.3: replconninfo1 = 'localhost=192.168.1.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.4 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo2 = 'localhost=192.168.1.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.3.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo3 = 'localhost=192.168.1.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.4.101 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo4 = 'localhost=192.168.1.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.5.101 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' 192.168.1.4的postgresql.conf: replconninfo1 = 'localhost=192.168.1.4 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo2 = 'localhost=192.168.1.4 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.3.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo3 = 'localhost=192.168.1.4 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.4.101 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo4 = 'localhost=192.168.1.4 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.5.101 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' 192.168.3.3: replconninfo1 = 'localhost=192.168.3.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo2 = 'localhost=192.168.3.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.4 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo3 = 'localhost=192.168.3.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.4.101 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo4 = 'localhost=192.168.3.3 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.5.101 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' 192.168.4.101(192.168.5.101): replconninfo1 = 'localhost=192.168.4.101 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo2 = 'localhost=192.168.5.101 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo3 = 'localhost=192.168.4.101 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.4 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo4 = 'localhost=192.168.5.101 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.1.4 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo5 = 'localhost=192.168.4.101 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.3.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004' replconninfo6 = 'localhost=192.168.5.101 localport=26001 localheartbeatport=26005 localservice=26004 remotehost=192.168.3.3 remoteport=26001 remoteheartbeatport=26005 remoteservice=26004'

4、配置主备切换优先级synchronous_standby_names

从架构图可以看出,几个机房的优先顺序是主用云>备用云>线控站,具体来说192.168.1.3>192.168.1.4>192.168.3.3>192.168.4.101(192.168.5.101)
也就是dn_6001>dn_6002>dn_6003>dn_6004。

这里的主备切换优先级需要参数synchronous_standby_names来控制。
参数说明: 潜在同步复制的备机名称列表,每个名称用逗号分隔。

FIRST N (node1,node2,…)表示在括号内按出现顺序的先后作为优先级选择前N个主机名称作为同步复制的备机名称列表。例如,FIRST 2 (node1,node2)表示选择node1作为同步复制的第一备机名称,node1作为同步复制的第二备机名称。

分别修改4台机器的postgresql.conf 192.168.1.3: synchronous_standby_names = 'FIRST 2(dn_6002,dn_6003,dn_6004)' # standby servers that provide sync rep 192.168.1.4: synchronous_standby_names = 'FIRST 2(dn_6001,dn_6003,dn_6004)' # standby servers that provide sync rep 192.168.3.3: synchronous_standby_names = 'FIRST 2(dn_6001,dn_6002,dn_6004)' # standby servers that provide sync rep 192.168.4.101(192.168.5.101): synchronous_standby_names = 'FIRST 2(dn_6001,dn_6002,dn_6003)' # standby servers that provide sync rep 所有节点 local_bind_address = '0.0.0.0' 改成 local_bind_address = '*' 不然会出现备库down A网情况下,备库的gs_ctl query显示异常wait A网:26001 timeout expired

4、配置mogha

修改node.conf

zone1~3 用于定义机房,分别表示主用云,备用云,线控站, 不同机房配置独立虚拟IP,分别为192.168.3.30,192.168.1.30,192.168.4.100,192.168.5.100

# docs: https://docs.mogdb.io/zh/mogha/v2.3/overview # 注意: 如果需要打开注释修改参数, 参数名前不能有空格 [config] # 数据库端口 db_port=26000 # 数据库的操作系统用户, 通常为omm db_user=omm # 数据库的数据目录 db_datadir=/opt/mogdb/data # 本地主库元数据存储路径 # primary_info=__INSTALLDIR__/primary_info # 本地备库元数据存储路径 # standby_info=__INSTALLDIR__/standby_info # 是否使用 lite 模式, 可选值: True / False lite_mode=False # HA节点之间心跳端口, 如果有防火墙, 需要配置互通 agent_port=8081 # 心跳间隔时间 heartbeat_interval=3 # 主库丢失的探测时间 primary_lost_timeout=5 # 主库的孤单时间 primary_lonely_timeout=5 # 双主确认超时时间 double_primary_timeout=5 # 本地元数据文件类型,支持 json/bin meta_file_type=json # 设置输出的日志格式 logger_format=%(asctime)s %(levelname)s [%(filename)s:%(lineno)d]: %(message)s # [2.3.0新增]设置日志存储目录 # log_dir=__INSTALLDIR__ # [2.3.0新增] 日志文件最大字节数(接近该值时,将发生日志滚动) # 支持的单位: KB, MB, GB (忽略大小写) # log_max_size=512MB # [2.3.0新增] 日志保留的文件个数 # log_backup_count=10 # 设置除了主备相关的机器, 允许可以访问到web接口的IP列表, 多个IP时逗号分隔 # allow_ips= # [2.1新增] 主实例进程未启动时,是否需要 HA 进行拉起或切换 # 搭配 primary_down_handle_method 使用 # handle_down_primary=True # [2.1新增] 备库进程未启动时,是否需要 HA 进行拉起 # handle_down_standby=True # [2.1新增] 主库实例进程未启动时,如何处理 # 支持两种处理方式: # - restart: 尝试重启,尝试次数在 restart_strategy 参数中设定 # - failover: 直接切换 primary_down_handle_method=restart # [2.1新增] 重启实例最大尝试条件: times/minutes # 例: 3/3 最多尝试3次或者3分钟, 任何一个条件先满足就不再尝试。 # [2.4.10更新] 调整默认值为 3/1, 重试次数最多3次] # restart_strategy=3/1 # [2.2.1新增] # debug_mode=False # [2.3.0新增] # HA节点间HTTP API 心跳请求超时时间(秒) # http_req_timeout=2 # host1-9, 每个代表一个机器(最多支持1主8备) # - ip: HA节点间通信IP # - heartbeat_ips: (选填)HA节点间通信的冗余 ip, 允许配置多个, 以逗号隔开, [host1] ip=192.168.1.3 [host2] ip=192.168.1.4 [host3] ip=192.168.3.3 [host4] ip=192.168.4.101 heartbeat_ips=192.168.5.101 replconn_ip=192.168.4.101,192.168.5.101 # zone1~3 用于定义机房, 不同机房配置独立虚拟IP # - hosts: (必填) 本机房内机器列表, 填写机器在配置文件中对应的配置模块名 host1~9, 示例: host1,host2 # - ping_list: (必填) 用于检查网络是否通畅的仲裁节点, 例如网关, 支持填写多个IP (逗号分隔) # - vip: (选填) 机房虚拟IP # - vip_bind_nic: (选填) 虚拟IP要绑定的网卡名, 默认使用 host 配置中的 ip 的网卡 [2.4.0新增] # - vip_netmask: (选填) 虚拟ip的子网掩码, 默认和 host 配置中 ip 同一网段 [2.4.0新增] # - cascades: (选填) 机房内的级联机器列表 (配置方式同 hosts, 没有不填) # - arping: (选填) 机房的 arping 地址, 切换虚拟IP后通知该地址 [zone1] hosts=host1,host2 ping_list=192.168.1.6,192.168.3.2 cascades= vip=192.168.1.30 vip_bind_nic=bond0 vip_netmask=255.255.255.0 arping= [zone2] hosts=host3 ping_list=192.168.1.6,192.168.3.2 cascades= vip=192.168.3.30 vip_bind_nic=bond0 vip_netmask=255.255.255.0 arping= [zone3] hosts=host4 ping_list=192.168.1.6,192.168.3.2 vip=192.168.4.100,192.168.5.100 vip_bind_nic= vip_netmask= cascades= arping=

通过本文的介绍,我们了解了MogDB在双网卡同步方面的配置和最佳实践。希望这些信息能帮助您在构建高可用性和高性能的数据库系统时,有效地利用双网卡同步的优势。当然,任何系统配置都需根据实际情况进行调整和优化。我们期待您的反馈和实践经验,共同推动MogDB技术的发展和优化。

最后修改时间:2023-12-04 22:16:51
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论