rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景 1

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景

话不多说,直接开搞

ip 服务
172.72.0.116 keepalived+haproxy+mysql
172.72.0.137 keepalived+haproxy+mysql
172.72.0.100 VIP

部署前,大家先要确认集群之间的时间是否一致,集群类的服务,最怕时间不一致

部署 mysql

部署相关的操作,两台机器都需要执行,需要执行指定机器时,会额外提示

关闭防火墙

systemctl disable firewalld --now

关闭 selinux

setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config

创建相关目录

mkdir -p /data/{software,mysql/{config,logs},script,mysql-back}

创建完成后的目录结构如下

/data/
├── mysql
│   ├── config
│   ├── logs
│   ├── mysql_data
├── mysql-back
├── script
└── software

解压下载好的二进制文件

tar xf mysql-5.7.29-linux-glibc2.12-x86_64.tar.gz

创建 mysql 用户

useradd mysql
# 配置用户密码
echo mysqldba | passwd --stdin mysql

给对应的目录和文件修改权限

chown -R mysql /data/software/mysql-5.7.29-linux-glibc2.12-x86_64
chown -R mysql /data/mysql
chown -R mysql /data/mysql-back

配置 PATH 变量

echo 'MYSQL_HOME="/data/software/mysql-5.7.29-linux-glibc2.12-x86_64"' >> /etc/profile
echo 'PATH=${PATH}:${MYSQL_HOME}/bin' >> /etc/profile
source /etc/profile

验证 mysql 命令

查看是否缺少依赖库

ldd /data/software/mysql-5.7.29-linux-glibc2.12-x86_64/bin/mysql

例如我这边缺了俩依赖

        linux-vdso.so.1 (0x00007ffe91b5a000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f495203f000)
        librt.so.1 => /lib64/librt.so.1 (0x00007f4951e37000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f4951c33000)
        libncurses.so.5 => not found
        libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f495189e000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f495151c000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f4951304000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f4950f3e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f495225f000)
        libtinfo.so.5 => not found

找一下是否有高版本的依赖

find / -type f -name "libncurses.so*"

尝试用软连接

ln -s /usr/lib64/libncurses.so.6.1 /usr/lib64/libncurses.so.5

再次使用上面的 ldd 命令去检查依赖,发现不是 not found 了,用这个办法,再去解决剩下的依赖缺失

验证 mysql 命令能不能正常使用

mysql -V

可以获取到当前的 mysql 客户端版本

mysql  Ver 14.14 Distrib 5.7.29, for linux-glibc2.12 (x86_64) using  EditLine wrapper

切换到 mysql 用户

后续的操作都使用 mysql 用户

su - mysql

在 172.72.0.116 生成配置文件

cat << EOF > /data/mysql/config/my.cnf
[mysqld]
pid-file=/data/mysql/mysqld.pid
socket=/data/mysql/mysqld.sock
datadir=/data/mysql/mysql_data
log-error=/data/mysql/logs/error.log
port=13306
# MySQL 在运行时需要 errmsg.sys 文件来显示和报告错误消息
lc-messages-dir=/data/software/mysql-5.7.29-linux-glibc2.12-x86_64/share/english
server_id=116
# binlog
# binlog 文件的名称
log_bin=mysql-bin
# 设置每个二进制日志文件的最大大小
max_binlog_size=100m
# 设置用于缓存二进制日志事件的缓冲区大小
binlog_cache_size=4m
# 设置 binlog 缓存的最大大小
max_binlog_cache_size=512m
# binlog 类型
binlog_format=MIXED
# binlog 过期时间
expire_logs_days=7
bind-address=0.0.0.0
# 是否允许在数据库目录下使用符号链接
## symbolic-links=0:表示不允许使用符号链接。如果设置为 0,MySQL 服务器在启动时将不会使用数据库目录下的符号链接,并且可能会在符号链接存在时报错。
## symbolic-links=1:表示允许使用符号链接。如果设置为 1,MySQL 服务器在启动时将允许使用数据库目录下的符号链接,但仅限于特定目录或文件(根据权限设置)。
## symbolic-links=2:表示允许使用符号链接,且没有限制。如果设置为 2,MySQL 服务器在启动时将允许使用数据库目录下的任意符号链接,包括对任意文件或目录的链接。
symbolic-links=0
# mysql 最大连接数
max_connections=1000
# 默认存储引擎
default_storage_engine=innodb
# 禁用外部锁定,MySQL 将使用内部锁定来代替外部锁定
skip_external_locking
# 0:表名存储为原始大小写,区分大小写;
# 1:表名存储为小写,不区分大小写;
# 2:表名存储为小写,但会在文件系统上进行名称比较,因此会区分大小写。
lower_case_table_names=1
# 禁用主机缓存,每次都要重新解析域名
skip_host_cache
# 开启主机名解析
skip_name_resolve
# 设置服务器的默认字符集
character_set_server=utf8
# 客户端与服务器之间允许的最大数据包大小
max_allowed_packet=12M
# 控制 SQL 的执行模式
## STRICT_TRANS_TABLES:启用严格模式,对于事务表,如果有非法数据插入或更新,将会引发错误
## NO_ZERO_IN_DATE:禁止在日期中使用 "0000-00-00" 这样的零值,否则会被转换为 NULL 值
## ERROR_FOR_DIVISION_BY_ZERO:当除零错误发生时,产生错误而不是返回 NULL 值
## NO_AUTO_CREATE_USER:禁止 GRANT 语句自动创建新用户,必须手动创建
## NO_ENGINE_SUBSTITUTION:如果指定的存储引擎不可用或不存在,不要自动替换为其他可用的存储引擎,而应该返回错误
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
[client]
# 设置 MySQL 客户端连接的默认字符集
character-set-client=utf8
EOF

