啊我死了 發表於 2026-3-10 19:09:00

搭建数据库服务高可用架构

<h1 id="搭建数据库服务高可用架构">搭建数据库服务高可用架构</h1>
<pre><code class="language-bash">为了实现数据服务主库异常后,可以将从库自动切换为主库
</code></pre>
<h2 id="1搭建高可用主从架构">1.搭建高可用主从架构</h2>
<pre><code class="language-sh">架构环境规划 -- centos 7.9
主库    10.0.0.51    8.0.36MHA-node
从库    10.0.0.52    8.0.36MHA-node
从库    10.0.0.53    8.0.36MHA-node
mgr   10.0.0.54    8.0.36MHA-node MHA-manager

MHA-manager: 管理程序包负责监控和控制主从架构
MHA-node   : 节点程序包和管理程序进行对接

步骤一:在虚拟环境中部署安装数据库和MHA程序
主库安装程序信息
安装数据库8.0.36 程序 并实现程序正常运行 (二进制包)
安装MHA-node程序
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

yum localinstall -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

从库安装程序信息
安装数据库8.0.36 程序 并实现程序正常运行 (二进制包)
安装MHA-node程序
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

yum localinstall -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

管理节点程序信息
安装数据库8.0.36 程序 不需要程序正常运行 (二进制包)
安装MHA-node程序
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

yum localinstall -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

安装MHA-manager程序
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

yum localinstall -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

步骤二:在数据库和管理节点中做高可用环境配置
准备好主从同步架构环境 -- GTID(推荐)
show slave status\G

实现主从数据库之间互信 -- ssh互信      
主库操作 -- 10.0.0.51
rm -rf /root/.ssh
ssh-keygen
cd /root/.ssh
mv id_rsa.pub authorized_keys
scp-r/root/.ssh10.0.0.52:/root
scp-r/root/.ssh10.0.0.53:/root
scp-r/root/.ssh10.0.0.54:/root
ssh 10.0.0.52 date
ssh 10.0.0.53 date
ssh 10.0.0.54 date

- 以上操作完毕,表示52和53和54都信任了51

ssh 10.0.0.51 date
ssh 10.0.0.53 date
ssh 10.0.0.54 date
-- 以上操作完毕,表示51和53和54都信任了52

ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.54 date
-- 以上操作完毕,表示51和52和54都信任了53

ssh 10.0.0.51 date
ssh 10.0.0.52 date
ssh 10.0.0.53 date
-- 以上操作完毕,表示51和52和53都信任了54


步骤三:运行启动高可用服务程序
ln -s /usr/local/mysql/bin/mysql/usr/bin/mysql
ln -s /usr/local/mysql/bin/mysqlbinlog/usr/bin/mysqlbinlog
-- 命令软链接创建,在管理节点和主从节点都进行创建

-- 以下操作信息,在管理节点执行即可(10.0.0.54)
mkdir -p /etc/mha
-- 创建配置文件目录
mkdir -p /var/log/mha/app1
-- 创建日志目录


create user mha@'10.0.0.%' identified with mysql_native_password by 'mha';
grant all privileges on *.* to mha@'10.0.0.%';
-- 在主从环境搭建好,在主库中创建mha监控用户


cat &gt; /etc/mha/app1.cnf &lt;&lt;EOF

manager_log=/var/log/mha/app1/manager         
-- MHA的工作日志设置
manager_workdir=/var/log/mha/app1            
-- MHA的工作目录      
master_binlog_dir=/data/3306/data/               
-- 主库的binlog目录
user=mha                                    
-- 监控用户,利用此用户连接各个节点,做心跳检测(主要是检测主库的状态)                     
password=mha                                 
-- 监控密码
ping_interval=2                              
-- 心跳检测的间隔时间
repl_password=123456                           
-- 复制密码
repl_user=repl                              
-- 复制用户(用于告知从节点通过新主同步数据信息的用户信息)
ssh_user=root                              
-- ssh互信的用户(可以利用互信用户从主库scp获取binlog日志信息,便于从库进行数据信息补偿)
                                    
