目录
- 摘要
- mysql路由
- 组复制(MGR–MySQL Group Replication)单主模式配置
- mysql shell
- mysql router+keepalived 高可用
- MHA部署
- 准备工作
- 详细配置
- MHA部署
- MHA故障手动切换
- MHA故障自动切换
- Redis
- Redis安装
- redis主从复制
- redis高可用
- redis+哨兵模式(Sentinel)
- redis集群
摘要
本文详细介绍了在 CentOS 7 环境下构建高可用 MySQL 数据库及 Redis 缓存层的完整解决方案。主要内容包括:
通过分步实操演示,从环境准备、服务配置到故障模拟切换,完整呈现了企业级数据库高可用架构的搭建与验证过程。
关键词:MySQL 高可用,MGR,MySQL Router,MHA,Redis 集群
mysql路由
Mysql Router 部署 ·Router 通过读取元数据(来自MGR集群)自动感知节点角色,将写请求路由到主节点,读请求分发到从节点; ·使用 mysqlrouter –bootstrap 命令可自动生成配置文件,简化手工配置。
#mysql路由部署
rpm -ivh mysql-router-community-8.0.46-1.el7.x86_64.rpm
cd /etc/mysqlrouter/
vim mysqlrouter.conf

systemctl enable –now mysqlrouter.service
yum install -y mariadb
create user'lzc'@'%'identified by '654321';
mysql -h 192.168.88.146 -P 7001 -u lzc -p654321 –default-auth=mysql_native_password

子节点查看网络连接
yum install -y lsof
lsof -i :3306

