• MHA实验和架构


    什么是MHA

    masterhight availabulity:基于主库的高可用环境下可以实现主从复制、故障切换

    MHA的主从架构最少要一主两从

    MHA的出现是为了解决MySQL的单点故障问题。一旦主库崩溃,MHA可以在0-30秒内自动完成故障切换。

    MHA的数据流向和工作流程图:

    MHA使用的是半同步的方式,所以使用一个从库来做主从之间切换就可以了

    MHA的工作原理

    MHA使用的是半同步的方式,只要有一台从服务器写入数据,就会自动提交给客户端

    1、 如果master崩溃,slave就会从主的二进制日志保存文件

    2、 slave会识别最新更新的日志,差异部分同步到slave

    3、 提升一个新的slave作为master

    4、 其他的slave继续和新的master同步

    实验过程

    1、 搭建MHA架构

    2、 模拟故障

    3、 故障恢复

    实验准备:

    MHA manager:20.0.0.20

    MySQL1:master 20.0.0.50

    MySQL2:slave1 20.0.0.60

    MySQL3:slave2 20.0.0.70

    node组件:需要部署在所有服务器上。因为manager组件依赖于node组件。node组件就是用来监控MySQL的状态的

    node组件靠ssh远程连接服务来进行通信。

    1. 开始实验
    2. 修改从主机名20.0.0.60
    3. hostnamectl set-hostname slave1
    4. 修改从主机名20.0.0.70
    5. hostnamectl set-hostname slave2
    6. 修改主主机名20.0.0.50
    7. hostnamectl set-hostname master
    8. su一下让他们都生效
    9. 修改完成后ping一下主机名看一下能不能通
    10. 先实现主从复制
    11. 配置主MySQL
    12. vim /etc/my.conf
    13. server-id=1
    14. log_bin=master-bin
    15. log-slave-updates=ture
    16. 配置从MySQL1
    17. server-id=2
    18. log_bin=master-bin
    19. relay-log=relay-log-bin
    20. relay-log-index=slave-relay-bin.index
    21. 配置从MySQL2
    22. server-id=3
    23. relay-log=relay-log-bin
    24. relay-log-index=slave-relay-bin.index
    25. 重启三台MySQL
    26. 在主和从服务器上创建软连接
    27. ln -s /usr/local/mysql/bin/mysql /usr/sbin/
    28. ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin
    29. 三台主机上都要创建软连接
    30. mysql -u root -p123456
    31. #进入数据库
    32. 三台服务器同时操作
    33. 开始数据库同步赋权给slave访问主库的授权
    34. 每台服务器都要操作
    35. 给mha权限能访问主从的权限
    36. 在三台服务器上都加上个主机名连接
    37. flush privileges;
    38. #刷新其权限
    39. show master status;
    40. #查看一下位置偏移点
    41. 在两个从库上配置与主同步
    42. start slave;
    43. #打开两个从的slave
    44. show slave status\G;
    45. #查看两个从的slave的状态都是yes表示成功
    46. 必须要把两个从库都设为只读模式
    47. set global read only=1
    48. #把两个从库都设为只读模式
    49. 打开工具测试一下主从复制是否成功
    50. create database kgc;
    51. #创建一个库
    52. 进入MHA的配置
    53. 所有的服务器都需要安装MHA的依赖环境必须要有epel源
    54. 开始安装
    55. yum install epel-release --nogpgcheck -y
    56. #epel源
    57. yum install -y perl-DBD-MySQL \
    58. perl-Config-Tiny \
    59. perl-Log-Dispatch \
    60. perl-Parallel-ForkManager \
    61. perl-ExtUtils-CBuilder \
    62. perl-ExtUtils-MakeMaker \
    63. perl-CPAN
    64. #MHA依赖环境
    65. 先咱装node组件,再安装MHA
    66. 每台服务器上都需要部署node节点
    67. cd /opt
    68. tar -xf mha4mysql-node-0.57.tar.gz
    69. #解压文件
    70. perl Makefile.PL
    71. #编译
    72. make $$ make install
    73. 回到mha服务器
    74. 解压高可用节点
    75. tar -xf mha4mysql-manager-0.57.tar.gz
    76. #解压
    77. cd mhamanager
    78. perl Makefile.PL
    79. make -j4 $$ make install
    80. cd /usr/local/bin/
    81. #查看一下重要组件
    82. ll -h
    83. master的组件:
    84. masterha_check_ssh
    85. #检查MHA的ssh的配置情况
    86. masterha_check_repl
    87. #检查MySQL的复制情况
    88. masterha_manager
    89. #启动manger的脚本
    90. masterha_check_status
    91. #检测MHA的运行状态
    92. masterhaha_master_monitor
    93. #检测master主机的情况,masters是否宕机
    94. masterha_master_switch
    95. #控制故障转移
    96. masterha_conf_host
    97. #添加或者删除配置的server信息
    98. masterha_stp
    99. #停止MHA的脚本
    100. 重要的node组件:
    101. save_binary_logs
    102. #保存和复制master的二进制日志
    103. apply_diff_relay_logs
    104. #识别二进制日志当中的差异事件,然后发送给其他的slave
    105. filter_mysqlbinlog
    106. #去除不必要的回滚(MHA已经不用了)
    107. purge_relay_logs
    108. #同步之后清除中继日志(不会阻塞sql的限制)
    109. 开始实现ssh免密登录
    110. 在MHA主机20.0.0.20上操作
    111. ssh-keygen -t rsa
    112. #选择加密方式
    113. 一路回车
    114. ssh-copy-id 20.0.0.50
    115. 输入密码和yes
    116. ssh-copy-id 20.0.0.60
    117. 输入密码和yes
    118. ssh-copy-id 20.0.0.70
    119. 输入密码和yes
    120. 回到master主机
    121. ssh-keygen -t rsa
    122. #选择加密方式
    123. ssh-copy-id 20.0.0.60
    124. 输入密码和yes
    125. ssh-copy-id 20.0.0.70
    126. 输入密码和yes
    127. 回到slave1主机
    128. ssh-keygen -t rsa
    129. #选择加密方式
    130. ssh-copy-id 20.0.0.50
    131. 输入密码和yes
    132. ssh-copy-id 20.0.0.70
    133. 输入密码和yes
    134. 回到slave2主机
    135. ssh-keygen -t rsa
    136. #选择加密方式
    137. ssh-copy-id 20.0.0.50
    138. 输入密码和yes
    139. ssh-copy-id 20.0.0.60
    140. 输入密码和yes
    141. 配置高可用MHA
    142. cd manger
    143. cd samples
    144. cd scripts
    145. master_ip_failover
    146. #自动切换时管理VIP的脚本
    147. master_ip_online_change
    148. #在线切换时的vip管理脚本
    149. power_manger
    150. #如果故障发生之后关闭master脚本
    151. send_report
    152. #发送故障时的告警脚本
    153. cp -a scripts/ /usr/local/bin
    154. cd /usr/loacl/bin
    155. cd scripts
    156. cp master_ip_failover /usr/local/bin
    157. vim master_ip_failover
    158. 除了第一行全部删除
    159. 添加控制脚本
    160. use strict;
    161. use warnings FATAL => 'all';
    162. use Getopt::Long;
    163. my (
    164. $command, $ssh_user, $orig_master_host, $orig_master_ip,
    165. $orig_master_port, $new_master_host, $new_master_ip, $new_master_port
    166. );
    167. my $vip = '20.0.0.100';
    168. #设定vip地址
    169. my $brdc = '20.0.0.255';
    170. #设定VIP的广播地址
    171. my $ifdev = 'ens33';
    172. #VIP绑定的网卡
    173. my $key = '1';
    174. #ifcong ens33:1 20.0.0.100/24 key是1,网卡的编号就是1
    175. my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
    176. #key:ens33:1 20.0.0.100 up
    177. my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
    178. #ens33:1 20.0.0.100 down
    179. my $exit_code = 0;
    180. GetOptions(
    181. 'command=s' => \$command,
    182. 'ssh_user=s' => \$ssh_user,
    183. 'orig_master_host=s' => \$orig_master_host,
    184. 'orig_master_ip=s' => \$orig_master_ip,
    185. 'orig_master_port=i' => \$orig_master_port,
    186. 'new_master_host=s' => \$new_master_host,
    187. 'new_master_ip=s' => \$new_master_ip,
    188. 'new_master_port=i' => \$new_master_port,
    189. );
    190. exit &main();
    191. sub main {
    192. print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
    193. if ( $command eq "stop" || $command eq "stopssh" ) {
    194. my $exit_code = 1;
    195. eval {
    196. print "Disabling the VIP on old master: $orig_master_host \n";
    197. &stop_vip();
    198. $exit_code = 0;
    199. };
    200. if ($@) {
    201. warn "Got Error: $@\n";
    202. exit $exit_code;
    203. }
    204. exit $exit_code;
    205. }
    206. elsif ( $command eq "start" ) {
    207. my $exit_code = 10;
    208. eval {
    209. print "Enabling the VIP - $vip on the new master - $new_master_host \n";
    210. &start_vip();
    211. $exit_code = 0;
    212. };
    213. if ($@) {
    214. warn $@;
    215. exit $exit_code;
    216. }
    217. exit $exit_code;
    218. }
    219. elsif ( $command eq "status" ) {
    220. print "Checking the Status of the script.. OK \n";
    221. exit 0;
    222. }
    223. else {
    224. &usage();
    225. exit 1;
    226. }
    227. }
    228. sub start_vip() {
    229. `ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
    230. }
    231. ### A simple system call that disable the VIP on the old_master
    232. sub stop_vip() {
    233. `ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
    234. }
    235. sub usage {
    236. print
    237. "Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
    238. }
    239. #master宕机之后,VIP地址切换到新的主库
    240. 创建MHA的软件目录,对节点服务器进行管理
    241. mkdir /etc/masterha
    242. cd /opt/manger/samples/conf/
    243. app1.cnf
    244. #用来管理mysql的节点服务器
    245. cp -a app1.cnf /etc/masterha/
    246. vim /etc/masterha/app1.cnf
    247. 全部删除内部的配置重新配置
    248. [server default]
    249. manager_log=/var/log/masterha/app1/manager.log
    250. #manager的管理日志
    251. manager_workdir=/var/log/masterha/app1
    252. #manager的工作目录
    253. master_binlog_dir=/usr/local/mysql/data
    254. #保存master的二进制的位置,必须要和master保存的路径一致
    255. master_ip_failover_script=/usr/local/bin/master_ip_failover
    256. #设置自动切换脚本
    257. master_ip_online_change_script=/usr/local/bin/master_ip_onli
    258. ne_change
    259. #手动切换脚本
    260. password=manager
    261. ping_interval=1
    262. #监控主库发送ping包的时间间隔 1代表1秒 工作中一般3-6秒。会尝试3次之后会切换到failover脚本进行自动切换
    263. remote_workdir=/tmp
    264. #mysql在发生切换时,binlog的保存位置
    265. repl_password=123456
    266. #登录主库和从库的用户密码
    267. repl_user=myslave
    268. #用户名
    269. secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.60 -s 20.0.0.70
    270. #从和主之间互相监听,主服务器无需声明,但是从服务器需要在check之后声明
    271. #从对主监听
    272. shutdown_script=""
    273. #设置切换时告警的脚本
    274. ssh_user=root
    275. #远程登录的用户名
    276. user=mha
    277. [server1]
    278. hostname=20.0.0.50
    279. #主服务器
    280. port=3306
    281. [server2]
    282. candidate_master=1
    283. #设置后选的master主库崩溃会切换到server2 233.22
    284. check_repl_delay=0
    285. #即使设置了权重,但是从服务器的relay_logs落后master100M,即使设置了权重也不会切换。通过设置0会忽略设置延迟复制,直接升为主.强制切换到设定为候选master的服务器。
    286. hostname=20.0.0.60
    287. #备用主服务器
    288. port=3306
    289. [server3]
    290. hostname=20.0.0.70
    291. #从服务器2
    292. port=3306
    293. 测试ssh通信是否正常
    294. masterha_check_ssh -conf=/etc/masterha/app1.cnf
    295. #测试ssh通信主从之间免密登录是否正常
    296. 测试主从连接情况是否正常
    297. masterha_check_repl-conf=/etc/masterha/app1.cnf
    298. #测试主从连接情况是否正常
    299. 都显示ok表示MHA搭建完成!
    300. 模拟故障
    301. nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
    302. remove_dead_master_conf
    303. #如果发生组从切换,老的主库的ip地址会从文件中删除
    304. /var/log/masterha/app1/manager.log
    305. #MHA的管理日志
    306. -ignore_last_failover
    307. #如果检测到连续发生宕机,而且宕机的事件间隔不足8小时,不会进行自动切换。忽略时间间隔只要发生故障,就会切换
    308. cat /var/log/masterha/app1/manager.log | grep "current master"
    309. 在开一个20主机监控一下管理日志
    310. tail -f /var/log/masterha/app1/manager.log
    311. 这时候停掉主MySQL
    312. systemctl stop mysqld
    313. 然后到20查看日志
    314. 查看一下vip地址还在不在主库20.0.0.50上如果已经转移到主库2 20.0.0.60上代表切换成功。
    315. 开始故障恢复
    316. 进入MySQL1的my.cnf文件进行配置
    317. vim /etc/my.conf
    318. log_bin = master-bin
    319. relay-log = relay-log-bin
    320. relay-log-index = slave-relay-bin.index
    321. #将MySQL1设为从
    322. 再进入MySQL2的my.cnf文件进行配置
    323. vim /etc/my.conf
    324. log_bin = master-bin
    325. log-slave-updates=ture
    326. #将MySQL2设置为新的主
    327. 进入manager主机
    328. 配置文件进行配置
    329. vim /etc/masterha/app1.cnf
    330. secondary_check_script=/usr/local/bin/masterha_secondary_check -s 20.0.0.50 -s 20.0.0.70
    331. #声明从库的ip将20.0.0.60修改为50
    332. [server1]
    333. hostname=20.0.0.60
    334. port=3306
    335. #server1的ip改为60
    336. [server2]
    337. candidate_master=1
    338. check_repl_delay=0
    339. hostname=20.0.0.50
    340. port=3306
    341. #复制一个server2出来将ip改为50
    342. 修改完成后重启启动一下manager
    343. nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
    344. 然后回到新的主MySQL20.0.0.60
    345. 重启MySQL服务
    346. systemctl restart mysqld
    347. 进入MySQL
    348. mysql -u root -p
    349. 查看一下偏移点
    350. show master status;
    351. 再回到MySQL1
    352. 启动MySQL服务
    353. 进入MySQL
    354. 先停止slave服务
    355. stop slave
    356. 进行配置
    357. change master to master_host='20.0.0.60',
    358. master_user='myslave',master_password='123456',
    359. master_log_file='master-bin.000002',
    360. master_log_pos=154;
    361. #绑定新的主MySQL的ip和日志文件和偏移点
    362. 配置完成后
    363. reset slave
    364. start slave
    365. #启动slave服务
    366. 查看一下slave的状态
    367. show slave status\G
    368. 此时出现两个yes代表实验成功
    369. 进入新的主MySQL20.0.0.60
    370. 创建一个库
    371. create database kgc2;
    372. 三台MySQL都能查看到代表实验成功
  • 相关阅读:
    leaflet 地图遮罩、扣洞
    Galaxy生信云平台|制作临床信息表/三线表/Table 1
    大老耗时90天完成,带你从实践出发,深入学习Mycat中间件,拥抱Mycat
    Golang基础6-反射
    flutter开发实战-打包应用apk签名及Android studio没有generate signed bundle/apk问题修改
    Android SurfaceFlinger导读(01) surfaceFlinger谁写的?他还干了什么?
    sqli-labs/Less-54
    代码层走进“百万级”分布式ID设计
    防火墙规则顺序解决方案
    告别手抖尴尬!教你轻松缓解手部震颤的小秘诀!
  • 原文地址:https://blog.csdn.net/m0_75209491/article/details/134397060