数据库-MHA-读写分离-redis

数据库MHA-读写分离-redis

02 数据库服务高可用架构(MHA)

环境准备四台机器

  • 主库:10.0.0.109 (db01)
  • 从库1:10.0.0.203 (db02)
  • 从库2:10.0.0.304 (db03)
  • MHA管理节点:10.0.0.205

所有节点MySQL安装路径 :/usr/local/mysql
数据目录:/data/3306/data

1)如何搭建高可用数据库架构

步骤一:确认具有主从同步环境

编写主库配置信息

bash 复制代码
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=51
port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db01 [\\d]>
EOF

编写从库配置信息(两台从库)

bash 复制代码
# 第一台从库
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=52
port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db02 [\\d]>
EOF

# 第二台从库
cat >/etc/my.cnf <<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
server_id=53
port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
[mysql]
prompt=db03 [\\d]>
EOF

三个节点执行(先清空或者备份数据)

bash 复制代码
# 先备份重要数据(如果有的话)
mv /data/3306/data /data/3306/data.bak

# 重新创建空的数据目录
mkdir -p /data/3306/data
chown -R mysql:mysql /data/3306/data

# 重新初始化
mysqld --initialize-insecure --user=mysql --datadir=/data/3306/data --basedir=/usr/local/mysql

# 启动数据库服务
/etc/init.d/mysqld start

主库创建主从同步用户

sql 复制代码
-- 主库配置用户
create user repl@'10.0.0.%' identified with mysql_native_password by '1';
grant Replication slave on *.* to repl@'10.0.0.%';

两个从库做主从配置

sql 复制代码
-- 在两台从库上执行
change master to
master_host='10.0.0.206',
master_user='repl',
master_password='1',
master_auto_position=1;

start slave;

-- 检查主从状态
SHOW SLAVE STATUS\G
步骤二:安装部署高可用服务软件

MHA管理节点(10.0.0.205)

bash 复制代码
# 创建软链接
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

# 生成密钥
rm -rf /root/.ssh
ssh-keygen

# 生成authorized_keys
cd /root/.ssh
mv id_rsa.pub authorized_keys

# 分发公钥到所有节点
scp -r /root/.ssh 10.0.0.119:/root
scp -r /root/.ssh 10.0.0.203:/root
scp -r /root/.ssh 10.0.0.204:/root

测试SSH连接

bash 复制代码
# 测试SSH连接--四台机器都输入以下命令,不需要输入密码即代表配置成功
ssh root@10.0.0.119 "hostname"
ssh root@10.0.0.203 "hostname"
ssh root@10.0.0.204 "hostname"

MHA的数据节点(三台Mysql节点:10.0.0.119,203,204)

bash 复制代码
# 创建软链接
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql

MYSQL节点安装Node包(三台机器)

bash 复制代码
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

管理节点安装Manager包

bash 复制代码
# MHA软件程序安装,管理节点数据包安装
yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
yum install -y mysql-devel
yum install -y perl-DBD-MySQL

# 验证安装
ldconfig -p | grep libmysqlclient

# 安装MHA包
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

# 测试perl模块
perl -MDBD::mysql -e 'print "DBD::mysql loaded successfully\n"'

编写MHA服务配置文件(只在管理节点操作)

bash 复制代码
# 创建配置文件目录
mkdir -p /etc/mha
# 创建日志目录
mkdir -p /var/log/mha/app1
bash 复制代码
# 编辑配置文件
vim /etc/mha/app01.cnf

配置文件内容

ini 复制代码
[server default]
manager_log=/var/log/mha/app1/manager         # MHA的工作日志设置
manager_workdir=/var/log/mha/app1             # MHA的工作目录
master_binlog_dir=/data/3306/data             # 主库的binlog目录
user=mha                                      # 监控用户,利用此用户连接各个节点,做心跳检测(主要是检测主库的状态)
password=mha                                  # 监控密码
ping_interval=2                               # 心跳检测的间隔时间
repl_password=1                               # 复制密码
repl_user=repl                                # 复制用户(用于告知从节点通过新主同步数据信息的用户信息)
ssh_user=root                                 # ssh互信的用户(可以利用互信用户从主库scp获取binlog日志信息,便于从库进行数据信息补偿)

