您的位置:首页 > 数据库 > SQL

MySQL高可用MHA集群架构案例

2020-04-07 12:27 1441 查看

(这个图片是当时的,我配置的时候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)

实验完成

  • 点赞
  • 收藏
  • 分享
  • 文章举报
宇龙的小心肝 发布了8 篇原创文章 · 获赞 2 · 访问量 1763 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: