MySQL|MySQL 学习七 ——高可用集群

部署MYSQL高可用集群
一、集群定义: 使用多台服务提供相同的服务
MySQL高可用,顾名思义就是当MySQL主机或服务发生任何故障时能够立马有其他主机顶替其工作,并且最低要求是要保证数据一致性。
目前MySQL高可用方案可以一定程度上实现数据库的高可用,比如MMM,heartbeat+drbd,NDB Cluster等。还有MariaDB的Galera Cluster,以及MySQL 5.7.17 Group Replication等,目前推荐使用MHA架构。
高可用系统的几个目标:
——数据一致性;
——故障快速切换;
——简化日常维护,通过高可用平台来自动完成高可用的部署、维护、监控等任务。
——统一管理,当复制集很多的情况下,能够统一管理高可用实例信息、监控信息、切换信息等。
——高可用的部署要对现有的数据库架构无影响
二、高可用集群定义:主备模式,被客户端访问的称作主,当主宕机时,备用服务器自动接收客户端访问。
三、配置mysql数据库服务高可用集群(MHA + 主从同步)
3.1 MHA软件介绍(Master High Availability)
——由日本DeNA公司youshimation开发
——是一套优秀的实现MySQL高可用的解决方案
——数据库的自动故障切换操作能做到在0~30秒之内
——MHA能够确保在故障切换过程中保证数据的一致性,以达到真正意义上的高可用
(MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。)
3.1.1 MHA组成
——MHA Manager(管理节点)
—可以单独部署在一台独立的机器上,管理其他的节点
—也可以部署在一台slave节点上
——Manager工具包主要包括以下几个工具:
(1)masterha_check_ssh #检查MHA的SSH配置状况;
(2)masterha_check_repl #检查MySQL复制状况;
(3)masterha_manger #启动MHA;
(4)masterha_check_status #检测当前MHA运行状态;
(5)masterha_master_monitor #检测master是否宕机;
(6)masterha_master_switch #控制故障转移(自动或者手动);
(7)masterha_conf_host #添加或删除配置的server信息;
( – conf=/etc/mha_manager/app1.cnf)
—MHA Node (数据节点)
—运行在每台MySQL服务器上
(1)save_binary_logs #保存和复制master的二进制日志;
(2)apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的slave;
(3)purge_relay_logs #清除中继日志(不会阻塞SQL线程);
(目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当slave。)
3.1.4 MHA工作原理:
——1.从宕机崩溃的 Master 保存二进制日志事件(binlog event);
——2. 识别含有最新更新的 Slave;
——3. 应用差异的中继日志(relay log)到其他 Slave;
——4. 应用从 Master 保存的二进制日志事件;
——5. 提升一个 Slave 为新的 Master;
——6. 使其他的 Slave 连接新的 Master 进行复制;
3.1.2 MHA提供了如下功能:
——(1)master自动监控,故障转移一体化(Automated master monitoring and failover)
——(2)MHA可以在一个复制组中监控master的状态,如果挂了,就可以自动的做failover。
——(3)MHA通过所有slave的差异relay-log来保证数据的一致性。
——(4)MHA在做故障转移,日志补偿这些动作的时候,通常只需要10~30秒。
——(5)通常情况下,MHA会选择最新的slave作为new master,但是你也可以指定哪些是候选maser,
——(6)导致复制环境中断的一致性问题,在MHA中是不会发生的。MHA可以与半同步复制结合起来
——(7)手工-交互式master故障转移(Interactive manually initiated Master Failover)MHA可以配置成手工-交互式方式进行故障转 移,不支持监控master的状态。
——(8)非交互式master故障转移 (Non-interactive master failover)非交互式,自动的故障转移,不提供监控master状态功能,监控可以交给其他组件做(如:Pacemaker heartbeat)。
——(9)在线master切换 (Online switching master to a different host)
MHA的优点
1—— master failover和slave promotion非常快速。
2.—— 自动探测,多重检测,切换过程中支持调用其他脚本的接口。
3.—— master crash不会导致数据不一致,自动补齐数据,维护数据一致性。
4. ——不需要修改复制的任何设置,简单易部署,对现有架构无影响。
5. ——不需要增加很多额外的机器来部署MHA,支持多实例集中管理。
6. ——没有任何性能影响。
7. ——支持在线切换。
8. ——跨存储引擎,支持任何引擎。
3.2 配置MHA集群
安装软件包:https://github.com/yoshinorim/mha4mysql-manager/wiki/Installation
mha4mysql-node-0.58.tar.gz
mha4mysql-manager-0.58.tar.gz
3.2.1 在所 有主机上安装perl软件包 (51~56)
https://github.com/yoshinorim/mha4mysql-manager/wiki/Installation#downloading-mha-node-and-mha-manager
介绍了安装的方法:
yum -y install perl-DBD-mysql
yum -y install perl-ExtUtils-* perl-CPAN*
还需要下载perl安装环境包:
perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-Log-Dispatch-2.14-1.el7.1.norach.rpm
perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
perl-MIME-Lite-3.030-1.el7.noarch.rpm
3.2.2 在所有主机上安装mha_node软件包 (51~56)
tar -zxvf mha4mysql-node-0.58.tar.gz
cd mha4mysql-node-0.58
]#perl Makefile.PL
]#make
]#make install
3.2.3 只在管理主机上安装mha_manager软件包(56)
]#tar -zxvf mha4mysql-manager-0.56.tar.gz
]#cd mha4mysql-manager-0.56
]#perl Makefile.PL
]#make
]#make install
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
一、拓扑结构(一主多从)
_____________ master51
____________________ |___________________________
++++ |+++++++ | ++++++ |+++++++ | +++++++++++ |
slave51 slave52 slave53 slave54 mgm56 Manager
二、配置所有数据节点51-55主机之间可以互相以ssh密钥对方式认证登录
三、配置manage56主机,无密码ssh登录所有数据节点主机
四、配置主从同步,要求如下:
51主库 开半同步复制
52从库(备用主库) 开半同步复制
53从库 (备用主库) 开半同步复制
54从库 不做备用主库 不开半同步复制
55从库 不做备用主库 不开半同步复制
2.1 51~55之间互相免密登录
51】]# ssh-keygen
]# ssh-copy-id root@192.168.4.52
]# ssh-copy-id root@192.168.4.53
]# ssh-copy-id root@192.168.4.54
]# ssh-copy-id root@192.168.4.55
52】]# ssh-keygen
]# ssh-copy-id root@192.168.4.51
]# ssh-copy-id root@192.168.4.53
]# ssh-copy-id root@192.168.4.54
]# ssh-copy-id root@192.168.4.55
52】、53】、54】、55】同样处理。
3、 56 能免密登录所有节点51~55主机
]# ssh-keygen
]# ssh-copy-id root@192.168.4.51
]# ssh-copy-id root@192.168.4.52
]# ssh-copy-id root@192.168.4.53
]# ssh-copy-id root@192.168.4.54
]# ssh-copy-id root@192.168.4.55
+++++++++++++++++++++++++++++++++++++++++++++++++++++
51作为主库需要如下操作:
]# mysql -u root -p 主从同步授权
mysql> grant replication slave on . to lisi@"%" identified by “123456”;
mysql>show grants for lisi@"%";
mysql> grant all on . to root@"%" identified by “123456”;
#vim /etc/my.cnf 半步复制修改配置文件
log-bin=master51
server_id=51
binlog-format=“mixed”
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
]# systemctl restart mysqld
]# mysql -u root -p
mysql> show master status;
mysql> select * from mysql.user where user=“lisi”\G; 查看哪些用户权限;
mysql> select user ,host from mysql.user; 查看授权用户;
mysql> set global relay_log_purge=off; 不自动删除本机的中继日志文件
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
52]52做主备
]# mysql -h 192.168.4.51 -ulisi -p123456 先验证用户授权
#mysql -uroot -p
mysql> change master to
-> master_host=“192.168.4.51”, 主库Ip地址
-> master_user=“lisi”, 主库授权用户名
-> master_password=“123456”, 授权用户密码
-> master_log_file=“master51.00001”, 主库binlog日志文件名
-> master_log_pos=154; binlog日志文件偏移量;
mysql> start slave;
mysql> show slave status\G;
mysql> grant replication slave on . to lisi@"%" identified by “123456”;
mysql>show grants for lisi@"%";
mysql> grant all on . to root@"%" identified by “123456”;
mysql> show variables like “have_dynamic_loading”;
mysql> show master status;
—— # vim /etc/my.cnf
server_id=52
binlog-format=“mixed”
log-bin=slave52
plugin-load=rpl_semi_sync_master=semisync_master.so
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
]# systemctl restart mysqld
mysql> select * from mysql.user where user=“lisi”\G; 查看哪些用户权限;
mysql> select user ,host from mysql.user; 查看授权用户;
mysql> set global relay_log_purge=off; 不自动删除本机的中继日志文件
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
53同样做主备库
]# mysql -h 192.168.4.51 -ulisi -p123456
]# mysql -h 192.168.4.52 -ulisi -p123456
#mysql -uroot -p
mysql> change master to
-> master_host=“192.168.4.51”, 主库Ip地址
-> master_user=“lisi”, 主库授权用户名
-> master_password=“123456”, 授权用户密码
-> master_log_file="master51.00001 ", 主库binlog日志文件名
-> master_log_pos=154; binlog日志文件偏移量;
mysql> start slave;
mysql> show slave status\G;
mysql> grant replication slave on . to lisi@"%" identified by “123456”;
mysql>show grants for lisi@"%";
mysql> grant all on . to root@"%" identified by “123456”;
mysql> show variables like “have_dynamic_loading”;
mysql> show master status;
—— # vim /etc/my.cnf
server_id=53
binlog-format=“mixed”
log-bin=slave53
plugin-load=rpl_semi_sync_master=semisync_master.so
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1
]# systemctl restart mysqld
mysql> select * from mysql.user where user=“lisi”\G; 查看哪些用户权限;
mysql> select user ,host from mysql.user; 查看授权用户;
mysql> set global relay_log_purge=off; 不自动删除本机的中继日志文件
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
54、55】只做从库,配置一样
]# mysql -h 192.168.4.51 -ulisi -p123456
]# mysql -h 192.168.4.52 -ulisi -p123456
]# mysql -h 192.168.4.53 -ulisi -p123456
#mysql -uroot -p
mysql> grant all on . to root@"%" identified by “123456”;
mysql> change master to
-> master_host=“192.168.4.51”, 主库Ip地址
-> master_user=“lisi”, 主库授权用户名
-> master_password=“123456”, 授权用户密码
-> master_log_file="master51.00001 ", 主库binlog日志文件名
-> master_log_pos=154; binlog日志文件偏移量;
mysql> start slave;
mysql> show slave status\G;
]# vim /etc/my.cnf
server_id=54
]# systemctl restart mysqld
mysql> set global relay_log_purge=off; 不自动删除本机的中继日志文件
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3.2.4 检查配置环境
在主机52-55上查询是否主从同步
]# mysql -uroot -p123456 -e “show slave status\G” | grep -i yes
在主机51 52 53 检查是否有同步数据的用户 repluser
mysql> show grants for lis@"%" ;
在主机51~55 做如下授权
mysql> grant all on . to root@"%" identified by “123456”;
在主机51~55 做如下设置
mysql> set global relay_log_purge=off; 不自动删除本机的中继日志文件
3.2.5 拷贝命令(56)
]# cp mha4mysql-manager-0.56/bin/* /usr/local/bin/
manager节点提供的命令工具
masterha_check_ssh 检查MHA的SSH配置状况
masterha_chechk_repl 检查MySQL复制状况
masterha_manager 启动MHA
masterha_check_status 检测MHA运行状态
masterha_master_monitor 检测master是否宕机
3.2.6 创建工作目录 和主配置文件 (56)
]# ls mha4mysql-manager-0.58/samples/conf/
app1.cnf masterha_default.cnf 模板文件
]# mkdir /etc/mha_manager/
]# cp mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/mha_manager/
3.2.7 创建故障切换脚本(56)
]# ls mha4mysql-manager-0.58/samples/scripts/master_ip_failover
]# cp mha4mysql-manager-0.58/samples/scripts/master_ip_failover /usr/local/bin/
]# ls /usr/local/bin/master_ip_failover
3.2.8 编辑主配置文件 app1.cnf(56)
vim /etc/mha_manager/app1.cnf
manager_workdir=/etc/mha_manager
manager_log=/etc/mha_manager/manager.log
master_ip_failover_script=/usr/local/bin/master_ip_failover 调用故障切换脚本
ssh_user=root 指定56主机免密连接51~55时的用户名
ssh_port=22
repl_user=lisi
repl_pssword=123456
user=root
password=123456
[server1]
hostname=192.168.4.51
port=3306
[server2]
hostname=192.168.4.52
port=3306
candudate_master=1 竞选主库
[server3]
hostname=192.168.4.53
port=3306
candudate_master=1 竞选主库
[server4]
hostname=192.168.4.54
port=3306
no_master=1 不竞选主库
[server5]
hostname=192.168.4.55
port=3306
no_master=1 不竞选主库
3.2.9 验证配置
验证ssh 免密码登录 数据节点主机
]# masterha_check_ssh --conf=/etc/mha_manager/app1.cnf 调用配置文件检查数据节点是否能连接
Sun May 6 16:38:19 2018 - [info] All SSH connection tests passed successfully. 即成功
验证 数据节点的主从同步配置
验证前先到配置文件中 #vim /etc/mha_manager/app1.cnf
#master_ip_failover_script=/usr/local/bin/master_ip_failover 注释调用故障切换脚本
masterha_check_repl --conf=/etc/mha_manager/app1.cnf 验证主从同步是否正确
MySQL Replication Health is OK.
四、测试高可用集群配置
4.1 在主库上手动部署vip 地址 192.168.4.100(这个ip不能被别的主机占用)
[root@db51 ~]# ifconfig eth0:1 192.168.4.100/24
[root@db51 ~]# ifconfig eth0:1 (若是绑定错误的话,就停用网卡重新启用修改)
eth0:1: flags=4163 mtu 1500
inet 192.168.4.100 netmask 255.255.255.0 broadcast
192.168.4.255
ether 74:52:09:07:51:01 txqueuelen 1000 (Ethernet)
4.2 修该故障切换脚本 指定vip地址的部署信息
#vim /etc/mha_manager/app1.cnf
master_ip_failover_script=/usr/local/bin/master_ip_failove (该行注释去掉)
]# vim /usr/local/bin/master_ip_failover (配置文件里面是用perl语言编写的,修改35-38行)
my $vip = ‘192.168.4.100/24’; # Virtual IP
my $key = “1”;
mys s h s t a r t v i p = " / s b i n / i f c o n f i g e t h 0 : ssh_start_vip = " /sbin/ifconfig eth0: sshs?tartv?ip="/sbin/ifconfigeth0:key $vip";
mys s h s t o p v i p = " / s b i n / i f c o n f i g e t h 0 : ssh_stop_vip = " /sbin/ifconfig eth0: sshs?topv?ip="/sbin/ifconfigeth0:key down";
4.3 启动管理服务,并查看服务状态
masterha_check_status // 查看主库状态;
masterha_check_stop //停止服务
–remove_dead_master_conf //删除宕机主库配置
–ignore_last_failover //忽略xxx.health文件
56]# masterha_check_status --conf=/etc/mha_manager/app1.cnf
56]# masterha_manager --conf=/etc/mha/app1.cnf
–remove_dead_master_conf --ignore_last_failover
56 ~]# masterha_check_status --conf=/etc/mha_manager/app1.cnf 查看启用状态
app1 (pid:16944) is running(0:PING_OK), master:192.168.4.51
56 ~]#ls /etc/mha_manager
app1.cnf app1.master_status.health manager.log
56 ~]#tail /etc/mha_manager/manager.log 查看日志
56 ~]#cat /etc/mha_manager/app1.master_status.health 查看目前健康主库情况
51]mysql > select user,host from mysql.user;
51]mysql > show grants for webadmin@"%";
客户端57】 mysql -h 192.168.4.100 -uwebadmin -p123456
MySQL[none] > create database bbsdb;
MySQL[none] > create table bbsdb.t2(id int);
4.4 测试故障转移
51 ~ ]# shutdown -h now
4.5 在管理主机上查看服务状态(如果服务停止了,手动启动一下服务,再查看状态)
56 ~]#tail -f /etc/mha_manager/manager.log (在另一个终端上查看日志)
56 ~]# masterha_check_status --conf=/etc/mha_manager/app1.cnf
app1 (pid:17507) is running(0:PING_OK), master:192.168.4.52
4.6 在52 本机查看是否获取vip地址
查看VIP地址: #ip addr show | grep vip地址
手动配置vip地址:# ifconfig ethX:1 x.x.x.x/24
52 ~]# ip addr show | grep 192.168.4
inet 192.168.4.52/24 brd 192.168.4.255 scope global eth0
inet 192.168.4.100/24 brd 192.168.4.255 scope global secondary eth0:1
4.7 客户端连接vip地址 ,访问数据服务
57]#mysql -h192.168.4.100 -uwebadmin -p123456
mysql>desc bbsdb.t2;
【MySQL|MySQL 学习七 ——高可用集群】容易发生的故障:
主从同步配置测试失败——报错:ERROR 2003 :Cannot connect to MySQL server…
56 ~]# masterha_check_repl --conf=/etc/mha_manager/app1.cnf 查看一下
故障分析及排除:
——无法加载故障切换脚本
解决:——注释配置文件中的加载脚本的 配置项
——重启管理服务
——重新测试即可
56 ~]# masterha_check_repl --conf=/etc/mha_manager/app1.cnf

    推荐阅读