mysql + keepalived 实现双主机HA配置

安装MySQL:
cd /usr/local/src/
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
yum -y install mysql-server
service mysqld restart
grep "password" /var/log/mysqld.log  
mysql -u root -p 
alter user 'root'@'localhost' identified by 'Root!!2018'; 
flush privileges;

支持root用户允许远程连接mysql数据库
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;

默认配置文件路径:
配置文件:/etc/my.cnf
日志文件:/var/log/var/log/mysqld.log
服务启动脚本:/usr/lib/systemd/system/mysqld.service
socket文件:/var/run/mysqld/mysqld.pid

忽略大小写 : lower_case_table_names=1 (建议最好忽略) 1: 忽略   0:区分大小写

MySQL 主从双备配置:
准备:/etc/my.cnf

增加以下内容:
开始-->
server_id=1 #不重复
log-bin = mysql-bin
binlog_format = mixed #指定mysql的binlog日志的格式,mixed是混合模式
relay-log = relay-bin #开启中继日志功能
relay-log-index = slave-relay-bin.index #中继日志清单
auto-increment-increment = 2 #表示自增长字段每次递增的量,其默认值是1。它的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2。
auto-increment-offset = 2 #不重复 用来设定数据库中自动增长的起点(即初始值),因为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突。
结束--<

在mysql 1 主机上创建授权账户,允许在mysql 2 主机上连接(在主库中对从库进行同步授权):
grant replication slave on *.* to  'username'@'ip'identified by 'password'; 
查看mysql 1 的当前binlog状态信息:
show master status;

在mysql 2 上将mysql 1 设为自已的主服务器并开启slave功能:
change master to master_host='ip',master_user='username',master_password='password',master_log_file='mysql-bin.000001',master_log_pos=456;
start slave;

查看mysql2的状态:
show slave status\G;

注意事项一:在mysql 1 防火墙上开启3306/tcp例外:
firewall-cmd --permanent --add-port=8888/tcp;firewall-cmd --reload

注意事项二:如果系统是复制过来的,需要更换mysql2的UUID号:
cd /var/lib/mysql/
vi auto.cnf  #修改server-uuid

查找命令:
find -name auto.cnf
注意:修改uuid后,需要重启MySQL服务:    >>> systemctl restart mysqld

以下为测试,看是否配置成功:
create database bdqn;
use bdqn;
create table it(id int primary key auto_increment,name varchar(20));
show databases;
use bdqn;
show tables;
insert into it(name) values('tom');
select * from it;

MySQL + keepalived HA配置部署:

首先安装gcc、c++编译器以及内核文件
yum -y install gcc gcc-c++ kernel-devel
tar -zxvf keepalived-1.2.tar.gz -C /usr/src/
cd /usr/src/keepalived-1.2/

在两台mysql上都开始解压缩编译安装keepalived:
./configure --prefix=/ && make && make install
ls /etc/init.d/keepalived

执行make install操作之后,会自动生成/etc/init.d/keepalived脚本文件,但还需要手动添加为系统服务,这样就可以使用service、chkconfig工具来对keepalived服务程序进行管理 (注意:可能路径不一定是这个,我的在安装目录下)
chkconfig --add keepalived
chkconfig keepalived on

若开启了防火墙,则需要关闭防火墙或者建富策略(现实生产环境中,都不允许关防火墙的,所以我们还是建富策略为第一选择)(两台mysql都需要操作)
firewall-cmd --permanent --add-rich rule="rule family=ipv4 destination address=224.0.0.18 protocol value=ip accept"
firewall-cmd reload 

修改keepalived的配置文件:
vi /etc/keepalived/keepalived.conf #编辑信息
开始:(直接替换即可)
! Configuration File for keepalived

global_defs {

  router_id mysql-1  #这里不一样 #当前节点名

}

