GFS分布式文件系统

GFS分布式文件系统

  • 一、GlusterFS 概述
    • 1、GlusterFS简介
    • 2、GlusterFS特点
    • 3、GlusterFS术语
    • 4、模块化堆栈式架构
    • 5、GlusterFS的工作流程
  • 二、HASH算法
    • 1、使用弹性HASH算法来解决数据定位、索引、寻址的功能
    • 2、HASH优点
    • 3、弹性HASH算法
  • 三、GlusterFS卷的分类
    • 1、分布式卷(默认)
    • 2、条带卷(默认)
    • 3、复制卷(Replica volume)
    • 4、分布式条带卷(Distribute Stripe volume)
    • 5、分布式复制卷(Distribute Replica volume)
    • 6、条带复制卷(Stripe Replica volume)
    • 7、分布式条带复制卷(Distribute Stripe Replicavolume)
  • 四、GlusterFS部署
    • 1、准备环境(所有node节点上操作)
      • (1)、关闭防火墙
      • (2)、磁盘分区,并挂载(仅以node1为例,其他节点相同)
      • (3)、修改主机名,配置/etc/hosts文件(所有node节点)
    • 2、安装、启动GlusterFS(所有node节点上操作)
      • (1)、将gfsrepo 软件上传到/opt目录下
    • 3、添加节点到存储信任池中(在 node1 节点上操作)
      • (1)、只要在一台Node节点上添加其它节点即可
      • (2)、在每个Node节点上查看群集状态
    • 4、创建卷(只要在1台节点上创建,对应的节点上检查下状态就可以了)
      • (1)、创建分布式卷
      • (2)、查看卷列表
      • (3)、启动新建分布式卷
      • (4)、查看创建分布式卷信息
      • (5)、创建条带卷
      • (6)、创建复制卷
      • (7)、创建分布式条带卷
      • (8)、创建分布式复制卷
    • 5、部署 Gluster 客户端
      • (1)、安装客户端软件
      • (2)、创建挂载目录
      • (3)、配置 /etc/hosts 文件
      • (4)、挂载 Gluster 文件系统
    • 6、测试 Gluster 文件系统
      • (1)、卷中写入文件,客户端操作
      • (2)、查看文件分布
    • 7、破坏性测试
      • (1)、挂起 node2 节点或者关闭glusterd服务来模拟故障
      • (2)、在客户端上查看文件是否正常
      • (3)、挂起 node2 和 node4 节点,在客户端上查看文件是否正常
      • (4)、总结:

一、GlusterFS 概述

1、GlusterFS简介

  • GlusterFS 是一个开源的分布式文件系统。
  • 由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。
  • 无元数据服务器

2、GlusterFS特点

  • 扩展性和高性能
  • 高可用性
  • 全局统一命名空间
  • 弹性卷管理
  • 基于标准协议

3、GlusterFS术语

  • Brick(块):存储服务器,实际存储用户数据的服务器
  • Volume:本地文件系统的分区
  • FUSE:用户空间的文件系统(类比EXT4),这是一个伪文件系统,用户端的交互模块
  • VFS:内核态的虚拟文件系统,用户是先提交请求交给VFS,然后VFS交给FUSE,再交给GFS客户端,最后由客户端交给远端的存储
  • Glusterd:运行再存储节点的进程(客户端运行的是gluster client),整个GFS之间的交互是由Gluster client 和glusterd完成(GFS使用过程)

4、模块化堆栈式架构

  • 模块化、堆栈式的架构
  • 通过对模块的组合,实现复杂的功能

5、GlusterFS的工作流程

(1)、客户端或应用程序通过GlusterFS的挂载点访问数据。
(2)、linux系统内核通过VFS API收到请求并处理。
(3)、VFS将数据递交给FUSE内核文件系统, fuse文件系统则是将数据通过/dev/fuse设备文件递交给了GlusterFS client端。可以将 FUSE 文件系统理解为一个代理。
(4)、GlusterFS client 收到数据后,client根据配置文件的配置对数据进行处理。
(5)、通过网络将数据传递至远端的GlusterFS Server,并且将数据写入到服务器存储设备上。

二、HASH算法

在多个后端存储中如何定位文件

1、使用弹性HASH算法来解决数据定位、索引、寻址的功能

  • 先通过HASH算法对数据可以得到一个值(该值由2的32次方个组合)
  • 每个数据对应了0-2的32次方的一个值

