数据库服务-redis高可用架构-mongodb日常维护管理

发布于:2025-08-31 ⋅ 阅读:(26) ⋅ 点赞:(0)

文章目录

🌟redis数据库主从架构搭建

可以实现缓存数据信息备份

可以实现缓存数据库服务高可用(哨兵服务)

可以实现缓存数据库服务负载均衡(集群服务)

🔄缓存服务主从同步原理

  • 在从库上进行主从配置(slaveof 主库地址 主库端口),然后会在配置之后向主库发送SYNC信息
  • 主库收到SYNC请求建立消息后,会对请求客户端做验证
  • 主库对客户端的请求验证通过,会立即触发BGSAVE(立刻进行rdb文件保存),将主库RDB文件信息发送给从节点
  • 从库会加载RDB文件数据,快速恢复主库中的缓存数据信息
  • 主库会将新增数据(key-values),不断同步传输给从节点

🛠️缓存服务主从同步配置

#mysql5.0之前
saveof 主数据库地址 主数据库端口

#mysql5.0之后
replicaof 主数据库地址 主数据库端口

准备主从redis数据库服务(多实例)

1.创建目录
mkdir -p /data/6380
mkdir -p /data/6381
mkdir -p /data/6382

2.修改redis配置文件
#主库
cat >/data/6380/redis.conf<<EOF
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
#bind 10.0.0.53 127.0.0.1
requirepass 123
masterauth 123
EOF

#从库
cat >/data/6381/redis.conf<<EOF
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
#bind 10.0.0.53 127.0.0.1
requirepass 123
masterauth 123
EOF

#从库
cat >/data/6382/redis.conf<<EOF
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382
#bind 10.0.0.53 127.0.0.1
requirepass 123
masterauth 123
EOF

redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf

实现redis服务主从同步

  • 6381实例从库做主从连接配置
redis-cli -p 6381 -a 123 slaveof 127.0.0.1 6380
  • 6382实例从库做主从连接配置
redis-cli -p 6382 -a 123 slaveof 127.0.0.1 6380

查看主从同步状态

  • 在主库上,确认主从是否建立成功
redis-cli -p 6380 -a 123 info replication

slave0:ip=127.0.0.1,port=6381,state=online,offset=126,lag=1

slave1:ip=127.0.0.1,port=6382,state=online,offset=126,lag=1

master_repl_offset:126(对比偏移量)

  • 在从库上查看
redis-cli -p 6381 -a 123 info replication

停止主从同步数据

  • 在从库上停止
#redis5.0之前
redis-cli -p 6382 -a 123 slaveof on one
或
#redis5.0之后
redis-cli -p 6382 -a 123 replicaof no one

#查看主从状态
redis-cli -p 6382 -a 123 info replication

🌟redis数据库高可用架构搭建

💡搭建redis哨兵服务环境

1.创建目录
mkdir /data/26380

2.编写配置文件
cat >/data/26380/sentinel.conf<<EOF
port 26380
dir "/data/26380"
daemonize yes
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel auth-pass mymaster 123
EOF

#监控集群架构中主库服务状态(数值1表示发现主库异常的票数,当发现有1票提出主库宕机,就立刻切换)
sentinel monitor mymaster 127.0.0.1 6380 1       

#当主库进行监控心跳检测时,如果5s内没有反馈,就认为主库服务已经宕机
sentinel down-after-milliseconds mymaster 5000

#设置连接主库服务的认证密码信息
sentinel auth-pass mymaster 123

3.启动哨兵服务
redis-sentinel /data/26380/sentinel.conf &>/tmp/sentinel.log

🔍测试

1.关闭redis 6380实例
redis-cli -p 6380 -a 123 shutdown

2.查看主从状态
redis-cli -p 6381 -a 123 info replication

🌟redis服务集群架构搭建

🛠️编写集群实例配置文件

mkdir -p /data/700{0..7}