vrrp_instance VI_1 {

   state BACKUP #两台配置节点均为BACKUP

   interface enp0s3 #绑定虚拟IP的网络接口
 
   virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组

   priority 100 #这里不一样 50  #节点的优先级,另一台优先级改低一点

   advert_int 1 #组播信息发送间隔,两个节点设置必须一样

   nopreempt #这里不一样 下个没这个 #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置

   authentication { #设置验证信息,两个节点必须一致

       auth_type PASS

       auth_pass 1111

   }

   virtual_ipaddress { #指定虚拟IP,两个节点设置必须一样

       192.168.1.150

   }

}

virtual_server 192.168.1.150 3306 { #linux虚拟服务器(LVS)配置

   delay_loop 2 #每个2秒检查一次real_server状态

   lb_algo rr #LVS调度算法,rr|wrr|lc|wlc|lblc|sh|dh

   lb_kind DR  #LVS集群模式 ,NAT|DR|TUN

   persistence_timeout 60  #会话保持时间

   protocol TCP   #使用的协议是TCP还是UDP

   real_server 192.168.1.100 3306 { #这里不一样

       weight 3  #权重

       notify_down    /etc/keepalived/bin/mysql.sh  #检测到服务down后执行的脚本

       TCP_CHECK {

            connect_timeout 3  #连接超时时间

            nb_get_retry 3  #重连次数

            delay_before_retry 3 #重连间隔时间

            connect_port 3306  #健康检查端口

       }

   }

}
编辑信息-结束

/etc/init.d/keepalived start #启动服务 注意:但可能一定是这个目录下

mysql1和mysql2上都需要添加检测脚本:
作用:是当mysql停止工作时自动关闭本机的keeplived,从而实现将故障主机踢出热备组,因每台机器上keepalived只添加了本机为realserver,所以当mysqld正常启动后,我们还需要手动启动keepalived服务。
mkdir /etc/keepalived/bin
vi /etc/keepalived/bin/mysql.sh
#!/bin/bash
pkill keepalived
/sbin/ifdown enp0s3 && /sbin/ifup enp0s3

给mysql.sh脚本赋予可执行权限(两台mysql都操作同样的步骤):
chmod +x /etc/keepalived/bin/mysql.sh

在mysql1和mysql2上分别执行ip addr show dev eno16777736命令查看mysql1和mysql2对VIP(群集虚拟IP)的控制权:
测试:ip addr show dev enp0s3

systemctl stop mysqld
systemctl restart mysqld
/etc/init.d/keepalived start
再次测试

客户端测试:
grant all on *.* to 'user'@'ip' identified by 'password';
mysql -uroot -ppassword -hhost -P3306
show variables like 'server_id';

查看端口占用(小工具):
netstat -apn|grep 3306


总结:

Keepalived+mysql双主一般来说,中小型规模的时候,采用这种架构是最省事的。

在master节点发生故障后,利用keepalived的高可用机制实现快速切换到备用节点。

在这个方案里,有几个需要注意的地方:

1.采用keepalived作为高可用方案时,两个节点最好都设置成BACKUP模式,避免因为意外情况下(比如脑裂)相互抢占导致往两个节点写入相同数据而引发冲突;

2.把两个节点的auto_increment_increment(自增步长)和auto_increment_offset(自增起始值)设成不同值。其目的是为了避免master节点意外宕机时,可能会有部分binlog未能及时复制到slave上被应用,从而会导致slave新写入数据的自增值和原先master上冲突了,因此一开始就使其错开;当然了,如果有合适的容错机制能解决主从自增ID冲突的话,也可以不这么做;

3.slave节点服务器配置不要太差,否则更容易导致复制延迟。作为热备节点的slave服务器,硬件配置不能低于master节点;

4.如果对延迟问题很敏感的话,可考虑使用MariaDB分支版本,或者直接上线MySQL 5.7最新版本,利用多线程复制的方式可以很大程度降低复制延迟;

发布了58 篇原创文章 · 获赞 1 · 访问量 2204

猜你喜欢

转载自blog.csdn.net/qq_37769323/article/details/104000993
今日推荐