6. MySQL 数据库优化与NOSQL

MySQL 数据库优化与NOSQL

一、Mycat 分布式存储

1.1 Mycat 概述

Mycat 是 MySQL 中间件,可实现读写分离、高可用冗余、垂直分表、水平分表。

端口 用途
8066 数据端口,应用程序通过此端口访问
9066 管理端口

1.2 环境规划与多实例部署

架构规划: 2 台虚拟主机,每台 4 个实例

实例 DB01 server_id DB02 server_id 关系
3307 7 17 双主互为主从
3308 8 18 双主互为主从
3309 9 19 各自 3307 的从库
3310 10 20 各自 3308 的从库

清理环境 + 初始化实例(两台主机均操作):

pkill mysqld
rm -rf /data/330*
mv /etc/my.cnf /etc/my.cnf.bak

mkdir /data/33{07..10}/data -p && chown -R mysql.mysql /data/*

# 初始化 4 个实例
mysqld --initialize-insecure --user=mysql --datadir=/data/3307/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3308/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3309/data --basedir=/usr/local/mysql
mysqld --initialize-insecure --user=mysql --datadir=/data/3310/data --basedir=/usr/local/mysql

实例配置文件(以 3307 为例,其他仅改 port/server_id/路径):

# cat >/data/3307/my.cnf<<EOF
[mysqld]
basedir=/usr/local/mysql
datadir=/data/3307/data
socket=/data/3307/mysql.sock
port=3307
log-error=/data/3307/mysql.log
log_bin=/data/3307/mysql-bin
binlog_format=row
skip-name-resolve
server-id=7                     # 每个实例不同
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
EOF

systemd 启动文件(以 3307 为例,其他仅改路径):

# cat >/etc/systemd/system/mysqld3307.service<<EOF
[Unit]
Description=MySQL Server
After=network.target syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE=5000
EOF
systemctl daemon-reload
systemctl start mysqld3307
systemctl start mysqld3308
systemctl start mysqld3309
systemctl start mysqld3310

# 验证
mysql -S /data/3307/mysql.sock -e "show variables like 'server_id'"

1.3 双主 + 从库构建

3307 双主(DB01:3307 ↔ DB02:3307):

# 【DB01】创建用户
mysql -S /data/3307/mysql.sock -e \
  "create user repl@'10.0.0.%' identified with mysql_native_password by '123';
   grant replication slave on *.* to repl@'10.0.0.%';
   create user root@'10.0.0.%' identified with mysql_native_password by '123';
   grant all on *.* to root@'10.0.0.%';"

# 【DB02】指向 DB01 为主
mysql -S /data/3307/mysql.sock -e \
  "change master to master_host='10.0.0.51', master_port=3307,
   master_auto_position=1, master_user='repl', master_password='123';
   start slave;"

# 【DB01】指向 DB02 为主
mysql -S /data/3307/mysql.sock -e \
  "change master to master_host='10.0.0.52', master_port=3307,
   master_auto_position=1, master_user='repl', master_password='123';
   start slave;"

3309 从库(各自同步本地 3307):

# 【DB01】3309 ← 3307
mysql -S /data/3309/mysql.sock -e \
  "change master to master_host='10.0.0.51', master_port=3307,
   master_auto_position=1, master_user='repl', master_password='123';
   start slave;"

# 【DB02】3309 ← 3307
mysql -S /data/3309/mysql.sock -e \
  "change master to master_host='10.0.0.52', master_port=3307,
   master_auto_position=1, master_user='repl', master_password='123';
   start slave;"

3308 双主 + 3310 从库:同上模式,端口改为 3308/3310

异常重置:mysql -S /data/3307/mysql.sock -e "stop slave;reset slave all;"

1.4 Mycat 安装

yum install -y java                                    # Java 运行环境
cd /usr/local
tar xf Mycat-server-1.6.7.4-release-*.linux\ .tar.gz
tar xf mysql-connector-java-8.0.21.tar.gz             # 可选:升级 MySQL 驱动

vim /etc/profile
# export PATH=/usr/local/mycat/bin:$PATH
source /etc/profile

mycat start
mysql -uroot -p123456 -h 127.0.0.1 -P8066

# 连接失败时(Java 驱动兼容问题),替换驱动后重启
cp mysql-connector-java-8.0.21/mysql-connector-java-8.0.21.jar /usr/local/mycat/lib/
mycat restart

1.5 功能一:读写分离

<!-- schema.xml -->
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  </schema>
  <dataNode name="dn1" dataHost="localhost1" database="world" />
  <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
            writeType="0" dbType="mysql" dbDriver="native" switchType="1">
    <heartbeat>select user()</heartbeat>
    <writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
      <readHost host="db2" url="10.0.0.51:3309" user="root" password="123" />
    </writeHost>
  </dataHost>
</mycat:schema>

关键参数: balance="1" 表示读操作分发到所有 readHost 和 standby writeHost

mysql -uroot -p123456 -h 10.0.0.51 -P8066
select @@server_id;          -- 读 → 3309 从库
begin; select @@server_id;   -- 写 → 3307 主库

1.6 功能二:高可用冗余

配置两个 writeHost,主库故障时自动切换到备用 writeHost。

<dataHost name="xiaoq1" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1">
  <heartbeat>select user()</heartbeat>
  <writeHost host="db1" url="10.0.0.51:3307" user="root" password="123">
    <readHost host="db2" url="10.0.0.51:3309" user="root" password="123" />
  </writeHost>
  <writeHost host="db3" url="10.0.0.52:3307" user="root" password="123">
    <readHost host="db4" url="10.0.0.52:3309" user="root" password="123" />
  </writeHost>
</dataHost>

switchType="1" 表示自动切换。测试:停掉 DB01 的 3307 → 写操作自动切到 DB02 的 3307

1.7 功能三:垂直分表

将不同表存储到不同主从架构(不同 dataHost)。

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="sh1">
  <table name="user" dataNode="sh1" />         <!-- user → xiaoq1 架构 -->
  <table name="order_t" dataNode="sh2" />      <!-- order_t → xiaoq2 架构 -->
</schema>
<dataNode name="sh1" dataHost="xiaoq1" database="taobao" />
<dataNode name="sh2" dataHost="xiaoq2" database="taobao" />

1.8 功能四:水平分表

将一个大表的数据按分片规则拆分到不同节点。

① 范围分片(auto-sharding-long):

<!-- schema.xml -->
<table name="t3" dataNode="sh1,sh2" rule="auto-sharding-long" />

<!-- rule.xml -->
<tableRule name="auto-sharding-long">
  <rule>
    <columns>id</columns>              <!-- 分片键 -->
    <algorithm>rang-long</algorithm>
  </rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
  <property name="mapFile">autopartition-long.txt</property>
</function>
-- autopartition-long.txt
0-10=0        -- id 0~10 → 节点0
10-20=1       -- id 10~20 → 节点1

② 取模分片(mod-long):

<table name="t4" dataNode="sh1,sh2" rule="mod-long" />

<tableRule name="mod-long">
  <rule>
    <columns>id</columns>
    <algorithm>mod-long</algorithm>
  </rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
  <property name="count">2</property>     -- 节点数
</function>

规则:id % 2 = 0 → 节点0,id % 2 = 1 → 节点1

③ 枚举分片(sharding-by-intfile):

<table name="t5" dataNode="sh1,sh2" rule="sharding-by-intfile" />

<tableRule name="sharding-by-intfile">
  <rule>
    <columns>name</columns>
    <algorithm>hash-int</algorithm>
  </rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
  <property name="mapFile">partition-hash-int.txt</property>
  <property name="type">1</property>
</function>
-- partition-hash-int.txt
bj=0              -- 北京数据 → 节点0
sh=1              -- 上海数据 → 节点1
DEFAULT_NODE=1    -- 未匹配 → 节点1

三种分片对比:

分片方式 规则 适用场景
范围分片 id 落在指定区间 → 固定节点 数据有明确区间特征
取模分片 id % 节点数 → 目标节点 等值随机查找,数据均匀分布
枚举分片 字段值匹配映射表 → 目标节点 跨地域区域存储

1.9 功能五:全局表

每个节点保存完整副本,修改时所有节点同步更新,适合字典表等小表。

<table name="t_area" primaryKey="id" type="global" dataNode="sh1,sh2" />

1.10 功能六:ER 表

子表通过外键关联父表的分片规则,保证关联数据在同一节点,避免跨库 JOIN。

<table name="a" dataNode="sh1,sh2" rule="mod-long_xiaoq">
  <childTable name="b" joinKey="aid" parentKey="id" />
</table>

a 表的 id 分到哪个节点,b 表中 aid 相同的记录也跟着到同一节点。


二、数据库优化与 Percona Toolkit 工具

2.1 数据库优化九大层面

层面 说明 示例
① 硬件层面 CPU、内存、磁盘(SSD)、网络 磁盘 IO 瓶颈替换为 SSD
② 系统层面 操作系统参数调优 文件句柄数、swap、内核参数
③ 软件版本 选择合适的 MySQL 版本 5.7 → 8.0 新特性利用
④ 结构参数 my.cnf 配置优化 innodb_buffer_pool_size、连接数
⑤ 开发规范 SQL 编写规范 禁止 SELECT *、合理使用索引
⑥ 索引优化 索引设计与使用 联合索引最左前缀、避免索引失效
⑦ 事务及锁 事务隔离级别、锁策略 避免长事务、合理选择隔离级别
⑧ 架构设计 读写分离、分库分表、缓存 主从 + Mycat/ProxySQL + Redis
⑨ 安全优化 用户权限、数据加密、审计 最小权限原则、SQL 注入防护

2.2 PT 工具安装

yum install -y percona-toolkit-3.1.0-2.el7.x86_64.rpm

2.3 pt-archiver(数据归档)

作用:将表中数据归档到其他表或文件,或清理历史数据。

# 数据归档(t100w → test1,条件 id<10000)
pt-archiver --source h=10.0.0.51,P=3307,D=oldboy,t=t100w,u=root,p=123 \
  --dest h=10.0.0.51,P=3307,D=oldboy,t=test1,u=root,p=123 \
  --where 'id<10000' --no-check-charset --no-delete \
  --limit=1000 --commit-each --progress 1000 --statistics

# 数据清理(直接删除)
pt-archiver --source h=10.0.0.51,P=3307,D=oldboy,t=t100w,u=root,p=123 \
  --where 'id<10000' --purge --limit=1 --no-check-charset

# 数据导出到文件
pt-archiver --source h=10.0.0.51,P=3307,D=oldboy,t=t100w,u=root,p=123 \
  --where '1=1' --no-check-charset --no-delete --file="/tmp/archiver.csv"

2.4 pt-online-schema-change(在线表结构变更)

无锁修改表结构,通过影子表 + 触发器同步 + 原子替换实现。

# 先 dry-run 预览,再 execute 执行
pt-online-schema-change --user=root --password=123 --host=10.0.0.51 --port=3307 \
  --alter "add column state int not null default 1" D=oldboy,t=test1 --print --dry-run

pt-online-schema-change --user=root --password=123 --host=10.0.0.51 --port=3307 \
  --alter "add column state int not null default 1" D=oldboy,t=test1 --print --execute

2.5 pt-table-checksum(主从数据一致性校验)

# 准备:创建校验库和用户
CREATE DATABASE pt CHARACTER SET utf8;
CREATE USER checksum@'10.0.0.%' IDENTIFIED WITH mysql_native_password BY 'checksum';
GRANT ALL ON *.* TO checksum@'10.0.0.%';

# 从库配置 report 信息
vim /data/3309/my.cnf
# report_host='10.0.0.51'
# report_port='3309'

# 执行校验
pt-table-checksum --nocheck-replication-filters --no-check-binlog-format \
  --replicate=pt.checksums --create-replicate-table \
  --databases=test --tables=t1 h=10.0.0.51,P=3307,u=checksum,p=checksum

2.6 pt-table-sync(修复主从数据不一致)

# 先 print 预览修复 SQL,再 execute 执行
pt-table-sync --replicate=pt.checksums --databases test --tables t1 \
  h=10.0.0.51,u=checksum,p=checksum,P=3307 \
  h=10.0.0.51,u=checksum,p=checksum,P=3309 --print

pt-table-sync --replicate=pt.checksums --databases test --tables t1 \
  h=10.0.0.51,u=checksum,p=checksum,P=3307 \
  h=10.0.0.51,u=checksum,p=checksum,P=3309 --execute

2.7 pt-duplicate-key-checker(冗余索引检查)

pt-duplicate-key-checker --database=test --host=10.0.0.51 --user=root --password=123 --port=3307

2.8 pt-kill(会话管理)

场景 关键参数
杀空闲超过 5 秒的连接 --match-command sleep --idle-time 5
杀 SELECT 超过 60 秒 --busy-time 60 --match-info "select|SELECT"
杀指定模式 SQL --match-info "select IFNULL.*"
杀 Locked 状态 --match-state="Locked"
杀指定库+来源 IP --match-db="a" --match-host='10.0.0.11'
杀指定用户 --match-user="root"
杀 query/Execute 状态 --match-command="query|Execute"

通用参数模板:

pt-kill --user=用户名 --password=密码 --victim all \
  --间隔参数 --kill --daemonize \
  -S /tmp/mysql.sock --pid=/tmp/ptkill.pid --print --log=/tmp/pt-kill.log &

2.9 pt-slave-find(主从拓扑发现)

pt-slave-find -h10.0.0.51 -P3307 -uchecksum -pchecksum

2.10 pt-heartbeat(主从延时精确监控)

# 【主库】后台写入心跳记录
pt-heartbeat --user=root --ask-pass --host=10.0.0.51 --port=3307 \
  --create-table -D test --interval=1 --update --replace --daemonize

# 【从库】监控延时
pt-heartbeat --user=root --password=123 --host=10.0.0.51 --port=3309 \
  -D test --table=heartbeat --monitor --file=/tmp/aa.log &

# 模拟延时验证
STOP SLAVE SQL_THREAD;

2.11 pt-show-grants(权限梳理)

pt-show-grants -h10.0.0.51 -P3307 -uchecksum -pchecksum

三、Redis 缓存服务

3.1 安装与配置

cd /usr/local/
wget https://download.redis.io/releases/redis-6.2.10.tar.gz
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

vim /etc/profile
# export PATH=/usr/local/redis/src:$PATH
source /etc/profile

配置文件:

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
EOF

redis-cli shutdown                                    # 关闭默认实例
redis-server /data/6379/redis.conf                    # 加载配置启动

关闭保护模式 + 设置密码:

vim /data/6379/redis.conf
# bind 10.0.0.51 127.0.0.1
# requirepass 123456

redis-cli -h 10.0.0.51 -p 6379 -a 123456

# 运行时查看/修改配置
config get key
config set key 值

3.2 持久化

方式 说明 配置
RDB 快照方式,定时保存数据集到 dump.rdb save 900 1(900秒内至少1次变化则触发)
AOF 追加日志,记录每个写命令 appendonly yes + appendfsync

RDB 手动触发:

save     -- 立即保存(阻塞主线程)
bgsave   -- 后台 fork 子进程保存(推荐,不阻塞)

AOF 同步策略:

策略 说明 性能 安全
always 每个命令立即同步 最差 最高
everysec 每秒同步一次(推荐 中等 中等
no 交给操作系统决定 最好 最低

3.3 基础操作

set key value              -- 设置键值对
get key                    -- 获取值
del key                    -- 删除
expire key 60              -- 设置过期时间(秒)
ttl key                    -- 查看剩余过期时间
persist key                -- 取消过期
exists key                 -- 判断键是否存在
rename old_key new_key     -- 修改键名

3.4 五大数据类型

① String(字符串):

mset id 101 name xiaoQ age 20 gender m     -- 批量设置
incr num_101                                 -- 数值+1
decr num_101                                 -- 数值-1
incrby num_101 10000                         -- 数值+10000
decrby num_101 5000                          -- 数值-5000

② Hash(哈希,缓存数据库行数据):

hmset stu01 id 101 name xiaoQ age 20 gender m   -- 存储一条记录
hmget stu01 id name age gender                   -- 获取指定字段
hgetall stu01                                   -- 获取所有字段

# 从 MySQL 批量缓存到 Redis
SELECT CONCAT("hmset city_",id," id ",id," name ",name)
FROM world.city LIMIT 10 INTO OUTFILE '/tmp/hmset.txt';
cat /tmp/hmset.txt | redis-cli -a 123456         -- 执行批量写入
hgetall city_1                                   -- 验证

③ List(列表,消息/评论场景):

LPUSH wechat "nice day"     -- 左侧插入
LPUSH wechat "bad day"
LPUSH wechat "good day"
lrange wechat 0 -1           -- 获取全部(0 到 -1)

④ Set(集合,交并差运算):

sadd xiaoQ xiaoA xiaoB oldgirl tom     -- 创建集合
SUNION xiaoQ oldboy                     -- 并集
SINTER xiaoQ oldboy                     -- 交集
SDIFF oldboy xiaoQ                      -- 差集

⑤ Sorted Set / ZSet(有序集合,排行榜):

zadd topN 0 smlt 0 fskl 0 fshkl       -- 初始化成员(分数为0)
ZINCRBY topN 100000 smlt                -- smlt 加 100000 分
ZINCRBY topN 1000000 fshkl              -- fshkl 加 1000000 分
ZREVRANGE topN 0 2                      -- 取 Top3(降序)

3.5 事务

multi                    -- 开始事务
set key1 value1
set key2 value2
exec                     -- 提交
# 或
discard                  -- 取消

Redis 事务不支持回滚,命令出错不会被撤销。

3.6 主从同步

第一步:部署多实例(6380 主 + 6381/6382 从):

mkdir -p /data/638{0..2}

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
requirepass 123
masterauth 123              -- 连接主库的密码
EOF
# 6381/6382 配置相同,仅改端口

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

第二步:从库开启同步 + 验证:

redis-cli -p 6381 -a 123 slaveof 127.0.0.1 6380     -- 从库1 指向主库
redis-cli -p 6382 -a 123 slaveof 127.0.0.1 6380     -- 从库2 指向主库

redis-cli -p 6380 -a 123 info replication             -- 主库视角查看同步状态
redis-cli -p 6381 -a 123 info replication             -- 从库视角查看同步状态

# 解除主从
redis-cli -p 6382 -a 123 slaveof no one

3.7 哨兵高可用(Sentinel)

部署哨兵:

mkdir /data/26380

cat >/data/26380/sentinel.conf <<EOF
port 26380
dir "/data/26380"
sentinel monitor mymaster 127.0.0.1 6380 1          -- 监控主库,1=至少1个哨兵同意切换
sentinel down-after-milliseconds mymaster 5000      -- 主库不可达超时(毫秒)
sentinel auth-pass mymaster 123                      -- 主库密码
EOF

redis-sentinel /data/26380/sentinel.conf &>/tmp/sentinel.log &

故障切换验证:

# 模拟主库宕机
redis-cli -p 6380 -a 123 shutdown

# 从库自动选举为新主
redis-cli -p 6381 -a 123 info replication

# 恢复原主库(自动降级为从库)
redis-server /data/6380/redis.conf
redis-cli -p 6381 -a 123 info replication

哨兵实现 Redis 高可用,但前端程序需自行感知地址变化。

3.8 Cluster 集群

架构: 最少 6 节点(3 主 3 从),数据按 16384 个槽位 分布式存储。

第一步:部署 6 个实例(7000~7005):

# Redis 5.0 之前版本需安装 Ruby 插件
yum install ruby rubygems -y
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources --remove http://rubygems.org/
gem install redis -v 3.3.3

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

# 每个实例配置相同,仅端口不同
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

# 启动全部 6 个实例
for i in $(seq 0 5); do redis-server /data/700$i/redis.conf; done

第二步:创建集群(3 主 3 从):

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

集群扩容(添加新主 7006 + 新从 7007):

mkdir /data/700{6..7}
# 编写配置文件(同上,改端口),启动实例
redis-server /data/7006/redis.conf
redis-server /data/7007/redis.conf

# 添加主节点并重新分配槽位
redis-cli --cluster reshard 127.0.0.1:7000
# 根据提示输入:分配多少槽位 → 接收节点ID(7006) → 源节点ID

# 添加从节点(指定其主节点)
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000 \
  --cluster-slave --cluster-master-id <7006的node-id>

集群缩容(删除 7006 主 + 7007 从):

# 第一步:移除 7006 的槽位,分配给 7000/7001/7002
redis-cli --cluster reshard 127.0.0.1:7000

# 第二步:删除从节点 7007
redis-cli --cluster del-node 127.0.0.1:7007 <7007的node-id>

# 第三步:删除主节点 7006
redis-cli --cluster del-node 127.0.0.1:7006 <7006的node-id>

四、MongoDB 文档型数据库入门

4.1 概述

MongoDB 是文档型 NoSQL 数据库,数据以 BSON(类 JSON)格式存储,无固定表结构。

对比项 MySQL MongoDB
数据模型 关系型(表/行/列) 文档型(集合/文档)
Schema 固定表结构 灵活,文档结构可不同
查询语言 SQL JavaScript 风格
扩展方式 垂直/水平拆分 原生分片
适用场景 事务一致性要求高 海量数据、灵活结构、高并发

4.2 基础概念对照

MySQL MongoDB 说明
database database 数据库
table collection 集合(表)
row document 文档(行)
column field 字段(列)
index index 索引
primary key _id 主键(自动生成 ObjectId)

4.3 常用操作

// 插入文档
db.collection.insertOne({name: "xiaoQ", age: 20})
db.collection.insertMany([{name: "a"}, {name: "b"}])

// 查询文档
db.collection.find()                    // 查询全部
db.collection.find({age: 20})           // 条件查询
db.collection.findOne({name: "xiaoQ"})  // 查询一条

// 更新文档
db.collection.updateOne({name: "xiaoQ"}, {$set: {age: 21}})
db.collection.updateMany({}, {$set: {status: 1}})

// 删除文档
db.collection.deleteOne({name: "xiaoQ"})
db.collection.deleteMany({age: {$lt: 18}})

附录:知识要点速查表

类别 要点
Mycat 核心 读写分离(balance=1)、高可用(switchType=1)、垂直/水平分表、全局表(type=global)、ER 表(childTable)
水平分片 范围(autopartition-long)、取模(PartitionByMod)、枚举(PartitionByFileMap)
优化九层 硬件→系统→版本→参数→规范→索引→事务锁→架构→安全
PT-archiver --dest 归档、--purge 清理、--file 导出
PT-osc --dry-run 预览,再 --execute 执行
PT-checksum/sync checksum 校验 → sync 修复(先 print 后 execute)
PT-kill --match-* 匹配条件 + --daemonize 后台运行
Redis 持久化 RDB(save/bgsave)+ AOF(appendonly + appendfsync everysec)
Redis 数据类型 String/Hash/List/Set/ZSet
Redis 高可用 Sentinel 哨兵(自动选主)+ Cluster 集群(16384 槽位分片)
Cluster 操作 --cluster create 创建、--cluster reshard 槽位迁移、--cluster add-node/del-node 扩缩容
posted @ 2026-03-31 23:40  gzjwo  阅读(11)  评论(0)    收藏  举报