随笔 - 32  文章 - 0  评论 - 2  阅读 - 7374

mysql_MHA之rpm

MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能。MHA在监控到master节点故障时,会提升其中拥有最新数据的slave节点成为新的master节点,在此期间,MHA会通过与其它从节点获取额外信息来避免一致性方面的问题。MHA还提供了master节点的在线切换功能,即按需切换master/slave节点。
相较于其它HA软件,MHA的目的在于维持MySQL Replication中Master库的高可用性,其最大特点是可以修复多个Slave之间的差异日志,最终使所有Slave保持数据一致,然后从中选择一个充当新的Master,并将其它Slave指向它

(1)从宕机崩溃的master保存二进制日志事件(binlog events);

(2)识别含有最新更新的slave;

(3)应用差异的中继日志(relay log)到其他的slave;

(4)应用从master保存的二进制日志事件(binlog events);

(5)提升一个slave为新的master;

(6)使其他的slave连接新的master进行复制;

环境 :A主机/B主机1/B主机2/B主机3/mha_manager

A:192.168.13.150

B:192.168.13.151

B:192.168.13.152

B:192.168.13.153

mha_manager: 192.168.13.160

✨步骤1:5机器安装mysql 并主从复制 ABBB,删除匿名用户,设置root密码

     yum install -y mysql-server mysql  (manager 不用装)

     13.150机器 开启二进制binlog 

1
2
3
vim /etc/my.cnf #加入一下三条<br>server_id=1
log_bin=binlog
log_bin_index=binlog.index<br>重启数据库 你的每次操作都回留下log 以便利从服务器操作

删除匿名用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mysql> select user,host,password from mysql.user;
+------+-----------+----------+
| user | host      | password |
+------+-----------+----------+
| root | localhost |          |
| root | 13-150    |          |
| root | 127.0.0.1 |          |
|      | localhost |          |
|      | 13-150    |          |
+------+-----------+----------+
5 rows in set (0.00 sec)
 
mysql> delete from mysql.user where user='';
Query OK, 2 rows affected (0.00 sec)
 
mysql> select user,host,password from mysql.user;
+------+-----------+----------+
| user | host      | password |
+------+-----------+----------+
| root | localhost |          |
| root | 13-150    |          |
| root | 127.0.0.1 |          |
+------+-----------+----------+
3 rows in set (0.00 sec)
 
mysql> delete from mysql.user where host='13-150';     
Query OK, 1 row affected (0.00 sec)
 
mysql> delete from mysql.user where host='127.0.0.1';
Query OK, 1 row affected (0.00 sec)
 
 
mysql> select user,host,password from mysql.user ;     
+------+-----------+----------+
| user | host      | password |
+------+-----------+----------+
| root | localhost |          |
+------+-----------+----------+
1 row in set (0.00 sec)

加入权限

1
2
3
4
5
6
7
8
9
10
11
mysql> grant all on *.* to `root`@`192.168.13.%`;
Query OK, 0 rows affected (0.00 sec)
 
mysql> select user,host,password from mysql.user ;
+------+--------------+----------+
| user | host         | password |
+------+--------------+----------+
| root | localhost    |          |
| root | 192.168.13.% |          |
+------+--------------+----------+
2 rows in set (0.00 sec)

设置密码

1
2
3
4
5
6
7
8
9
10
11
12
mysql> update mysql.user set password=password('123');
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0
 
mysql> select user,host,password from mysql.user ;   
+------+--------------+-------------------------------------------+
| user | host         | password                                  |
+------+--------------+-------------------------------------------+
| root | localhost    | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | 192.168.13.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+------+--------------+-------------------------------------------+
2 rows in set (0.00 sec)<br>mysql> flush privileges; #使其生效

做主从复制 还需要一个账号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> grant replication slave on *.* to 'sko'@'%' identified by 'skoo';  
Query OK, 0 rows affected (0.00 sec)
 
