设为首页 收藏本站
查看: 1410|回复: 0

[经验分享] Keepalived+Master-Master-Slave组合

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-7-12 08:52:21 | 显示全部楼层 |阅读模式
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

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

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 tomaster_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 statusG
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 statusG
wKioL1eDZPrzam0oAABDYajErFg697.png

我们可以随意在master1和master2建立测试数据库,插入数据,可以发现在任意节点插入都能自动同步到另一台上面。


二、安装配置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情况,如下图:
wKioL1eDZUCzOLp-AABUaOOA2SY316.png
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
wKiom1eDZWnC41GQAADS5Ote5Wc948.png

安装完成后,如下图所示:
wKioL1eDZWqA5C2wAAHXI8-xhYs742.png


五、在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

在干净的slave上启动MariaDB,并导入all.sql
# mysql -uroot -proot -e 'sourceall.sql;'

导入后,在刚才锁表的master上解除锁
> unlock tables;

操作完成后,在master1和master2上启动keepalived进程,让VIP再次出现。

VIP出现后,然后,在slave上执行:
> change master tomaster_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 statusG
wKiom1eDZYuQDYleAAA9jEQ2888801.png

这时候,我们可以在master1或者master2上任意创建库、表、插入数据,然后在slave上都可以看到数据已经正常同步过来了。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-242835-1-1.html 上篇帖子: keepalived配置文件说明 下篇帖子: 我zabbix做keepalived,zabbix_server.log出现大量日志
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表