-- 节点信息....
hostname=10.0.0.51
port=3306                                 
            
hostname=10.0.0.52
port=3306

hostname=10.0.0.53
port=3306
EOF
-- 编辑mha配置文件


nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover&lt; /dev/null&gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;


MHA服务启动扩展说明:
masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:23754) is running(0:PING_OK), master:10.0.0.51
-- 查看mha服务是否正确运行

排查启动异常方法:
1)查看日志信息,确认启动异常原因
/var/log/mha/app1/manager.log
2)执行查看命令,确认启动异常原因
masterha_check_ssh --conf=/etc/mha/app1.cnf
-- 确认SSH互信是否正常
masterha_check_repl --conf=/etc/mha/app1.cnf
-- 确认主从同步是否正常
</code></pre>
<h2 id="2mha高可用功能配置和原理说明">2.MHA高可用功能配置和原理说明</h2>
<pre><code class="language-bash">1)MHA高可用服务运行启动
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover&lt; /dev/null &gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;

--conf=/etc/mha/app1.cnf-- 配置文件没有存储在默认路径下,需要进行指定加载;需要利用自定义配置文件实现多个主从架构高可用
--remove_dead_master_conf -- 表示在配置文件中会将有故障的主节点配置删除,避免配置信息影响选主效率
--ignore_last_failover    -- 表示可以让高可用服务出现异常后,快速启动
&lt; /dev/null               -- 表示程序运行过程中,忽略所有交互操作信息
PS:MHA实现高可用属于一次性高可用服务

2)MHA高可用主节点监控过程
mha会调用masterha_master_monitor监控主节点脚本 实现确认主库是否存活
应用监控用户(mha)登录连接主库,执行SQL语句 select user();
当发现监控用户无法连接主库或者无法向主库发送查询请求,都会触发故障转移操作

3)MHA会从其余节点中选择新主节点(选主过程)52 53 54 55 56 57
进行分组操作
alive   将活着的从节点划分到存活组中   52 53   
latest数据量和主库基本一致的组       52 53   
pref    指定接替主库角色节点信息组      (candidate_master=1)
dead    不会参数选主的角色组          54      (no_master=1/log_bin=0/检测主从数据差异量&gt;100M)      


根据不同策略选主
最优策略   先考虑 alive   其次考虑latest再其次考虑pref最后确认dead组 55 56
          以上策略选择完,还有多个节点信息,根据节点顺序编号选择最终的主节点

次优选择   先考虑 alive   其次考虑latestdead组      
          以上策略选择完,还有多个节点信息,根据节点顺序编号选择最终的主节点

再次优选择 先考虑 alive   其次考虑pref    dead组
          以上策略选择完,还有多个节点信息,根据节点顺序编号选择最终的主节点

最后选主方法 先考虑 alive dead组
         以上策略选择完,还有多个节点信息,根据节点顺序编号选择最终的主节点


4)MHA数据补偿操作过程   
   情况一:原有主库只是数据库服务异常,但是数据库系统环境正常(ssh连接管理)
   ssh 连接主库 -- 到指定binlog目录中拉取日志 -- 从库中(选举后)-- 将主库binlog信息补充到从库中
   情况二:原有主库系统崩溃,无法实现ssh连接管理
   1)所有从库之间进行binlog信息对比 ssh连接所有从库
   52 新主-- 53 binlog -- 54 binlog -- 55 binlog
    1-15      1-9         1-15      1-10
   2)借助远程日志备份服务器,将binlog日志信息拉取并补偿数据
   必须搭建好原有备份日志服务/管理节点可以连接备份服务器拉取日志         
   mkdir -p /backup/binlog/10.0.0.51/ &amp;&amp; cd /backup/binlog/10.0.0.51/   
   mysqlbinlog -R --host=10.0.0.51 --user=root --password=123456 --raw --stop-never binlog.000001 &amp;

   vim /etc/mha/app1.cnf
   
   hostname=10.0.0.54
   master_binlog_dir=/backup/binlog/10.0.0.51/   
   no_master=1

