Centos7+Mariadb+Keepalived实现Mariadb(MYSQL)的高可用(HA)

Centos7+Mariadb+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服务器,实现高可用的切换。具体见下:

Image(95)

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
vimepel.repo
添加以下内容
[epel]name=aliyunepelbaseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/
gpgcheck=0

Image(28)

我们查看定义的源

Image(96)

运行yum install MariaDB-server MariaDB-client命令安装 MariaDB

yuminstallmariadb-servermariadb-clientMysqL

Image(97)

安装完成后, 我们通过rpm查看安装的相关信息

rpm-qa|grepmariadb

Image(98)

然后启动数据库

systemctlstartmariadb
systemctlenablemariadb

Image(99)

接着运行 MysqL_secure_installation配置MariaDB

MysqL_secure_installation

Image(100)


Image(101)

配置完成后,我们进入数据库

MysqL�Curoot�Cp
showdatabases;

Image(102)

接下来我们创建一个数据库及表单信息

createdatabasesDB1;
showdatabases;

Image(91)

useDB1;
showtables;

Image(92)

创建一个表
CREATETABLEinfo(idint(30)NOTNULL,namevarchar(30)NOTNULL,sexvarchar(30)NOTNULL,mailVARCHAR(255)NOTNULL,PRIMARYKEY(id));
insertintoinfo(name,sex,mail)values('ls','boy','ls@abc.com');

Image(93)

showtables;

Image(94)

我们可以根据自己的配置设置运行那些主机及用户进行MysqL的连接;

如果我们需要配置任何主机都可以连接的话,可以使用一下命令

GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION;
flushprivileges;
如果任何主机连接不需要密码的话可以下面
GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY''WITHGRANTOPTION;
flushprivileges;

Image(103)

接下来我们修改认的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#忽略所有复制产生的错误

Image(104)

保存退出;先查看下log bin日志和pos值位置

注意:这里记住File的值:MysqL-bin.000001和Position的值:245,后面会用到。

showmasterstatus;

Image(105)

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

Image(106)

添加防火墙端口

firewall-cmd--add-port='3306/tcp'--permanent

Image(107)

启动slave
slavestart;

Image(108)

主主同步配置完毕,查看同步状态Slave_IO和Slave_sql是YES说明主主同步成功。

showslavestatus\G;

Image(109)

我们也需要同时在第二台服务器上执行上面的所有操作。

我们在第二台服务器上也安装完成

Image(110)

我们同样查看版本

rpm-qa|grepmariadb

Image(111)

然后启动数据库

systemctlstartmariadb
systemctlenablemariadb

Image(112)

接着运行MysqL_secure_installation配置MariaDB
MysqL_secure_installation

Image(113)

Image(114)

接下来我们同样登陆到MysqL服务

MysqL-uroot-p123456
showdatabases;

Image(115)

createdatabasesDB1;
showdatabases;

Image(91)[1]

useDB;
showtables;

Image(92)[1]

创建一个表及插入数据

CREATETABLEinfo(idint(30)NOTNULL,'ls@abc.com');

Image(93)[1]

showtables;
select*frominfo

Image(94)[1]

我们可以根据自己的配置设置运行那些主机及用户进行MysqL的连接;

如果我们需要配置任何主机都可以连接的话,可以使用一下命令

GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION;
flushprivileges;

Image(116)

接下来我们修改认的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#忽略所有复制产生的错误

Image(117)

保存退出: 我们需要些对方的ip地址192.168.5.53

changemastertomaster_host='192.168.5.53',master_log_pos=245;

Image(118)

添加防火墙端口

firewall-cmd--add-port='3306/tcp'--permanent

Image(119)

启动slave
slavestart;

Image(108)[1]

主主同步配置完毕,查看同步状态Slave_IO和Slave_sql是YES说明主主同步成功。

showslavestatus\G;
Slave_IO_Running:Yes
Slave_sql_Running:Yes

Image(120)

接下来我们测试一下

我们在第一台Mariadb的数据库表中插入一条数据,然后在第二台服务器上进行查看,是否会同步;

因为我们在配置的时候指定了DB这个数据库才会同步,所以我们需要在DB数据库中插入数据

我们当前数据库表中的数据只有一条

Image(121)