mysql> select user,host,password from mysql.user ;
+------+--------------+-------------------------------------------+
| user | host         | password                                  |
+------+--------------+-------------------------------------------+
| root | localhost    | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| root | 192.168.13.% | *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
| sko  | %            | *FA2494A90A1C7995503F974ACDE08139BD31AC51 |
+------+--------------+-------------------------------------------+
3 rows in set (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)主的机器 部署到此结束

第一台从服务器 直接修改配置文件

vim /etc/my.cnf(开启二进制) 然后重启mysql

查看主binlog记录位置

1
2
3
4
5
6
7
mysql> show master status; 查询二进制文件写到哪里了
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| binlog.000003 |      916 |              |                  |
+---------------+----------+--------------+------------------+
1 row in set (0.00 sec)

在第一台从服务器上设置

1
2
3
4
mysql> slave stop; #停止
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> change master to master_host='192.168.13.150', master_user='sko', master_password='skoo', master_log_file='binlog.000003';
Query OK, 0 rows affected (0.01 sec)mysql> slave start; #开始

查看主从复制是否成功

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> show slave status \G  #查看是否主从成功
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.13.150
                  Master_User: sko
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000003
          Read_Master_Log_Pos: 916
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 1058
        Relay_Master_Log_File: binlog.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
.....
.....
....
1 row in set (0.00 sec)

 第二台从服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
 
mysql> change master to master_host='192.168.13.150', master_user='sko', master_password='skoo', master_log_file='binlog.000003';
Query OK, 0 rows affected (0.01 sec)
 
mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
|      | 13-152    |
| root | 13-152    |
|      | localhost |
| root | localhost |
+------+-----------+
5 rows in set (0.00 sec)
 
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.13.150
                  Master_User: sko
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binlog.000003
          Read_Master_Log_Pos: 916
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 1058
        Relay_Master_Log_File: binlog.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 916
              Relay_Log_Space: 1214
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
1 row in set (0.00 sec)
 
mysql> select user,host from mysql.user;
+------+--------------+
| user | host         |
+------+--------------+
| sko  | %            |
| root | 13-152       |
| root | 192.168.13.% |
| root | localhost    |
+------+--------------+
4 rows in set (0.00 sec)剩余几台也这么操作 此处不在记录

 

清除主从复制

1、slave stop;

2、reset slave;

3、重启 (上线注意安全)

 

五台机器互相密钥登陆

1
for i in 151 152 153 160;do ssh-copy-id -i .ssh/id_rsa.pub root@192.168.13.$i ;donefor i in 150 152 153 160;do ssh-copy-id -i .ssh/id_rsa.pub root@192.168.13.$i ;donefor i in 150 151 153 160;do ssh-copy-id -i .ssh/id_rsa.pub root@192.168.13.$i ;donefor i in 151 152 150 160;do ssh-copy-id -i .ssh/id_rsa.pub root@192.168.13.$i ;donefor i in 151 152 153 150;do ssh-copy-id -i .ssh/id_rsa.pub root@192.168.13.$i ;done

✨步骤2:安装node,所有节点都需要安装

  MHA是由perl编写的,所以要安装perl语言环境

  yum install -y perl-*  (五台都需要安装)

  上传软件包  mha4mysql-node-0.54-0.el6.noarch.rpm (五台都安装)

1
2
3
[root@13-160 mha_soft]# rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm  (安装成功)
Preparing...                ########################################### [100%]
1:mha4mysql-node         ########################################### [100%]

✨步骤3:  安装manager,需要做配置 所有的主机相互建立信任 使用manager监控管理mysql主从复制  

安装server端 在13.160上

   上传软件包依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ompat-db43-4.3.29-15.el6.x86_64.rpm
perl-Compress-Raw-Bzip2-2.052-1.el6.rf.x86_64.rpm
perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
perl-Email-Date-Format-1.002-1.el6.rfx.noarch.rpm
perl-Log-Dispatch-2.27-1.el6.noarch.rpm
perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
perl-MailTools-2.09-1.el6.rfx.noarch.rpm
perl-MIME-Lite-3.027-1.el6.rfx.noarch.rpm
perl-MIME-Types-1.28-2.el6.noarch.rpm
perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
perl-Params-Validate-0.95-1.el6.rfx.x86_64.rpm
perl-Time-HiRes-1.9724-1.el6.rfx.x86_64.rpm
 
