良许Linux教程网 干货合集 通过mysql+keepalived实现MySQL高可用架构

通过mysql+keepalived实现MySQL高可用架构

keepalived是vrrp协议的实现,原生设计目的是为了高可用ipvs服务,keepalived能够配置文件中的定义生成ipvs规则,并能够对各RS的健康状态进行检测;通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器宕机,其虚拟IP地址将会被其他服务器接替(优先级决定接替顺序),实现高可用为后端主机提供服务。

image-20220118123205576

系统环境及架构

#主机名     系统版本        mysql版本  ip地址
mysqlMaster    centos7.4        mysql5.7        192.168.1.42
mysqlSlave    centos7.4        mysql5.7        192.168.1.43

#vip:192.168.1.41
MySQL高可用架构:mysql+keepalived实现MySQL高可用架构:mysql+keepalived实现

在master和slave上分别进行数据库的安装

yum install epel*  -y && yum clean all && yum makecache
rpm -Uvh http://repo.mysql.com/mysql57-community-release-el7.rpm
yum clean all && yum makecache
yum install gcc gcc-c++ openssl-devel mysql mysql-server mysql-devel -y

创建数据库文件存放路径

mkdir /data/mysql -p
chown -R mysql:mysql /data/mysql

配置mysql配置文件

#在mysqlMaster上配置mysql配置文件

vi /etc/my.cnf

[mysqld]
server-id = 1  #全局唯一,每台都不能一样
log-bin = mysql-bin #log-bin表示开启二进制日志记录,mysql-bin表示日志文件的命名格式,会生成mysql-bin.0001 等等
relay-log = mysql-relay-bin #指定中继日志格式(拉取主mysql日志后,在从库上生成的日志)
replicate-wild-ignore-table=mysql.% #指定那些库或则表不进行同步,mysql是库名,.%表示下面所有的表,mysql.user  表示不同不mysql库下的user表
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
#replicate-wild-do-table=boke.%  #表示同步那个库
#注意:不要在主库上使用binlog-do-db 或 binlog-ignore-db选项
#也不要在从库上使用 replicate-do-db 或 replicate-ignore-db 选项,因为这有可能产生跨库更新失败的问题.推荐从库上使用 replicate_wild_do_table 和 replicate_wild_ignore_table 这两个选项来解决复制过滤问题
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8

[mysql]
socket=/data/mysql/mysql.sock
default-character-set=utf8

[client]
socket=/data/mysql/mysql.sock
default-character-set=utf8
user=root
password=NCYD-tianyu@0791
#若是不写上这个字段,在本机用命令进入mysql会报错,提示默认路径/var/lib/mysql/mysql.sock找不到

在mysqlSlave上配置mysql配置文件

vi /etc/my.cnf

[mysqld]
server-id = 2
log-bin = mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8

[mysql]
socket=/data/mysql/mysql.sock
default-character-set=utf8

[client]
socket=/data/mysql/mysql.sock
default-character-set=utf8
user=root
password=NCYD-tianyu@0791

#若是不写上这个字段,在本机用命令进入mysql会报错,提示默认路径/var/lib/mysql/mysql.sock找不到,先初始化数据库(需要进行初始化在/data/mysql目录里生成必要的信息)

#mysql5.7.7以后的初始化方法
mysqld --initialize --user=mysql --datadir=/data/mysql

#mysql5.7.7以前的初始化方法
mysql_install_db --user=mysql --datadir=/data/mysql

分别启动主从数据库

#在centos7里面,必须先关闭selinux,否在无法启动mysqld
systemctl start mysqld

分别为主从mysql做安全加固

#查到上一步,首次启动mysql,系统自动生成的密码( cat /var/log/mysqld.log |grep pass )
mysql_secure_installation #使用该命令更改随机root密码(修改为 NCYD-tianyu@0791 )
手动同步数据(假如现在的环境,主上已经有数据了,从是新的)
1:在主上数据库中创建用于复制的用户,并授权
mysql> GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'192.168.1.43' identified by '123456789';

