无论在学习还是工作的过程中,随着时间的推移,数据量会越来越大,对数据库的要求也越来越高.这个时候,对数据库的相关部署就显得尤为重要,本文简单介绍了对Mysql数据库的主从复制和高可用部署,希望对大家有所帮助.

一、Mysql数据库的主从复制和高可用

1.Mysql数据库的主从复制:基于binlog日志,当主库更新操作后,从库会自动同步操作,实现数据的统一,提高了数据库的安全性

2.高可用:基于keepalived实现高可用,避免单点故障

二、部署过程

1.主从复制的部署(GTID)

(1)环境准备  两台centos7版本虚拟机(master backup) 关闭防火墙 关闭selinux安全服务 配置国内的base仓库和epel仓库    注意:主库和从库的数据应当保持一致(密码 用户名..)

两台虚拟机同时部署

(2)下载Mysql数据库仓库文件软件包并安装指定版本

 wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 

 #下载仓库文件软件包

 rpm -ivh  mysql80-community-release-el7-7.noarch.rpm

#安装软件包

yum -y install yum-utils

#安装yum管理工具

yum-config-manager --enable mysql57-community

#启用mysql5.7版本

yum-config-manager --disable mysql80-community

#禁用mysql8.0版本

yum -y install mysql-server mysql

#安装

systemctl start mysqld

#启动数据库

(3)数据库初始化

cat /var/log/mysqld.log |grep password    

#获取原始密码

mysqladmin -uroot -p'原始密码' password '新密码'

#修改root用户原始密码    如果需要设置弱密码策略,在/etc/my.cnf配置文件中写入validate_password=off

master虚拟机部署

(1)在配置文件/etc/my.cnf中写入

log-bin  
server-id=1                      #服务器的id不能相同
gtid_mode = ON                   #开启GTID功能
enforce_gtid_consistency=1

(2)进入数据库创应的授权用户供从服务器使用

mysql -uroot -p密码

#登录到数据库

grant all on *.* to haha@"%" identified by '密码'

#任何人可以通过haha用户登录到数据库并享有所有库,所有表的权限

flush privileges;
#刷新授权表  也可以最后重启mysqld服务

systemctl restart mysqld

#重启服务 因为修改了配置文件

backup虚拟机部署

(1)配置文件/etc/my.cnf中写入并重启mysqld服务

log-bin
server-id=2 
gtid_mode = ON  
enforce_gtid_consistency=1 
master-info-repository=TABLE      #将master.info和relay.info保存在表中
relay-log-info-repository=TABLE  
relay_log_recovery  = on          #开启relay-log日志

(2)进入数据库,并关联到主数据库

mysql命令行输入edit写入

     change master to
         master_host='master的IP地址',
         master_user='授权用户',
         master_password='授权密码',
         master_auto_position=1;

保存退出并以;结束

(3)启动角色并查看状态,

start slave;启动角色

show slave status\G; 查看状态

(4)出现下图两个yes表示主从状态正常

(5)交换master和slave身份再执行以上操作(注意:两台服务器应创建一样的授权用户)

2. 高可用部署(keepalived)

两台虚拟机同时部署

(1)安装keepalived

yum -y install keepalived

master上部署

(1)修改/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id sun1                     #集群id,保持不一致
}
vrrp_script check_run {
   script "/etc/keepalived/keepalived_chech_mysql.sh"
   interval 5
}

vrrp_instance VI_1 {
    state MASTER                            #定义为master
    interface ens33
    virtual_router_id 89                    #集群调度器保持一致
    priority 100                            #优先级master大于backup
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.244/24                    #定义VIP(最好是和宿主机同一网段)
    }
    track_script {
        check_run
    }
}

backup上部署

(1)修改/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id sun2
}
vrrp_script check_run {
   script "/etc/keepalived/keepalived_check_mysql.sh"
   interval 5
}

vrrp_instance VI_1 {
    state BACKUP                  #定义为backup
    nopreempt                     #默认不抢占
    interface ens33
    virtual_router_id 89
    priority 50                   #优先级小于master
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.244/24             #定义VIP
    }
    track_script {
        check_run
    }
}

master和backeup启动keepalived

验证结果

(1)VIP出现在master,停掉master的keepalived后,VIP漂移到backup上

(2)停掉master的mysqld和keepalived后,用第三台服务器通过授权用户+VIP仍然可以远程登陆到数据库

局限性

当MySQL服务出现问题,而keepalived未停止,VIP不会飘移,这时无法切换master,数据库无法正常登录。

解决办法

当检测到mysqld服务未正常运行时,同时关闭keepalived

编写健康监测脚本+计划任务,脚本如下:

#!/bin/bash
systemctl status mysqld&>/dev/null  
if [ $? = 0 ]; then                 #通过判断执行上条命令的返回结果,判断mysqld是否运行
     echo "数据库运行正常"
   else
     systemctl stop keepalived
fi

计划任务如下:

 chmod a+x /root/mysql.sh        #给脚本执行权限 
      
*/5 * * * * bash /root/mysql.sh  #每隔五分钟执行一次脚本

总结

       本文介绍了Mysql数据库基于GTID实现互为主从,并在此基础上做了数据库的高可用,编写了健康检测脚本,当master宕掉了,数据库仍然正常可以访问,很大程度上保证了服务的可用性.希望对大家有所帮助.

更多推荐