5) MHA会自动完成主从重建过程
   52 新主   10.0.0.523306repl123456
   管理其他从节点和新主建立连接
   53 从库   stop slave; change master 10.0.0.523306   repl123456; start slave
   54 从库   stop slave; change master 10.0.0.523306   repl123456; start slave   

6) MHA实现VIP地址创建和实现地址漂移
   ifconfig ens33:1 10.0.0.50/24-- 在主库中执行

   上传脚本文件信息
   vim /usr/local/bin/master_ip_failover
   13 my $vip = '10.0.0.50/24';
   14 my $key = '1';
   15 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
   16 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
   17 my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.50";
   -- 以上编写内容在mha管理节点操作

   vim /etc/mha/app1.cnf
   
   master_ip_failover_script=/usr/local/bin/master_ip_failover

7) MHA故障切换实现邮件报警功能
   vim /usr/local/bin/send_report
   28 my $smtp='smtp.qq.com';
   29 my $mail_from='330882721@qq.com';
   30 my $mail_user='330882721';
   31 my $mail_pass='lshxuahtxuxfcaec';
   32 #my $mail_to=['to1@qq.com','to2@qq.com',];
   33 my $mail_to='330882721@qq.com';

   vim /etc/mha/app1.cnf
   
   report_script=/usr/local/bin/send_report
</code></pre>
<h3 id="mha额外配置">MHA额外配置</h3>
<pre><code class="language-sh">1)VIP地址漂移功能设置   /usr/local/bin/master_ip_failover   mha服务加载
2)数据补偿功能设置      搭建binlog日志远程备份功能/可以拉取备份日志
3)实现MHA报警功能       /usr/local/bin/send_report          mha服务加载
</code></pre>
<h3 id="mha高可用切换原理">MHA高可用切换原理</h3>
<pre><code class="language-bash">1)当MHA实现高可用监控后,会不断对主库发起探活测试,但发现主库不能连接或返回查询结果
2)当MHA发现主库异常后,会先举行新主角色选举过程
3)当新的主节点选择后,会将数据信息在新的主节点上进行补偿
4)在新的主节点补偿数据后,会实现新主节点和其余从节点之间主从关系重建
5)在原有主节点上会删除VIP地址,在新主节点上会生成VIP地址(VIP漂移)
6)所有前端业务都会访问新的主节点
7)会利用邮件报警脚本,实现MHA故障转移报警通知
</code></pre>
<h2 id="3mha高可用功能测试和修复">3.MHA高可用功能测试和修复</h2>
<pre><code class="language-bash">MHA切换功能测试
masterha_stop --conf=/etc/mha/app1.cnf
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover&lt; /dev/null &gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;

/etc/init.d/mysqld stop
-- 模拟主库异常

-- 检测VIP地址是否漂移      主库vip是否清理从库是否生成VIP
-- 检查主从关系是否重新建立show slave status\G获取新主库连接信息
-- 检查报警邮件信息是否收到QQ 其他邮箱


MHA切换修复过程:
步骤一:将原有主库恢复运行启动
/etc/init.d/mysqld start
-- 当主库无法正常恢复启动,可以重新建立新的数据库实例(重新加载备份数据 和新主库建立主从同步)

步骤二:在原有主库中做设置,实现和新主库建立主从同步
reset master;
CHANGE MASTER TO
MASTER_HOST='10.0.0.52',
MASTER_PORT=3306,
MASTER_USER='repl',
MASTER_PASSWORD='123456',
master_auto_position=1;

