公司动态
0823Keepalived + LVS(DR) + MariaDB主主 小白完整实战教程
文章目录Keepalived LVS(DR) MariaDB主主 小白完整实战教程一、业务背景与架构选型数据库业务四大刚性需求传统架构痛点本套方案组件分工项目预期收益二、MariaDB主从/主主复制原理核心日志与线程完整同步流程三、实验环境规划四、基础环境初始化所有机器1. 修改主机名、网卡IP2. router路由器开启IP转发五、部署MariaDB配置主主双向复制db1配置db2配置第一步db2作为从库同步db1db1→db2第二步db1作为从库同步db2db2→db1完成双向主主六、数据库后端RS配置LVS‑DR环境db1、db2两台都操作七、KeepalivedLVS配置调度器ha1、ha2ha1主调度器priority 110ha2备调度器priority 100八、业务测试验证1. 在数据库创建远程测试账号db1执行即可主主会同步到db22. client客户端安装mysql客户端工具访问VIP故障模拟测试核心高可用验证九、常见踩坑排错清单Keepalived LVS(DR) MariaDB主主 小白完整实战教程整套架构四层负载均衡LVS‑DR Keepalived实现调度器主备高可用 MariaDB双主互备复制实现数据库无间断对外服务企业常用数据库高可用方案。 整体流程客户端连接VIP访问数据库 → KeepalivedLVS做四层调度分发请求到两台MariaDB数据库双向主主复制保证两边数据一致任意一台调度器/数据库故障自动切换业务无感知。一、业务背景与架构选型数据库业务四大刚性需求高可用24×7不间断硬件宕机、进程崩溃不能导致业务中断故障自动转移。高并发承载读写量大单台数据库CPU/IO容易瓶颈。数据可靠性故障不丢失数据多节点之间数据同步一致。可扩展增加数据库节点不用修改业务代码。传统架构痛点架构问题单节点数据库单点故障宕机业务全部中断恢复慢有丢数据风险简单一主一从写操作全部压在主库故障切换需要人工操作容易出错业务层硬编码地址没有故障检测后端宕机业务还会继续访问故障节点新增节点需要改代码重启服务本套方案组件分工组件作用MariaDB主主复制两台数据库互为主从双向binlog同步两台库都可以读写一台故障另一台拥有完整数据LVS‑DR四层负载均衡转发数据库3306端口请求响应报文数据库直接返回客户端不经过调度器性能极高自带后端节点健康检测故障节点自动剔除Keepalived1. 给LVS做主备高可用VIP故障漂移消除调度器单点2. 直接写配置生成ipvs规则不用敲命令3. TCP健康检查后端数据库3306端口数据库挂掉自动摘除节点项目预期收益可用性提升故障自动切换无需人工干预写能力双库分担读能力可以继续追加从库横向扩展业务只需要连接一个VIP地址后端数据库变更业务代码零修改。二、MariaDB主从/主主复制原理主主复制本质就是两台数据库互做对方的主从复制A同步BB同步A实现双向数据同步。核心日志与线程binlog二进制日志主库记录所有增删改DDL/DML语句是复制的数据源。relay log中继日志从库从库拉取到binlog先存成本地中继日志再执行。binlog dump线程主库把binlog事件发送给从库IO线程。IO线程从库连接主库拉取binlog写入relay‑log。SQL线程从库读取relay‑log在本机回放SQL实现数据同步。完整同步流程主库执行写操作事务提交写入binlog日志。从库IO线程连接主库指定binlog文件名和position位置请求日志。主库dump线程读取binlog把事件传给从库IO线程。IO线程收到数据写入本机relay‑log记录同步位点。SQL线程读取relay‑log回放SQL语句完成数据同步。主主复制db1→db2做一遍主从db2→db1再反向做一遍主从双向同步。三、实验环境规划主机名IP地址网关角色VIPclient2.meng.cloud10.1.1.2110.1.1.20外部测试客户端无client1.meng.cloud10.1.8.2110.1.8.20内网测试客户端无router.meng.cloud10.1.8.20 / 10.1.1.2010.1.8.2路由器无ha1.meng.cloud10.1.8.1310.1.8.20LVSKeepalived主调度器10.1.8.100ha2.meng.cloud10.1.8.1410.1.8.20LVSKeepalived备调度器10.1.8.100db1.meng.cloud10.1.8.1110.1.8.20MariaDB数据库110.1.8.100dummy网卡db2.meng.cloud10.1.8.1210.1.8.20MariaDB数据库210.1.8.100dummy网卡VIP统一10.1.8.100业务客户端只连接这个IP访问数据库3306端口。四、基础环境初始化所有机器1. 修改主机名、网卡IP#### client2 hostnamectl set-hostname client2.meng.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.1.21/24 ipv4.gateway 10.1.1.20 ipv4.dns 223.5.5.5 autoconnect yes nmcli connection up ens33 #### client1 hostnamectl set-hostname client1.meng.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.21/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes nmcli connection up ens33 #### router路由器 hostnamectl set-hostname router.meng.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.20/24 ipv4.gateway 10.1.8.2 ipv4.dns 223.5.5.5 autoconnect yes nmcli connection up ens33 nmcli connection add type ethernet con-name ens36 ifname ens36 ipv4.method manual ipv4.addresses 10.1.1.20/24 autoconnect yes nmcli connection up ens36 #### ha1调度器 hostnamectl set-hostname ha1.meng.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.13/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes nmcli connection up ens33 #### ha2调度器 hostnamectl set-hostname ha2.meng.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.14/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes nmcli connection up ens33 #### db1数据库 hostnamectl set-hostname db1.meng.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.11/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes nmcli connection up ens33 #### db2数据库 hostnamectl set-hostname db2.meng.cloud nmcli connection modify ens33 ipv4.method manual ipv4.addresses 10.1.8.12/24 ipv4.gateway 10.1.8.20 ipv4.dns 223.5.5.5 autoconnect yes nmcli connection up ens332. router路由器开启IP转发echo net.ipv4.ip_forward1 /etc/sysctl.conf sysctl -p systemctl enable --now firewalld firewall-cmd --set-default-zonetrusted firewall-cmd --add-masquerade --permanent firewall-cmd --add-masquerade五、部署MariaDB配置主主双向复制db1配置安装服务开启binlog、relay‑logyum install -y mariadb-server vim /etc/my.cnf.d/server.cnf写入mysqld段落[mysqld] server-id1 log_binmysql-bin relay_logmysql-relay-bin启动服务systemctl enable --now mariadb安全初始化设置root密码huawei移除匿名用户等mysql_secure_installation交互步骤回车(旧密码为空) → Y设置密码输入huawei确认后面全部回车确认。创建复制账号授权给db2mysql -uroot -phuawei grant replication slave, replication client on *.* to repl10.1.8.12 identified by huawei; flush privileges; show master status\G;记录输出File、Position这里示例mysql‑bin.000003Position:327db2配置安装配置my.cnfserver‑id必须不一样db2写2yum install -y mariadb-server vim /etc/my.cnf.d/server.cnf [mysqld] server-id2 log_binmysql-bin relay_logmysql-relay-bin systemctl enable --now mariadb mysql_secure_installation创建复制账号授权给db1mysql -uroot -phuawei grant replication slave, replication client on *.* to repl10.1.8.11 identified by huawei; flush privileges; show master status\G;记录File、Position示例mysql‑bin.000002Position:1769第一步db2作为从库同步db1db1→db2db2数据库执行mysql命令替换成刚刚show master status拿到的文件名和positionchange master to master_host10.1.8.11, master_userrepl, master_passwordhuawei, master_port3306, master_log_filemysql-bin.000003, master_log_pos327, master_connect_retry30; start slave; show slave status\G;✅必须看到Slave_IO_Running: Yes、Slave_SQL_Running: Yes才算正常。测试db1建库建表插入数据db2查询确认数据同步过来。第二步db1作为从库同步db2db2→db1完成双向主主db1数据库执行替换db2的binlog文件名和positionchange master to master_host10.1.8.12, master_userrepl, master_passwordhuawei, master_port3306, master_log_filemysql-bin.000002, master_log_pos1769, master_connect_retry30; start slave; show slave status\G;✅db1这边也必须IO、SQL线程全部Yes双向复制完成两边写数据都可以互相同步。⚠️主主复制注意业务层要做好主键冲突规避否则双向同时插入相同主键会报错。六、数据库后端RS配置LVS‑DR环境db1、db2两台都操作DR模式关键点后端数据库也要绑定VIP/32掩码ARP抑制不对外响应VIP的ARP请求防止ARP漂移。# 创建dummy虚拟网卡绑定VIP掩码32位 nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32 nmcli connection up dummy # 配置arp抑制内核参数 cat /etc/sysctl.conf EOF net.ipv4.conf.all.arp_ignore 1 net.ipv4.conf.all.arp_announce 2 net.ipv4.conf.dummy.arp_ignore 1 net.ipv4.conf.dummy.arp_announce 2 EOF sysctl -p参数解释arp_ignore1只接收本机真实网卡IP的ARP请求dummy上的VIP不回复ARParp_announce2发送ARP广播不用VIP做源IP避免把VIP‑MAC广播出去造成冲突。七、KeepalivedLVS配置调度器ha1、ha2Keepalived的virtual_server段直接生成ipvs规则TCP_CHECK每隔一段时间探测3306端口数据库端口不通自动把该RS剔除负载均衡集群。ha1主调度器priority 110安装软件yum install -y keepalived ipvsadm cp /etc/keepalived/keepalived.conf{,.bak} vim /etc/keepalived/keepalived.conf完整配置文件! Configuration File for keepalived global_defs { router_id ha1 } vrrp_instance db { state MASTER interface ens33 virtual_router_id 51 priority 110 advert_int 1 authentication { auth_type PASS auth_pass meng123 } virtual_ipaddress { 10.1.8.100/24 } } virtual_server 10.1.8.100 3306 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 10.1.8.11 3306 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 10.1.8.12 3306 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } }启动服务systemctl enable --now keepalived ipvsadm -Ln ip addrha2备调度器priority 100yum install -y keepalived ipvsadm cp /etc/keepalived/keepalived.conf{,.bak} vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id ha2 } vrrp_instance db { state BACKUP interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass meng123 } virtual_ipaddress { 10.1.8.100/24 } } virtual_server 10.1.8.100 3306 { delay_loop 6 lb_algo rr lb_kind DR persistence_timeout 50 protocol TCP real_server 10.1.8.11 3306 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } real_server 10.1.8.12 3306 { weight 1 TCP_CHECK { connect_timeout 3 retry 3 delay_before_retry 3 } } } systemctl enable --now keepalived参数说明 virtual_serverdelay_loop 6每6秒执行一次后端TCP健康检查lb_algo rr轮询调度算法lb_kind DRLVS DR模式persistence_timeout 50会话保持50秒同一个客户端50秒内分配到同一台后端TCP_CHECK探测3306端口端口访问失败自动从ipvs集群移除该real_server。重要提醒real_server后面只能写IP不支持域名LVS四层工作不做域名解析填域名直接启动报错。八、业务测试验证1. 在数据库创建远程测试账号db1执行即可主主会同步到db2mysql -uroot -phuawei grant ALL PRIVILEGES on *.* to meng% identified by huawei; flush privileges;2. client客户端安装mysql客户端工具访问VIPyum install -y mysql # 访问VIP不需要写db1/db2真实IP mysql -umeng -phuawei -h 10.1.8.100故障模拟测试核心高可用验证调度器故障测试ha1执行systemctl stop keepalived观察VIP漂移到ha2客户端依然可以正常连接数据库。恢复ha1 keepalivedVIP切回ha1。数据库节点故障测试db1执行systemctl stop mariadbkeepalived检测3306端口不通自动将db1剔除集群客户端访问VIP只会调度到db2业务不中断启动db1数据库自动重新加入集群。双向复制验证db1新建库表插入数据db2查询看是否同步db2插入数据db1查询看是否同步。九、常见踩坑排错清单LVS‑DR访问不通db1/db2是否配置dummy网卡VIP掩码/32arp_ignore / arp_announce内核参数是否生效所有机器必须在同一个二层广播域DR模式依靠MAC转发跨VLAN不行。MariaDB主主不同步server‑id两台数据库不能相同repl复制账号授权IP是否正确密码一致show slave status\G看IO/SQL线程状态Last_IO_Error、Last_SQL_Error查看报错。Keepalived脑裂两台调度器同时拿到VIP防火墙放行VRRP协议firewall‑cmd --add‑protocolvrrp --permanentvrrp实例virtual_router_id两台必须一致auth_pass密码两台必须一模一样多网卡机器使用mcast_src_ip指定心跳报文发出网卡IP。keepalived启动失败virtual_server、real_server语法不能写错大括号配对不能使用域名写后端地址。主主复制业务坑应用层尽量规避两台库同时生成自增主键否则主键冲突复制报错生产建议配合中间件ProxySQL做读写分离。制账号授权IP是否正确密码一致show slave status\G看IO/SQL线程状态Last_IO_Error、Last_SQL_Error查看报错。Keepalived脑裂两台调度器同时拿到VIP防火墙放行VRRP协议firewall‑cmd --add‑protocolvrrp --permanentvrrp实例virtual_router_id两台必须一致auth_pass密码两台必须一模一样多网卡机器使用mcast_src_ip指定心跳报文发出网卡IP。keepalived启动失败virtual_server、real_server语法不能写错大括号配对不能使用域名写后端地址。主主复制业务坑应用层尽量规避两台库同时生成自增主键否则主键冲突复制报错生产建议配合中间件ProxySQL做读写分离。