[server1]                                     # 节点信息
hostname=10.0.0.119
port=3306

[server2]
hostname=10.0.0.203
port=3306

[server3]
hostname=10.0.0.204
port=3306

或者使用简化的创建方式

bash 复制代码
cat >/etc/mha/app01.cnf<<EOF
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/data/3306/data
user=mha
password=mha
ping_interval=2
repl_password=1
repl_user=repl
ssh_user=root
[server1]
hostname=10.0.0.119
port=3306
[server2]
hostname=10.0.0.203
port=3306
[server3]
hostname=10.0.0.204
port=3306
EOF

主库创建MHA监控管理用户

sql 复制代码
create user mha@'10.0.0.%' identified with mysql_native_password by 'mha';
grant all privileges on *.* to mha@'10.0.0.%';

MHA服务环境测试(管理节点)

bash 复制代码
# 测试主从节点之间互信功能
masterha_check_ssh --conf=/etc/mha/app01.cnf
# 显示 Sat Aug 23 23:39:25 2025 - [info] All SSH connection tests passed successfully. 成功

# 测试主从同步状态
masterha_check_repl --conf=/etc/mha/app01.cnf
# 显示 MySQL Replication Health is NOT OK! 成功

启动MHA服务程序(管理节点)

bash 复制代码
nohup masterha_manager --conf=/etc/mha/app01.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

参数说明

  • nohup:将服务程序运行的进程放在后台运行
  • --remove_dead_master_conf:将故障节点从高可用集群中移除
  • --ignore_last_failover:可以在出现异常时连续启动高可用服务

检查状态

bash 复制代码
masterha_check_status --conf=/etc/mha/app01.cnf
# 应该显示: app01 (pid:XXXX) is running(0:PING_OK), master:10.0.0.51

查看进程

bash 复制代码
ps -ef|grep mha

输出示例

复制代码
root       3152   1977  0 18:09 pts/0    00:00:00 perl /usr/bin/masterha_manager --conf=/etc/mha/app01.cnf --remove_dead_master_conf --ignore_last_failover
root       3178   1977  0 18:10 pts/0    00:00:00 grep --color=auto mha

检查状态

bash 复制代码
masterha_check_status --conf=/etc/mha/app01.cnf
# 输出:app01 (pid:3152) is running(0:PING_OK), master:10.0.0.51

PS:MHA高可用服务,是一次性的高可用服务

优雅停止MHA服务

bash 复制代码
masterha_stop --conf=/etc/mha/app01.cnf

# 检查是否停止成功
masterha_check_status --conf=/etc/mha/app01.cnf
# 应该显示: app01 is stopped(2:NOT_RUNNING)
步骤三:MHA功能配置

1)高可用主库的监控

  • 利用masterha_manager启动脚本,在启动MHA服务后,会自动调用masterha_master_monitor脚本
  • 利用监控脚本向主库发送SQL语句请求
    • 如果可以对SQL语句做响应,表示主库可以正常使用
    • 如果不能对SQL语句做响应,会连续发送4次测试请求,4次连续请求都不能做响应,会触发MHA故障切换

2)会进行新的主库选举阶段

会划分角色信息:

  • alive角色数组:将活着的节点会划分到此数组中(52 53)
  • latest角色数组:将数据量和主库一致的节点划分到此数组中(52 53)
  • pref角色数组:会检查MHA配置文件节点信息,看节点信息中是否有candidate_master配置项,有就会把对应节点划分到此数组中(52 53)
  • bad角色数组 :划分到此数组中的节点,未来不会竞选新主角色
    • 情况一:在从库上做了log_bin=0配置(禁用了二进制日志功能,无法获取binlog增量,被列入bad数组)
    • 情况二:在从库上做了no_master=1配置(明确指令,直接被列入bad数组)
    • 情况三:从库和主库的数据差异量较大(100M,被列入bad数组)

