鄙人不才,自搭Mysql+MHA高可用集群,望君指点。

 



前言:

  通常套路都是这样滴,都会说一下对于整个集群的概念以及一些理论的东西;但是并没有错,学习一个东西就是要结合理论来进行实践.有了思路就好像有了赌博的筹码,筹码越多,信心越大;对于回报,取决于你赌注的大小;当然,如果你一直那么不幸,这也是人品的问题了~不是有一句话叫越努力越幸运嘛,那就努力点争取更多的思路筹码咯.那么接下来,就请带着你的思路筹码,跟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)

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值