2、HASH优点

平均分配,当数据量越来越大的时候,相对每个存储节点的数据量(几率)是相等的
而如果考虑到单点故障问题,当数据存储在C存储节点,对此GFS是有备份机制,默认3备份,所以GFS本身的机制会对数据产生冗余,以此解决单点故障

3、弹性HASH算法

  • 通过HASH算法得到一个固定长度的数据(这里是32位整数)
  • 通常情况下, 不同数据得到的结果是不同的
  • 为了解决分布式文件数据索引、定位的复杂程度,而使用了HASH算法来辅助

三、GlusterFS卷的分类

GlusterFS支持七种卷,即分布式卷、条带卷、复制卷、分布式条带卷、分布式复制卷、条带复制卷和分布式条带复制卷

1、分布式卷(默认)

文件通过HASH算法分不到所有Brick Server上
这种卷是GlusterFS的基础;以文件为单位根据HASH算法散列到不同的Brick,其实只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件级的RAID 0,不具有容错能力

特点:

  • 文件分布在不同的服务器,不具备冗余性。
  • 更容易和廉价地扩展卷的大小。
  • 单点故障会造成数据丢失。
  • 依赖底层的数据保护。

2、条带卷(默认)

类似 RAID0,文件被分成数据块并以轮询的方式分布到多个 Brick Server 上,文件存储以数据块为单位,支持大文件存储, 文件越大,读取效率越高。

特点

  • 数据被分割成更小块分布到块服务器群中的不同条带区。
  • 分布减少了负载且更小的文件加速了存取的速度。
  • 没有数据冗余。

3、复制卷(Replica volume)

将文件同步到多个 Brick 上,使其具备多个文件副本,属于文件级 RAID 1,具有容错能力。因为数据分散在多个 Brick 中, 所以读性能得到很大提升,但写性能下降。

特点

  • 卷中所有的服务器均保存一个完整的副本。
  • 卷的副本数量可由客户创建的时候决定
  • 至少由两个块服务器或更多服务器
  • 具备冗余性

4、分布式条带卷(Distribute Stripe volume)

Brick Server 数量是条带数(数据块分布的 Brick 数量)的倍数,兼具分布式卷和条带卷的特点。主要用于大文件访问处理,创建一个分布式条带卷最少需要 4 台服务器。

5、分布式复制卷(Distribute Replica volume)

Brick Server 数量是镜像数(数据副本数量)的倍数,兼具分布式卷和复制卷的特点,用于需要冗余的情况。

6、条带复制卷(Stripe Replica volume)

类似 RAID 10,同时具有条带卷和复制卷的特点

7、分布式条带复制卷(Distribute Stripe Replicavolume)

三种基本卷的复合卷,通常用于类Map Reduce应用

四、GlusterFS部署

一台centos7虚拟机,IP地址为:192.168.246.10,主机名为:node1,添加4块磁盘,分别为3G,4G,5G,6G大小

一台centos7虚拟机,IP地址为:192.168.246.20,主机名为:node2,添加4块磁盘,分别为3G,4G,5G,6G大小

一台centos7虚拟机,IP地址为:192.168.246.30,主机名为:node3,添加3块磁盘,分别为3G,4G,5G大小

一台centos7虚拟机,IP地址为:192.168.246.40,主机名为:node4,添加3块磁盘,分别为3G,4G,5G大小

一台centos7虚拟机,IP地址为:192.168.246.50,主机名为:client,当做测试机使用

将要使用的卷名称和信息

GFS分布式文件系统_第1张图片

1、准备环境(所有node节点上操作)

(1)、关闭防火墙

systemctl stop firewalld
setenforce 0

GFS分布式文件系统_第2张图片

(2)、磁盘分区,并挂载(仅以node1为例,其他节点相同)

虚拟机设置----添加----硬盘,下一步----SCSI(推荐),下一步----创建新的虚拟磁盘,下一步----最大磁盘大小(自定义),勾选将虚拟磁盘拆分成多个文件,下一步----完成,相同方法添加其他的磁盘(除了client客户机),磁盘添加后需要重启一下才能识别到磁盘

vim fdisk.sh
#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
do
   echo -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/null
   mkfs.xfs /dev/${VAR}"1" &> /dev/null
   mkdir -p /data/${VAR}"1" &> /dev/null
   echo "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null

