Keepalived+Master-Master-Slave组合 深碍√TFBOYSˉ_ 2022-07-08 15:56 218阅读 0赞 master1和master2公用一个VIP。当某个master宕机后,keepalived能自动将VIP漂移到另一个master上。只需要1~3秒即可切换完成,基本能保证服务不中断。 实验环境: CentOS6.7X86\_64 MariaDB10.0.17 Keepalived1.2.21 各节点配置: Master1:192.168.2.13 Master2:192.168.2.14 VIP:192.168.2.100 Slave:192.168.2.11 Web服务器:192.168.2.11 主要步骤如下: 构建MySQL双主---> 配置Keepalived ---> 模拟节点故障 ---> MHA基础上构建web站点 ---> MHA基础上添加Slave 一、构建双主MySQL 安装MariaDB过程略过,可以直接使用通用二进制包进行安装。 首先确保2台Master是新安装的(不是新安装的话,执行mysql\_install\_db重新初始化即可),配置起来更方便些。 配置Master1,修改my.cnf,如下: \[mysqld\] ....主要修改如下:.... innodb\_file\_per\_table =ON skip\_name\_resolve = ON log-bin=mysql-bin binlog\_format=mixed **server-id=1** log\_slave\_updates=ON auto-increment-offset = 1 auto-increment-increment = 2 replicate-ignore-db = test replicate-ignore-db = mysql 配置Master2,修改my.cnf,如下: \[mysqld\] ....主要修改如下:.... innodb\_file\_per\_table =ON skip\_name\_resolve = ON log-bin=mysql-bin binlog\_format=mixed **server-id=2** log\_slave\_updates=ON auto-increment-offset = 2 auto-increment-increment = 2 replicate-ignore-db = test replicate-ignore-db = mysql 在Master1上建立授权用户 > grant replication slave on \*.\* to 'repluser'@'192.168.2.%' identified by '123456'; > flush privileges; > show master status; ![wKiom1eDZLXx6DBxAAAWpIx9se8859.png][] 在Master2上连接到Master1作为自己的主服务器 > change master to master\_host='192.168.2.13', master\_user='repluser', master\_password='123456', master\_log\_file='mysql-bin.000003', master\_log\_pos=22519; > start slave; > show slave status\\G ![wKioL1eDZMviedvuAABDYajErFg006.png][] 在Master2上建立授权用户 > grant replication slave on \*.\* to 'repluser'@'192.168.2.%' identified by '123456'; > flush privileges; > show master status; ![wKioL1eDZODT9GjGAAAaaHKVHmU501.png][] 在Master1上连接到Master2作为自己的主服务器 > change master to master\_host='192.168.2.14', master\_user='repluser', master\_password='123456', master\_log\_file='mysql-bin.000003', master\_log\_pos=643; > start slave; > show slave status\\G ![wKioL1eDZPrzam0oAABDYajErFg697.png][] 二、安装配置keepalived **编译安装keepalived** 在2个节点都如下操作: tar xf keepalived-1.2.21.tar.gz cd keepalived-1.2.21 ./configure make && make install cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived cp /usr/local/sbin/keepalived /usr/sbin/ chkconfig --add keepalived chkconfig keepalived on **在master1(192.168.2.13)上,修改keepalived的配置文件**,如下: ! Configuration File forkeepalived global\_defs \{ notification\_email \{ receiver@126.com \} notification\_email\_from localhost smtp\_server 127.0.0.1 smtp\_connect\_timeout 30 router\_id MySQL\_HA \} vrrp\_instance VI\_1 \{ state BACKUP \# 两台配置此处均是BACKUP interface eth0 \# 网卡,可使用ifconfig查看 virtual\_router\_id 51 priority 100 \# 优先级,另一台改为90,默认VIP飘在在这个节点上 advert\_int 1 nopreempt \# 不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置 authentication \{ auth\_type PASS auth\_pass 1111 \} virtual\_ipaddress \{ 192.168.2.100 dev eth0 label eth0:1 \} \} virtual\_server 192.168.2.100 3306\{ delay\_loop 2 \# 每个2秒检查一次real\_server状态 lb\_algo rr \# 轮询算法 lb\_kind DR \# LVS算法,直接转发 persistence\_timeout 50 \# 会话保持时间 protocol TCP real\_server 192.168.2.13 3306 \{ \# 只配置一个real\_server,且为本机地址 weight 3 notify\_down/home/scripts/MySQL.sh \# 检测到服务down后执行的脚本 TCP\_CHECK\{ connect\_timeout10 \# 连接超时时间 nb\_get\_retry 3 \# 重连次数 delay\_before\_retry 3 \# 重连间隔时间 connect\_port 3306 \# 健康检查端口 \} \} \} **在master2(192.168.2.14)上,修改keepalived的配置文件**,如下: ! Configuration File forkeepalived global\_defs \{ notification\_email \{ receiver@126.com \} notification\_email\_from localhost smtp\_server 127.0.0.1 smtp\_connect\_timeout 30 router\_id MySQL\_HA \} vrrp\_instance VI\_1 \{ state BACKUP \# 两台配置此处均是BACKUP interface eth0 \# 网卡,可使用ifconfig查看 virtual\_router\_id 51 priority 90 \# 优先级,master2这台改为90,当master1无响应,则VIP会飘到这个节点上 advert\_int 1 \#nopreempt \# 不抢占,只在优先级高的机器上设置即可,优先级低的机器设不设置都无所谓 authentication \{ auth\_type PASS auth\_pass 1111 \} virtual\_ipaddress \{ 192.168.2.100 dev eth0 label eth0:1 \} \} virtual\_server 192.168.2.100 3306\{ delay\_loop 2 \# 每个2秒检查一次real\_server状态 lb\_algo rr \# 轮询算法 lb\_kind DR \# LVS算法,直接转发 persistence\_timeout 50 \# 会话保持时间 protocol TCP real\_server 192.168.2.14 3306 \{ \# 只配置一个real\_server,且为本机地址 weight 3 notify\_down/home/scripts/MySQL.sh \# 检测到服务down后执行的脚本 TCP\_CHECK\{ connect\_timeout10 \# 连接超时时间 nb\_get\_retry 3 \# 重连次数 delay\_before\_retry 3 \# 重连间隔时间 connect\_port 3306 \# 健康检查端口 \} \} \} 编写检测服务down后所要执行的脚本 在master1和master2都执行下面的操作: mkdir /home/scripts/ **vim /home/scripts/MySQL.sh 内容如下**: \#!/bin/sh pkill keepalived 注意: 此脚本是上面配置文件notify\_down选项所用到的, **keepalived使用notify\_down选项来检查real\_server的服务状态,当发现real\_server服务故障** **时,便触发此脚本;我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死** **keepalived进程,从而实现了MySQL故障自动转移。** 另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP。 **在master1和master2上都启动keepalived** /etc/init.d/keepalived start ps aux|grep keepalived ifconfig -a 可以看到VIP默认是在master1上的(因为keepalived里配置master1的优先级为100,master2的优先级为90) 三、模拟节点故障 模拟MySQLMaster的写节点故障 我们可以模拟下master的MySQL无法访问了,看看VIP会不会自动漂移。 先查看master1、master2的IP情况,如下图: ![wKiom1eDZUDzZxlAAABPH1M0r2M317.png][] 可以看到VIP在master1节点上。我们在master1上执行/etc/init.d/mariadb stop 模拟master1的MySQL进程挂掉的情况。 然后,在maste1和master2上执行 ps aux|egrep "keepalived|mariadb" ip a 可以看到VIP已经漂移到master2上了。此时,master1上的MariaDB进程挂掉后,keepalived进程也一并被kill了。 至此,实验初步算是完成了。但是这个方案的话,mysql一退出, keepalived也退出了,后面再次修复的话要手动启动keepalived进程,不然就达不到高可用的效果了。不过出于数据安全性、完整性考虑,MySQL和keepalived进程还是应该手动恢复的。 这个方案还有个不足,就是mysql端口和进程都在,但是复制线程却不是Yes状态了,这种只能靠zabbix 或者其它监控工具来监控了。 四、在MHA的基础上构建个web站点 MySQL高可用实现后,不如继续深入下,再基于上面的环境构建个web站点吧,操作如下: web节点参数: IP:192.168.2.11 运行有:Nginx+php-fpm nginx虚拟主机配置如下: server \{ listen 80; server\_name 192.168.2.11; location / \{ root /home/wwwroot/default; index index.php index.html index.htm; \} location ~ \\.php$ \{ root /home/wwwroot/default; fastcgi\_pass unix:/tmp/php-cgi.sock; fastcgi\_index index.php; fastcgi\_param SCRIPT\_FILENAME $document\_root$fastcgi\_script\_name; include fastcgi\_params; access\_log /home/wwwlogs/access.log main; \} \} /etc/init.d/nginx start 启动nginx服务 /etc/init.d/php-fpm start 启动php-fpm服务 在master1或者master2上执行下面命令,创建个web网站所需的数据库: > create database metinfo; > grant all on metinfo.\* to'met'@'192.168.2.%' identified by '123456'; > flush privileges; 在浏览器访问http://192.168.2.11 如下图: 注意数据库主机地址要填:192.168.2.100 五、在MHA的基础上添加一个Slave 生产环境中,光靠2个Master是顶不住那么大压力的,因此还需要添加几个Slave节点(假设节点IP 192.168.2.11)。 修改Slave的my.cnf 如下 \[mysqld\] ....主要修改如下:.... innodb\_file\_per\_table =ON skip\_name\_resolve = ON log-bin=mysql-bin binlog\_format=mixed server-id = 10 relay\_log =mysql-relay.bin log\_slave\_updates = 1 read\_only = 1 replicate-ignore-db = test replicate-ignore-db = mysql **在业务低谷时候,先将keepalived进程停掉,防止写入数据**。 然后稍等片刻,等2个master之间的数据同步后,在任意master上执行: > **flush tables with read lock;** \# mysqldump -uroot -proot -A >all.sql \# scp all.sqlroot@192.168.2.11:/root/ 在干净的slave上启动MariaDB,并导入all.sql \# mysql -uroot -proot -e 'sourceall.sql;' 导入后,在刚才锁表的master上解除锁 > unlock tables; 操作完成后,在master1和master2上启动keepalived进程,让VIP再次出现。 VIP出现后,然后,在slave上执行: > change master to master\_host='192.168.2.100', master\_user='repluser', master\_password='123456', master\_log\_file='mysql-bin.000006', master\_log\_pos=326; > start slave; 启动复制 > show slave status\\G ![wKiom1eDZYuQDYleAAA9jEQ2888801.png][] 这时候,我们可以在master1或者master2上任意创建库、表、插入数据,然后在slave上都可以看到数据已经正常同步过来了。 脚本change\_master.sh内容如下: \#!/bin/bash \# 下面的是Master的虚拟IP,还有授权的账号和密码 VIP="192.168.2.100" user="root" passwd="123456" \# 复制账号和密码 repluser="repluser" replpasswd="123456" \# 本地MySQL管理账号等 host="192.168.2.11" man\_user="root" man\_pass="123456" \# 查看Master的二进制日志信息 FILE=$(/usr/local/mariadb/bin/mysql -u$user -p$passwd -h $VIP -e 'show master status;'|sed -n '2p'|awk '\{print$1\}') POS=$(/usr/local/mariadb/bin/mysql -u$user -p$passwd -h $VIP -e 'show masterstatus;'|sed -n '2p'|awk '\{print $2\}') \# 将本机修改成Slave状态 mysql -u$man\_user -p$man\_pass -h$host -e "stop slave;" mysql -u$man\_user -p$man\_pass -h$host -e "reset slave all;" mysql -u$man\_user -p$man\_pass -h$host -e "change master to master\_user='$\{repluser\}',master\_host='$\{VIP\}',master\_password='$\{replpasswd\}',master\_log\_file='$\{FILE\}',master\_log\_pos=$\{POS\};" mysql -u$man\_user -p$man\_pass -h$host -e "start slave;" \# 输出执行结果 REPL\_STATUS=$(mysql -e 'show slave status\\G'|sed -n '12,13p'|grep-c "Yes") if \[\[ $REPL\_STATUS != 2 \]\];then echo-e "\\033\[31mChange Status to Slave,Failed!\\033\[0m" else echo-e "\\033\[32mChange Status to Slave,Success!\\033\[0m" fi 脚本monitor\_slave.sh内容如下: \#!/bin/bash \# Description: 每2秒钟检测从节点的状态,如果状态不是2个Yes,则执行上面的change\_master.sh脚本 while true;do \{ if\[\[ \`mysql -uroot -e 'show slave status\\G'|grep -c "Yes"\` != 2 \]\] ;then echo-e "\\033\[30mwill auto change slave status $(date "+%F %T")\\033\[0m" >> /tmp/slave.log /bin/bash change\_master.sh else echo-e "\\033\[32mHealth Status: OK $(date "+%F %T")\\033\[0m" >> /tmp/slave.log fi \} sleep 2 done nohup sh monitor\_slave.sh & 将监控进程运行在后台,不断监控slave的同步状态,如果发现同步线程不是2个Yes,则自动执行change\_master.sh,重新配置主从关系。 假设我们还有一个配置好的slave,IP为192.168.2.15。那么现在的情况是: Master1:192.168.2.13 Master2:192.168.2.14 VIP:192.168.2.100 Slave1:192.168.2.12 Slave2:192.168.2.15 Web服务器:192.168.2.11 haproxy的安装配置 演示用法而已,我们就将haproxy安装到192.168.2.12上,能验证效果即可。 软件版本: haproxy-1.5.4-2 【haproxy1.6配置文件和以往的有点不一样,这里没有用最新的】 yum install haproxy -y cd /etc/haproxy vim haproxy.cfg 修改配置文件,修改好的配置文件如下: global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon stats socket /var/lib/haproxy/stats defaults mode tcp log global option dontlognull retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 \#\# 定义一个监控页面,监听在1080端口,并启用了验证机制 listen stats mode http bind 0.0.0.0:1080 stats enable stats hide-version stats uri /haproxy stats realm Haproxy\\ Statistics stats auth admin:123456 stats admin if TRUE listen mysql bind 0.0.0.0:3336 mode tcp option mysql-check user haproxy\_check \# 定义了一个用于后端的mysql健康检查的用户\[主要:这个用户要在后端的slave上存在才行\] balance roundrobin server slave1 192.168.2.12:3306 weight 1check inter 1s rise 2 fall 2 server slave2 192.168.2.15:3306 weight 1check inter 1s rise 2 fall 2 在各个mysqlslave节点上创建账号 创建允许haproxy连接到数据库的账号获取其运行状态 > GRANT PROCESS ON \*.\* TO'haproxy\_check'@'192.168.2.%'; > flush privileges; 再创建一个访问的账号,一会要通过它连接haproxy的3336节点尝试访问slave,以便验证是否能负载均衡 > GRANT ALL ON \*.\* TO'lirl'@'192.168.2.%' identified by '123456'; > flush privileges; 启动haproxy /etc/init.d/haproxy start 浏览器访问http://192.168.2.12:1080/haproxy 输入用户名admin 密码123456 进到下面的界面: 一、环境说明 1、操作系统内核版本:2.6.9-78.ELsmp 2、Keepalived软件版本:keepalived-1.1.20.tar.gz 二、环境配置 1、主Keepalived服务器IP地址 192.168.111.223 2、备Keepalived服务器IP地址 192.168.111.100 3、Keepalived虚拟IP地址 192.168.111.150 三、软件下载地址 http://www.keepalived.org/software/keepalived-1.1.20.tar.gz 四、安装流程 1、上传Keepalived至/home/目录 2、解压Keepalived软件 \[root@localhost home\]\# tar -zxvf keepalived-1.1.20.tar.gz \[root@localhost home\]\# cd keepalived-1.1.20 \[root@localhost keepalived-1.1.20\]\# ln -s /usr/src/kernels/2.6.9-78.EL-i686/usr/src//linux \[root@localhost keepalived-1.1.20\]\# ./configure 遇到错误提示:configure: error: Popt libraries is required 这个错误是因为没有安装popt的开发包导致的,解决方法也很简单,只要yum install popt-devel 就可以安装好popt的开发包了。 重新./configure 没有遇到跳过这一步 3、提示 ![971251-20160911132315044-327292328.png][] 4、编译以及编译安装 \[root@localhost keepalived-1.1.20\]\# make && make install 5、将types.h调用的部分注释掉即可解决4出现的问题 vi/usr/src/kernels/2.6.9-78.EL-i686/include/linux/types.h 到158行操作如下 \#endif 6、重新编译以及编译安装 \[root@localhost keepalived-1.1.20\]\# make && make install 7、修改配置文件路径 [\[root@localhostkeepalived-1.1.20\]\#cp/usr/local/etc/rc.d/init.d/keepalived/etc/rc.d/init.d/][root_localhostkeepalived-1.1.20_cp_usr_local_etc_rc.d_init.d_keepalived_etc_rc.d_init.d] \[root@localhostkeepalived-1.1.20\]\# cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/ \[root@localhost keepalived-1.1.20\]\# mkdir /etc/keepalived [\[root@localhostkeepalived-1.1.20\]\#cp][root_localhostkeepalived-1.1.20_cp_usr_local_etc_rc.d_init.d_keepalived_etc_rc.d_init.d] /usr/local/etc/keepalived/keepalived.conf/etc/keepalived/ \[root@localhost keepalived-1.1.20\]\# cp /usr/local/sbin/keepalived /usr/sbin/ 8、设置为服务,开机启动 \[root@localhost keepalived-1.1.20\]\# vi /etc/rc.local 五、主Keepalived配置 1、修改配置文件 \[root@localhost keepalived-1.1.20\]\# vi /etc/keepalived/keepalived.conf 六、备Keepalived配置 1、修改配置文件 七、启动服务 八、查看网卡信息 1、主Keepalived网卡信息 ![971251-20160911132624651-125190919.png][] 九、验证测试 1、在主服务器上新建一个网页,内容为 192.168.111.223 2、在备用服务器上新建一个网页,内容为 192.168.111.100 3、启动主备服务器的http服务和Keepalived服务 4、通过浏览数,输入虚拟IP地址 192.168.111.150 页面显示为 192.168.111.223 5、关闭主服务器的Keepalived服务,通过浏览器输入IP地址192.168.111.150 页面显示为 192.168.111.100 6、再次启动主服务器的Keepalived服务,通过浏览器输入IP地址192.168.111.150 页面显示为 192.168.111.223 [wKiom1eDZLXx6DBxAAAWpIx9se8859.png]: /images/20220708/33e69c55a9574611a01847f66019629d.png [wKioL1eDZMviedvuAABDYajErFg006.png]: /images/20220708/c9d8b41d7c234e86a0a7afda612e1be8.png [wKioL1eDZODT9GjGAAAaaHKVHmU501.png]: /images/20220708/b9b4bd0a4c32420d8d57b823c5a75487.png [wKioL1eDZPrzam0oAABDYajErFg697.png]: /images/20220708/121f4da94b4546b7ac4e4397010f00df.png [wKiom1eDZUDzZxlAAABPH1M0r2M317.png]: /images/20220708/375357745ac54eebbf49d1ba7dc6ed80.png [wKiom1eDZYuQDYleAAA9jEQ2888801.png]: /images/20220708/dbad266c17674cbfafd2dd8bd6ffd2e5.png [971251-20160911132315044-327292328.png]: /images/20220708/3b9c6c3ec3594938b485bac85fbeb870.png [root_localhostkeepalived-1.1.20_cp_usr_local_etc_rc.d_init.d_keepalived_etc_rc.d_init.d]: mailto:[root@localhostkeepalived-1.1.20] [971251-20160911132624651-125190919.png]: /images/20220708/c712cb27af524115b3c4019b898fcd5c.png
相关 组合数 组合数 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n) Love The Way You Lie/ 2022年08月05日 07:26/ 0 赞/ 218 阅读
相关 组合数 组合数 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 3 描述 找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n) 怼烎@/ 2022年07月12日 13:14/ 0 赞/ 222 阅读
相关 组合模式 在我写外观模式的时候,我是举最近在做的一个考勤的例子,不熟悉的小伙伴可以去看一下前面的文章哦,在那个例子中我们分析了一下,考勤中每种类别员工的工作日计算方式是不一样的,比如说一 川长思鸟来/ 2022年05月09日 15:00/ 0 赞/ 229 阅读
相关 组合模式 组合模式 一、概述 1. 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组 合,使得用户在使用时可以一致性的对待容器和叶子。 2. 古城微笑少年丶/ 2022年04月18日 04:47/ 0 赞/ 209 阅读
相关 组合数学 (二): 排列组合 排列组合 公式 排列 组合 代码 输出所有排列 错位排列 输出所有组合 公式 排列 从 本是古典 何须时尚/ 2022年02月21日 14:54/ 0 赞/ 346 阅读
相关 组合模式 > 本文总结摘自刘伟老师的《设计模式》和程杰老师的《大话设计模式》 1.定义 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个 朴灿烈づ我的快乐病毒、/ 2022年01月23日 00:21/ 0 赞/ 253 阅读
相关 组合模式 前言 组合模式(Composite),将对象组合树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 一、Compone 傷城~/ 2021年12月09日 00:49/ 0 赞/ 296 阅读
相关 组合 与全排列实现方式有异曲同工之处。 代码如下: import java.util.ArrayList; import java.util.List; 我就是我/ 2021年09月26日 15:16/ 0 赞/ 320 阅读
相关 组合模式 11.组合模式 ![70][] //抽象构件,它是叶子和容器共同的父类,并且声明了叶子和容器的所有方法 abstract class Abstr 末蓝、/ 2021年09月16日 23:58/ 0 赞/ 368 阅读
相关 组合模式 合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类... 小灰灰/ 2020年06月13日 05:57/ 0 赞/ 805 阅读
还没有评论,来说两句吧...