在 172.72.0.137 生成配置文件

cat << EOF > /data/mysql/config/my.cnf
[mysqld]
pid-file=/data/mysql/mysqld.pid
socket=/data/mysql/mysqld.sock
datadir=/data/mysql/mysql_data
log-error=/data/mysql/logs/error.log
port=13306
# MySQL 在运行时需要 errmsg.sys 文件来显示和报告错误消息
lc-messages-dir=/data/software/mysql-5.7.29-linux-glibc2.12-x86_64/share/english
server_id=137
# binlog
# binlog 文件的名称
log_bin=mysql-bin
# 设置每个二进制日志文件的最大大小
max_binlog_size=100m
# 设置用于缓存二进制日志事件的缓冲区大小
binlog_cache_size=4m
# 设置 binlog 缓存的最大大小
max_binlog_cache_size=512m
# binlog 类型
binlog_format=MIXED
# binlog 过期时间
expire_logs_days=7
bind-address=0.0.0.0
# 是否允许在数据库目录下使用符号链接
## symbolic-links=0:表示不允许使用符号链接。如果设置为 0,MySQL 服务器在启动时将不会使用数据库目录下的符号链接,并且可能会在符号链接存在时报错。
## symbolic-links=1:表示允许使用符号链接。如果设置为 1,MySQL 服务器在启动时将允许使用数据库目录下的符号链接,但仅限于特定目录或文件(根据权限设置)。
## symbolic-links=2:表示允许使用符号链接,且没有限制。如果设置为 2,MySQL 服务器在启动时将允许使用数据库目录下的任意符号链接,包括对任意文件或目录的链接。
symbolic-links=0
# mysql 最大连接数
max_connections=1000
# 默认存储引擎
default_storage_engine=innodb
# 禁用外部锁定,MySQL 将使用内部锁定来代替外部锁定
skip_external_locking
# 0:表名存储为原始大小写,区分大小写;
# 1:表名存储为小写,不区分大小写;
# 2:表名存储为小写,但会在文件系统上进行名称比较,因此会区分大小写。
lower_case_table_names=1
# 禁用主机缓存,每次都要重新解析域名
skip_host_cache
# 开启主机名解析
skip_name_resolve
# 设置服务器的默认字符集
character_set_server=utf8
# 客户端与服务器之间允许的最大数据包大小
max_allowed_packet=12M
# 控制 SQL 的执行模式
## STRICT_TRANS_TABLES:启用严格模式,对于事务表,如果有非法数据插入或更新,将会引发错误
## NO_ZERO_IN_DATE:禁止在日期中使用 "0000-00-00" 这样的零值,否则会被转换为 NULL 值
## ERROR_FOR_DIVISION_BY_ZERO:当除零错误发生时,产生错误而不是返回 NULL 值
## NO_AUTO_CREATE_USER:禁止 GRANT 语句自动创建新用户,必须手动创建
## NO_ENGINE_SUBSTITUTION:如果指定的存储引擎不可用或不存在,不要自动替换为其他可用的存储引擎,而应该返回错误
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
[client]
# 设置 MySQL 客户端连接的默认字符集
character-set-client=utf8
EOF

mysql 初始化

mysqld --initialize-insecure \
--user=mysql \
--basedir=${MYSQL_HOME} \
--datadir=/data/mysql/mysql_data

启动 mysql 服务

${MYSQL_HOME}/bin/mysqld \
--defaults-file=/data/mysql/config/my.cnf --daemonize \
--plugin-dir=${MYSQL_HOME}/lib/plugin

修改 mysql 的 root 用户密码

进入 mysql,初始化的时候没有设定密码,直接回车就可以了

mysql -uroot -p -S /data/mysql/mysqld.sock

修改密码

