记录一个Keepalived+MySQL 双主高可用配置的配置过程。
系统环境准备
两台服务器IP:
10.17.55.201主要的
10.17.55.202次要的
两台系统版本均为 CentOS Linux release 7.4.1708 (Core)
MySQL官网上下载mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar,即适用于CentOS的MySQL 8.0.18
组件安装
CentOS可能带有默认的Mariadb,如果不想用的话可以执行rpm -qa|grep mariadb
找到所有安装包,然后依次执行rpm -r 每个文件名
卸载Mariadb。
然后从官网上下载相应的MySQL安装文件。
安装顺序为
1 | rpm -ivh mysql-community-common-5.7.17-1.el7.x86_64.rpm |
2 | rpm -ivh mysql-community-libs-5.7.17-1.el7.x86_64.rpm |
3 | rpm -ivh mysql-community-client-5.7.17-1.el7.x86_64.rpm |
4 | rpm -ivh mysql-community-server-5.7.17-1.el7.x86_64.rpm |
5 | rpm -ivh mysql-community-devel-5.7.17-1.el7.x86_64.rpm |
安装最后一个的时候有可能出现依赖openssl的问题,重新安装openssl无效,输入参数-e --nodeps
可以解决,暂不清楚原理
数据库配置
先从主备模式开始进行配置,方便排错。
主实例
修改配置文件/etc/my.cnf
1 | [mysqld] |
2 | log-bin=mysql-bin #日志名称 |
3 | server-id=1 #数据库id,两个实例不能一样 |
然后创建用户,用于数据同步,MySQL 8.0之后的用户创建方式和之前不一样
1 | CREATE USER 'repl'@'10.17.55.202' IDENTIFIED WITH mysql_native_password BY '1'; |
2 | GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.17.55.202'; |
然后刷新权限
1 | flush privileges; |
查看主节点的binary log文件名和位置:
1 | show master status; |
记录下来File
和Position
两个字段,下面要用。
备用实例
在从节点上设置参数:
1 | CHANGE MASTER TO MASTER_HOST='10.17.55.201',MASTER_USER='repl',MASTER_PASSWORD='1',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=1141; |
然后启动从节点start slave
,并且查看节点状态show slave status\G
如果看到节点的状态信息中包含一下的两条,证明连接成功。
1 | Slave_IO_State: Waiting for master to send event |
2 | Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates |
然后验证一下:
切换回主节点,新建一个数据库或者表,从节点中应该同步添加了。
双主环境
以上搭建的是MySQL主备模式,双主模式其实一样,只不过两者之间互为主备。
同样的,把之前的备用节点当做主节点,之前的主节点当做备用节点,再来一遍。不要忘记修改my.cnf
。
配置完成之后继续新建一个数据库或者表,测试是否同步。
Keepalived安装和配置
CentOS上直接可以用yum安装Keepalived,省了不少事情,不过可能遇到错误
1 | Error: Package: 1:net-snmp-agent-libs-5.7.2-43.el7.x86_64 (base) |
2 | Requires: libmysqlclient.so.18()(64bit) |
3 | Error: Package: 1:net-snmp-agent-libs-5.7.2-43.el7.x86_64 (base) |
4 | Requires: libmysqlclient.so.18(libmysqlclient_18)(64bit) |
安装MySQL安装包中的libs-compat
即可
然后对keepalived进行配置,最简配置如下:
主节点:
1 | ! Configuration File for keepalived |
2 | |
3 | global_defs { |
4 | router_id master |
5 | } |
6 | |
7 | vrrp_instance VI_1 { |
8 | state MASTER |
9 | interface eth1 |
10 | virtual_router_id 51 |
11 | priority 100 |
12 | advert_int 1 |
13 | unicast_src_ip 172.18.0.2 |
14 | unicast_peer { |
15 | 1172.18.0.3 |
16 | } |
17 | authentication { |
18 | auth_type PASS |
19 | auth_pass 1111 |
20 | } |
21 | virtual_ipaddress { |
22 | 172.18.0.10 |
23 | } |
24 | } |
从节点:
1 | ! Configuration File for keepalived |
2 | |
3 | global_defs { |
4 | router_id master |
5 | } |
6 | |
7 | vrrp_instance VI_1 { |
8 | state MASTER |
9 | interface eth1 |
10 | virtual_router_id 51 |
11 | priority 90 |
12 | advert_int 1 |
13 | unicast_src_ip 172.18.0.3 |
14 | unicast_peer { |
15 | 1172.18.0.2 |
16 | } |
17 | authentication { |
18 | auth_type PASS |
19 | auth_pass 1111 |
20 | } |
21 | virtual_ipaddress { |
22 | 172.18.0.10 |
23 | } |
24 | } |
主要有几点重要的地方,一个是router_id
不能一样,这个是区分每个实力上的标志。
然后state
可以都为master
,即按照权重来强占。
interface
填写的是网卡名称,这个要结合自己实际的网卡名。
virtual_router_id
在同一个网络环境下不可以重复,不然会出问题。
priority
是权重,按照这个值来确定主节点。
一般采用单播的形式,方便配置而且不影响其他服务,所以两个配置文件中的unicast_src_ip
和unicast_peer
是相反的。
virtual_ipaddress
填写需要使用的虚拟IP就可以了。
如果是在容器中创建虚拟IP,有可能遇到错误:
1 | IPVS: Can't initialize ipvs: Protocol not available |
开启的必要条件有两个:
- 容器放开权限,即添加参数
--privileged
- 宿主机同样需要开启
ipvasdm
测试
输入ip a
应该就可以看到虚拟ip出现在网络信息中。
没有这个命令的话通过yum install iproute
安装
附录
MySQL状态监测脚本
1 |
|
2 | pgrep -x mysqld &> /dev/null |
3 | if [ $? -ne 0 ] |
4 | then |
5 | echo "not running" |
6 | else |
7 | echo "running" |
8 | fi |