cat >/data/7000/redis.conf<<EOF
port 7000
daemonize yes
pidfile /data/7000/redis.pid
loglevel notice
logfile "/data/7000/redis.log"
dbfilename dump.rdb
dir /data/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >/data/7001/redis.conf<<EOF
port 7001
daemonize yes
pidfile /data/7001/redis.pid
loglevel notice
logfile "/data/7001/redis.log"
dbfilename dump.rdb
dir /data/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >/data/7002/redis.conf<<EOF
port 7002
daemonize yes
pidfile /data/7002/redis.pid
loglevel notice
logfile "/data/7002/redis.log"
dbfilename dump.rdb
dir /data/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >/data/7003/redis.conf<<EOF
port 7003
daemonize yes
pidfile /data/7003/redis.pid
loglevel notice
logfile "/data/7003/redis.log"
dbfilename dump.rdb
dir /data/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >/data/7004/redis.conf<<EOF
port 7004
daemonize yes
pidfile /data/7004/redis.pid
loglevel notice
logfile "/data/7004/redis.log"
dbfilename dump.rdb
dir /data/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >/data/7005/redis.conf<<EOF
port 7005
daemonize yes
pidfile /data/7005/redis.pid
loglevel notice
logfile "/data/7005/redis.log"
dbfilename dump.rdb
dir /data/7005
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

🚀启动redis实例

redis-server /data/7000/redis.conf
redis-server /data/7001/redis.conf
redis-server /data/7002/redis.conf
redis-server /data/7003/redis.conf
redis-server /data/7004/redis.conf
redis-server /data/7005/redis.conf

📌构建集群环境

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

🔍集群架构信息查看

redis-cli -p 7000 cluster nodes|grep master
redis-cli -p 7000 cluster nodes|grep slave

🌟日常集群维护管理

🧩添加新的集群节点

  • 创建新的redis集群节点实例(7006-7007)
cat >/data/7006/redis.conf<<EOF
port 7006
daemonize yes
pidfile /data/7006/redis.pid
loglevel notice
logfile "/data/7006/redis.log"
dbfilename dump.rdb
dir /data/7006
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

cat >/data/7007/redis.conf<<EOF
port 7007
daemonize yes
pidfile /data/7007/redis.pid
loglevel notice
logfile "/data/7007/redis.log"
dbfilename dump.rdb
dir /data/7007
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF
  • 启动redis实例
redis-server /data/7006/redis.conf
redis-server /data/7007/redis.conf
  • 添加新的主节点到集群中
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

新节点加入到了集群中,但是没有分配槽位

  • 添加新的节点分配存储缓存的槽位信息
redis-cli --cluster reshard 127.0.0.1:7000

How many slots do you want to move (from 1 to 16384)?
将多少槽位数量进行转移存储?

What is the receiving node ID?
转移的槽位由哪个节点接收?

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: 51440e9573448bc2b09269a4ef71bcfba74777bf
Source node 表示从哪个原有集群节点移出槽位信息

all 表示所有集群节点都统一移出相应槽位信息
done(继续)
yes(确认)

  • 检查
redis-cli -p 7000 cluster nodes|grep master

  • 添加从节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 --cluster-slave --cluster-master-id f1e1ea548764f2bd7de8f147c4dca9181cf4c59d

删除原有集群节点(删除主节点)

  • 将槽位挪动还给7000主节点
redis-cli --cluster reshard 127.0.0.1:7000

  • 槽位已经移动回去到 7000主节点
redis-cli -p 7000 cluster nodes|grep master

  • 删除指定集群节点信息(主库节点)
redis-cli --cluster del-node 127.0.0.1:7006 f1e1ea548764f2bd7de8f147c4dca9181cf4c59d

  • 删除指定集群节点信息(从库节点)
redis-cli --cluster del-node 127.0.0.1:7007 fa3ec88c79b7b42b612fb7b61de216c3a1c0bf8c

🌟mongodb数据库服务应用

🍀概述

MongoDB名称由来Humongous,表示巨大的意思,比较适合海量的存储和管理

MongoDB支持的数据结构非常松散,是一种类似于JSON的格式交BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活

📐数据库服务区别对比

MongoDB缓存型数据库 vs 关系型数据库(RDBMS)

功能分析 MongoDB RDBMS
数据库模型 JSON Relational
数据库应用 OLTP/OLAPOLTP:On-Line Transaction Processing 即联机事务处理过程 OLAP:On-Line Analytical Processing 即联机分析处理 OLTP/OLAP
CRUD操作 MSQL/SQL SQL/SQLX
高可用能力 原生Replica-Set cluster、中间件
横向扩展能力 原生MSC集群环境 分片 中间件
索引支持 B-Tree、F-text、GIS、multikey、HASH、TTL B-Tree
开发难度 简单 困难
数据存储量 无理论上限 千万、亿
扩容方式 垂直扩展+水平扩展 垂直扩展

MongoDB缓存型数据库 vs 关系型数据库(RDBMS) 逻辑结构对比