chmod +x /opt/fdisk.sh
cd /opt/
./fdisk.sh

df -Th

GFS分布式文件系统_第3张图片
GFS分布式文件系统_第4张图片

(3)、修改主机名,配置/etc/hosts文件(所有node节点)

#以Node1节点为例:
hostnamectl set-hostname node1
su

echo "192.168.246.10 node1" >> /etc/hosts
echo "192.168.246.20 node2" >> /etc/hosts
echo "192.168.246.30 node3" >> /etc/hosts
echo "192.168.246.40 node4" >> /etc/hosts

GFS分布式文件系统_第5张图片

2、安装、启动GlusterFS(所有node节点上操作)

(1)、将gfsrepo 软件上传到/opt目录下

cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak

cd /opt
unzip gfsrepo.zip

cd /etc/yum.repos.d/
vim glfs.repo
[glusterfs]
name=glusterfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

yum clean all && yum makecache
##yum -y install centos-release-gluster			#如采用官方 YUM 源安装,可以直接指向互联网仓库

yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma

systemctl start glusterd.service 
systemctl enable glusterd.service
systemctl status glusterd.service

GFS分布式文件系统_第6张图片
GFS分布式文件系统_第7张图片

3、添加节点到存储信任池中(在 node1 节点上操作)

(1)、只要在一台Node节点上添加其它节点即可

gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4

(2)、在每个Node节点上查看群集状态

gluster peer status

GFS分布式文件系统_第8张图片

4、创建卷(只要在1台节点上创建,对应的节点上检查下状态就可以了)

#根据规划创建如下卷:
卷名称 				卷类型				Brick
dis-volume			分布式卷				node1(/data/sdb1)、node2(/data/sdb1)
stripe-volume		条带卷				node1(/data/sdc1)、node2(/data/sdc1)
rep-volume			复制卷				node3(/data/sdb1)、node4(/data/sdb1)
dis-stripe			分布式条带卷			node1(/data/sdd1)、node2(/data/sdd1)、node3(/data/sdd1)、node4(/data/sdd1)
dis-rep				分布式复制卷			node1(/data/sde1)、node2(/data/sde1)、node3(/data/sde1)、node4(/data/sde1)

(1)、创建分布式卷

  • 创建分布式卷,没有指定类型,默认创建的是分布式卷
gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force

(2)、查看卷列表

gluster volume list

(3)、启动新建分布式卷

gluster volume start dis-volume

(4)、查看创建分布式卷信息

gluster volume info dis-volume

GFS分布式文件系统_第9张图片

(5)、创建条带卷

  • 指定类型为 stripe,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是条带卷
gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force
gluster volume start stripe-volume
gluster volume info stripe-volume

GFS分布式文件系统_第10张图片

(6)、创建复制卷

  • 指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷
gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force
gluster volume start rep-volume
gluster volume info rep-volume

GFS分布式文件系统_第11张图片

(7)、创建分布式条带卷

  • 指定类型为 stripe,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式条带卷
gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 force
gluster volume start dis-stripe
gluster volume info dis-stripe

GFS分布式文件系统_第12张图片

(8)、创建分布式复制卷

  • 指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷
gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 force
gluster volume start dis-rep
gluster volume info dis-rep	
gluster volume list

GFS分布式文件系统_第13张图片

5、部署 Gluster 客户端

(1)、安装客户端软件

  • 将gfsrepo 软件上传到/opt目下
cd /etc/yum.repos.d/
mkdir repo.bak
mv *.repo repo.bak

cd /opt
unzip gfsrepo.zip

vim glfs.repo
[glusterfs]
name=glusterfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1

yum clean all && yum makecache

yum -y install glusterfs glusterfs-fuse

GFS分布式文件系统_第14张图片

(2)、创建挂载目录

mkdir -p /test/{dis,stripe,rep,dis_stripe,dis_rep}
ls /test

(3)、配置 /etc/hosts 文件

echo "192.168.246.10 node1" >> /etc/hosts
echo "192.168.246.20 node2" >> /etc/hosts
echo "192.168.246.30 node3" >> /etc/hosts
echo "192.168.246.40 node4" >> /etc/hosts

(4)、挂载 Gluster 文件系统

  • 临时挂载