SET PASSWORD FOR root@localhost = PASSWORD ('YWJjMTIzCg==');

配置主从关系

以下的配置,都是基于新部署的数据库实现的,如果当前数据库本身存在数据的情况下,需要先把 master 的数据备份,然后在 slave 节点上恢复数据后,再进行主从配置

172.72.0.137 配置成 172.72.0.116 的从库

在 172.72.0.116 的 mysql 里面操作,创建一个从复制专用的用户

CREATE USER 'rpldb'@'%' IDENTIFIED BY 'cnBsZGIwMDcK';
GRANT REPLICATION SLAVE ON *.* TO 'rpldb'@'%';

查看 binlog 的文件名称和 Position 信息

SHOW MASTER STATUS\G

获取到类似如下的信息

*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 841
     Binlog_Do_DB:
 Binlog_Ignore_DB: sys,mysql,performance_schema,information_schema
Executed_Gtid_Set:
1 row in set (0.00 sec)

在 172.72.0.137 的 mysql 里面操作

CHANGE MASTER TO MASTER_HOST='172.72.0.116', MASTER_PORT=13306, MASTER_USER='rpldb', MASTER_PASSWORD='cnBsZGIwMDcK', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=841;

启动复制

STOP SLAVE;
START SLAVE;

查看复制是否成功

SHOW SLAVE STATUS\G

看到这两个都是 yes,表示主从复制已经建立成功了

Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
172.72.0.116 配置成 172.72.0.137 的从库

在 172.72.0.137 的 mysql 里面操作,创建一个从复制专用的用户

CREATE USER 'rpldb'@'%' IDENTIFIED BY 'cnBsZGIwMDcK';
GRANT REPLICATION SLAVE ON *.* TO 'rpldb'@'%';

查看 binlog 的文件名称和 Position 信息

SHOW MASTER STATUS\G

获取到类似如下的信息

*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 841
     Binlog_Do_DB:
 Binlog_Ignore_DB: sys,mysql,performance_schema,information_schema
Executed_Gtid_Set:
1 row in set (0.00 sec)

在 172.72.0.116 的 mysql 里面操作

CHANGE MASTER TO MASTER_HOST='172.72.0.137', MASTER_PORT=13306, MASTER_USER='rpldb', MASTER_PASSWORD='cnBsZGIwMDcK', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=841;

启动复制

STOP SLAVE;
START SLAVE;

查看复制是否成功

SHOW SLAVE STATUS\G

看到这两个都是 yes,表示主从复制已经建立成功了

Slave_IO_Running: Yes
            Slave_SQL_Running: Yes


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8天前
|
存储 关系型数据库 MySQL
MySQL在企业内部应用场景有哪些
【10月更文挑战第17天】MySQL在企业内部应用场景有哪些
18 0
|
8天前
|
存储 关系型数据库 MySQL
介绍一下MySQL的一些应用场景
【10月更文挑战第17天】介绍一下MySQL的一些应用场景
42 0
|
2月前
|
关系型数据库 MySQL 数据安全/隐私保护
docker应用部署---MySQL的部署配置
这篇文章介绍了如何使用Docker部署MySQL数据库,包括搜索和拉取MySQL镜像、创建容器并设置端口映射和目录映射、进入容器操作MySQL,以及如何使用外部机器连接容器中的MySQL。
docker应用部署---MySQL的部署配置
|
2月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
288 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
24天前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
【10月更文挑战第1天】使用Docker部署的MySQL数据库,数据表里的中文读取之后变成问号,如何处理?
50 3
|
24天前
|
关系型数据库 MySQL 数据库
使用Docker部署的MySQL数据库如何设置忽略表名大小写?
【10月更文挑战第1天】使用Docker部署的MySQL数据库如何设置忽略表名大小写?
64 1
|
2月前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
23天前
|
存储 关系型数据库 MySQL
【MySQL精装典藏版】MySQL的安装与部署
【MySQL精装典藏版】MySQL的安装与部署
45 0
|
24天前
|
关系型数据库 MySQL 数据库
如何使用Docker部署MySQL数据库?
【10月更文挑战第1天】如何使用Docker部署MySQL数据库?
131 0
|
25天前
|
容灾 Cloud Native 关系型数据库
实现MySQL异地多活场景
现代化互联网企业面临的最大威胁是意外导致的数据丢失或不可用。为应对这一挑战,企业通常采用“主从高可用”架构,但单一机房内的高可用仍存风险。真正的高可用需通过“跨机房容灾”或“异地容灾”实现。异地容灾将服务器部署在不同地域的机房中,确保一处受灾时,其他机房能迅速接管业务。更进一步的“异地多活”方案则让各节点同步处理业务流量,确保数据一致性,提高资源利用率。NineData 提供了实现这一方案的强大工具。
39 0