根据机制选择新主(优先级从上到下)

  1. 方案一:活着节点 + 数据量一致 + 被选择为太子的 + 不能出现在bad数组的节点 → 会优先选择为新主节点
  2. 方案二:活着节点 + 数据量一致 + 不能出现在bad数组的节点
  3. 方案三:活着节点 + 被选择为太子的 + 不能出现在bad数组的节点
  4. 方案四:活着节点 + 不能出现在bad数组的节点

PS:以上4种方案,进行选主时,出现多个主节点情况,看配置节点标签编号,标签编号越小,越会成为主节点

3)数据补偿过程

  • 方案一:当原主库可以被SSH连接访问时(node节点 主从节点)

    • 会利用SSH免密连接,拉去主库中的binlog日志文件,保存到新的从库中,进行数据补偿
  • 方案二:当原主库不能被SSH连接访问时

    1. 利用从库之间数据差异性,进行数据补偿
    2. 利用binlog日志备份服务器,实现数据补偿(需要进行配置)

4)进行主从重构

在从节点上进行重新配置(主备切换的时候,自己重新配置这些信息):

sql 复制代码
stop slave;
reset slave all;
change master to 
  master_host=新主IP地址
  master_post=新主port
  master_user=$repl_user
  master_password=$repl_password;

5)实现主从切换应用透明(需要做配置)

应用透明表示让前端服务器感知不到后端有故障切换过程,利用VIP地址实现应用透明

6)实现MHA故障转移报警功能

告知管理人员,主数据库出现异常,发生了高可用故障切换

步骤四:测试MHA切换功能

实现自动切换

1)应用透明配置(VIP实现切换)

将这个脚本下载到 /usr/local/bin/ 目录下:

bash 复制代码
vi /usr/local/bin/master_ip_failover

脚本关键配置

perl 复制代码
my $vip = '10.0.0.50/24';                # 定义VIP地址
my $key = '1';                           # 定义VIP地址所在网卡的别名
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";  # 在从节点(新主节点)会创建生成VIP
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";   # 在主节点(原主节点)会删除VIP地址
my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.50";  # 让所有数据库客户端主机,可以重新生成VIP地址的ARP记录(确保web前端服务器可以访问新的主节点)
bash 复制代码
# 添加执行权限
chmod +x master_ip_failover

在MHA配置文件中,需要加载脚本文件

bash 复制代码
vi /etc/mha/app01.cnf
# 添加
master_ip_failover_script=/usr/local/bin/master_ip_failover

手动在主库先生成一个VIP

bash 复制代码
/sbin/ifconfig ens33:1 10.0.0.50/24

2)实现故障报警功能

bash 复制代码
vim send_report

脚本关键配置

perl 复制代码
my $smtp='smtp.qq.com';                  # 设置邮件服务域名信息
my $mail_from='330882721@qq.com';        # 设置邮箱服务登录账号
my $mail_user='330882721@qq.com';        # 设置邮箱服务登录账号
my $mail_pass='nqlgqhpvtvcjbhfh';        # 设置邮箱服务登录授权码
# my $mail_to=['主管@qq.com','dba@qq.com',xxx];
my $mail_to='330882721@qq.com';          # 当需要进行报警通知时,把报警邮件发给谁
bash 复制代码
# 添加执行权限
chmod +x send_report

在MHA配置文件中,需要加载脚本文件

bash 复制代码
vi /etc/mha/app01.cnf
# 添加
report_script=/usr/local/bin/send_report

3)实现数据额外补偿功能
步骤一:需要有binlog日志备份服务器(管理节点当备份服务器)

bash 复制代码
mkdir -p /binlog_backup/app01/
cd /binlog_backup/app01/
mysqlbinlog -R --host=10.0.0.206 --user=mha --password=mha --raw --stop-never binlog.000001 &

在MHA配置文件中添加binlog服务器配置

