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

[经验分享] Centos7+Keepalived实现Mariadb(MYSQL)的高可用(HA)

[复制链接]

尚未签到

发表于 2018-4-24 07:32:29 | 显示全部楼层 |阅读模式
  Centos7+Keepalived实现Mariadb(MYSQL)的高可用(HA)
  我们前面几篇文章中有介绍了Keepalived的功能--HA,关于MySQL-HA,目前有多种解决方案,比如heartbeat、drbd、mmm、共享存储,但是它们各有优缺点。heartbeat、drbd配置较为复杂,需要自己写脚本才能实现MySQL自动切换,对于不会脚本语言的人来说,这无疑是一种脑裂问题;对于mmm,生产环境中很少有人用,且mmm 管理端需要单独运行一台服务器上,要是想实现高可用,就得对mmm管理端做HA,这样无疑又增加了硬件开支;对于共享存储,个人觉得MySQL数据还是放在本地较为安全,存储设备毕竟存在单点隐患。使用MySQL双master+keepalived是一种非常好的解决方案,今天我们介绍利用keepalived构建高可用MySQL-HA,保证两台MySQL数据的一致性,然后用keepalived实现虚拟IP,通过keepalived自带的服务监控功能来实现MySQL故障时自动切换。
  大概的思路是将两台MYSQL服务器配置双向复制,然后通过配置Keepalived指定realserver指向本地的Mysql服务器,实现高可用的切换。具体见下:
DSC0000.png

  Hostname:DB01
  IP:192.168.5.53
  Role:Mariadb+Keepalived
  Hostname:DB012
  IP:192.168.5.54
  Role:Mariadb+Keepalived
  Virtual IP:192.168.5.88
  从Centos7下mysql已经被遗弃了,变为Mariadb了,当然功能及配置是一样的。因为我们是Centos7,所以需要指定安装源,为后面yum安装服务提供支持需要执行以下命令:
cd /etc/yum.repo
vim epel.repo
添加以下内容
[epel]   name=aliyun epel    baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/
gpgcheck=0
DSC0001.png

  我们查看定义的源
DSC0002.png

  运行yum install MariaDB-server MariaDB-client命令安装 MariaDB
yum install mariadb-server mariadb-client mysql
DSC0003.png

  安装完成后, 我们通过rpm查看安装的相关信息
rpm -qa | grep mariadb
DSC0004.png

  然后启动数据库
systemctl start mariadb
systemctl enable mariadb
DSC0005.png

  接着运行 mysql_secure_installation配置MariaDB
mysql_secure_installation
DSC0006.png

DSC0007.png

  配置完成后,我们进入数据库
mysql –uroot –p
show databases;
DSC0008.png

  接下来我们创建一个数据库及表单信息
create databases DB1;
show databases;
DSC0009.png

use DB1;
show tables;
DSC00010.png

创建一个表
CREATE TABLE info(id int(30)NOT NULL,name varchar(30) NOT NULL,sex varchar(30) NOT NULL,mail VARCHAR(255) NOT NULL,PRIMARY KEY(id));
insert into info (name,sex,mail) values('ls','boy','ls@abc.com');
DSC00011.png

show tables;
DSC00012.png

  我们可以根据自己的配置设置运行那些主机及用户进行mysql的连接;
  如果我们需要配置任何主机都可以连接的话,可以使用一下命令
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;
如果任何主机连接不需要密码的话可以下面
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION;
flush privileges;
DSC00013.png

  接下来我们修改默认的mysql配置文件
vim /etc/my.cnf
server-id = 1                    #backup这台设置2
log-bin = mysql-bin
binlog-do-db=DB  #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db = mysql,information_schema       #忽略写入binlog日志的库
auto-increment-increment = 2             #字段变化增量值
auto-increment-offset = 1              #初始字段ID为1
slave-skip-errors = all                       #忽略所有复制产生的错误
DSC00014.png

  保存退出;先查看下log bin日志和pos值位置
  注意:这里记住File的值:mysql-bin.000001和Position的值:245,后面会用到。
show master status;
DSC00015.png

change master to master_host='主服务器',master_user='mysql用户名',master_password='mysql服务密码',master_log_file='File值' ,master_log_pos=Postion值;
我们需要些对方的服务器IP地址192.168.5.54
change master to master_host='192.168.5.54',master_user='root',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=245;
里面填写的信息是是在主服务器上执行show master status;的信息
DSC00016.png

  添加防火墙端口
firewall-cmd --add-port='3306/tcp' --permanent
DSC00017.png

启动slave
slave start;
DSC00018.png

  主主同步配置完毕,查看同步状态Slave_IO和Slave_SQL是YES说明主主同步成功。
show slave status\G;
DSC00019.png

  我们也需要同时在第二台服务器上执行上面的所有操作。
  我们在第二台服务器上也安装完成
DSC00020.png

  我们同样查看版本
rpm -qa | grep mariadb
DSC00021.png

  然后启动数据库
systemctl start mariadb
systemctl enable mariadb
DSC00022.png

接着运行 mysql_secure_installation配置MariaDB
mysql_secure_installation
DSC00023.png

DSC00024.png

  接下来我们同样登陆到mysql服务
mysql -uroot -p123456
show databases;
DSC00025.png

create databases DB1;
show databases;
DSC00026.png

use DB;
show tables;
DSC00027.png

  创建一个表及插入数据
CREATE TABLE info(id int(30)NOT NULL,name varchar(30) NOT NULL,sex varchar(30) NOT NULL,mail VARCHAR(255) NOT NULL,PRIMARY KEY(id));
insert into info (name,sex,mail) values('ls','boy','ls@abc.com');
DSC00028.png

show tables;
select * from info
DSC00029.png

  我们可以根据自己的配置设置运行那些主机及用户进行mysql的连接;
  如果我们需要配置任何主机都可以连接的话,可以使用一下命令
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;
DSC00030.png

  接下来我们修改默认的mysql配置文件
vim /etc/my.cnf
server-id = 2                    #backup这台设置2
log-bin = mysql-bin
binlog-do-db=DB  #需要同步的数据库名,如果有多个数据库,可重复此参数,每个数据库一行
binlog-ignore-db = mysql,information_schema       #忽略写入binlog日志的库
auto-increment-increment = 2             #字段变化增量值
auto-increment-offset = 1              #初始字段ID为1
slave-skip-errors = all                       #忽略所有复制产生的错误
DSC00031.png

  保存退出:  我们需要些对方的ip地址192.168.5.53
change master to master_host='192.168.5.53',master_user='root',master_password='123456',master_log_file='mysql-bin.000001' ,master_log_pos=245;
DSC00032.png

  添加防火墙端口
firewall-cmd --add-port='3306/tcp' --permanent
DSC00033.png

启动slave
slave start;
DSC00034.png

  主主同步配置完毕,查看同步状态Slave_IO和Slave_SQL是YES说明主主同步成功。
show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
DSC00035.png

  接下来我们测试一下
  我们在第一台Mariadb的数据库表中插入一条数据,然后在第二台服务器上进行查看,是否会同步;
  因为我们在配置的时候指定了DB这个数据库才会同步,所以我们需要在DB数据库中插入数据
  我们当前数据库表中的数据只有一条
DSC00036.png

  接下来我们插入一条数据;
insert into info(id,name,sex,mail) values('1','ll','girl','ll@abc.com');
DSC00037.png

  插入完成后,我们在第二台服务器上进行查看;
  我们查看到数据是已经同步了;
DSC00038.png

  我们接下来在第二台服务器上进行插入一条数据,看看第一台服务器是否会同步;
insert into info(id,name,sex,mail) values('2','zs','boy','zs@abc.com');
DSC00039.png

  接着我们在第一台服务器上进行查看
  数据已经同步过来了
DSC00040.png

  配置keepalived实现热备
  我们首先在第一台服务器上进行安装
yum install -y keepalived
DSC00041.png

  我们首先备份一下默认的配置文件;
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
DSC00042.png

  我们查看默认配置
[root@db01 keepalived]# vim keepalived.conf
! Configuration File for keepalived
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_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    sorry_server 192.168.200.200 1358
    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}
virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url {
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url {
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}  通过修改后,我们将将默认的文件清空,然后粘贴下面内容
echo > /etc/keepalived/keepalived.conf
DSC00043.png

  然后粘贴以下内容
global_defs {
   notification_email {
       gavin@ixmsoft.com             # 定义通知邮箱,有多个可以换行添加
}
   notification_email_from admin@ixmsoft.com# 定义发送邮件的邮箱
   smtp_server mail.ixmsoft.com             # 定义发件服务器
   smtp_connect_timeout 30                  # 定义连接smtp服务器超时时间
   router_id Mysql-HA
}
vrrp_instance VI_1 {
state BACKUP           #两台都设置BACKUP
interface ens160
virtual_router_id 51       #主备相同
priority 100           #优先级,backup设置90
advert_int 1
nopreempt             #不主动抢占资源,只在master这台优先级高的设置,backup不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.88
}
}
virtual_server 192.168.5.88 3306 {
delay_loop 2
lb_algo rr              #LVS算法,用不到,我们就关闭了
lb_kind DR              #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL
persistence_timeout 50  #同一IP的连接60秒内被分配到同一台真实服务器
protocol TCP
real_server 192.168.5.53 3306 {   #检测本地mysql,backup也要写检测本地mysql
weight 3
notify_down /DATA/shell/mysql.sh    #当mysq服down时,执行此脚本,杀死keepalived实现切换
TCP_CHECK {
connect_timeout 3    #连接超时
nb_get_retry 3       #重试次数
delay_before_retry 3 #重试间隔时间
  }
}
DSC00044.png

  我们启动keepalived服务
systemctl start keepalived
systemctl enable keepalived
DSC00045.png

  接下来我们在DATA目录下创建shell目录添加mysql.sh脚本
cd /DATA
mkdir shell
vim mysql.sh
pkill keepalived
chmod a+x mysql.sh
DSC00046.png

  接着我们查看keepalived的网卡监听状态,虚拟IP已经监听
DSC00047.png

  我们同样在第二台服务器上也安装keepalived
yum install -y keepalived
DSC00048.png

  我们首先备份一下默认的配置文件;
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
DSC00049.png

  然后将第一台服务器上的keepalived拷贝到第二台服务器上的keepalived路劲下替换keepalived.conf文件
scp /etc/keepalived/keepalived.conf root@192.168.5.54:/etc/keepalived/
DSC00050.png

  然后我们将第一台服务器下的mysql.sh拷贝到第二台对应的路劲
scp /DATA/shell/mysql.sh root@192.168.5.54:/DATA/shell/
DSC00051.png

  然后,我们要修改第二台服务器的keepalived.conf文件,因为刚才拷贝过来的数据需要修改
vim /etc/keepalived/keepalived.conf  我们需要修改realserver的地址,指向本地192.168.5.54,然后修改weight权重值,我们备服务器修改成50
global_defs {
   notification_email {
       gavin@ixmsoft.com             # 定义通知邮箱,有多个可以换行添加
}
   notification_email_from admin@ixmsoft.com# 定义发送邮件的邮箱
   smtp_server mail.ixmsoft.com             # 定义发件服务器
   smtp_connect_timeout 30                  # 定义连接smtp服务器超时时间
   router_id Mysql-HA
}
vrrp_instance VI_1 {
state BACKUP           #两台都设置BACKUP
interface ens160
virtual_router_id 51       #主备相同
priority 50           #优先级,backup设置90
advert_int 1
#nopreempt             #不主动抢占资源,只在master这台优先级高的设置,backup不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.5.88
}
}
virtual_server 192.168.5.88 3306 {
delay_loop 2
lb_algo rr              #LVS算法,用不到,我们就关闭了
lb_kind DR              #LVS模式,如果不关闭,备用服务器不能通过VIP连接主MySQL
persistence_timeout 50  #同一IP的连接60秒内被分配到同一台真实服务器
protocol TCP
real_server 192.168.5.54 3306 {   #检测本地mysql,backup也要写检测本地mysql
weight 3
notify_down /DATA/shell/mysql.sh    #当mysq服down时,执行此脚本,杀死keepalived实现切换
TCP_CHECK {
connect_timeout 3    #连接超时
nb_get_retry 3       #重试次数
delay_before_retry 3 #重试间隔时间
  }
}
DSC00052.png

  保存退出后,我们启动keepalived服务
systemctl enable keepalived
systemctl start keepalived
DSC00053.png

  我们第二台服务器的网卡监听状态,虚拟地址都 已经监听了
DSC00054.png

  接下来我们需要在两台服务器上ping一下虚拟ip地址是否通
ping 192.168.5.88
DSC00055.png

DSC00056.png

  我们找了一台windows机器进行测试
DSC00057.png

  然后使用myslq连接工具进行测试,测试通过
DSC00058.png

  我们查看连接后所有的数据信息都可以看见
DSC00059.png

  接下来我们将第一台服务器服务停止。
systemctl stop keepalived
systemctl stop mariadb
DSC00060.png

  客户端还是可以继续使用。
DSC00061.png

  接下来我们使用客户端插入一条数据
insert into inf (id,name,sex,mail) values ('3','gavin','boy','gavin@abc.com')
DSC00062.png

  我们查看插入的数据
DSC00063.png

  我们在第二台服务器上查看数据
select * from info
DSC00064.png

  接下来我们将第一台服务器的mariadb和keepalived服务启动起来,然后再查看数据
systemctl start mariadb
systemctl start keepalived
DSC00065.png

  查看第一台的数据也会自动同步
select * from info;
DSC00066.png

运维网声明 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-451096-1-1.html 上篇帖子: centos7.3安装增强工具(VirtualBox) 下篇帖子: centos6.6重置root密码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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