1. 简介
① 高可用性:故障检测及迁移,多节点备份。
② 可伸缩性:新数据库节点方便,扩展方便。
③ 负载平衡:切换服务访问节点,分担单个节点数据库的压力。
① 如果数据库停机或意外中断,可以尽快恢复数据库的可用性,尽量减少停机时间,确保业务不会因数据库故障而中断。
② 用作备份、只读等功能的【非主节点】的数据应该和主节点的数据实时或者最终保持一致。
③ 当业务发生数据库切换时,切换前后的数据库内容应一致,不会因数据缺失或数据不一致而影响业务。
2.高可用性方案
2.1双主
由于是两个主节点,两个节点之间必然存在数据同步问题。
MySQL为我们提供:异步复制、半同步复制、全同步复制。
2.1.1 MySQL从复制原理出发
1).客户端在master上执行DDL、DML操作,记录数据变更 bin log(二进制日志);
2).从库 slave 的I/O线程连接上 master,请阅读指定位置 position 日志内容;
3).master 收到从库 slave 请求后,指定位置 position 日志内容志内容和主库 bin log 从库中推送文件的名称和日志的位置 slave。 ① 通过 show master status 查看最新的 bin log 日志文件名称和位置等信息;
② 定位一个 logEvent 需要通过 binlog filename binlog position进行定位。
4).slave 的I/O线程接收到数据后,将接收到的日志内容依次写入 relay log(中继日志)文件的末尾,读取的主库 bin log 文件名和位置 position 记录到 master info 文件中,方便下次读的时候清楚的告诉。 master我需要从某个开始bin log日志的某个位置开始日志的未来内容。
5).slave 的 sql 线程检测到 relay log 内容更新后,读取日志并分析为可执行的 sql 重做句子。
2.1.2异步复制
MySQL 默认复制采用异步复制,主库在执行客户端提交的事务后会立即返回客户端,不管备库是否已接收处理。
可能出现的问题:当主库停机时,主库上提交的事务可能没有传输到仓库。异步复制会导致节点之间的数据不一致,即不一致。
2.1.3半同步复制
在执行客户端提交后,主库并没有立即返回客户端,而是等待至少一个从库中收到并写到 relay log 返回客户端的中才。
这种方案会对客户端造成一定的延迟,至少一个 TCP/IP 往返时间。
其实这个方案就是把原本只提交一个库的操作变成两个库。
优点:
① 不涉及双节点 master 停机后直接切换选主的问题。
② 结构简单,使用方便 MySQL 原生半同步复制是数据同步的基础。
缺点:无故障自动转移和负载平衡。
2.2 MHA架构
2.2.1简介
MHA(master high availability)是开源的 MySQL 目前在高可用程序中 MySQL 相对成熟的高可用解决方案。
MHA 以标准为基础 MySQL 复制(异步/半同步),
MHA 由 管理节点(MHA Manager)和 数据节点(MHA Node)两部分组成。
MHA 还提供了 master 节点在线切换的功能,也就是说,可以按需切换 master/slave 节点。
2.2.2 MHA角色
2.2.3架构
目前 MHA 主要支持一主多从的架构,
1). 从宕机崩溃的 master 保存二进制日志事件(bin log events)。 2). 识别含有最新更新的 slave。 3). 应用差异的中继日志(relay log)到其他的 slave。 4). 把 master 保存的二进制日志事件(bin log events)应用到要提升为 master 节点的 slave。 5). 解除这个 slave 的只读模式,并提升为新 master。 6). 让其他的 slave 连接到新的 master 进行复制。 |
2.2.4优缺点
① 可以监控多个集群
一个 MHA Manager 可以管理多个集群。
② 故障处理速度
在主从复制集群中,只要从库在复制上没有延迟,MHA 通常可以在数秒内实现故障切换。9-10秒内检测到 master 故障,可以在7-10秒关闭 master 以避免出现脑裂,几秒钟内,将差异中继日志(relay log)应用到新的 master 上,因此,总的宕机时间通常为 10-30 秒。恢复新的 master 后,MHA 并行恢复其余的 slave。
③ 无性能下降
MAH 适用于【异步或半同步复制】的 MySQL 复制。监控 master 时,MHA 仅仅是每隔几秒(默认是 3 秒)发送一个 ping 包,并不发送重查询,可以得到像原生 MySQL 复制一样的性能。
① 只监控 master
MHA 只保证 master 的高可用,并没有监控 slave 的状态。加入某个 slave 出现复制中断、延迟增加等问题,都是不知道的。
② 没有集成虚拟 IP 的配置
在故障转移时,为了对外透明,需要使用虚拟 IP,MHA 没有实现 VIP,需要借助于 keepAlive。
③ 安全问题
MHA 要求所有服务器之间都配置 SSH 免登录。这样就存在一定的安全隐患,如果某台服务器出现了安全问题,那么就可能影响其他服务器。
3.MHA 搭建
3.1 数据同步
如果主从库的数据一模一样,那么这一步可以略过。因为在搭建主从复制之前需要保证主从库一致。
可以使用 Navicat 工具来保证多个MySQL服务保持一致,也可以使用其他方式,具体方法就各显神通吧。
3.2 MySQL主从搭建(异步复制)
|
107 |
|
134、143 |
3.2.1 准备
【备注】:所有节点都要做如下配置(一劳永逸,目的是为了方便下面的MHA搭建)
修改 MySQL 的配置文件(可通过命令 mysql --help | grep "my.cnf" 查看配置文件的位置)。
log_bin=/usr/local/mysql/logs/binlogs/mysql-bin # 一个事务刷盘一次(bin log 刷盘机制) sync_binlog=1 # bin log 的格式 binlog_format=ROW relay-log=/usr/local/mysql/logs/relaylogs/mysql-relay # 指定 slave 要复制主库上的哪个数据库,如果有多个的话,那就得配置多个 replicate-do_db,而不是用逗号把对应的数据库名给隔开。 |
# grant replication slave on *.* to # ② 刷新 flush privileges; |
# ③ 看看有没有创建成功 select host, user from mysql.user where user = 'repluser'; |
1). 查看MySQL配置文件在服务器上的目录:mysql --help | grep "my.cnf"
|
# ① cluster id, |
# ① 重置 master reset master; # ② 查看 master 的 binlog 日志信息(当前最新的 binlog 文件名称、position 等) show master status; |
|
# cluster id |
|
# cluster id |
# ① 停止 slave 进程 stop slave; |
|
# ② 在【从服务器】上设置主从关系 change master to master_host = '192.168.73.107', master_user = 'repluser', master_password = '654321', master_log_file = 'mysql-bin.000001', master_log_pos = 154; |
master_host:主库 ip master_user:主库授权用户名 master_password:授权用户密码 master_log_file:主库日志文件 master_log_pos:主库日志偏移量 |
# ③ 启动 slave 进程 start slave; |
|
# ④ 查看 slave 状态 show slave status\G; |
|
这里只截取了一部分 slave 的状态信息。 注意看: ① Slave_IO_Running(IO 线程状态):YES(开启)。 ② Slave_SQL_Running(SQL 线程状态):YES(开启)。 |
3.2.2 验证
在107主库的 ta_liquidation_sub_sh 数据库上进行 DDL、DML 操作,对应的 134、143 这两个从库上就会进行同步。
3.3 MySQL主从搭建(半同步复制)
3.3.1 概念
这里我们再来回顾一下半同步复制。
在异步复制中,主库不会去验证 bin log 有没有成功复制到从库中。如果主库提交一个事务并写入 bin log 中后,当从库还没有从主库中得到 bin log 时,主库宕机了或者由于其他原因导致该事务的 bin log 丢失了,那么从库就不会得到这个事务,进而就造成了主从数据不一致。
半同步复制,
在半同步复制时,如果主库的一个事务提交成功了,在推送到从库的过程中,如果从库宕机了或者网络故障,导致从库并没有接收到这个事务的 bin log。此时,主库会等待一段时间(这个时间由 rpl_sync_master_timeout 的毫秒数决定),如果过了这个时间后还无法推送到从库的话,那么,
SO,半同步复制很大程度上取决于主从库之间的网络情况,往返时延越小决定了从库的实时性越好。
3.3.2 配置半同步复制
主从库都查看一下。如果不支持那就直接跳过当前章节。
select @@have_dynamic_loading; |
|
YES:支持。 |
MySQL的插件一般在安装目录/bin/plugin下,先看一下能不能安装。
# ① 先看看是不是已经安装了 select * from mysql.plugin; |
# ② 安装 semisync_master.so 插件 install plugin rpl_semi_sync_master soname 'semisync_master.so'; |
# ③ 在所有【 install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; |
半同步复制,默认情况下设置不打开。
# ① 在MySQL-master上开启 master 的半同步复制 set global rpl_semi_sync_master_enabled = 1; # 查看 show variables like 'rpl_semi_sync_master_enabled'; |
|
# ② 在MySQL-slave上开启 slave 的半同步复制 set global rpl_semi_sync_slave_enabled = 1; # 查看 show variables like 'rpl_semi_sync_slave_enabled'; |
|
如果之前配置的是异步复制,那么在这里就需要重启一下从库的I/O线程。如果是全新的半同步复制就不需要这一步。
# 停止 I/O 线程 stop slave io_thread; # 开启 I/O 线程 start slave io_thread; |
|
# 在【主库】上查看半同步复制的状态信息 show status like '%semi_sync%'; |
|
|
我们在这里需要关注三个值: 值为 ON,表示半同步复制目前处于打开状态。 这个值表示当前主库有多少个事务不是半同步模式下从库及时响应的。 这个值表示当前主库上有多少个事务是通过半同步复制到从库的。 综上所知,在日常的维护中, |
3.3.3 半同步复制方式
MySQL的半同步复制方式由参数【
支持两种不同的半同步复制方式:AFTER_SYNC(默认值)和AFTER_COMMIT。
复制方式:Master上的 binlog 日志复制到 slave 之后,master 再 commit。
所有在 master 上 commit 的事务都已经复制到了 slave;但是所有已经复制到 slave 的事务在 master 上不一定 commit(比如说,master 将日志复制到 slave 之后,在 commit 之前宕机了)。
复制方式:Master 先 commit,之后再将 binlog 日志复制到 slave 上。
所有在 master 上 commit 的事务不一定复制到了 slave(比如,master commit 之后,还未来得及将 binlog 日志复制到 slave 就宕机了);所有已经复制到 slave的事务在 master 上一定 commit 了。
该方式在 master 宕机的情况下,无法保证数据的一致性,所以,一般也不会使用该方式。
3.3.4 验证
验证方式及结果与【3.2.2验证】相同。主从复制完成后,再来在主库上看一下半同步复制的状态信息。
3.4 MHA 搭建
真正的大佬来了。
|
|
107 |
|
134、143 |
|
|
104 |
3.4.1 MySQL 配置
在 MySQL 的 slave 上开启 bin log(二进制日志)。因为当发生自动故障迁移时,如果 slave 没有开启 bin log 的话,那么就无法将其提升为 master。开启方式直接参考【3.2.1.1.1主库配置】。
3.4.2 安装 MHA
因为 MHA Manager 与 MHA Node 都是用 Perl 开发的,所以我们需要安装 Perl。
yum install -y epel-release
yum -y install perl-DBD-MySQL
yum -y install perl-Config-Tiny
yum -y install perl-Log-Dispatch
yum -y install perl-Parallel-ForkManager
yum -y install perl-ExtUtils-CBuilder
yum -y install perl-ExtUtils-MakeMaker
yum -y install perl-
CPAN网站(The Comprehensive Perl Archive Network - www.cpan.org)
MetaCPAN网站(Search the CPAN - metacpan.org)
在这两个网站上搜索。
在 GitHub 上下载 tar.gz 包
|
|
https://github.com/yoshinorim/mha4mysql-manager/releases |
0.58 |
https://github.com/yoshinorim/mha4mysql-node/releases |
0.58 |
tar -xzvf mha4mysql-node-v0.58.tar.gz |
① perl Makefile.PL |
|
② make |
|
③ make install |
|
【注意】:下面的方法一和方法二都要执行,执行完之后还是不行的话就继续执行直至成功为止。一般情况下需要两三次执行才可成功。
一路 yes + enter 就行。
① install local::lib ② o conf init:重新配置。 ③ reload cpan:更新。 ④ exit:退出。
这些工具通常由 MHA Manager 的脚本触发,无需人为操作。
|
|
save_binary_logs |
保存和复制 master 的二进制日志 |
apply_diff_relay_logs |
识别差异的中继日志事件,并将其差异的事件应用于其他的 slave |
filter_mysqlbinlog |
去除不必要的 rollback 事件(MHA 已不再使用这个工具) |
purge_relay_logs |
清除中继日志(不会阻塞 SQL 线程) |
|
|
|
masterha_check_repl |
检查 MySQL 复制状况 |
masterha_check_ssh |
检查 MHA 的 SSH 配置状况 |
masterha_check_status |
检测当前 MHA 的运行状态 |
masterha_conf_host |
添加或删除配置的 server 信息 |
masterha_manager |
|
masterha_master_monitor |
检测 master 是否宕机 |
masterha_master_switch |
控制故障转移(自动or手动) |
|
多种线路检测 master 是否存活(当 MHA Manager 检测到 master 不可用时 ,通过该脚本来进一步确认,降低误切的风险)。 |
masterha_stop |
|
|
3.4.3 免密通信
服务器之间免密登录,也叫 SSH 互信配置。
这里以 MHA Manager 服务器节点为例进行说明,其他的三台(一主二从)机器一样的操作。
# ① 生成 RSA 公钥 ssh-keygen -t rsa(请一直回车,直至结束) |
执行过程:
执行结果:
|
# ② 将公钥(/root/.ssh/id_rsa.pub)文件追加到认证文件(名为 authorized_key 文件)中。 # id_rsa.pub 文件位置在上一步就可以看出来。 cat id_rsa.pub >> authorized_keys |
|
这里也以 MHA Manager 为例进行操作。
# ① 将 master 上的认证文件发送到 MHA Manager scp 192.168.73.107:/root/.ssh/authorized_keys ./authorized_keys.107 # ② 将 slave1 上的认证文件发送到 MHA Manager scp 192.168.73.143:/root/.ssh/authorized_keys ./authorized_keys.143 # ③ 将 slave2 上的认证文件发送到 MHA Manager scp 192.168.73.134:/root/.ssh/authorized_keys ./authorized_keys.134 |
|
|
|
# 也就是把 master、slave1、slave2 上发送过来的三个文件合并到 MHA Manager 的认证文件中。 # ① 把 master 上的认证文件合并到 MHA Manager cat authorized_keys.107 >> authorized_keys # ② 把 slave1 上的认证文件合并到 MHA Manager cat authorized_keys.134 >> authorized_keys # ③ 把 slave2 上的认证文件合并到 MHA Manager cat authorized_keys.143 >> authorized_keys |
|
|
合并完成之后,可以看出来 MHA Manager 对应的认证文件【authorized_keys】的文件大小都变大了。 |
# 因为这里已经没有用了,就只留 MHA Manager 自身的一个认证文件就行了。 |
|
|
|
# ① 将 MHA Manager 上的密钥文件发送到 master scp authorized_keys 192.168.73.107:/root/.ssh/ # ② 将 MHA Manager 上的密钥文件发送到 slave1 scp authorized_keys 192.168.73.134:/root/.ssh/ # ③ 将 MHA Manager 上的密钥文件发送到 slave2 scp authorized_keys 192.168.73.143:/root/.ssh/ |
|
至此, |
分别在四台服务器(一个 MHA Manager,三个 MHA Node[一主两从])上修改 IP 主机名:vim /etc/hosts
192.168.73.104 mha-manager 192.168.73.107 mha-node-master 192.168.73.143 mha-node-slave1 192.168.73.134 mha-node-slave2 |
|
能够互相 ssh 且不要密码就算是成功了。
3.4.4 MHA Manager 配置
在 https://github.com/yoshinorim/mha4mysql-manager.git 下载源码,我们需要用到 /mha4mysql-manager/samples 下的文件。
我们在【3.4.1.2.2安装 mha4mysql-manager】中可以得知,安装成功后,在/usr/local/bin下有了9个工具(脚本),除此之外,我们还需要自定义3个脚本。当然,这3个脚本可以在 /mha4mysql-manager/samples/script 下找到。
在 MHA Manager 节点上复制相关脚本到 /usr/local/bin 目录下,复制完后就多了下面三个文件。 |
|
|
|
标签: cp100变送器 |