bash 复制代码
vi /etc/mha/app01.cnf
# 添加
[binlog1]
no_master=1                              # 不存于竞选
hostname=10.0.0.54                       # 将日志额外补偿到哪个主机上
master_binlog_dir=/binlog_backup/app01/  # 日志额外补偿的存储目录

运行服务

bash 复制代码
# 测试主从节点之间互信功能
masterha_check_ssh --conf=/etc/mha/app01.cnf
# 显示 Sat Aug 23 23:39:25 2025 - [info] All SSH connection tests passed successfully. 成功

# 测试主从同步状态
masterha_check_repl --conf=/etc/mha/app01.cnf
# 显示 MySQL Replication Health is NOT OK! 成功

# 启动MHA服务
nohup masterha_manager --conf=/etc/mha/app01.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

# 检查状态
masterha_check_status --conf=/etc/mha/app01.cnf

测试高可用功能:

自动切换测试

bash 复制代码
# 在主节点上关闭mysql数据库服务
/etc/init.d/mysqld stop

检查01:VIP地址是否漂移

  • 主库地址是否消失
  • 从库是否生成VIP

检查02:主从是否重新构建

  • 新主节点做检查:

    sql 复制代码
    db02 [(none)]>show slave status\G
    # 输出:Empty set, 1 warning (0.00 sec)
  • 从节点做检查:

    sql 复制代码
    show slave status\G
    # 输出:Master_Host: 10.0.0.52
    #       Master_Port: 3306

检查03:是否收到报警通知邮件

  • 检查邮件信息

检查04:确认MHA服务状态

bash 复制代码
masterha_check_status --conf=/etc/mha/app01.cnf
# 输出:app01 is stopped(2:NOT_RUNNING).

恢复MHA运行启动

bash 复制代码
# 在日志备份服务器上,启动日志备份功能
cd /binlog_backup/app01/
mysqlbinlog -R --host=10.0.0.50 --user=mha --password=mha --raw --stop-never binlog.000001 &

# 启动MHA服务
nohup masterha_manager --conf=/etc/mha/app01.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

# 检查状态
masterha_check_status --conf=/etc/mha/app01.cnf
# 输出:app01 (pid:8633) is running(0:PING_OK), master:10.0.0.52

WordPress连接数据库地址:10.0.0.50 VIP

测试完记得重新恢复主从复制

新的主库创建账号

sql 复制代码
CREATE USER 'repl'@'10.0.0.%' IDENTIFIED BY '1';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.%';
FLUSH PRIVILEGES;

原主库

sql 复制代码
-- 先停止旧的复制关系(如果有)
STOP SLAVE;

-- 清除旧的复制信息,这是一个关键步骤
RESET SLAVE ALL;

-- 重新配置主从
change master to
master_host='10.0.0.207',
master_user='repl',
master_password='1',
master_auto_position=1;

-- 启动复制
START SLAVE;

-- 检查状态
SHOW SLAVE STATUS\G

管理节点重新更新配置 /etc/mha/app01.cnf

ini 复制代码
[server1]
hostname=10.0.0.50 # 原主库,现已恢复为从库

[server2]
hostname=10.0.0.52 # 当前的主库

[server3]
hostname=10.0.0.53 # 另一个从库

重新启动MHA

bash 复制代码
# 停止MHA
masterha_stop --conf=/etc/mha/app01.cnf

# 启动MHA
nohup masterha_manager --conf=/etc/mha/app01.cnf < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

# 检查状态
masterha_check_status --conf=/etc/mha/app01.cnf

实现手动切换

步骤一:编写手动切换脚本

bash 复制代码
vi master_ip_online_change

脚本关键配置

perl 复制代码
my $vip = "10.0.0.50/24";
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key $vip down";
my $ssh_Bcast_arp= "/sbin/arping -I ens33 -c 3 -A 10.0.0.50";
bash 复制代码
# 添加执行权限
chmod +x master_ip_online_change

在MHA配置文件中加载脚本

bash 复制代码
vi /etc/mha/app01.cnf
# 添加
master_ip_online_change_script=/usr/local/bin/master_ip_online_change

步骤二:利用命令实现手工高可用切换

bash 复制代码
# 先停止MHA服务
masterha_stop --conf=/etc/mha/app01.cnf

# 执行手动切换
masterha_master_switch --conf=/etc/mha/app01.cnf --master_state=alive --new_master_host=10.0.0.53 --orig_master_is_new_slave --running_updates_limit=10000

参数说明

  • --master_state=alive:确保在主节点活着的状态进行MHA高可用切换
  • --new_master_host=10.0.0.53:指定在手工切换过程中,哪个节点成为新的主节点
  • --orig_master_is_new_slave:实现主从重构功能
  • --running_updates_limit=10000:在指定时间内,如果没有完成手工切换,会自动终止切换过程

测试

  • 测试01:VIP地址是否漂移
  • 测试02:主从关系是否重构

掌握要点

  1. MHA高可用搭建配置过程
  2. MHA高可用切换原理流程(监控、选主、数据补偿)
  3. MHA高可用如何实现自动和手动切换

02 数据库服务读写分离架构(ProxySQL-中间件)

作用:搭建读写分离架构,可以将读或者写请求进行负载均衡(写请求 500-1000,读请求 1000-2000)

1)如何安装部署ProxySQL程序

操作节点:ProxySQL服务器(建议独立部署,不要和MySQL同机)

步骤一:下载ProxySQL软件程序

步骤二:安装ProxySQL软件程序

bash 复制代码
rpm -ivh proxysql-2.4.6-1-centos7.x86_64.rpm
# 或者
yum localinstall -y proxysql-2.4.6-1-centos7.x86_64.rpm

步骤三:启动ProxySQL软件程序

bash 复制代码
systemctl start proxysql

检查端口

bash 复制代码
netstat -lntup|grep proxysql
# 输出:
# tcp        0      0 0.0.0.0:6032            0.0.0.0:*               LISTEN      10269/proxysql
# tcp        0      0 0.0.0.0:6033            0.0.0.0:*               LISTEN      10269/proxysql

端口说明

  • 6032端口:用于对ProxySQL服务进行远程管理端口(管理端口),用于管理员通过MySQL客户端连接进来,配置ProxySQL的各项设置。用户是admin,密码是admin
  • 6033端口:用于对ProxySQL服务进行远程访问端口(业务端口),用于应用程序像连接普通MySQL数据库一样连接进来,执行SQL操作。ProxySQL会在这里接收请求并转发到后端数据库

步骤四:配置ProxySQL软件程序

bash 复制代码
mysql -uadmin -padmin -h127.0.0.1 -P6032

配置方法

  1. 01:需要先执行insert/update/delete SQL语句对ProxySQL中的功能表进行配置(以上配置信息都会写入到内存区域)
  2. 02:需要执行load加载内存中的配置信息,将配置信息保存到runtime中,实现功能配置生效
  3. 03:需要执行save加载内存中的配置信息,将配置信息保存到磁盘中,实现功能配置永久生效

配置步骤

1)编写数据表 mysql_replication_hostgroups
作用:创建读写业务的数据组信息,相当于负载均衡一样,ProxySQL分别将读写的请求发送到不同的数据库中

sql 复制代码
-- 在表中先创建两个数据组 10号组(写组)20号组(读组)
insert into mysql_replication_hostgroups(writer_hostgroup,reader_hostgroup,comment) values(10,20,'proxy');

-- 实现配置功能生效
load mysql servers to runtime;

-- 保存配置信息永久生效
save mysql servers to disk;

修改数据库只读状态

  • 主库set global read_only=0; 会被归为10写组
  • 从库set global read_only=1; 会被归为20读组

2)编写数据表 mysql_servers
作用:将节点信息划分到读组或写组中

sql 复制代码
-- 插入节点信息
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'10.0.0.50',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (10,'10.0.0.206',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.207',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.208',3306);

-- 保存并加载
save mysql servers to disk;
load mysql servers to runtime;