组复制(MGR–MySQL Group Replication)单主模式配置
·server-id 必须全局唯一,gtid_mode=ON 和 enforce-gtid-consistency=ON 开启GTID,便于故障恢复;
·group_replication_group_name 使用UUID格式,集群内所有节点必须一致;
·group_replication_local_address 和 group_replication_group_seeds 分别定义本节点通信地址和集群成员列表;
·启动第一个节点时需临时开启 group_replication_bootstrap_group=ON,后续节点仅需执行 START GROUP_REPLICATION;
·注意检查防火墙/安全组放行 33061 端口(组复制内部通信)和 3306 端口。 
systemctl stop mysqld
rm -fr *
vim /etc/mysql/my.cnf
server1主节点
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
server-id=1
gtid_mode=ON
enforce-gtid-consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_replica_updates=ON
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "192.168.88.143:33061"
group_replication_group_seeds= "192.168.88.143:33061,192.168.88.144/:33061,192.168.88.145:33061"
group_replication_bootstrap_group=off
group_replication_ip_whitelist="192.168.88.0/24,127.0.0.1/8"
group_replication_single_primary_mode=ON;
group_replication_enforce_update_everywhere_checks=OFF;
mysqld –defaults-file=/etc/mysql/my.cnf –initialize
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
Query OK, 0 rows affected (0.00 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (2.09 sec)
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| group_replication_applier | 01e2c898–8c06–11f1–b570–000c292077de | server1 | 3306 | ONLINE | PRIMARY | 8.0.36 | XCom |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
1 row in set (0.03 sec)
server2 slave
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected, 1 warning (2.02 sec)
mysql> SELECT * FROM performance_schema.replication_group_members;
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
| group_replication_applier | 01e2c898–8c06–11f1–b570–000c292077de | server1 | 3306 | ONLINE | PRIMARY | 8.0.36 | XCom |
| group_replication_applier | cd3c8329–8c09–11f1–b547–000c294eca46 | server2 | 3306 | RECOVERING | SECONDARY | 8.0.36 | XCom |
+—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
2 rows in set (0.12 sec)
再添加一个slave,server3 server3与server2进行相同操作

mysql shell
server4-mysql router
yum install -y mysql-shell-8.0.46-1.el7.x86_64.rpm
mysqlsh icadmin@192.168.88.143:3306
server1–主节点
mysql> CREATE USER icadmin@'%' IDENTIFIED BY '654321';
Query OK, 0 rows affected (0.09 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO icadmin@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)
server4:路由器接管MGR集群
MySQL 192.168.88.143:3306 ssl JS > var cluster = dba.createCluster("mgr_single_cluster", {adoptFromGR:true, force:true});

#查看集群状态
cluster.status();

mysqlrouter –bootstrap icadmin@192.168.88.143:3306 –user=mysqlrouter
systemctl restart mysqlrouter.service

mysql router+keepalived 高可用
·在 server6 和 server7 上部署 Keepalived,通过 VRRP 虚拟出一个 IP(192.168.88.100),并配置 LVS 将流量分发至两台Router(server4, server5);master:server6
·lb_algo wrr 采用加权轮询调度,persistence_timeout 保持用户会话粘性;
·通过 TCP_CHECK 检测后端Router服务的存活状态,实现自动剔除故障节点。
部署另一台路由器 
yum install -y keepalived
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.88.100
}
}
virtual_server 192.168.88.100 6446 {
delay_loop 3
lb_algo wrr
lb_kind DR
persistence_timeout 300
protocol TCP
real_server 192.168.88.146 6446 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6446
}
}
real_server 192.168.88.147 6446 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6446
}
}
virtual_server 192.168.88.100 6447 {
delay_loop 3
lb_algo wrr
lb_kind DR
persistence_timeout 300
protocol TCP
real_server 192.168.88.146 6447 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6447
}
}
real_server 192.168.88.147 6447 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6447
}
}
}
}
backup:server7
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 90 #权重比master小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.88.100
}
}
virtual_server 192.168.88.100 6446 {
delay_loop 3
lb_algo wrr
lb_kind DR
persistence_timeout 300
protocol TCP
real_server 192.168.88.146 6446 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6446
}
}
real_server 192.168.88.147 6446 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6446
}
}
virtual_server 192.168.88.100 6447 {
delay_loop 3
lb_algo wrr
lb_kind DR
persistence_timeout 300
protocol TCP
real_server 192.168.88.146 6447 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6447
}
}
real_server 192.168.88.147 6447 {
weight 1
TCP_CHECK {
connect_timeout 3
connect_port 6447
}
}
}
MHA部署
准备工作
·在 server1、server2、server3 上配置一主两从异步复制,均开启GTID,简化位置管理;
·创建用于复制的专用用户 repl 和 MHA管理用户 root(需具备管理权限);
·所有节点需配置SSH免密登录,MHA依赖SSH进行日志传输和故障切换。
详细配置
primary
systemctl stop mysqld
[root@server1 mysql]# cd /data/mysql
[root@server1 mysql]# rm -fr *
[root@server1 mysql]# vim /etc/mysql/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
log-bin=mysql-bin
port=3306
user=mysql
pid-file=/data/mysql/mysql.pid
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
log-error=/data/mysql/mysql-error.log
innodb_buffer_pool_size=1G
max_connections=1000
default_authentication_plugin=mysql_native_password
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
log_bin=binlog
[client]
socket=/data/mysql/mysql.sock
[root@server1 mysql]# mysqld –defaults-file=/etc/mysql/my.cnf –initialize
[root@server1 mysql]# systemctl start mysqld
mysql> alter user root@localhost identified by ‘654321’; Query OK, 0 rows affected (0.01 sec)
mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '654321';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql> show master status;
+—————+———-+————–+——————+——————————————+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+—————+———-+————–+——————+——————————————+
| binlog.000002 | 950 | | | 30a2d7e4–8e7c–11f1–863a–000c292077de:1–3 |
+—————+———-+————–+——————+——————————————+
1 row in set (0.00 sec)
slave
systemctl stop mysqld
cd /data/mysql
rm -fr *
vim /etc/mysql/my.cnf
mysqld –defaults-file=/etc/mysql/my.cnf –initialize
grep 'temporary password' /data/mysql/mysql-error.log
mysql> alter user root@localhost identified by '654321';
Query OK, 0 rows affected (0.03 sec)
mysql> change master to master_host='192.168.36.173', master_user='repl', master_password='654321', master_auto_position=1;
Query OK, 0 rows affected, 7 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> show slave status\\G;

mysql> create database westos;
Query OK, 1 row affected (0.02 sec)
mysql> use westos
Database changed
mysql> create table user_tb (username varchar(25) not null,
–> password varchar(50) not null);
Query OK, 0 rows affected (0.08 sec)
mysql> insert into user_tb values ('user1','111');
Query OK, 1 row affected (0.21 sec)
mysql> insert into user_tb values ('user2','222');
Query OK, 1 row affected (0.01 sec)
mysql> select * from westos.user_tb;