mount.glusterfs node1:dis-volume /test/dis
mount.glusterfs node1:stripe-volume /test/stripe
mount.glusterfs node1:rep-volume /test/rep
mount.glusterfs node1:dis-stripe /test/dis_stripe
mount.glusterfs node1:dis-rep /test/dis_rep

df -Th

GFS分布式文件系统_第15张图片

  • 永久挂载
vim /etc/fstab
node1:dis-volume		/text/dis				glusterfs		defaults,_netdev		0 0
node1:stripe-volume		/text/stripe			glusterfs		defaults,_netdev		0 0
node1:rep-volume		/text/rep				glusterfs		defaults,_netdev		0 0
node1:dis-stripe		/text/dis_and_stripe	glusterfs		defaults,_netdev		0 0
node1:dis-rep			/text/dis_and_rep		glusterfs		defaults,_netdev		0 0

mount -a

6、测试 Gluster 文件系统

(1)、卷中写入文件,客户端操作

cd /opt
dd if=/dev/zero of=/opt/demo1.log bs=1M count=40
dd if=/dev/zero of=/opt/demo2.log bs=1M count=40
dd if=/dev/zero of=/opt/demo3.log bs=1M count=40
dd if=/dev/zero of=/opt/demo4.log bs=1M count=40
dd if=/dev/zero of=/opt/demo5.log bs=1M count=40

ls -lh /opt

cp demo* /test/dis
cp demo* /test/stripe/
cp demo* /test/rep/
cp demo* /test/dis_stripe/
cp demo* /test/dis_rep/

(2)、查看文件分布

#查看分布式文件分布
[root@node1 ~]# ls -lh /data/sdb1					#数据没有被分片
总用量 160M
-rw-r--r-- 2 root root 40M 12 18 14:50 demo1.log
-rw-r--r-- 2 root root 40M 12 18 14:50 demo2.log
-rw-r--r-- 2 root root 40M 12 18 14:50 demo3.log
-rw-r--r-- 2 root root 40M 12 18 14:50 demo4.log

GFS分布式文件系统_第16张图片

[root@node2 ~]# ll -h /data/sdb1
总用量 40M
-rw-r--r-- 2 root root 40M 12 18 14:50 demo5.log

GFS分布式文件系统_第17张图片

#查看条带卷文件分布
[root@node1 ~]# ls -lh /data/sdc1					#数据被分片50% 没副本 没冗余
总用量 101M
-rw-r--r-- 2 root root 20M 12 18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo4.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo5.log

GFS分布式文件系统_第18张图片

[root@node2 ~]# ll -h /data/sdc1					#数据被分片50% 没副本 没冗余
总用量 101M
-rw-r--r-- 2 root root 20M 12 18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo4.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo5.log

GFS分布式文件系统_第19张图片

#查看复制卷分布
[root@node3 ~]# ll -h /data/sdb1					#数据没有被分片 有副本 有冗余     
总用量 201M
-rw-r--r-- 2 root root 40M 12 18 14:51 demo1.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo2.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo3.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo4.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo5.log

GFS分布式文件系统_第20张图片

[root@node4 ~]# ll -h /data/sdb1					#数据没有被分片 有副本 有冗余
总用量 201M
-rw-r--r-- 2 root root 40M 12 18 14:51 demo1.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo2.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo3.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo4.log
-rw-r--r-- 2 root root 40M 12 18 14:51 demo5.log

GFS分布式文件系统_第21张图片

#查看分布式条带卷分布
[root@node1 ~]# ll -h /data/sdd1					#数据被分片50% 没副本 没冗余
总用量 81M
-rw-r--r-- 2 root root 20M 12 18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo4.log

GFS分布式文件系统_第22张图片

[root@node2 ~]# ll -h /data/sdd1
总用量 81M
-rw-r--r-- 2 root root 20M 12 18 14:51 demo1.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo2.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo3.log
-rw-r--r-- 2 root root 20M 12 18 14:51 demo4.log

GFS分布式文件系统_第23张图片

[root@node3 ~]# ll -h /data/sdd1
总用量 21M
-rw-r--r-- 2 root root 20M 12 18 14:51 demo5.log

在这里插入图片描述

[root@node4 ~]# ll -h /data/sdd1
总用量 21M
-rw-r--r-- 2 root root 20M 12 18 14:51 demo5.log

在这里插入图片描述

