前言:
通常套路都是这样滴,都会说一下对于整个集群的概念以及一些理论的东西;但是并没有错,学习一个东西就是要结合理论来进行实践.有了思路就好像有了赌博的筹码,筹码越多,信心越大;对于回报,取决于你赌注的大小;当然,如果你一直那么不幸,这也是人品的问题了~不是有一句话叫越努力越幸运嘛,那就努力点争取更多的思路筹码咯.那么接下来,就请带着你的思路筹码,跟Mysql+MHA集群进行赌博吧.
一.工作原理
MHA(Master HighAvalilability)是一款适用于Mysql主从同步高可用集群管理的软件.其主要作用就是通过对主库的监控,当主库发生宕机的时候,在0-30秒内自动切换到备用主库,从库重新指定备用主库为新主库,避免了单点故障,从而达到高可用的效果.该软件是基于C/S架构的,由两大部分组成:Manager(管理节点),Node(数据节点);顾名思义,Manager是用来管理Node数据节点的.Manager是服务端,而Node则是客户端.在这里需要提到的是,在一台服务器上可充当服务端亦可充当客户端.
MHA工作原理总结为以下几条:
(1)从宕机崩溃的master保存二进制日志事件(binlog events);
(2)识别含有最新更新的slave;
(3)应用差异的中继日志(relay log) 到其他slave;
(4)应用从master保存的二进制日志事件(binlog events);
(5)提升一个slave为新master;
(6)使用其他的slave连接新的master进行复制。
二.环境介绍
1. 系统环境,yum源,IP地址,主机名,虚拟IP地址,防火墙,SELinux.
这里有必要说一下虚拟IP(以下简称VIP).最早接触VIP这个概念是在学习思科的热备份路由协议(HSRP)时,其主要作用就是提供给客户端一个固定的供访问IP地址;高可用集群中最主要的特点就是能自动故障转移,而故障转移通常伴随着服务器的切换,那么物理IP地址就随之改变.这样就会造成一个严重问题:客户端访问的一直是故障的IP地址.我们不可能试图将客户端的IP地址总是指向正常的服务器.所以有了VIP这玩意,它将一个集群的IP地址虚拟成一个VIP地址,对外提供一个固定的VIP地址.客户端只要指向VIP便可访问.VIP的抢占或者切换工作由专门的脚本或者软件来管理即可.那么管理VIP的软件有keepalived.亦可使用MHA自带的master_ip_failover脚本.
系统:RedHat7.4 Yum源:用自带ISO镜像光盘
防火墙:禁用状态
那么请大家准备好7台虚拟机,配置好IP和主机名.VIP稍后教你设置.
Client | 192.168.4.101 | Slave1 | 192.168.4.61 |
Master1 | 192.168.4.58 | Slave2 | 192.168.4.62 |
Master2 | 192.168.4.59 | Manager | 192.168.4.63 |
Master3 | 192.168.4.60 | Virtual IP | 192.168.4.100 |
2. 需要安装的软件以及依赖包
所有包我都打包起来了,直接从以下链接下载便可.
链接:https://pan.baidu.com/s/1qFjx33FmY0gw_kqzqu3ozg 密码:r900
MHA-cluster //MHA集群有关软件包
Mysql-5.7.17 //mysqld安装包
3. Mysql主从同步
在搭建MHA集群时,是以Mysql主从同步为基础的,在本次实验中用到的是一主四从二备主.所以要配置集群成功,就必须先把主从同步配置完成,稍后会教你如何配置.在上绘的拓扑图中我们可以看到.这次集群我们用到5台机器实现主从同步.其中
Client | 访问客户端 |
Master1 | 主库 |
Master2 | 备用主库 |
Master3 | 备用主库 |
Slave1 | 从库 |
Slave2 | 从库 |
Manager | 负责监控五台主从库 |
在主从同步中,主库和备用主库都必须开启半同步复制功能,默认是异步复制
强行解释:如若主从同步的复制模式是异步复制的话,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理;开启半同步复制的话,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端,这样就保证了数据的一致性,防止数据丢失。稍后配置。
4. 设置一下中继日志文件不自动清除
在配置主从同步后,默认在从库上生成的中继日志文件会在SQL线程执行完后自动清除,但我们并不太想他太快清除,因为会存在数据不一致的风险;所以我们就临时指定不自动清除,但也有点风险;若要定时清除,请去百度一下~
mysql> set global relay_log_purge=off;
5. Manager主机需要安装管理节点,另外5个数据库服务器安装Node数据节点
解释: MHA基于C/S架构,而在此次实验中,Manager主机作为我们的管理节点,故需安装Manager管理节点;另外5个数据库服务器是被监控端,故需安装Node数据节点,受Manager实时监控是否宕机,以便故障切换.
6. Manager 需要ssh免密登录各个数据节点
为何?Manager负责监控各个数据节点,必然要读取其系统信息.实时监控他是否是活跃状态;如若第一主库宕机,则立即启动备选主库切换机制。稍后教你配置
7. 各个数据节点需要互相ssh免密登录
原因:街坊邻里大家互相认识认识,当第一主库宕机之后,MHA启动切换机制,备选主库成为新的主库;但有一个问题:从库如何选择新的主库?所以从库必须要随时获取主库的信息,查看他是否宕机,如若宕机,他也必须要知道谁是新的主库;当MHA切换完新主库后,从库就可以知道指向哪个新的主库。稍后教你配置
三.具体配置
1. 虚拟IP地址。
那些主机名什么的大家都会配置了吧。在这里就不累赘了。搞个虚拟IP
在第一主库Master1上配置:
ifconfig eth0:1 192.168.4.100/24
2. 在5台主机上安装数据库服务器。(58主机-62主机)
*源码装包前提:
rpm -qa | grep -i mariadb //查看mariadb有无安装
systemctl stop mariadb
rpm -e --nodeps mariadb-server mariadb //忽略依赖关系卸载数据库
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql
*源码装包:
tar xvf mysql-5.7.17-1.el7.x86_64.rpm-bundle.tar
rm -rf mysql-community-server-minimal-5.7.17-1.el7.x86_64.rpm
yum -y install perl-JSON
rpm -Uvh mysql-community-*.rpm
rpm -qa | grep -i mysql
*配置:
服务名:mysqld
主配置文件:/etc/my.cnf
数据目录:/var/lib/mysql
日志目录:/var/log/mysqld.log
*起服务:
systemctl start mysqld
systemctl enable mysqld
3.数据库基本使用:
*初始密码连接服务
cat /var/log/mysql.log | grep password
在这里可以查看到密码,是个很复杂的初始密码每个机器的密码都不同,所以直接粘贴
*重置密码
mysql>set global validate_password_policy=0; //修改策略.只检查密码长度
mysql>set global validate_password_length=6; //修改长度
mysql>alter user root@"localhost" identified by "123456"; //重置密码
若要设置为永久有效的话就修改/etc/my.cnf
vim/etc/my.cnf
[mysqld]
validate_password_policy=0
validate_password_length=6
记得重启服务
systemctl restart mysqld
*修改密码
mysqladmin -uroot -p password '123456'
输入初始密码就可以修改密码为123456了
这时候登录数据库就没问题了
mysql -uroot -p123456
4. 配置Mysql主从同步
*在主库Master1上配置:
vim /etc/my.cnf
[mysqld]
plugin-load ="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled= 1
rpl-semi-sync-slave-enabled= 1
server_id=58
log-bin=master58
binlog-format="mixed"
:wq
[root@master1~]# systemctl restart mysqld
[root@master1~]# ls /var/lib/mysql/master58.*
/var/lib/mysql/master58.000001 /var/lib/mysql/master58.index
[root@master1~]# mysql -uroot -p123456
mysql>grant replication slave on *.* to repluser@"%" identified by "123456";
Query OK, 0 rowsaffected, 1 warning (10.04 sec)
mysql> set global relay_log_purge=off;
Query OK, 0 rowsaffected (0.15 sec)
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master58.000001| 441 | | | |
+-----------------+----------+--------------+------------------+-------------------+
mysql> quit;
*在备用主库Master2上配置:
vim /etc/my.cnf
[mysqld]
plugin-load ="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled= 1
rpl-semi-sync-slave-enabled= 1
server_id=59
log-bin=master59
binlog-format="mixed"
[root@master2~]# systemctl restart mysqld
[root@master2~]# ls /var/lib/mysql/master59.*
/var/lib/mysql/master59.000001 /var/lib/mysql/master59.index
[root@master2~]# mysql -uroot -p123456
mysql> set global relay_log_purge=off;
Query OK, 0 rowsaffected (0.13 sec)
mysql> change master to
-> master_host="192.168.4.58",
-> master_user="repluser",
-> master_password="123456",
->master_log_file="master58.000001",
-> master_log_pos=441;
Query OK, 0 rowsaffected, 2 warnings (0.04 sec)
mysql> start slave;
Query OK, 0 rowsaffected (0.01 sec)
[root@master2~]# mysql -uroot -p123456 -e "show slave status\G" | grep -i YES
mysql: [Warning]Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
*在备用主库Master3上配置:
[root@master3~]# vim /etc/my.cnf
[mysqld]
plugin-load ="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled= 1
rpl-semi-sync-slave-enabled= 1
server_id=60
log-bin=master60
binlog-format="mixed"
:wq
[root@master3~]# systemctl restart mysqld
[root@master3~]# ls /var/lib/mysql/master60.*
/var/lib/mysql/master60.000001 /var/lib/mysql/master60.index
[root@master3~]#
[root@master3~]# mysql -uroot -p123456
mysql> set global relay_log_purge=off;
Query OK, 0 rowsaffected (0.14 sec)
mysql> change master to
-> master_host="192.168.4.58",
-> master_user="repluser",
-> master_password="123456",
->master_log_file="master58.000001",
-> master_log_pos=441;
Query OK, 0 rowsaffected, 2 warnings (0.05 sec)
mysql> start slave;
Query OK, 0 rowsaffected (0.00 sec)
mysql>
[root@master3~]# mysql -uroot -p123456 -e "show slave status\G" | grep -i yes
mysql: [Warning]Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
*在从库Slave1上配置:
[root@slave1 ~]#vim /etc/my.cnf
[mysqld]
server_id=61
:wq
[root@slave1 ~]#systemctl restart mysqld
[root@slave1 ~]#mysql -uroot -p123456
mysql> change master to
-> master_host="192.168.4.58",
-> master_user="repluser",
-> master_password="123456",
->master_log_file="master58.000001",
-> master_log_pos=441;
Query OK, 0 rowsaffected, 2 warnings (0.09 sec)
mysql> start slave;
Query OK, 0 rowsaffected (0.00 sec)
mysql> quit;
Bye
[root@slave1 ~]#
[root@slave1 ~]#mysql -uroot -p123456 -e "show slave status\G" | grep -i yes
mysql: [Warning]Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
*在从库Slave2上配置:
[root@slave2 ~]#vim /etc/my.cnf
[mysqld]
server_id=62
:wq
[root@slave2 ~]#systemctl restart mysqld
[root@slave2 ~]#mysql -uroot -p123456
mysql> change master to
-> master_host="192.168.4.58",
-> master_user="repluser",
-> master_password="123456",
->master_log_file="master58.000001",
-> master_log_pos=441;
Query OK, 0 rowsaffected, 2 warnings (0.09 sec)
mysql> start slave;
Query OK, 0 rowsaffected (0.00 sec)
mysql> quit;
Bye
[root@slave2 ~]#
[root@slave2 ~]#mysql -uroot -p123456 -e "show slave status\G" | grep -i yes
mysql: [Warning]Using a password on the command line interface can be insecure.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
*自行验证主从同步的效果.按道理说,在58上做的操作都会在从库上体现出来
5. Manager主机需要安装管理节点,另外5个数据库服务器安装Node数据节点
*在所有主机上安装perl软件包(在58-63)
cd MHA-cluster
yum -y install perl-*.rpm
*在所有主机上安装mha4mysql-node-0.56-0.el6.noarch.rpm
yum -y install mha4mysql-node-0.56-0.el6.noarch.rpm
*在管理机"63"上安装mha_manager
[root@manager MHA-cluster]#yum -y install perl-ExtUtils-* perl-CPAN*
[root@manager MHA-cluster]#tar xfmha4mysql-manager-0.56.tar.gz
[root@manager MHA-clustert]#cdmha4mysql-manager-0.56/
[root@manager mha4mysql-manager-0.56]#perl Makefile.PL
[root@manager mha4mysql-manager-0.56]#make && make install
*检查配置环境
在主机58,59,60 检查是否有同步数据的用户repluser
mysql> show user,host from mysql.user;
在58上添加授权用户自动同步到59-62,为了给63 进行连接管理
grant all on *.* to root@"%" identified by "123456";
在主机58-62 做如下设置
mysql> set global relay_log_purge=off; //relay log 不清除
*拷贝命令(在63)
cp /MHA-cluster/mha4mysql-manager-0.56/bin/* /usr/local/bin
*创建工作目录和主配置文件(在63)
mkdir /etc/mha_manager
cp /MHA-cluster/mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/mha_manager
*拷贝故障后切换主库的脚本(在63)
cp /MHA-cluster/mha4mysql-manager-0.56/samples/master_ip_failover /usr/local/bin/
*编辑主配置文件(在63)
vim /etc/mha_manager/app1.cnf
[server default]
manager_workdir=/etc/mha_manager //指定工作目录
manager_log=/etc/mha_manager/manager.log //指定日志文件
master_ip_failover_script=/usr/local/bin/master_ip_failover //故障后切换主库的脚本
report_script=/usr/local/bin/send_report //设置发生切换后发送的报警的脚本
shutdown_script="" //设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
ssh_user=root //ssh的用户
ssh_port=22 //ssh的端口号
repl_user=repluser //有资格成为其从库的用户名,就是在三台主库中已经授权给所有主机的用户名repluser@"%"
repl_password=123456 //密码
user=root //63 MHA管理机 登录连接数据库服务器并可对其监控的用户
password=123456 //密码
[server1] //主库信息
hostname=192.168.4.58
port=3306
[server2] //第一台候选主库信息
hostname=192.168.4.59
candidate_master=1
check_repl_delay=0 //默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
[server3] //第二台候选主库信息
hostname=192.168.4.60
candidate_master=1
check_repl_delay=0
[server4] //纯从库
hostname=192.168.4.61
no_master=1
[server5] //纯从库
hostname=192.168.4.62
no_master=1
6. Manager 需要ssh免密登录各个数据节点
[root@manager ~]ssh-keygen -N '' -f /root/.ssh/id_rsa //非交互生成密钥文件
[root@manager ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.58
[root@manager ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.59
[root@manager ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.60
[root@manager ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.61
[root@manager ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.62
7. 各个数据节点需要互相ssh免密登录
[root@master1 ~]ssh-keygen -N '' -f /root/.ssh/id_rsa
[root@master1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.59
[root@master1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.60
[root@master1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.61
[root@master1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.62
[root@master2 ~]ssh-keygen -N '' -f /root/.ssh/id_rsa
[root@master2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.58
[root@master2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.60
[root@master2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.61
[root@master2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.62
[root@master3 ~]ssh-keygen -N '' -f /root/.ssh/id_rsa
[root@master3 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.58
[root@master3 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub192.168.4.59
[root@master3 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.61
[root@master3 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.62
[root@slave1 ~]ssh-keygen -N '' -f /root/.ssh/id_rsa
[root@slave1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub192.168.4.58
[root@slave1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.59
[root@slave1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.60
[root@slave1 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.62
[root@slave2 ~]ssh-keygen -N '' -f /root/.ssh/id_rsa
[root@slave2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.58
[root@slave2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.59
[root@slave2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.60
[root@slave2 ~]ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.4.61
8.集群环境都准备好了,验证一下环境有没有错,没报错就ok
*验证配置
记得把启用脚本自动切换那一行注释掉再验证
vim /etc/mha_manager/app1.cnf
#master_ip_failover_script=/usr/local/bin/master_ip_failover
*验证ssh免密登录数据节点主机
masterha_check_ssh--conf=/etc/mha_manager/app1.cnf
*验证数据节点的主从同步配置
masterha_check_repl--conf=/etc/mha_manager/app1.cnf
四.测试阶段
1.修改故障切换脚本,此脚本是从老师那里拿来的,修改一下IP就可以
cp /MHA-cluster/master_ip_failover /usr/local/bin/
vim /usr/local/bin/master_ip_failover
my$vip = '192.168.4.100/24'; # Virtual IP
vim /etc/mha_manager/app1.cnf
master_ip_failover_script=/usr/local/bin/master_ip_failover //将注释弄掉
2.启动服务,会占用一个终端,所以开启后可开另一个终端再查看服务状态
masterha_manager--conf=/etc/mha_manager/app1.cnf \
--remove_dead_master_conf--ignore_last_failover
3.查看服务状态
masterha_check_status--conf=/etc/mha_manager/app1.cnf
4.验证集群的可用性,在此执行的所有操作都会被同步到所有数据库服务器中
(若没有webadmin这个授权用户的,请自行在58机子上授权,会自动同步到所有机)
[root@client~]#mysql -h192.168.4.100 -uwebadmin -p
createtable bbsdb.t2(id int(2));
5.模拟故障转移
*可以再开个终端在63上监控日志文件
tail -f /etc/mha_manager/manager.log
*将58关机
[root@master1~]# shutdown -h now
*再切换到63看日志,会自动切换
192.168.4.59(192.168.4.59:3306):Resetting slave info succeeded.
Masterfailover to 192.168.4.59(192.168.4.59:3306) completed successfully.
*在59本机上可以查看到VirtualIP地址192.168.4.100
[root@master2~]# ip add show eth0
五.结束语
无可厚非,这次的集群是有点难度的,因为涉及到的知识点还是听多的;你必须对Mysql的基本操作熟练,对主从同步的理论与实操比较娴熟,对整个集群架构有一定的思维想象力.接近尾声后,不知道你的筹码还剩下多少...不管剩下多少,也请努力争取多一点.
整个集群并不是很完美!有一下几点缺陷交给你解决:
*58的服务器down掉后,重新启动,并不会抢占主库,可能要等到59 down掉才可以.
*63MHA-manager启动后占用一个终端,太霸道了
*ifconfigeth0:1 192.168.4.100/24 这个命令是临时的,所以重启服务器后可能要重新设置
(提示:keepalive)