3)编写数据表 global_variables
作用:创建数据库监控用户和密码信息。ProxySQL需要用一个账户定期连接后端所有MySQL服务器,检查它们的健康状态(是否存活、复制状态、read_only值等)

sql 复制代码
-- 设置监控用户名
update global_variables set variable_value='monitor' where variable_name='mysql-monitor_username';

-- 设置监控密码
update global_variables set variable_value='123' where variable_name='mysql-monitor_password';

-- 加载并保存
load mysql variables to runtime;
save mysql variables to disk;

在数据库主节点上,创建ProxySQL应用的监控用户

sql 复制代码
create user monitor@'%' identified with mysql_native_password by '123';
grant replication client on *.* to monitor@'%';

4)编写数据表 mysql_users
作用:在ProxySQL中设置业务用户信息。应用程序连接ProxySQL时使用的用户名和密码。ProxySQL会用这个表里的信息去验证客户端连接,并用同样的凭证去连接后端数据库

sql 复制代码
-- 插入用户信息
insert into mysql_users(username,password,default_hostgroup) values('root','123',10);

-- 加载并保存
load mysql users to runtime;
save mysql users to disk;

在主数据库上创建客户端访问用户(此时ProxySQL的该用户就可以访问数据库):

sql 复制代码
create user root@'%' identified with mysql_native_password by '123';
grant all on *.* to root@'%';

5)编写数据表 mysql_query_rules
作用:SQL语句发送到ProxySQL(默认规则信息都不匹配,会将SQL请求转发到写组):匹配的规则,怎么样的规则就分发给哪个节点处理

sql 复制代码
-- 规则1:SELECT ... FOR UPDATE 语句(写操作)发送到写组
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,'^select.*for update$',10,1);

-- 规则2:普通SELECT语句发送到读组
insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',20,1);

-- 加载并保存
load mysql query rules to runtime;
save mysql query rules to disk;

测试读写分离功能

告知开发人员

  1. ProxySQL业务端口和地址信息,以及连接ProxySQL业务用户信息

    • 10.0.0.54 6033 root 123
  2. 告知开发人员主从数据库server_id信息(主01 从02 从03)

运维人员做测试

bash 复制代码
# 访问的是业务端口6033,10.0.0.209 是 ProxySQL 服务所在服务器的网络地址
mysql -uroot -p123 -h10.0.0.209 -P6033 -e "select @@server_id;"

# 测试事务中的查询
mysql -uroot -p123 -h10.0.0.209 -P6033 -e "begin;select @@server_id;"

03 Redis数据库服务应用

Redis缓存型数据库服务:读取数据/存储数据,都会在内存空间进行操作(加快数据库数据读写效率)

  • 作为MySQL数据库服务缓存设备,将不重要数据会放在Redis中进行处理(减少MySQL并发访问压力)
  • 还可以将Redis服务做消息队列进行应用(消息队列)

1)Redis服务如何安装部署

步骤一:安装Redis服务程序

bash 复制代码
# 下载Redis软件包为源码包
wget https://download.redis.io/releases/redis-6.2.10.tar.gz

cd /usr/local
tar xf redis-6.2.10.tar.gz
ln -s redis-6.2.10 redis

# 安装编译依赖
yum install -y gcc automake autoconf libtool make

# 编译安装
cd redis
make

步骤二:对Redis服务进行配置

bash 复制代码
# 配置环境变量
vim /etc/profile
# 添加
export PATH=/usr/local/mysql/bin:/usr/local/redis/src:$PATH

# 加载配置
source /etc/profile

Redis服务配置文件编写

bash 复制代码
mkdir -p /data/6379
cat >/data/6379/redis.conf<<EOF
daemonize yes            # 表示定义服务程序在后台以守护进程方式运行
port 6379               # 表示定义服务的默认端口
logfile /data/6379/redis.log  # 表示服务运行日志存放路径
dir /data/6379          # 表示定义数据目录路径,用于持久化应用时存储数据
dbfilename dump.rdb     # 表示持久化存储的数据文件名称(RDB方式完成Redis持久化)
EOF

或者使用简化方式

