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服务器,实现高可用的切换。具体见下:
Hostname:DB01
IP:
Role:Mariadb+Keepalived
Hostname:DB012
IP:
Role:Mariadb+Keepalived
Virtual IP:
从Centos7下MysqL已经被遗弃了,变为Mariadb了,当然功能及配置是一样的。因为我们是Centos7,所以需要指定安装源,为后面yum安装服务提供支持需要执行以下命令:
cd/etc/ vim 添加以下内容 [epel]name=aliyunepelbaseurl=/epel/7Server/x86_64/ gpgcheck=0
我们查看定义的源
运行yum install MariaDB-server MariaDB-client命令安装 MariaDB
yuminstallmariadb-servermariadb-clientMysqL
安装完成后, 我们通过rpm查看安装的相关信息
rpm-qa|grepmariadb
然后启动数据库
systemctlstartmariadb systemctlenablemariadb
接着运行 MysqL_secure_installation配置MariaDB
MysqL_secure_installation
配置完成后,我们进入数据库
MysqL–uroot–p showdatabases;
接下来我们创建一个数据库及表单信息
createdatabasesDB1; showdatabases;
useDB1; showtables;
创建一个表 CREATETABLEinfo(idint(30)NOTNULL,namevarchar(30)NOTNULL,sexvarchar(30)NOTNULL,mailVARCHAR(255)NOTNULL,PRIMARYKEY(id)); insertintoinfo(name,sex,mail)values('ls','boy','ls@');
showtables;
我们可以根据自己的配置设置运行那些主机及用户进行MysqL的连接;
如果我们需要配置任何主机都可以连接的话,可以使用一下命令
GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION; flushprivileges; 如果任何主机连接不需要密码的话可以下面 GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY''WITHGRANTOPTION; flushprivileges;
vim/etc/ 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#忽略所有复制产生的错误
保存退出;先查看下log bin日志和pos值位置
注意:这里记住File的值:MysqL-和Position的值:245,后面会用到。
showmasterstatus;
changemastertomaster_host='主服务器',master_user='MysqL用户名',master_password='MysqL服务密码',master_log_file='File值',master_log_pos=Postion值; 我们需要些对方的服务器IP地址 changemastertomaster_host='',master_user='root',master_password='123456',master_log_file='MysqL-',master_log_pos=245; 里面填写的信息是是在主服务器上执行showmasterstatus;的信息
添加防火墙端口
firewall-cmd--add-port='3306/tcp'--permanent
启动slave slavestart;
主主同步配置完毕,查看同步状态Slave_IO和Slave_sql是YES说明主主同步成功。
showslavestatus\G;
我们也需要同时在第二台服务器上执行上面的所有操作。
我们在第二台服务器上也安装完成
我们同样查看版本
rpm-qa|grepmariadb
然后启动数据库
systemctlstartmariadb systemctlenablemariadb
接着运行MysqL_secure_installation配置MariaDB MysqL_secure_installation
接下来我们同样登陆到MysqL服务
MysqL-uroot-p123456 showdatabases;
createdatabasesDB1; showdatabases;
useDB; showtables;
创建一个表及插入数据
CREATETABLEinfo(idint(30)NOTNULL,'ls@');
showtables; select*frominfo
我们可以根据自己的配置设置运行那些主机及用户进行MysqL的连接;
如果我们需要配置任何主机都可以连接的话,可以使用一下命令
GRANTALLPRIVILEGESON*.*TO'root'@'%'IDENTIFIEDBY'123456'WITHGRANTOPTION; flushprivileges;
vim/etc/ 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#忽略所有复制产生的错误
保存退出: 我们需要些对方的ip地址
changemastertomaster_host='',master_log_pos=245;
添加防火墙端口
firewall-cmd--add-port='3306/tcp'--permanent
启动slave slavestart;
主主同步配置完毕,查看同步状态Slave_IO和Slave_sql是YES说明主主同步成功。
showslavestatus\G; Slave_IO_Running:Yes Slave_sql_Running:Yes
接下来我们测试一下
我们在第一台Mariadb的数据库表中插入一条数据,然后在第二台服务器上进行查看,是否会同步;
因为我们在配置的时候指定了DB这个数据库才会同步,所以我们需要在DB数据库中插入数据
我们当前数据库表中的数据只有一条
接下来我们插入一条数据;
insertintoinfo(id,name,mail)values('1','ll','girl','ll@');
插入完成后,我们在第二台服务器上进行查看;
我们查看到数据是已经同步了;
我们接下来在第二台服务器上进行插入一条数据,看看第一台服务器是否会同步;
insertintoinfo(id,mail)values('2','zs','zs@');
接着我们在第一台服务器上进行查看
数据已经同步过来了
配置keepalived实现热备
我们首先在第一台服务器上进行安装
yuminstall-ykeepalived
我们首先备份一下默认的配置文件;
cp/etc/keepalived//etc/keepalived/
我们查看默认配置
[root@db01keepalived]#vim !ConfigurationFileforkeepalived global_defs{ notification_email{ acassen@ failover@ sysadmin@ } notification_email_from@ smtp_server smtp_connect_timeout30 router_idLVS_DEVEL } vrrp_instanceVI_1{ stateMASTER interfaceeth0 virtual_router_id51 priority100 advert_int1 authentication{ auth_typePASS auth_pass1111 } virtual_ipaddress{ } } virtual_server443{ delay_loop6 lb_algorr lb_kindNAT nat_mask persistence_timeout50 protocolTCP real_server443{ weight1 SSL_GET{ url{ path/ digestff20ad2481f97b1754ef3e12ecd3a9cc } url{ path/mrtg/ digest9b3a0c85a887a256d6939da88aabd8cd } connect_timeout3 nb_get_retry3 delay_before_retry3 } } } virtual_server1358{ delay_loop6 lb_algorr lb_kindNAT persistence_timeout50 protocolTCP sorry_server1358 real_server1358{ weight1 HTTP_GET{ url{ path/testurl/ digest640205b7b0fc66c1ea91c463fac6334d } url{ path/testurl2/ digest640205b7b0fc66c1ea91c463fac6334d } url{ path/testurl3/ digest640205b7b0fc66c1ea91c463fac6334d } connect_timeout3 nb_get_retry3 delay_before_retry3 } } real_server1358{ weight1 HTTP_GET{ url{ path/testurl/ digest640205b7b0fc66c1ea91c463fac6334c } url{ path/testurl2/ digest640205b7b0fc66c1ea91c463fac6334c } connect_timeout3 nb_get_retry3 delay_before_retry3 } } } virtual_server1358{ delay_loop3 lb_algorr lb_kindNAT nat_mask persistence_timeout50 protocolTCP real_server1358{ weight1 HTTP_GET{ url{ path/testurl/ digest640205b7b0fc66c1ea91c463fac6334d } url{ path/testurl2/ digest640205b7b0fc66c1ea91c463fac6334d } url{ path/testurl3/ digest640205b7b0fc66c1ea91c463fac6334d } connect_timeout3 nb_get_retry3 delay_before_retry3 } } real_server1358{ weight1 HTTP_GET{ url{ path/testurl/ digest640205b7b0fc66c1ea91c463fac6334d } url{ path/testurl2/ digest640205b7b0fc66c1ea91c463fac6334d } url{ path/testurl3/ digest640205b7b0fc66c1ea91c463fac6334d } connect_timeout3 nb_get_retry3 delay_before_retry3 } } }
echo>/etc/keepalived/
然后粘贴以下内容
global_defs{ notification_email{ gavin@#定义通知邮箱,有多个可以换行添加 } notification_email_fromadmin@#定义发送邮件的邮箱 smtp_server#定义发件服务器 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{ } } virtual_server3306{ delay_loop2 lb_algorr#LVS算法,用不到,我们就关闭了 lb_kindDR#LVS模式,如果不关闭,备用服务器不能通过VIP连接主MysqL persistence_timeout50#同一IP的连接60秒内被分配到同一台真实服务器 protocolTCP real_server3306{#检测本地MysqL,backup也要写检测本地MysqL weight3 notify_down/DATA/shell/#当mysq服down时,执行此脚本,杀死keepalived实现切换 TCP_CHECK{ connect_timeout3#连接超时 nb_get_retry3#重试次数 delay_before_retry3#重试间隔时间 } }
我们启动keepalived服务
systemctlstartkeepalived systemctlenablekeepalived
接下来我们在DATA目录下创建shell目录添加脚本
cd/DATA mkdirshell vim pkillkeepalived chmoda+x
接着我们查看keepalived的网卡监听状态,虚拟IP已经监听
我们同样在第二台服务器上也安装keepalived
yuminstall-ykeepalived
我们首先备份一下默认的配置文件;
cp/etc/keepalived//etc/keepalived/
然后将第一台服务器上的keepalived拷贝到第二台服务器上的keepalived路劲下替换文件
scp/etc/keepalived/root@:/etc/keepalived/
然后我们将第一台服务器下的拷贝到第二台对应的路劲
scp/DATA/shell/root@:/DATA/shell/
然后,我们要修改第二台服务器的文件,因为刚才拷贝过来的数据需要修改
vim/etc/keepalived/
我们需要修改realserver的地址,指向本地,然后修改weight权重值,我们备服务器修改成50
global_defs{ notification_email{ gavin@#定义通知邮箱,有多个可以换行添加 } notification_email_fromadmin@#定义发送邮件的邮箱 smtp_server#定义发件服务器 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{ } } virtual_server3306{ delay_loop2 lb_algorr#LVS算法,用不到,我们就关闭了 lb_kindDR#LVS模式,如果不关闭,备用服务器不能通过VIP连接主MysqL persistence_timeout50#同一IP的连接60秒内被分配到同一台真实服务器 protocolTCP real_server3306{#检测本地MysqL,backup也要写检测本地MysqL weight3 notify_down/DATA/shell/#当mysq服down时,执行此脚本,杀死keepalived实现切换 TCP_CHECK{ connect_timeout3#连接超时 nb_get_retry3#重试次数 delay_before_retry3#重试间隔时间 } }
保存退出后,我们启动keepalived服务
systemctlenablekeepalived systemctlstartkeepalived
我们第二台服务器的网卡监听状态,虚拟地址都 已经监听了
接下来我们需要在两台服务器上ping一下虚拟ip地址是否通
ping
我们找了一台windows机器进行测试
然后使用myslq连接工具进行测试,测试通过
我们查看连接后所有的数据信息都可以看见
接下来我们将第一台服务器服务停止。
systemctlstopkeepalived systemctlstopmariadb
客户端还是可以继续使用。
接下来我们使用客户端插入一条数据
insertintoinf(id,mail)values('3','gavin','gavin@')
我们查看插入的数据
我们在第二台服务器上查看数据
select*frominfo
接下来我们将第一台服务器的mariadb和keepalived服务启动起来,然后再查看数据
systemctlstartmariadb systemctlstartkeepalived
查看第一台的数据也会自动同步
select*frominfo;原文链接:/centos/378977.html