centos7上配置mysql8 keepalived
- 1. 环境准备
- 1.1 清掉系统原有MySQL
- 1.2 虚拟机环境
- 2. rpm 安装
- 3. 配置MySQL的主主结构
- 4. 配置Keepalived高可用
- 总结
参考:https://www.cnblogs.com/boboooo/p/13891447.html
1. 环境准备
1.1 清掉系统原有MySQL
代码语言:javascript复制rpm -qa | grep mariadb
rpm -e --nodeps xxx
rm -f /etc/my.cnf
1.2 虚拟机环境
MySQL采用主主结构,我们使用两台机器就够了,然后再这两台机器上再安装Keepalived,使用vrrp技术,虚拟出一个IP。两台机器如下:
代码语言:javascript复制# 发行版
[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
# IP
node1 192.168.11.111 MySQL(主1)、Keepalived(MASTER)
node2 192.168.11.112 MySQL(主2)、Keepalived(BACKUP)
192.168.11.150:虚IP
2. rpm 安装
下载地址 https://dev.mysql.com/downloads/repo/yum/
Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package | 25.4K | Download | |
---|---|---|---|
(mysql80-community-release-el7-3.noarch.rpm) | MD5: 893b55d5d885df5c4d4cf7c4f2f6c153 |
两台节点都执行以下操作
代码语言:javascript复制# 安装
rpm -ivh rpm -ivh mysql80-community-release-el7-3.noarch.rpm
yum install mysql-community-server
# 启动&配置自启动
systemctl start mysqld.service
systemctl enable mysqld.service
# 从MySQL的日志中 找到root账号的临时密码
grep 'temporary password' /var/log/mysqld.log
# 使用root账号登录 输入临时密码 登录成功
mysql -uroot -p
# 修改root账号的密码 使用MYSQL_NATIVE_PASSWORD的加密方式 这种方式大多数客户端都可以连接
ALTER USER 'root'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'Lft@2021';
# 创建MySQL账号
CREATE USER 'lft'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'Lft@6666';
# 对USER账号授权
GRANT ALL ON *.* TO 'lft'@'%';
# 刷新权限
FLUSH PRIVILEGES;
3. 配置MySQL的主主结构
首先,我们修改 node1(主1)上的my.cnf文件。
代码语言:javascript复制vim /etc/my.cnf
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# 配置server-id 每个MySQL实例的server-id都不能相同
server-id=1
# MySQL的日志文件的名字
log-bin=mysql_master
# 作为从库时 更新操作是否写入日志 on:写入 其他数据库以此数据库做主库时才能进行同步
log-slave-updates=on
# MySQL系统库的数据不需要同步 我们这里写了3个 更加保险
# 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user 数据还是会同步的
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
# 使用通配符忽略MySQL系统库的表 这样在create user时也不会进行同步了
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=sys.%
# MySQL系统库的日志不计入binlog 这样更加保险了
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
在 node2(主2)上也修改my.cnf文件,直接复制过去,只需修改其中两个地方,如下:
代码语言:javascript复制# 配置server-id=2
server-id=2
# MySQL的日志文件的名字 不改名字也可以 这里主要为了区分
log-bin=mysql_slave
配置文件修改好后,分别在 node1(主1)和 node2(主2)上重启MySQL服务,
代码语言:javascript复制systemctl restart mysqld
下面开始配置主从,其实主主模式就是配置两个主从,先配置 node1(主1)->node2(主2)的主从,然后再反过来配置 node2(主2)->node1(主1)的主从,这样主主的模式就配置好了。
我们先来配置 node1(主1)->node2(主2)的主从
先登录 node1(主1)的数据库,并执行如下命令:
代码语言:javascript复制# 创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密
CREATE USER 'repl_master'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'Lft@2021';
# 对repl_master授予备份的权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_master'@'%';
# 刷新权限
FLUSH PRIVILEGES;
# 查看MySQL主节点的状态
SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;
--------------------- ---------- -------------- ------------------------------------------------- -------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
--------------------- ---------- -------------- ------------------------------------------------- -------------------
| mysql_master.000001 | 840 | | information_schema,mysql,performance_schema,sys | |
--------------------- ---------- -------------- ------------------------------------------------- -------------------
1 row in set (0.00 sec)
我们要记住binlog文件的名字,也就是 mysql_master.000001,和位置,也就是840。
然后,我们再登录到 node2(主2)的数据库,执行如下命令:
代码语言:javascript复制mysql> CHANGE MASTER TO
# MySQL主的IP
-> MASTER_HOST='node1',
# MySQL主的端口
-> MASTER_PORT=3306,
# MySQL主的备份账号
-> MASTER_USER='repl_master',
# MySQL主的备份账号密码
-> MASTER_PASSWORD='password',
# 日志文件 通过show master status得到的
-> MASTER_LOG_FILE='mysql_master.000001',
# 日志文件位置 通过show master status得到的
-> MASTER_LOG_POS=516;
CHANGE MASTER TO
MASTER_HOST='node1',
MASTER_PORT=3306,
MASTER_USER='repl_master',
MASTER_PASSWORD='Lft@2021',
MASTER_LOG_FILE='mysql_master.000001',
MASTER_LOG_POS=840;
# 开启从库
START SLAVE;
# 查看从库的状态
SHOW SLAVE STATUS;
这样,node1(主1)->node2(主2)的主从就搭建好了。
然后,再反过来,搭建 node2(主2)->node1(主1)的主从。
先登录 node2(主2)的数据库,执行如下命令:
代码语言:javascript复制# 创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密
CREATE USER 'repl_slave'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'Lft@2021';
# 对repl_slave授予备份的权限
GRANT REPLICATION SLAVE ON *.* TO 'repl_slave'@'%';
# 刷新权限
FLUSH PRIVILEGES;
# 查看MySQL主节点的状态
SHOW MASTER STATUS;
mysql> SHOW MASTER STATUS;
-------------------- ---------- -------------- ------------------------------------------------- -------------------
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
-------------------- ---------- -------------- ------------------------------------------------- -------------------
| mysql_slave.000001 | 838 | | information_schema,mysql,performance_schema,sys | |
-------------------- ---------- -------------- ------------------------------------------------- -------------------
1 row in set (0.00 sec)
再登录到 node1(主1)的数据库,执行如下命令:
代码语言:javascript复制mysql> CHANGE MASTER TO
# MySQL主的IP
-> MASTER_HOST='node2',
# MySQL主的端口
-> MASTER_PORT=3306
# MySQL主的备份账号
-> MASTER_USER='repl_slave',
# MySQL主的备份账号密码
-> MASTER_PASSWORD='password',
# 日志文件 通过show master status得到的
-> MASTER_LOG_FILE='mysql_slave.000001',
# 日志文件位置 通过show master status得到的
-> MASTER_LOG_POS=379;
CHANGE MASTER TO
MASTER_HOST='node2',
MASTER_PORT=3306,
MASTER_USER='repl_slave',
MASTER_PASSWORD='Lft@2021',
MASTER_LOG_FILE='mysql_slave.000001',
MASTER_LOG_POS=838;
# 开启从库
START SLAVE;
# 查看从库的状态
SHOW SLAVE STATUS;
至此,node2(主2)->node1(主1)的主从也搭建好了。
使用 Navicat/SQLyog 分别连接 node1(主1)和 node2(主2),并执行建表、插入等语句,验证一下主主同步是否成功。
4. 配置Keepalived高可用
MySQL主主结构已经搭建好了,无论从哪个MySQL插入数据,都会同步到另外一个MySQL。虽然有了MySQL主主结构,但是不能保证高可用,比如,我们的应用程序连接的是node1(主1),倘若node1(主1)的MySQL挂掉了,我们的应用程序并不能自动的切换到node2(主2),我们的应用程序也是不可用的状态。要做到这一点,就要借助于Keepalived。
Keepalived有两个主要的功能:
- 提供虚IP,实现双机热备
- 通过LVS,实现负载均衡
我们这里使用Keepalived,只需要使用其中的一个功能,提供虚IP,实现双机热备。我们需要在node1(主1)和node2(主2)上都安装Keepalived,执行命令如下:
代码语言:javascript复制yum install keepalived -y
我们直接使用yum进行安装。安装完之后,编辑keepalived的配置文件,首先编辑node1(主1)上的配置文件,如下:
代码语言:javascript复制vim /etc/keepalived/keepalived.conf# 全局配置 不用动 只需注释掉vrrp_strictglobal_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_skip_check_adv_addr #必须注释掉 否则报错 #vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0}# 检查mysql服务是否存活的脚本vrrp_script chk_mysql { script "/usr/bin/killall -0 mysqld"}# vrrp配置虚IPvrrp_instance VI_1 { # 状态:MASTER 另外一台机器为BACKUP state MASTER # 绑定的网卡 interface ens33 # 虚拟路由id 两台机器需保持一致 virtual_router_id 51 # 优先级 MASTER的值要大于BACKUP priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP地址 两台keepalived需要一致 virtual_ipaddress { 192.168.11.150 } # 检查脚本 vrrp_script的名字 track_script { chk_mysql }}###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的 这里用不到
再编辑node2(主2)上的配置文件,只需要将state MASTER改为state BACKUP,如下:
代码语言:javascript复制state BACKUP
通过keepalived的配置,我们对外提供 192.168.11.150 的IP,这个IP实际指向是node1(主1),因为它的state是MASTER。当keepalived检测到node1(主1)上的MySQL不可用时,会自动切换到node2(主2)。对于外部用户是无感知的,因为外部统一使用的是192.168.11.150。
我们再来看看检测的脚本/usr/bin/killall -0 mysqld,killall命令不是系统自带的,需要安装,我们还是使用yum来安装,如下:
代码语言:javascript复制# 先查询一下killallyum search killall#找到了psmisc.x86_64Loading mirror speeds from cached hostfile===============Matched: killall ================================psmisc.x86_64 : Utilities for managing processes on your system# 安装psmiscyum install psmisc.x86_64 -y[root@node1 keepalived]# ll /usr/bin/ | grep killall-rwxr-xr-x 1 root root 24720 Oct 1 2020 killall
这样我们就可以使用killall命令了。killall -0并不是杀掉进程,而是检查进程是否存在,如果存在则返回0,如果不存在则返回1。当返回1时,keepalived就会切换主备状态。
好了,killall也介绍完了,我们在两台机器上启动keepalived,如下:
代码语言:javascript复制# 启动keepalivedsystemctl start keepalived
然后,我们在node1(主1)上查看一下IP是否有192.168.11.150,如下:
代码语言:javascript复制ip addr
到这里,keepalived的配置就完成了,我们通过Navicat/SQLyog连接192.168.11.150,可以正常的连接数据库,实际上它连接的是node1的数据库,我们操作数据库也是正常的。
然后,我们停掉node1(主1)上的MySQL服务,
代码语言:javascript复制systemctl stop mysqld# 再用 ip addr查看一下ip addr
192.168.11.150的IP找不到了,我们再去node2(主2)上去查看,可以发现192.168.11.150的IP。我们在Navicat/SQLyog上操作数据库,是可以正常使用的。
但这时实际连接的是node2(主2)的数据库。我们是没有感知的。如果我们把node1(主1)上的mysql服务再启动起来,192.168.11.150还会切换到node1(主1)。
总结
我们通过MySQL主主结构 keepalived双机热备实现了MySQL的高可用,我们应用程序可以连接虚IP,具体连接的实际MySQL,不需要我们关心。如果我们再做读写分离的话,可以将MySQL(主2)作为主,配置数据库的主从关系。这时,虚IP连接的是MySQL(主1),MySQL(主1)将数据同步到MySQL(主2),然后MySQL(主2)再将数据同步到其他从库。如果MySQL(主1)挂掉,虚IP指向MySQL(主2),MySQL(主2)再将数据同步到其他从库。