MySQL MongoDB
Database Database
Table、View Collection(集合)
Row Document
Index Index
Join Embedded Document
Foreign Key Reference
Partition Shard

🛠️数据库服务特色优势

MongoDB面向开发者具有易用性,并且属于高效数据库;

  • 简单直观:以自然的方式来建模,以直观的方式来与数据库交互;
  • 结构灵活:弹性模式从容响应需求的频繁变化;
  • 快速开发:做更多的事,写更少的代码;

🔄安装部署mongodb软件程序

数据库服务安装准备

  • 1️⃣需要在redhat或centos 6.2以上系统进行部署;
  • 2️⃣系统开发工具包安装完整;
  • 3️⃣系统IP地址和hosts文件解析正常;
  • 4️⃣系统防火墙功能与SElinux安全功能均要关闭;
  • 5️⃣关闭系统大页内存机制
#禁用大页内存功能,默认16kb
1.添加开机自启脚本文件
vim /etc/rc.local
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

2.添加执行权限
chmod +x /etc/rc.d/rc.local

3.执行脚本,使配置信息生效
/etc/rc.d/rc.local

4.检查确认
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag

下载mongodb

下载地址:https://www.mongodb.com/

mongodb-linux-x86_64-rhel70-4.2.24.tgz

解压到/app/tools目录

tar xf mongodb-linux-x86_64-rhel70-4.2.24.tgz -C /app/tools/

创建软连接

ln -s /app/tools/mongodb-linux-x86_64-rhel70-4.2.24/ /app/tools/mongodb

配置环境变量

vim /etc/profile
export PATH="$PATH:/app/tools/mysql/bin:/app/tools/redis/src:/app/tools/mongodb/bin"

加载环境变量

source /etc/profile

检查

mongo --version

启动mongo数据库

1.准备存放数据目录
mkdir -p /mongodb/data

2.准备存放日志目录
mkdir -p /mongodb/log

3.启动mongo数据库
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork

4.检查
ps -ef | grep mongo

5.登录数据库
mongo

修改mongo数据库配置文件

cat >/mongodb/conf/mongo.conf<<EOF
systemLog:
   destination: file
   path: "/mongodb/log/mongodb.log"
   logAppend: true
storage:
   journal:
       enabled: true
   dbPath: "/mongodb/data"
processManagement:
   fork: true   
net:
   port: 27017
   bindIp: 10.0.0.53,127.0.0.1
security:
   authorization: enabled
EOF

path: “/mongodb/log/mongodb.log” – 日志存储位置

logAppend: true – 日志以追加模式记录

dbPath: “/mongodb/data” – 数据路径的位置

fork: true – 后台守护进程

pidFilePath: – pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中

port: 27017 – 端口号,默认不配置端口号,是27017

bindIp: 192.168.30.101,127.0.0.1 – 监听地址

authorization: enabled – 是否打开用户名密码验证

以配置文件形式启动

1.停止mongo进程
pkill mongod

2.启动mongo
mongod -f /mongodb/conf/mongo.conf

🖥️mongo数据库集合操作

#展示mongodb中所有对库或集合的操作函数
db.help()

创建

切换的同时会创建数据库

use xiaoA
db.createCollection("t1")

查看

#查看数据库
show databases;/show dbs;

#查看表
show tables

删除

db.t1.drop()
db.dropDatabase()

🛠️mongo数据库文档操作

#展示mongodb中所有对集合或文档操作函数
db.集合名称.help()
db.student.help()

添加数据

db.集合名称.insert(json信息)
db.student.insert({name:"xiaoA",age:18,gender:"m"})
db.student.insert({id:2,name:"xiaoB",gender:"f"})

删除数据

  • 格式
db.集合名称.remove()
  • 将集合中数据清空
db.studen.remove({id:3})
db.studen.remove({})

查看数据

db.集合名称.find()

#全表信息查询数据
db.student.find()

#过滤集合中数据信息
db.student.find({name:"xiaoA"})

  • 格式化输出一行数据
db.student.find({id:3}).pretty()

🌟mongodb服务基础管理知识

🌈如何实现用户管理

创建用户语句信息

db.createUser(
{
    user: "<name>"               #定义创建用户名
    pwd: "<cleartext password>"  #定义用户密码信息
    roles: [                     #定义用户权限信息   
    ]
}
)

管理员用户创建

use admin
db.createUser(
{
       user: "root",
       pwd: "root123",
       roles: [ { role: "root", db: "admin" } ]
}
)

普通用户创建