#查看分布式复制卷分布								#数据没有被分片 有副本 有冗余
[root@node1 ~]# ll -h /data/sde1
总用量 120M
-rw-r--r-- 2 root root 40M 3   2 19:19 demo1.log
-rw-r--r-- 2 root root 40M 3   2 19:19 demo2.log
-rw-r--r-- 2 root root 40M 3   2 19:19 demo3.log

GFS分布式文件系统_第24张图片

[root@node2 ~]# ll -h /data/sde1
总用量 120M
-rw-r--r-- 2 root root 40M 3   2 19:19 demo1.log
-rw-r--r-- 2 root root 40M 3   2 19:19 demo2.log
-rw-r--r-- 2 root root 40M 3   2 19:19 demo3.log

GFS分布式文件系统_第25张图片

[root@node3 ~]# ll -h /data/sde1
总用量 80M
-rw-r--r--. 2 root root 40M 3   2 19:19 demo4.log
-rw-r--r--. 2 root root 40M 3   2 19:19 demo5.log 

在这里插入图片描述

[root@node4 ~]# ll -h /data/sde1
总用量 80M
-rw-r--r--. 2 root root 40M 3   2 19:19 demo4.log
-rw-r--r--. 2 root root 40M 3   2 19:19 demo5.log

在这里插入图片描述

7、破坏性测试

(1)、挂起 node2 节点或者关闭glusterd服务来模拟故障

[root@node2 ~]# systemctl stop glusterd.service

(2)、在客户端上查看文件是否正常

  • 分布式卷数据查看
[root@localhost dis]# ll 						#在客户上发现少了demo5.log文件,这个是在node2上的
总用量 163840
-rw-r--r-- 1 root root 41943040 12 18 14:50 demo1.log
-rw-r--r-- 1 root root 41943040 12 18 14:50 demo2.log
-rw-r--r-- 1 root root 41943040 12 18 14:50 demo3.log
-rw-r--r-- 1 root root 41943040 12 18 14:50 demo4.log

  • 条带卷
[root@localhost text]# cd stripe/				#无法访问,条带卷不具备冗余性
[root@localhost stripe]# ll
总用量 0

  • 分布式条带卷
[root@localhost dis_and_stripe]# ll				#无法访问,分布条带卷不具备冗余性
总用量 40960
-rw-r--r-- 1 root root 41943040 12 18 14:51 demo5.log

  • 分布式复制卷
[root@localhost dis_and_rep]# ll				#可以访问,分布式复制卷具备冗余性
总用量 204800
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo1.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo2.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo3.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo4.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo5.log

(3)、挂起 node2 和 node4 节点,在客户端上查看文件是否正常

  • 测试复制卷是否正常
[root@localhost rep]# ls -l						#在客户机上测试正常 数据有
总用量 204800
-rw-r--r-- 1 root root 41943040 12 18 14:51 demo1.log
-rw-r--r-- 1 root root 41943040 12 18 14:51 demo2.log
-rw-r--r-- 1 root root 41943040 12 18 14:51 demo3.log
-rw-r--r-- 1 root root 41943040 12 18 14:51 demo4.log
-rw-r--r-- 1 root root 41943040 12 18 14:51 demo5.log

  • 测试分布式条卷是否正常
[root@localhost dis_stripe]# ll					#在客户机上测试正常 没有数据 
总用量 0
  • 测试分布式复制卷是否正常
[root@localhost dis_and_rep]# ll				#在客户机上测试正常 有数据
总用量 204800
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo1.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo2.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo3.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo4.log
-rw-r--r-- 1 root root 41943040 12 18 14:52 demo5.log

(4)、总结:

==上述实验测试,凡是带复制数据,相比而言,数据比较安全 ==
拓展下其他维护命令:

#其他的维护命令:
1.查看GlusterFS卷
gluster volume list 

2.查看所有卷的信息
gluster volume info

3.查看所有卷的状态
gluster volume status

4.停止一个卷
gluster volume stop dis-stripe

5.删除一个卷,注意:删除卷时,需要先停止卷,且信任池中不能有主机处于宕机状态,否则删除不成功
gluster volume delete dis-stripe

6.设置卷的访问控制
#仅拒绝
gluster volume set dis-rep auth.allow 192.168.246.10

#仅允许
gluster volume set dis-rep auth.allow 192.168.246.*	  #设置192.168.246.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)

你可能感兴趣的:(mysql,mysql)