centos 下 mysql+keepalived实现双主自由切换
目录
本文的目的是搭建一个互为主从的mysql高可用架构,用来保证mysql服务器宕机的时候,能够自动的切换的另一台mysql服务器。
ip规划
主机名 | ip地址 | 角色 |
---|---|---|
mysql1 | RIP:172.25.0.41 VIP 172.25.0.200 | 主服务器1 |
mysql2 | Rip:172.25.0.42 VIP 172.25.0.200 | 主服务器2 |
mysql双主配置
第一步,修改mysql1配置文件,如下所示。
[root@mysql1 ~]# vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd server-id = 1 log-bin = binlog relay_log = mysql-relay-bin log_slave_updates =1 auto_increment_increment=2 #表示自增长ID的数量,即步进 auto_increment_offset=1 ##自增长ID起始位置 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d
第二步:修改mysql2的配置文件,如下:
[root@mysql2 ~]# vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd server-id=2 #配置server-id,标识从服务器 relay_log = mysql-relay-bin #打开Mysql中继日志 log_bin =mysql-bin #打开从服务器的二进制日志 log_slave_updates =1 #使得更新的数据写进二进制日志中 auto_increment_increment=2 #表示自增长ID的数量,即步进 auto_increment_offset=2 #自增长ID起始位置 [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # # include all files from the config directory # !includedir /etc/my.cnf.d
第三步:在mysql1上创建复制账号,在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。 MariaDB [(none)]> grant replication slave ,replication client on *.* to slave@'172.25.%.%' identified by 'centos';
第四步:启动从服务器配置线程,在mysql2上配置
MariaDB [(none)]> change master to master_host='172.25.0.41', master_user='slave', master_password='centos', master_log_file='binlog.000003', #指明初始复制时的mysql1中的binlog文件 master_log_pos=245; #指明初始复制时binlog文件的位置
开启slave线程 MariaDB [(none)]> start slave;
第五步:上述已搭建好mysql1和mysql2的主从,接下来配置mysql2和mysql1的主从,使其能够互为主从。在mysq1上指定mysql2为主。
MariaDB [(none)]> change master to master_host='172.25.0.42', master_user='slave', master_password='centos', master_log_file='mysql-bin.000003', master_log_pos=486688; #指明复制时的起始文件和起始位置。
开启slave进程 MariaDB [(none)]> start slave;
keepalived配置
keepalived能够实现mysql1和mysql2共享一个虚拟ip,当前端访问数据库的时候,可以直接指向这个ip地址,若mysql1宕机了,VIP资源可以直接共享给mysql2.
mysql1中keepalived的配置
第一步:编辑keepalived的配置文件
! Configuration File for keepalived global_defs { #设置报警通知邮件地址,可以设置多个 notification_email { root@localhost } #设置邮件的发送地址 notification_email_from mysql@xiaomi.com #设置smtp server的地址,该地址必须是存在的 smtp_server 127.0.0.1 #设置连接smtp server的超时时间 smtp_connect_timeout 30 #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息 router_id mysql_ha } # 检测脚本 vrrp_script chk_mysql { script "/etc/keepalived/mysqlcheck/check_slave.sh" interval 2 weight 2 } #定义VRRP实例,实例名自定义 vrrp_instance mysql-ha { #指定Keepalived的角色,MASTER主机 BACKUP备份 state BACKUP #此处两个都设置为BACKUP #指定HA监测的接口 interface ens34 #虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样 virtual_router_id 68 #优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器 priority 100 #从服务器99 #设置主备之间同步检查的时间间隔单位秒 advert_int 1 #设置不抢占模式(DB1设置即可) nopreempt #设置验证类型和密码 authentication { #验证类型有两种{PASS|HA} auth_type PASS #设置验证密码,在一个实例中主备密码保持一样 auth_pass centos } track_script { chk_mysql # 执行监控的服务 } #定义虚拟IP地址,可以有多个,每行一个 virtual_ipaddress { 172.25.0.200 } }
第二步:编写心跳检测脚本:
[root@mysql1 /etc/keepalived/mysqlcheck]# vim /etc/keepalived/mysqlcheck/check_slave.sh #!/bin/bash #This scripts is check for Mysql Slave status counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${counter}" -eq 0 ]; then systemctl stop keepalived killall keepalived fi ping 172.25.0.41 -w1 -c1 &>/dev/null if [ $? -ne 0 ] then systemctl stop keepalived killall keepalived fi
需要为此.sh文件添加可执行权限
chmod +x /etc/keepalived/mysqlcheck/check_slave.sh
基于网段是否可用以及mysql数据库是否工作来判断服务器的心跳
mysql2中keepalived的配置
第一步:编辑keepalived中的配置文件
[root@mysql2 ~]# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { #设置报警通知邮件地址,可以设置多个 notification_email { root@localhost } #设置邮件的发送地址 notification_email_from mysql@xiaomi.com #设置smtp server的地址,该地址必须是存在的 smtp_server 127.0.0.1 #设置连接smtp server的超时时间 smtp_connect_timeout 30 #运行Keepalived服务器的标识,发邮件时显示在邮件标题中的信息 router_id mysql_ha } # 检测脚本 vrrp_script chk_mysql { script "/etc/keepalived/mysqlcheck/check_slave.sh" interval 2 weight 2 } #定义VRRP实例,实例名自定义 vrrp_instance mysql-ha { #指定Keepalived的角色,MASTER主机 BACKUP备份 state BACKUP #此处两个都设置为BACKUP #指定HA监测的接口 interface ens34 #虚拟路由标识,这个标识是一个数字(1-255),在一个VRRP实例中主备服务器ID必须一样 virtual_router_id 68 #优先级,数字越大优先级越高,在一个实例中主服务器优先级要高于备服务器 priority 90 #从服务器99 #设置主备之间同步检查的时间间隔单位秒 advert_int 1 #设置不抢占模式(DB1设置即可) #nopreempt #设置验证类型和密码 authentication { #验证类型有两种{PASS|HA} auth_type PASS #设置验证密码,在一个实例中主备密码保持一样 auth_pass centos } track_script { chk_mysql # 执行监控的服务 } #定义虚拟IP地址,可以有多个,每行一个 virtual_ipaddress { 172.25.0.200 } }
第二步:编写检测脚本:
[root@mysql2 ~]# vim /etc/keepalived/mysqlcheck/check_slave.sh #!/bin/bash #This scripts is check for Mysql Slave status counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${counter}" -eq 0 ]; then systemctl stop keepalived killall keepalived fi ping 172.25.0.42 -w1 -c1 &>/dev/null if [ $? -ne 0 ] then systemctl stop keepalived killall keepalived fi
需要为此.sh文件添加可执行权限
chmod +x /etc/keepalived/mysqlcheck/check_slave.sh
上述心跳检测脚本中,对于状态的检测写的很简单,其一是基于该服务器的mysql是否开启,其二是基于该网段是否可以ping通。可以根据自己的需求,将该脚本设计的更复杂一些。比如根据数据库的插入、删除等是否可用、主从线程是否开启等进行细分。提高检测的精准度。
VIP漂移检测
mysql1和mysql2中同时开启keepalived服务和msyql服务
查看mysql1中的ip地址: [root@mysql1 ~]# ip a s
由上图可知,此时的VIP是在mysql1中的。
停止mysql1中的mysql服务,再观察mysql1和mysql2的ip状况。
mysql1:
MySQL2:
可以看到VIP资源已经由mysql1转移到了mysql2当中。
在生产环境中,利用这种机制能够实现故障转移的功能。