MySQL高可用MHA集群架构案例

在这里插入图片描述(这个图片是当时的,我配置的时候ip有变动,懒得调了)

这是一个高可用方案MHA的经典企业版本的架构案例,希望可以帮到大家,文章下面涉及到二进制日志方面,请参考我的另一个博客文档“二进制回复案例”,可以教你设置二进制日志

1.IP地址规划:
yulong-manager  :  192.168.136.160(管理节点)
yulong-master  :  192.168.136.157(主库)
yulong-candicate  :  192.168.136.158(从库,备选主库,)
yulong-slave  :  192.168.136.159(从库)
2.环境(四台主机上全部跑一遍)#(脚本):
#!/bin/bash
#yum安装的mysql默认目录为:/var/lib/mysql
lujing=/var/lib/mysql
#下载semange命令
yum install  policycoreutils-python-2.5-33.el7.x86_64 -y
#调整selinux的上下文的默认值
semanage fcontext -a -t mysqld_db_t "$lujing(/.*)?"
#接下来再将目录的安全上下文恢复为刚刚设置的默认值即可
restorecon -Rv $lujing
#启动sql服务
systemctl restart mysqld
#防火墙放行3306
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
#配置主机名解析                                                      
a='192.168.136.160  yulong-manager'
b='192.168.136.157  yulong-master'
c='192.168.136.158  yulong-candicate'
d='192.168.136.159  yulong-slave01'
echo ${a} >> /etc/hosts
echo ${b} >> /etc/hosts
echo ${c} >> /etc/hosts
echo ${d} >> /etc/hosts
#同步时间程序安装
yum install chrony -y
systemctl enable chronyd
systemctl start  chronyd
3.manager同步互联网时间:
#允许192.168.136.0/24网段的主机同步:
[root@yulong-manager ~]# vim /etc/chrony.conf
键入追加:allow 192.168.136.0/24
#重启服务
[root@yulong-manager ~]# systemctl restart chronyd
#检查是否同步成功
[root@yulong-manager ~]# chronyc sources
#防火墙放行NTP
[root@yulong-manager ~]# firewall-cmd --add-service=ntp --permanent   
success
[root@yulong-manager ~]# firewall-cmd --reload 
success
4.配置其他主机节点的时间服务器为manager
#更改配置文件,与manager同步起来
vim /etc/chrony.conf
键入追加:server yulong-manager iburst
#重启服务
systemctl restart chronyd
#检查是否同步成功
chronyc sources
#同步成功示例:
[root@yulong-candicate-master ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* yulong-manager                3   6    17    13   +582ns[  +22us] +/-   52ms
5.建立SSH免密钥登陆环境
5.1各个主机之间生成密钥
ssh-keygen 
5.2各个主机运行以下脚本拷贝公钥
vim ssh-copy.sh
#脚本内容
#!/usr/bin/bash
for i in 160 157 158 159
do
  ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.136.$i
done
5.3脚本给予可运行权限并且运行:
chmod 777 ssh-copy.sh 
./ssh-copy.sh
6.配置MySQL半同步复制(所有主从节点)
6.1查看自己是否有半同步插件
mysql> show variables like '%plugin_dir%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| plugin_dir    | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
1 row in set (0.42 sec)
6.2检查是否支持插件:
mysql> show variables like '%have_dynamic_loading%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
1 row in set (0.00 sec)
6.3分别在主从节点上安装相关的插件
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
Query OK, 0 rows affected (0.23 sec)
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
Query OK, 0 rows affected (0.01 sec)
6.4确认插件已经激活
mysql> select plugin_name, plugin_status from information_schema.plugins
    -> where plugin_name like '%semi%';
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
| rpl_semi_sync_slave  | ACTIVE        |
+----------------------+---------------+
2 rows in set (0.10 sec)
6.5查看半同步信息,应该是关闭off状态
mysql>  show variables like '%semi_sync%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | OFF        |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
8 rows in set (0.01 sec)
7.配置主从同步
7.1修改主库配置文件:
vim /etc/my.cnf
[mysqld]
log_bin=/var/lib/binlogs/master
server_id=157
##上面这两条是sql二进制文件位置,不用动,然后手动添加如下
gtid_mode=ON
enforce_gtid_consistency=true
rpl_semi_sync_master_enabled=1 #启用半同步:1启用,0关闭
rpl_semi_sync_master_timeout=1000 # 毫秒单位,该参数主服务器等待确认消息10秒后,不再等待,变为异步方式。
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
binlog-ignore-db=mysql
7.2重新启动服务
[root@yulong-master ~]# systemctl restart mysqld
7.3创建复制用户和管理用户
#创建复制用户mharep并授权(所有库的复制权限)
mysql> create user 'mharep'@'192.168.136.%' identified
    -> with mysql_native_password by 'Com.123!';
Query OK, 0 rows affected (1.00 sec)
mysql> grant replication slave on *.* to 'mharep'@'192.168.136.%';
Query OK, 0 rows affected (0.00 sec)
#创建管理用户manager并授权(所有权限全部给manager)
mysql> create user 'manager'@'192.168.136.%' identified
    -> with mysql_native_password by 'Com.123!';
Query OK, 0 rows affected (0.01 sec)

mysql> grant all privileges on *.* to 'manager'@'192.168.136.%';
Query OK, 0 rows affected (0.00 sec)
8.candicate master配置(备份master)
8.1修改主配置文件
vim /etc/my.cnf
[mysqld]
log_bin=/var/lib/binlogs/slave01
server_id=158
#上面这两条是sql二进制文件位置,不用动,然后手动添加如下
binlog-ignore-db=mysql
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
gtid_mode=ON
enforce_gtid_consistency=true
skip_slave_start
8.2重新启动服务
[root@yulong-candicate-master ~]# systemctl restart mysqld

9.slave配置
9.1修改主配置文件
vim /etc/my.cnf
[mysqld]
log_bin=/var/lib/binlogs/slave02
server_id=159
#上面这两条是sql二进制文件位置,不用动,然后手动添加如下
binlog-ignore-db=mysql
rpl_semi_sync_slave_enabled=1
read_only=1
gtid_mode=ON
enforce_gtid_consistency=true 
skip_slave_start
8.2重新启动服务
[root@yulong-slave ~]# systemctl restart mysqld
10.1查看master文件进程的状态
mysql> show master status \G(主库)
*************************** 1. row ***************************
             File: master.000009
         Position: 1907
     Binlog_Do_DB: 
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: d912f36e-52dd-11ea-a0c9-000c294062df:1-4
1 row in set (0.00 sec)
mysql> create user 'root'@'192.168.136.%' identified with mysql_native_password by 'Com.123!';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on *.* to 'root'@'192.168.136.%';
Query OK, 0 rows affected (0.00 sec)
11.主库上进行授权(让别的库能备份master上的)
mysql> create user 'root'@'192.168.136.%' identified with mysql_native_password by 'Com.123!';
Query OK, 0 rows affected (0.01 sec)
12:两个从库都基于文件备份过来了,然后把主库的备份恢复(我这里是一个从库的例子)
[root@yulong-slave mysql]#  mysqldump -h 192.168.136.157 -uroot --password='Com.123!' --all-databases --routines --events --single-transaction --master-data > dump.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.

[root@yulong-slave01 mysql]# mysql -uroot -pCom.123! < dump.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
13.从库上指定master,首先是基于文件的复制(两个从库都要进行,master的信息再第10步中)
mysql> change master to master_host='192.168.136.157',
    -> master_user='mharep',master_password='Com.123!',
    -> master_log_file='master.000009',master_log_pos=1907;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> stert slave;

mysql> start slave;
Query OK, 0 rows affected (0.02 sec) #启动同步

mysql> show slave status\G #两个从库都要查看
(此时IO线程和sql线程均为开启)
14.将主库设置为只读,并确保所用从库都能与主库同步。因为主从之间不应该有任何数据的不一致
mysql> set @@global.read_only = ON;
15.使用GTID同步:(两个从库进行)
15.1指定主库GTID进行复制
mysql> stop slave;(停止当前的备份)
mysql> change master to master_host='192.168.136.157',
    -> master_port=3306,master_user='mharep',
    -> master_password='Com.123!', master_auto_position = 1
    -> ;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
15.2启动slave中继日志
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
15.4查看slave状态信息:
此时两个线程肯定开启了
16.master主库上创建库验证(已经同步):
我们可以创建一个库验证,已经成功。

管理工具下载地址,linux不行的话就用windows,下载之后传进linux
wget -c https://github.com/yoshinorim/mha4mysqlnode/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
wget -c https://github.com/yoshinorim/mha4mysqlmanager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

12.安装MHA程序
12.1安装MySQL server节点(主库和备选主库上安装)
[root@yulong-master ~]#  yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm 
[root@yulong-candicate-master ~]# yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch_\(2\).rpm 
12.2安装管理manager节点(管理者安装)
[root@yulong-manager ~]# yum install epel-release -y
[root@yulong-manager ~]# yum localinstall mha4mysql-node-0.58-0.el7.centos.noarch.rpm(node是基础,才能manager的安装)
[root@yulong-manager ~]# yum localinstall mha4mysql-manager-0.58-0.el7.centos.noarch.rpm -y  #如果还不行,请安装epel-release源


13.配置MHA(管理节点)
[root@yulong-manager ~]# mkdir -p /etc/mha
[root@yulong-manager ~]# mkdir -p /var/log/mha/app1
[root@yulong-manager ~]# vim /etc/mha/app1.cnf
[server default]
manager_workdir=/masterha/app1
manager_log=/masterha/app1/manager.log
user=manager
password=Com.123!
ssh_user=root
repl_user=mharep
repl_password=Com.123!
ping_interval=2

[server1]
hostname=192.168.136.157
port=3306
master_binlog_dir=/var/lib/binlogs/master/  #指定库的二进制文件目录(/etc/my.cnf查看)
candidate_master=1

[server2]
hostname=192.168.136.158
port=3306
master_binlog_dir=/var/lib/binlogs/slave01/
candidate_master=1  #是否要成为备选master

[server3]
hostname=192.168.136.159
port=3306
master_binlog_dir=/var/lib/binlogs/slave02/
no_master=1   #不会成为备选master

14.ssh的有效性验证:(管理节点)
[root@yulong-manager ~]#  masterha_check_ssh --conf=/etc/mha/app1.cnf
Wed Mar  4 19:33:50 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Mar  4 19:33:50 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Mar  4 19:33:50 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
Wed Mar  4 19:33:50 2020 - [info] Starting SSH connection tests..
Wed Mar  4 19:33:51 2020 - [debug] 
Wed Mar  4 19:33:50 2020 - [debug]  Connecting via SSH from root@192.168.136.157(192.168.136.157:22) to root@192.168.136.158(192.168.136.158:22)..
Wed Mar  4 19:33:50 2020 - [debug]   ok.
Wed Mar  4 19:33:50 2020 - [debug]  Connecting via SSH from root@192.168.136.157(192.168.136.157:22) to root@192.168.136.159(192.168.136.159:22)..
Wed Mar  4 19:33:51 2020 - [debug]   ok.
Wed Mar  4 19:33:52 2020 - [debug] 
Wed Mar  4 19:33:51 2020 - [debug]  Connecting via SSH from root@192.168.136.159(192.168.136.159:22) to root@192.168.136.157(192.168.136.157:22)..
Wed Mar  4 19:33:51 2020 - [debug]   ok.
Wed Mar  4 19:33:51 2020 - [debug]  Connecting via SSH from root@192.168.136.159(192.168.136.159:22) to root@192.168.136.158(192.168.136.158:22)..
Wed Mar  4 19:33:52 2020 - [debug]   ok.
Wed Mar  4 19:33:52 2020 - [debug] 
Wed Mar  4 19:33:50 2020 - [debug]  Connecting via SSH from root@192.168.136.158(192.168.136.158:22) to root@192.168.136.157(192.168.136.157:22)..
Wed Mar  4 19:33:51 2020 - [debug]   ok.
Wed Mar  4 19:33:51 2020 - [debug]  Connecting via SSH from root@192.168.136.158(192.168.136.158:22) to root@192.168.136.159(192.168.136.159:22)..
Wed Mar  4 19:33:51 2020 - [debug]   ok.
Wed Mar  4 19:33:52 2020 - [info] All SSH connection tests passed successfully.
15.集群有效性验证(MySQL必须都启动)(管理节点)
[root@yulong-manager ~]# mkdir /tmp/mha_manager.log
[root@yulong-manager /]# masterha_check_repl --conf=/etc/mha/app1.cnf
Wed Mar  4 21:12:53 2020 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Mar  4 21:12:53 2020 - [info] Reading application default configuration from /etc/mha/app1.cnf..
Wed Mar  4 21:12:53 2020 - [info] Reading server configuration from /etc/mha/app1.cnf..
Wed Mar  4 21:12:53 2020 - [info] MHA::MasterMonitor version 0.58.
Wed Mar  4 21:12:54 2020 - [info] GTID failover mode = 1
Wed Mar  4 21:12:54 2020 - [info] Dead Servers:
Wed Mar  4 21:12:54 2020 - [info] Alive Servers:
Wed Mar  4 21:12:54 2020 - [info]   192.168.136.157(192.168.136.157:3306)
Wed Mar  4 21:12:54 2020 - [info]   192.168.136.158(192.168.136.158:3306)
Wed Mar  4 21:12:54 2020 - [info]   192.168.136.159(192.168.136.159:3306)
Wed Mar  4 21:12:54 2020 - [info] Alive Slaves:
Wed Mar  4 21:12:54 2020 - [info]   192.168.136.158(192.168.136.158:3306)  Version=8.0.19 (oldest major version between slaves) log-bin:enabled
Wed Mar  4 21:12:54 2020 - [info]     GTID ON
Wed Mar  4 21:12:54 2020 - [info]     Replicating from 192.168.136.157(192.168.136.157:3306)
Wed Mar  4 21:12:54 2020 - [info]     Primary candidate for the new Master (candidate_master is set)
Wed Mar  4 21:12:54 2020 - [info]   192.168.136.159(192.168.136.159:3306)  Version=8.0.19 (oldest major version between slaves) log-bin:enabled
Wed Mar  4 21:12:54 2020 - [info]     GTID ON
Wed Mar  4 21:12:54 2020 - [info]     Replicating from 192.168.136.157(192.168.136.157:3306)
Wed Mar  4 21:12:54 2020 - [info]     Not candidate for the new Master (no_master is set)
Wed Mar  4 21:12:54 2020 - [info] Current Alive Master: 192.168.136.157(192.168.136.157:3306)
Wed Mar  4 21:12:54 2020 - [info] Checking slave configurations..
Wed Mar  4 21:12:54 2020 - [info] Checking replication filtering settings..
Wed Mar  4 21:12:54 2020 - [info]  binlog_do_db= , binlog_ignore_db= mysql
Wed Mar  4 21:12:54 2020 - [info]  Replication filtering check ok.
Wed Mar  4 21:12:54 2020 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Wed Mar  4 21:12:54 2020 - [info] Checking SSH publickey authentication settings on the current master..
Wed Mar  4 21:12:54 2020 - [info] HealthCheck: SSH to 192.168.136.157 is reachable.
Wed Mar  4 21:12:54 2020 - [info] 
192.168.136.157(192.168.136.157:3306) (current master)
 +--192.168.136.158(192.168.136.158:3306)
 +--192.168.136.159(192.168.136.159:3306)

Wed Mar  4 21:12:54 2020 - [info] Checking replication health on 192.168.136.158..
Wed Mar  4 21:12:54 2020 - [info]  ok.
Wed Mar  4 21:12:54 2020 - [info] Checking replication health on 192.168.136.159..
Wed Mar  4 21:12:54 2020 - [info]  ok.
Wed Mar  4 21:12:54 2020 - [warning] master_ip_failover_script is not defined.
Wed Mar  4 21:12:54 2020 - [warning] shutdown_script is not defined.
Wed Mar  4 21:12:54 2020 - [info] Got exit code 0 (Not master dead).

MySQL Replication Health is OK.
16.开启MHA(管理节点)
[root@yulong-manager /]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover &> /tmp/mha_manager.log &
[1] 12890
[root@yulong-manager /]#  masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:12890) is running(0:PING_OK), master:192.168.136.157
17.将当前主库停掉
[root@yulong-master ~]# systemctl stop mysqld
18.备选主库上上查看新的主库
已经丛157,跳转到158
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.136.158
                  Master_User: mharep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: slave01.000005
          Read_Master_Log_Pos: 235
               Relay_Log_File: yulong-slave-relay-bin.000006
                Relay_Log_Pos: 405
        Relay_Master_Log_File: slave01.000005
             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: 235
              Relay_Log_Space: 870
              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: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 158
                  Master_UUID: d9a393c6-5d00-11ea-a5d5-000c296c0add
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: d9a393c6-5d00-11ea-a5d5-000c296c0add:3-4
            Executed_Gtid_Set: d912f36e-52dd-11ea-a0c9-000c294062df:1-12,
d9a393c6-5d00-11ea-a5d5-000c296c0add:1-4,
dd56aada-5de1-11ea-ab41-000c29ada657:1-5,
e060504a-5dfb-11ea-8fab-000c294062df:1-2
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)

实验完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值