bash 复制代码
cat >/data/6379/redis.conf<<EOF
daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
dbfilename dump.rdb
EOF

步骤三:启动运行Redis服务

bash 复制代码
redis-server /data/6379/redis.conf

测试Redis

bash 复制代码
redis-cli
127.0.0.1:6379> set username xiaoA
OK
127.0.0.1:6379> get username
"xiaoA"

2)Redis服务基础管理

安全功能配置(远程功能)
bash 复制代码
vim /data/6379/redis.conf
# 添加或修改
bind 10.0.0.209 127.0.0.1
requirepass 123456

注意:目前只有209这台机器配置了Redis,所以自己连自己

远程连接测试

bash 复制代码
# 实现远程管理
redis-cli -h 10.0.0.209 -p 6379

# 实现远程登录时,做密码验证
redis-cli -h 10.0.0.209 -p 6379 -a 123456

# 在Redis客户端内进行登录验证
auth 密码信息
Redis数据库持久化功能配置

RDB持久化存储

可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
缺陷:Redis中的数据信息,不会实现实时存储

RDB存储配置(默认)

自动保存配置信息

bash 复制代码
"save"
"3600 1 300 100 60 10000"   # 触发RDB备份时间和存储量信息
  • 60 10000:1分钟内,如果有10000个key-value数据量变化 → 自动触发RDB快照保存机制
  • 300 100:5分钟内,如果有100个key-value数据量变化 → 自动触发RDB快照保存机制
  • 3600 1:1小时内,如果有1个key-value数据量变化 → 自动触发RDB快照保存机制

意思是:在3600秒(1小时)内,如果至少有1个键发生变化,则触发一次快照保存。

手动保存配置信息

  • save命令:立刻马上将Redis中数据做保存

应用场景

  • 实现主从同步过程,可以应用RDB文件,将主库数据迁移恢复到从节点

优点

  • 主从复制:正如你所说,主节点首次同步数据给从节点时,会先生成一个RDB文件,然后传输给从节点。从节点加载这个RDB文件来完成初始数据的同步

缺点

  • 可能丢失数据:这是最大的问题。如果配置为每5分钟保存一次,那么一旦服务器宕机,你会丢失最近5分钟内的数据。

AOF持久化存储

会记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集(类似binlog)
缺陷:恢复加载持久化数据信息会比较慢,AOF持久化存储数据的文件,数据量较大

AOF存储配置(做设置)

bash 复制代码
appendonly yes      # 开启AOF持久化存储功能

appendfsync配置(AOF文件记录Redis操作记录方式):

  • always:每完成一个操作都会记录 → 安全
  • everysec:每间隔一秒钟做一次记录 → 推荐
  • no:实现数据信息持久化保存,由系统进行控制 → 性能

应用场景

  • 可以实现数据信息恢复操作
相关推荐
小高不会迪斯科5 小时前
CMU 15445学习心得(二) 内存管理及数据移动--数据库系统如何玩转内存
数据库·oracle
e***8906 小时前
MySQL 8.0版本JDBC驱动Jar包
数据库·mysql·jar
l1t6 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
失忆爆表症7 小时前
03_数据库配置指南:PostgreSQL 17 + pgvector 向量存储
数据库·postgresql
AI_56787 小时前
Excel数据透视表提速:Power Query预处理百万数据
数据库·excel
SQL必知必会8 小时前
SQL 窗口帧:ROWS vs RANGE 深度解析
数据库·sql·性能优化
Gauss松鼠会8 小时前
【GaussDB】GaussDB数据库开发设计之JDBC高可用性
数据库·数据库开发·gaussdb
+VX:Fegn08959 小时前
计算机毕业设计|基于springboot + vue鲜花商城系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
识君啊9 小时前
SpringBoot 事务管理解析 - @Transactional 的正确用法与常见坑
java·数据库·spring boot·后端
一个天蝎座 白勺 程序猿10 小时前
破译JSON密码:KingbaseES全场景JSON数据处理实战指南
数据库·sql·json·kingbasees·金仓数据库