yum -y localinstall ./*
即可全部安装上

上传软件包 : mha4mysql-manager-0.55-0.el6.noarch.rpm 

1
2
3
[root@13-160 mha_soft]# rpm -ivh mha4mysql-manager-0.55-0.el6.noarch.rpm
Preparing...                ########################################### [100%]
   1:mha4mysql-manager      ########################################### [100

接下来需要配置MHA高可用

创建目录 mkdir /etc/mha/

创建文件 vim mha.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[server default]
#mysql_admin and password
user=root  #mysql 用户
password=123  #mysql 密码
#work_dir
manager_workdir=/etc/mha  #工作目录
#mha_log
manager_log=/etc/mha/manager.log  #log日志
#ssh connetion account
ssh_user=root  #链接账号 建立好信任的用户(免除秘钥)
#AB copy account and password  #(主从复制账号密码)
repl_user=sko
repl——password=skoo
[server1] #管理机器1
hosername=192.168.13.150
ssh_port=22
master_binlog_dir=/var/lib/mysql
candidate_master=1
[server2] #机器2
hosername=192.168.13.151
ssh_port=22
master_binlog_dir=/var/lib/mysql   #master二进制日志路径
candidate_master=1          #参与选举 1为参与
[server3]  #机器3
hosername=192.168.13.152
ssh_port=22
master_binlog_dir=/var/lib/mysql
candidate_master=1
[server4]  #机器4
hosername=192.168.13.152
ssh_port=22
master_binlog_dir=/var/lib/mysql
candidate_master=1

检查配置文件

命令:master_check_ssh --conf=/etc/mha/mha.cnf 

此处如果报错找不到配置文件,(/usr/share/perl5/vendor_perl/MHA/SSHCheck.pm)

请仔细检查配置文件 是否有特殊字符等 或者手动重新写入

 测试主从是否有问题

命令:[root@13-160 mha]# masterha_check_repl --conf=mha.cnf

 接下来进行监控啦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
masterha_manager --conf=/etc/mha/mha.cnf  #开启之后一直占用终端所以扔到后台执行
ctrl + z  mac系统 control+z
fg  将后台中的命令调至前台继续运行
bg 将一个在后台暂停的命令,变成继续执行
 
[root@13-160 mha]# masterha_manager --conf=/etc/mha/mha.cnf
Thu Aug 29 02:19:41 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Thu Aug 29 02:19:41 2019 - [info] Reading application default configurations from /etc/mha/mha.cnf..
Thu Aug 29 02:19:41 2019 - [info] Reading server configurations from /etc/mha/mha.cnf..
 
^Z  #control +z 了
[1]+  Stopped                 masterha_manager --conf=/etc/mha/mha.cnf
[root@13-160 mha]# bg
[1]+ masterha_manager --conf=/etc/mha/mha.cnf &
[root@13-160 mha]
[root@13-160 mha]# jobs
[1]+  Running                 masterha_manager --conf=/etc/mha/mha.cnf &
[root@13-160 mha]#

  mha.master_status.health  #顾名思义 文件记录master是那台 

  manager.log  #程序一直在ping主mysql_master,当主master没有响音便记录日志

✨步骤4 :测试 干掉原来的主,看从能否选举新的主

 13.150 操作命令:/etc/init.d/mysqld stop

13.160  manager.log 记录以下内容

MHA只能切换一次 切换成功会出现一个文件(mha.failover.complete)成功的标注

写:13.150

不能写死13.150,如果150挂了,就写不了了,所有不能写死 定义一个虚ip(13.200)

此处有一个脚本可以自动检测 绑定ip

所需安装包

https://pan.baidu.com/s/1Ik1h5rhOERbuVF2gY0KViA

如有错误 请指出谢谢🙏

posted on   I我非柠檬为何心酸I  阅读(455)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示