MHA部署
server4
systemctl stop mysqlrouter.service
ssh-keygen
ssh-copy-id server4
scp -r .ssh/ server1:
scp -r .ssh/ server2:
scp -r .ssh/ server3:
yum install -y ha4mysql-node-0.58-0.el7.centos.noarch.rpm
#若果安装失败,添加epel源
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
#集群安装客户端软件
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:
mkdir /etc/masterha
cd /etc/masterha
vim /etc/masterha/app1.cnf
[server default]
user=root
password=654321
ssh_user=root
repl_user=repl
repl_password=654321
master_binlog_dir=/data/mysql
remote_workdir=/tmp
secondary_check_script= masterha_secondary_check -s 192.168.88.144 -s 192.168.88.145
ping_interval=3
manager_workdir=/etc/masterha/app1
manager_log=/etc/masterha/app1/manager.log
[server1]
hostname=192.168.88.143
candidate_master=1
check_repl_delay=0
[server2]
hostname=192.168.88.144
no_master=1
[server3]
hostname=192.168.88.145
candidate_master=1
check_repl_delay=0
检查免密连接
masterha_check_ssh –conf=/etc/masterha/app1.cnf
检查集群
masterha_check_repl –conf=/etc/masterha/app1.cnf

MHA故障手动切换

MHA故障自动切换
·监控进程 masterha_manager 定期通过 ping_interval 检测主库健康;
·当主库故障时,MHA自动执行 master_ip_failover 脚本,将VIP漂移到新主库,并将所有从库重新指向新主;
·切换完成后,原主库恢复后可作为新的从库加入集群。 
授予可执行权限 chmod 755 master_ip_failover chmod 755 master_ip_online_change
vim master_ip_failover
当 MHA 完成主库切换后,自动执行这些命令,将虚拟 IP(VIP)从旧主库漂移到新主库上。
masterha_manager –conf=/etc/masterha/app1.cnf & 这条命令,启动了 MHA(Master High Availability)的核心监控进程,它根据 app1.cnf 配置文件,在后台静默运行。 查看从库状态已切换至新的主节点。

Redis
Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,支持网络访问,可用作数据库、缓存、消息代理和流处理引擎。
| 内存存储 | 数据主要存在内存中,读写速度极快(10万+ QPS) |
| 数据结构丰富 | 不仅是 key-value,还支持 String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、Stream、Geo 等 |
| 持久化 | 支持 RDB(快照)和 AOF(日志)两种持久化方式 |
| 单线程模型 | 核心命令处理是单线程的,避免锁竞争,保证原子性 |
| 高可用 | 支持主从复制(Replication)、Sentinel 哨兵、Cluster 集群模式 |
| 原子操作 | 所有命令都是原子的,适合并发场景 |
Redis安装
tar zxf redis-6.2.4.tar.gz
cd redis-6.2.4
make && make install
cd utils/
vim install_server.sh

#运行安装脚本
./install_server.sh

改为监听所有端口

redis主从复制
·从节点通过配置 replicaof <master_ip> <master_port> 指向主库,启动后自动同步数据;
·主从复制为异步,适用于读多写少场景,可横向扩展读能力。
server1
rsync -a redis-* server2:/usr/local/bin
rsync -a redis-6.2.4 server2:
server2
cd redis-6.2.4/utils
./install_server.sh

vim /etc/redis/6379.conf
replicaof 192.168.88.143 6379

systemctl restart redis_6379
测试
redis-cli
>info



redis高可用
redis+哨兵模式(Sentinel)
·在 server1、server2、server3 上分别部署哨兵进程,监控主库状态;

·哨兵之间相互通信,通过投票机制判断主库是否客观下线,并自动执行故障转移; 
server2

[root@server1 redis]# redis-cli shutdown


redis集群
./create-cluster start
·集群通过哈希槽(16384个槽位)分区,数据自动分布在多个主节点上; ./create-cluster create
连接集群
redis-cli -c -p 30001 info
127.0.0.1:30004> set name ljx
–> Redirected to slot [5798] located at 127.0.0.1:30002
OK
#添加新节点(30007、30008)后,需执行 reshard 迁移槽位,才能均匀数据分布;
redis-cli –cluster add-node 127.0.0.1:30007 127.0.0.1:30001
·添加从节点时需指定主节点ID,实现副本备份。
redis-cli –cluster add-node 127.0.0.1:30008 127.0.0.1:30001 –cluster-slave –cluster-master-id ef99a4fc501bce05f725ba926510c2816d1c9f46

redis-cli –cluster check 127.0.0.1:30001

#迁移hash槽
redis-cli –cluster reshard 127.0.0.1:30001