在新主库中做数据备份,在原主库中进行数据恢复
mysqldump -A --source-data &gt;/backup/all-03-09-02.sql
scp -rp /backup/all-03-09-02.sql 10.0.0.51:/backup/
mysql &lt;/backup/all-03-09-02.sql

start slave;

步骤三:在MHA配置文件中,添加原主节点配置信息
vim /etc/mha/app1.cnf

hostname=10.0.0.51
port=3306

步骤四:恢复binlog日志远程备份功能
10.0.0.54
mkdir -p /backup/binlog/10.0.0.52/ &amp;&amp; chown -R mysql.mysql /backup/binlog/10.0.0.52/
cd /backup/binlog/10.0.0.52/
mysqlbinlog -R --host=10.0.0.52 --user=root --password=123456 --raw --stop-never binlog.000001 &amp;


步骤五:重新恢复MHA服务运行启动
vim /etc/mha/app1.cnf

hostname=10.0.0.54
master_binlog_dir=/backup/binlog/10.0.0.52/   
no_master=1

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover&lt; /dev/null &gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;
</code></pre>
<h2 id="4mha切换主数据库角色到原有主库">4.MHA切换主数据库角色到原有主库</h2>
<pre><code class="language-bash">利用脚本文件实现角色手工切换转移   52(主) -主角色切换- 51(主)
步骤一:编写手工切换脚本信息,并加载手工切换脚本
vim /usr/local/bin/master_ip_online_change
21 my $vip = "10.0.0.50/24";
22 my $key = "1";
23 my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";   
24 my $ssh_stop_vip = "/sbin/ifconfig ens33:$key $vip down";
25 my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.50/24";

vim /etc/mha/app1.cnf
master_ip_online_change_script=/usr/local/bin/master_ip_online_change

步骤二:实现手工切换主备角色信息
masterha_stop--conf=/etc/mha/app1.cnf
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive --new_master_host=10.0.0.51 --orig_master_is_new_slave --running_updates_limit=10000

--master_state=alive   -- 表示在主节点正常运行状态,做主备切换
--new_master_host      -- 表示将哪个节点切换成主节点
--orig_master_is_new_slav-- 表示让其余从节点和新主节点重新建立主从关系   
--running_updates_limit    -- 切换过程有异常超过时间设定,会撤销切换

FLUSH NO_WRITE_TO_BINLOG TABLES   --在主节点做命令执行切换过程中禁止向主节点写入新的binlog信息

步骤三:重新恢复MHA服务运行
vim /etc/mha/app1.cnf

hostname=10.0.0.54
master_binlog_dir=/backup/binlog/10.0.0.51/   
no_master=1

cd /backup/binlog/10.0.0.51/
mysqlbinlog -R --host=10.0.0.51 --user=root --password=123456 --raw --stop-never binlog.00000X &amp;

nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover&lt; /dev/null &gt; /var/log/mha/app1/manager.log 2&gt;&amp;1 &amp;
</code></pre>
<h1 id="总结">总结</h1>
<pre><code class="language-sh">1)MHA高可用架构部署过程
   环境准备(安装程序 主从同步 ssh互信设置) --&gt; 编写配置文件,并启动mha服务 --&gt; 额外功能设置(VIP漂移/数据补偿功能/报警功能设置)
2)MHA高可故障切换原理/高可用切换测试
3)MHA故障修复过程
   -- 将故障节点修复后,可以重新加入到高可用集群中
   -- 可以手工将原有主库角色恢复
</code></pre>
<h1 id="课程知识练习">课程知识练习</h1>
<pre><code class="language-bash">1.重新部署综合架构LNMP架构(wordpress) 在数据库应用上可以应用mysql数据库(构建为高可用架构)
2.测试主库故障,网站业务是否可以正常访问50x
</code></pre><br><br>
来源:https://www.cnblogs.com/jindongyan666/p/19694112
頁: [1]
查看完整版本: 搭建数据库服务高可用架构