2:在主mysql上先锁表(使其所有表变成只读状态)
mysql> flush tables with read lock;  #不要退出终端,否在这个锁就失效了

3:再开启另一个命令行终端,使用myqldump等工具将数据导出(或则直接打包存储mysql数据的目录,并发送到从机上)

4:将导出数据复制到从机上,并创建新库并导入数据
互相置从,互相置主(以达到双主模式)

在mysqlMaster上将mysqlSlave设置为自己的主角色服务器

mysql> show master status; #查看mysqlSlave的状态(记录File名字,和Position)

change master to
master_host = '192.168.1.43',
master_user = 'tongbu',
master_password = '123456789',
master_log_file = 'mysql-bin.000002',
master_log_pos = 1006;

mysql> start slave;      #启动slave端的复制进程(某些版本是:slave start; )
mysql> show slave status\G  #查看slaves端的I/O进程,与SQL进程

在从上将mysqlMaster设置为自己的主角色服务器

mysql> show master status; #查看mysqlMaster的状态(记录File名字,和Position)

change master to
master_host = '192.168.1.42',
master_user = 'tongbu',
master_password = '123456789',
master_log_file = 'mysql-bin.000002',
master_log_pos = 1006;

mysql> start slave;      #启动slave端的复制进程
mysql> show slave status\G  #查看slaves端的I/O进程,与SQL进程

验证是否同步

1:第一验证在myssqlMaster上创建库,mysqlSlave上是否存在

2:第二验证在mysqlSlave上创建库,mysqlMaster上是否存在

安装keepalived实现VIP切换,达到高可用

yum install keepalived -y

#在mysqlMaster和mysqlSlave上都创建检查mysql的检查脚本,并赋予执行权限
touch /etc/keepalived/mysql_check.sh
chmod +x /etc/keepalived/mysql_check.sh
vi /etc/keepalived/mysql_check.sh

#!/bin/bash
#slave_is=( $(mysql -uroot -pNCYD-tianyu@0791 -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') ) 在新版本的myql中,直接将密码写在命令行,会进行安全提示,解决办法是将其写在mysql的配置文件里的 [client] 字段里,写法见上面mysql的配置文件
slave_is=( $(mysql -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') )
if [ "${slave_is[0]}" = "Yes" -a "$slave_is[1]" = "Yes"]
then
exit 0
else
exit 1
fi

#注意,keepalived检查脚本vrrp_script,只认两个返回值,0表示正常,非0表示不正常(这在写脚本是要注意),不正常就要做相关的切换

配置keepalived,以实现高可用

vi /etc/keepalived/keepalived.conf

global_defs {
  notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
  }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL
  vrrp_skip_check_adv_addr
  #vrrp_strict  #注意:当你发现无法ping通虚拟VIP时,建议将此行注释掉
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}
vrrp_script mysql_check {
script "/etc/keepalived/mysql_check.sh"
#这个脚本,若是发现不执行,可以检查他的权限,777是不可以的,日志提示不安全,可以直接chmod +x /etc/keepalived/mysql_check.sh 就行
#script "shutdown -r now" #或者,直接用命令进行调试
interval 2
weight 2
}
vrrp_instance VI_1 {
   state MASTER #mysqlMaster上是MASTER;mysqlSlave上是BACKUP
   interface ens192
   virtual_router_id 52
   priority 100 #mysqlMaster上是100;mysqlSlave上是90
   advert_int 1
   nopreempt  #配置VIP(注意:故障切换抢占模式,尽量关闭,默认是开启的,这个参数只需要在高优先级上设置即可)
   authentication {
       auth_type PASS
       auth_pass 1111
   }
track_script { #调用上面定义检查mfsmaster的脚本
       mysql_check
   }
   virtual_ipaddress {
       192.168.1.41/24 dev ens192
   }
}

启动keepalived

systemctl start keepalived

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

img
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部