接下来我们插入一条数据;

insertintoinfo(id,name,mail)values('1','ll','girl','ll@abc.com');

Image(122)

插入完成后,我们在第二台服务器上进行查看;

我们查看到数据是已经同步了;

Image(123)

我们接下来在第二台服务器上进行插入一条数据,看看第一台服务器是否会同步;

insertintoinfo(id,mail)values('2','zs','zs@abc.com');

Image(124)

接着我们在第一台服务器上进行查看

数据已经同步过来了

Image(125)

配置keepalived实现热备

我们首先在第一台服务器上进行安装

yuminstall-ykeepalived

Image(126)

我们首先备份一下认的配置文件

cp/etc/keepalived/keepalived.conf/etc/keepalived/keepalived.conf.bak

Image(127)

我们查看认配置

[root@db01keepalived]#vimkeepalived.conf
!ConfigurationFileforkeepalived
global_defs{
notification_email{
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_fromAlexandre.Cassen@firewall.loc
smtp_server192.168.200.1
smtp_connect_timeout30
router_idLVS_DEVEL
}
vrrp_instanceVI_1{
stateMASTER
interfaceeth0
virtual_router_id51
priority100
advert_int1
authentication{
auth_typePASS
auth_pass1111
}
virtual_ipaddress{
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server192.168.200.100443{
delay_loop6
lb_algorr
lb_kindNAT
nat_mask255.255.255.0
persistence_timeout50
protocolTCP
real_server192.168.201.100443{
weight1
SSL_GET{
url{
path/
digestff20ad2481f97b1754ef3e12ecd3a9cc
}
url{
path/mrtg/
digest9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout3
nb_get_retry3
delay_before_retry3
}
}
}
virtual_server10.10.10.21358{
delay_loop6
lb_algorr
lb_kindNAT
persistence_timeout50
protocolTCP
sorry_server192.168.200.2001358
real_server192.168.200.21358{
weight1
HTTP_GET{
url{
path/testurl/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
url{
path/testurl2/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
url{
path/testurl3/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout3
nb_get_retry3
delay_before_retry3
}
}
real_server192.168.200.31358{
weight1
HTTP_GET{
url{
path/testurl/test.jsp
digest640205b7b0fc66c1ea91c463fac6334c
}
url{
path/testurl2/test.jsp
digest640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout3
nb_get_retry3
delay_before_retry3
}
}
}
virtual_server10.10.10.31358{
delay_loop3
lb_algorr
lb_kindNAT
nat_mask255.255.255.0
persistence_timeout50
protocolTCP
real_server192.168.200.41358{
weight1
HTTP_GET{
url{
path/testurl/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
url{
path/testurl2/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
url{
path/testurl3/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout3
nb_get_retry3
delay_before_retry3
}
}
real_server192.168.200.51358{
weight1
HTTP_GET{
url{
path/testurl/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
url{
path/testurl2/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
url{
path/testurl3/test.jsp
digest640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout3
nb_get_retry3
delay_before_retry3
}
}
}

通过修改后,我们将将认的文件清空,然后粘贴下面内容

echo>/etc/keepalived/keepalived.conf

Image(128)

然后粘贴以下内容

global_defs{
notification_email{
gavin@ixmsoft.com#定义通知邮箱,有多个可以换行添加
}
notification_email_fromadmin@ixmsoft.com#定义发送邮件的邮箱
smtp_servermail.ixmsoft.com#定义发件服务器
smtp_connect_timeout30#定义连接smtp服务器超时时间
router_idMysqL-HA
}
vrrp_instanceVI_1{
stateBACKUP#两台都设置BACKUP
interfaceens160
virtual_router_id51#主备相同
priority100#优先级,backup设置90
advert_int1
nopreempt#不主动抢占资源,只在master这台优先级高的设置,backup不设置
authentication{
auth_typePASS
auth_pass1111
}
virtual_ipaddress{
192.168.5.88
}
}
virtual_server192.168.5.883306{
delay_loop2
lb_algorr#LVS算法,用不到,我们就关闭了
lb_kindDR#LVS模式,如果不关闭,备用服务器不能通过VIP连接主MysqL
persistence_timeout50#同一IP的连接60秒内被分配到同一台真实服务器
protocolTCP
real_server192.168.5.533306{#检测本地MysqL,backup也要写检测本地MysqL
weight3
notify_down/DATA/shell/MysqL.sh#当mysq服down时,执行此脚本,杀死keepalived实现切换
TCP_CHECK{
connect_timeout3#连接超时
nb_get_retry3#重试次数
delay_before_retry3#重试间隔时间
}
}

Image(129)

我们启动keepalived服务

systemctlstartkeepalived
systemctlenablekeepalived

Image(130)

接下来我们在DATA目录下创建shell目录添加MysqL.sh脚本

cd/DATA
mkdirshell
vimMysqL.sh
pkillkeepalived
chmoda+xMysqL.sh

Image(131)

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

Image(132)

我们同样在第二台服务器上也安装keepalived

yuminstall-ykeepalived

Image(133)

我们首先备份一下认的配置文件

cp/etc/keepalived/keepalived.conf/etc/keepalived/keepalived.conf.bak

Image(134)

然后将第一台服务器上的keepalived拷贝到第二台服务器上的keepalived路劲下替换keepalived.conf文件

scp/etc/keepalived/keepalived.confroot@192.168.5.54:/etc/keepalived/

Image(135)

然后我们将第一台服务器下的MysqL.sh拷贝到第二台对应的路劲

scp/DATA/shell/MysqL.shroot@192.168.5.54:/DATA/shell/

Image(136)

然后,我们要修改第二台服务器的keepalived.conf文件,因为刚才拷贝过来的数据需要修改

vim/etc/keepalived/keepalived.conf

我们需要修改realserver的地址,指向本地192.168.5.54,然后修改weight权重值,我们备服务器修改成50

global_defs{
notification_email{
gavin@ixmsoft.com#定义通知邮箱,有多个可以换行添加
}
notification_email_fromadmin@ixmsoft.com#定义发送邮件的邮箱
smtp_servermail.ixmsoft.com#定义发件服务器
smtp_connect_timeout30#定义连接smtp服务器超时时间
router_idMysqL-HA
}
vrrp_instanceVI_1{
stateBACKUP#两台都设置BACKUP
interfaceens160
virtual_router_id51#主备相同
priority50#优先级,backup设置90
advert_int1
#nopreempt#不主动抢占资源,只在master这台优先级高的设置,backup不设置
authentication{
auth_typePASS
auth_pass1111
}
virtual_ipaddress{
192.168.5.88
}
}
virtual_server192.168.5.883306{
delay_loop2
lb_algorr#LVS算法,用不到,我们就关闭了
lb_kindDR#LVS模式,如果不关闭,备用服务器不能通过VIP连接主MysqL
persistence_timeout50#同一IP的连接60秒内被分配到同一台真实服务器
protocolTCP
real_server192.168.5.543306{#检测本地MysqL,backup也要写检测本地MysqL
weight3
notify_down/DATA/shell/MysqL.sh#当mysq服down时,执行此脚本,杀死keepalived实现切换
TCP_CHECK{
connect_timeout3#连接超时
nb_get_retry3#重试次数
delay_before_retry3#重试间隔时间
}
}

Image(137)

保存退出后,我们启动keepalived服务

systemctlenablekeepalived
systemctlstartkeepalived

Image(138)

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

Image(139)

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

ping192.168.5.88

Image(140)

Image(141)

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

Image(142)

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

Image(143)

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

Image(144)

接下来我们将第一台服务器服务停止。

systemctlstopkeepalived
systemctlstopmariadb

Image(145)

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

Image(146)

接下来我们使用客户端插入一条数据

insertintoinf(id,mail)values('3','gavin','gavin@abc.com')

Image(147)

我们查看插入的数据

Image(148)

我们在第二台服务器上查看数据

select*frominfo

Image(149)

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

systemctlstartmariadb
systemctlstartkeepalived

Image(150)

查看第一台的数据也会自动同步

select*frominfo;

Image(151)

相关文章

Centos下搭建性能监控Spotlight
CentOS 6.3下Strongswan搭建IPSec VPN
在CentOS6.5上安装Skype与QQ
阿里云基于centos6.5主机VPN配置
CentOS 6.3下配置multipah
CentOS安装、配置APR和tomcat-native