use zhu
db.createUser(
{
       user: "xiaoA",
       pwd: "xiaoA123",
       roles: [ { role: "readWrite", db: "zhu" } ]
}
)

查看创建用户信息

use admin
show tables;
db.system.users.find().pretty()

删除用户

db.system.users.remove({})

🍀如何实现远程管理

修改配置文件

cat >/mongodb/conf/mongo.conf<<EOF
systemLog:
   destination: file
   path: "/mongodb/log/mongodb.log"
   logAppend: true
storage:
   journal:
       enabled: true
   dbPath: "/mongodb/data"
processManagement:
   fork: true   
net:
   port: 27017
   bindIp: 10.0.0.53,127.0.0.1
security:
   authorization: enabled
EOF

加载配置文件

1.停止mongo服务
pkill mongod

2.启动mongo服务加载配置文件
mongod -f /mongodb/conf/mongo.conf

使用远程用户登录

mongo -uxiaoA -pxiaoA123 10.0.0.53:27017/zhu

🌟利用mongodb服务建立主从环境(副本集)

MongoDB复制集(replication Set)的主要意义在于实现服务高可用,它的实现依赖于两个方面的功能

  • 数据写入时将数据迅速复制到另一个独立节点上
  • 在接受写入的节点发生故障时自动选举出一个新的替代节点

在实现高可用的同时,复制集实现了其他几个附加功能:

  • 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
  • 读写分离:不同类型的压力分别在不同的节点上执行
  • 异地容灾:在数据中心故障时候快速切换到异地

一个典型的复制集由3个以上具有投票权的节点组成:(PSS PSA-建议5节点)

  • 一个主节点(primary):接收写入操作和选举时投票;
  • 两个或多个从节点(secondary):复制主节点上的新数据和选举时投票
  • Arbiter(投票节点),建议5节点架构时应用

🍀创建mongodb数据库多实例

实例信息 地址 端口
实例01 10.0.0.53 28017
实例02 10.0.0.53 28018
实例03 10.0.0.53 28019
实例04 10.0.0.53 28020

创建多实例目录

mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

创建多实例配置文件

cat > /mongodb/28017/conf/mongod.conf << EOF
systemLog:
   destination: file
   path: "/mongodb/28017/log/mongodb.log"
   logAppend: true
storage:
   journal:
       enabled: true
   dbPath: "/mongodb/28017/data"
   directoryPerDB: true
   #engine: wiredTiger
   wiredTiger:
        engineConfig:
             cacheSizeGB: 1
             directoryForIndexes: true
        collectionConfig:
             blockCompressor: zlib
        indexConfig:
             prefixCompression: true
processManagement:
   fork: true
net:
   port: 28017
   bindIp: 10.0.0.53,127.0.0.1
replication:
   oplogSizeMB: 2048        -- 定义oplog日志存储量,实质是数据库服务的表的大小,因为同步用的日志存储在表中
   replSetName: my_repl     -- 表示复制集的名称,要和后面创建的集群名称一致
-- 表示设置复制集功能
EOF


\cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
\cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
\cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/


sed -i 's#28017#28018#g' /mongodb/28018/conf/mongod.conf
sed -i 's#28017#28019#g' /mongodb/28019/conf/mongod.conf
sed -i 's#28017#28020#g' /mongodb/28020/conf/mongod.conf

启动运行多实例

mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf

检查端口

netstat -lntup|grep 280

创建主从同步架构

1.登录mongodb
mongo --port 28017 admin

2.配置主从同步架构
config = {_id: 'my_repl', members: [
            {_id: 0, host: '10.0.0.53:28017'},
            {_id: 1, host: '10.0.0.53:28018'},
            {_id: 2, host: '10.0.0.53:28019',priority:10}] 
          }

3.初始化配置
rs.initiate(config)

#详细查看副本集状态信息
rs.status()

#查看主节点详细信息
rs.isMaster()

#查看副本集配置信息
rs.conf()

PS:mongodb主从同步过程,默认选择主节点时,会根据节点优先级选择,默认所有节点优先级为1,优先级越大越会选择为主节点

🛠️mongodb副本集日常维护管理

副本集节点添加

1.在主节点上添加
rs.add("10.0.0.53:28020")

2.查看节点状态
rs.status()

副本集节点调整

rs.remove("10.0.0.53:28020")

rs.status()

投票节点添加

rs.addArb("10.0.0.53:28020")

投票节点arbiterOnly的值为true

投票节点删除

rs.remove("10.0.0.53:28020")