我们前面几篇文章中有介绍了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: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安装服务提供支持需要执行以下命令:
1
2
3
4
5
|
cd
/etc/yum
.repo
vim epel.repo
添加以下内容
[epel] name=aliyun epel baseurl=http:
//mirrors
.aliyun.com
/epel/7Server/x86_64/
gpgcheck=0
|
我们查看定义的源
运行yum install MariaDB-server MariaDB-client命令安装 MariaDB
1
|
yum
install
mariadb-server mariadb-client mysql
|
安装完成后, 我们通过rpm查看安装的相关信息
1
|
rpm -qa |
grep
mariadb
|
然后启动数据库
1
2
|
systemctl start mariadb
systemctl
enable
mariadb
|
接着运行 mysql_secure_installation配置MariaDB
1
|
mysql_secure_installation
|
配置完成后,我们进入数据库
1
2
|
mysql –uroot –p
show databases;
|
接下来我们创建一个数据库及表单信息
1
2
|
create databases DB1;
show databases;
|
1
2
|
use DB1;
show tables;
|
1
2
3
|
创建一个表
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'
);
|
1
|
show tables;
|
我们可以根据自己的配置设置运行那些主机及用户进行mysql的连接;
如果我们需要配置任何主机都可以连接的话,可以使用一下命令
1
2
3
4
5
|
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;
|
接下来我们修改默认的mysql配置文件
1
2
3
4
5
6
7
8
|
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
#忽略所有复制产生的错误
|
保存退出;先查看下log bin日志和pos值位置
注意:这里记住File的值:mysql-bin.000001和Position的值:245,后面会用到。
1
|
show master status;
|
1
2
3
4
|
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;的信息
|
添加防火墙端口
1
|
firewall-cmd --add-port=
'3306/tcp'
--permanent
|
1
2
|
启动slave
slave start;
|
主主同步配置完毕,查看同步状态Slave_IO和Slave_SQL是YES说明主主同步成功。
1
|
show slave status\G;
|
我们也需要同时在第二台服务器上执行上面的所有操作。
我们在第二台服务器上也安装完成
我们同样查看版本
1
|
rpm -qa |
grep
mariadb
|
然后启动数据库
1
2
|
systemctl start mariadb
systemctl
enable
mariadb
|
1
2
|
接着运行 mysql_secure_installation配置MariaDB
mysql_secure_installation
|
接下来我们同样登陆到mysql服务
1
2
|
mysql -uroot -p123456
show databases;
|
1
2
|
create databases DB1;
show databases;
|
1
2
|
use DB;
show tables;
|
创建一个表及插入数据
1
2
|
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'
);
|
1
2
|
show tables;
select
* from info
|
我们可以根据自己的配置设置运行那些主机及用户进行mysql的连接;
如果我们需要配置任何主机都可以连接的话,可以使用一下命令
1
2
|
GRANT ALL PRIVILEGES ON *.* TO
'root'
@
'%'
IDENTIFIED BY
'123456'
WITH GRANT OPTION;
flush privileges;
|
接下来我们修改默认的mysql配置文件
1
2
3
4
5
6
7
8
|
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
#忽略所有复制产生的错误
|
保存退出: 我们需要些对方的ip地址192.168.5.53
1
|
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;
|
添加防火墙端口
1
|
firewall-cmd --add-port=
'3306/tcp'
--permanent
|
1
2
|
启动slave
slave start;
|
主主同步配置完毕,查看同步状态Slave_IO和Slave_SQL是YES说明主主同步成功。
1
2
3
|
show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
|
接下来我们测试一下
我们在第一台Mariadb的数据库表中插入一条数据,然后在第二台服务器上进行查看,是否会同步;
因为我们在配置的时候指定了DB这个数据库才会同步,所以我们需要在DB数据库中插入数据
我们当前数据库表中的数据只有一条
接下来我们插入一条数据;
1
|
insert into info(
id
,name,sex,mail) values(
'1'
,
'll'
,
'girl'
,
'll@abc.com'
);
|
插入完成后,我们在第二台服务器上进行查看;
我们查看到数据是已经同步了;
我们接下来在第二台服务器上进行插入一条数据,看看第一台服务器是否会同步;
1
|
insert into info(
id
,name,sex,mail) values(
'2'
,
'zs'
,
'boy'
,
'zs@abc.com'
);
|
接着我们在第一台服务器上进行查看
数据已经同步过来了
配置keepalived实现热备
我们首先在第一台服务器上进行安装
1
|
yum
install
-y keepalived
|
我们首先备份一下默认的配置文件;
1
|
cp
/etc/keepalived/keepalived
.conf
/etc/keepalived/keepalived
.conf.bak
|
我们查看默认配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
[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
|