精华内容
下载资源
问答
  • 可能很多用户并不太清楚,现在由品牌云服务商优惠活动首发及大品牌云服务商代金券免费领取平台“尊托云数zuntop.cn”来为大家解读一二:云服务器是在云中提供可扩展的计算服务,避免了使用传统服务器需要预估资源...

    什么叫云服务器?云服务器的概念及优势

    对于云服务器的概念以及云服务器的优势,可能很多用户并不太清楚,现在由品牌云服务商优惠活动首发及大品牌云服务商代金券免费领取平台“尊托云数zuntop.cn”来为大家解读一二:云服务器是在云中提供可扩展的计算服务,避免了使用传统服务器时需要预估资源用量及前期投入的情况。云服务器支持用户自定义一切资源:cpu、内存、硬盘、网络、安全等等,并可在访问量和负载等需求发生变化时轻松地调整它们。

    云服务器为业务用户提供稳定性和安全性,因为任何软件问题都与您的环境隔离。其他云服务器不会影响您的云服务器,反之亦然。如果其他用户超载其云服务器,则与物理服务器不同,这对您的云服务器没有影响。

    云服务器稳定,快速且安全。它们避免了物理服务器出现的硬件问题,对于希望降低IT预算的企业而言,它们可能是最稳定的选择。

    云服务器可为您提供更快捷的服务。与类似价格的物理服务器相比,您将获得更多资源和更快的服务。云托管网站运行速度更快。

    您可以通过云服务器获得可扩展性。通过增加内存和磁盘空间以及更实惠的方式升级非常简单快捷。

    与传统物理主机相比,云服务器的优势是什么?

    云服务价格低于传统的物理主机租用。具有快速供应和部署能力,用户在提交云主机租用申请后可实时开通,立即获得。业务支持平滑扩展,当用户业务规模扩张时,可快速实现业务扩容。

    云主机能在线升级内存、磁盘,更换机房,更换操作系统,内置冗余的共享存储和智能备份。大多数物理服务器租用是单硬盘无备份,数据容易丢失。云主机具有更方便的系统维护功能,重装系统最快只需3~5分钟即可完成。

    云服务器支持电子商务、论坛、SNS、企业网站、OA系统等互联网建站应用,适合注重主机服务性价比的用户;需要快速实现分布式部署的用户;对业务的弹性扩展能力有需求的用户;有系统高可用性和快速恢复需求的用户;希望轻松管理系统的用户等。

    展开全文
  • 云服务器存储扩详解

    千次阅读 2020-08-06 10:26:12
    云服务器存储扩详解 2020-01-20阅读 6640 环境说明 Linux操作系统:CentOS Linux release 7.6.1810 (Core) 平台环境:腾讯云CVM,CBS 本教程相关视频教程:腾讯云大学-云服务器存储扩 1. 存储扩概述 ...

    云服务器存储扩容详解

    2020-01-20阅读 6640

    环境说明

    Linux操作系统:CentOS Linux release 7.6.1810 (Core)

    平台环境:腾讯云CVM,CBS

    本教程相关视频教程:腾讯云大学-云服务器存储扩容


    1. 存储扩容概述

    随着业务的发展,业务数据不停的增长,原有的磁盘空间可能会出现磁盘空间不够用的情况,因此,需要对磁盘空间进行扩容,以满足业务数据增长的需求,以下图为例,假如起初购买了100G磁盘空间,随着数据的不停增长,原有100G空间不够用了,将空间扩容至200G,CBS是腾讯云提供用于云服务器的持久性数据块级存储服务,云盘具有弹性,按需扩容特性,云盘可以任意的按需扩容。

    存储扩容概述

    不过云盘扩容时不是所有的场景下都可以任意扩容,云盘扩容具有两个限制:

    • 系统盘不支持扩容,理论上系统盘也能够支持扩容,系统盘存放操作系统数据,扩容可能会造成系统启动异常
    • 本地盘不支持扩容,本地盘使用宿主机的本地盘,本地盘弹性扩容能力没有云盘灵活,无法支持弹性按需扩容

    要深入掌握云盘的扩容,需要掌握云盘的使用方式,在Linux下通常有如下三种使用方式:

    1. 裸设备创建文件系统,不需要创建任何分区,直接在裸盘上创建文件系统
    2. 磁盘上创建MBR格式的分区,适用于小于2T的多个磁盘分区的场景
    3. 磁盘上创建GPT格式的分区,适用于大于2T的多个磁盘分区的场景

    2. Linux云服务器存储扩容

    2.1. 裸设备磁盘使用

    Linux系统中可以直接在裸设备磁盘上创建文件系统,即磁盘不需要创建任何磁盘分区,直接在磁盘上创文件文件系统并挂载使用,其具有如下特点:

    • 磁盘不需要多个分区
    • 适用于大于2T磁盘
    • 简单易使用
    • 后期支持在线扩容

    裸设备文件创建文件系统

    上图所示是在Linux系统中直接在裸设备创建文件系统的操作步骤,先在控制台购买好云盘并将其挂载到CVM中,然后登陆到Linux系统中对磁盘格式化文件系统并挂载使用,控制台购买和挂载请自行操作,如下演示在Linux系统中裸设备文件系统的使用步骤:

    1、 登陆操作系统,通过fdisk -l获取磁盘的名称,系统有两块磁盘vda和vdb,/dev/vdb是我们操作的磁盘

    [root@VM_0_89_centos ~]# fdisk -l
    
    Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors   #vda为系统盘
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x0009ac89
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *        2048   104857566    52427759+  83  Linux
    
    Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors   #vdb为数据盘
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

    2、直接在磁盘上创建文件系统(注:并未在磁盘上创建任何分区),根据需要格式化为ext4或xfs格式

    [root@VM_0_89_centos ~]# mkfs.ext4 /dev/vdb		#创建文件ext4文件系统
    mke2fs 1.42.9 (28-Dec-2013)
    Filesystem label=
    OS type: Linux
    Block size=4096 (log=2)
    Fragment size=4096 (log=2)
    Stride=0 blocks, Stripe width=0 blocks
    6553600 inodes, 26214400 blocks
    1310720 blocks (5.00%) reserved for the super user
    First data block=0
    Maximum filesystem blocks=2174746624
    800 block groups
    32768 blocks per group, 32768 fragments per group
    8192 inodes per group
    Superblock backups stored on blocks: 
    	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
    	4096000, 7962624, 11239424, 20480000, 23887872
    
    Allocating group tables: done                            
    Writing inode tables: done                            
    Creating journal (32768 blocks): done
    Writing superblocks and filesystem accounting information: done  
    
    备注:如果要创建为xfs则使用mkfs.xfs /dev/vdb

    3、创建好文件系统后即可挂载到系统中使用,使用方式有两种:临时mount和编写fstab实现持久性挂载,线上环境推荐使用编写fstab的方式,避免机器下次重启后磁盘信息未加载,挂载名称推荐使用UUID

    blkid获取磁盘UUID信息
    [root@VM_0_89_centos ~]# blkid /dev/vdb    
    /dev/vdb: UUID="7fb2c90a-fcd1-472c-b07c-8a20e2e9a436" TYPE="ext4"
    
    编写/etc/fstab,其内容如下
    UUID="7fb2c90a-fcd1-472c-b07c-8a20e2e9a436" /data		  ext4 	  defaults	0 0 

    4、挂载点目录/data需要提前创建好,然后执行mount -a进行加载,mount -a是系统启动时之行的指令,如果fstab编写有误要及时修复,避免影响下次开机启动

    执行挂载操作
    [root@VM_0_89_centos ~]# mount -a 
    
    检查挂载情况
    [root@VM_0_89_centos ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        485M     0  485M   0% /dev
    tmpfs           496M   24K  496M   1% /dev/shm
    tmpfs           496M  444K  496M   1% /run
    tmpfs           496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1        50G  1.8G   46G   4% /
    tmpfs           100M     0  100M   0% /run/user/0
    /dev/vdb         99G   61M   94G   1% /data				#vdb磁盘已顺利挂载到系统中,大小为100G

    至此,基于Linux系统上使用裸盘构建文件系统并使用操作演示完毕,通过操作可知,裸盘上创建文件系统方式不需要对磁盘进行分区,操作便捷容易,且方便扩容,下章节中演示基于裸设备文件文件系统存储空间扩容。

    2.2 裸设备磁盘扩容

    裸设备扩容

    上述步骤是裸设备磁盘的扩容方式,扩容过程中存在数据损坏的风险,为了避免扩容过程中误操作,强烈建议扩容前对磁盘做快照,避免数据损坏时可以做恢复,谨记!做完快照后在控制台完成磁盘的扩容,扩容完毕后需要在操作系统中识别到扩容的空间,以磁盘扩容至200G为例,演示在Linux中裸设备扩容的操作过程:

    1、 确认磁盘的使用方式,通过fdisk -l查看磁盘并未创建有任何磁盘分区

    [root@VM_0_89_centos ~]# fdisk -l /dev/vdb
    
    Disk /dev/vdb: 214.7 GB, 214748364800 bytes, 419430400 sectors    #磁盘空间已扩容至200G
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes        #当前磁盘上未创建任何分区
    
    #使用blkid查看vdb磁盘文件系统的情况,可得知,当前/dev/vdb未创建磁盘分区,切构建了ext4文件系统
    [root@VM_0_89_centos ~]# blkid
    /dev/sr0: UUID="2020-01-13-22-30-05-00" LABEL="config-2" TYPE="iso9660" 
    /dev/vda1: UUID="4b499d76-769a-40a0-93dc-4a31a59add28" TYPE="ext4" 
    /dev/vdb: UUID="7fb2c90a-fcd1-472c-b07c-8a20e2e9a436" TYPE="ext4"   #直接在裸盘上创建ext4文件系统

    2、确认为云盘的扩容方式为裸盘后,根据文件系统的类型,在文件系统层面扩容以识别到云盘的扩容空间

    [root@VM_0_89_centos ~]# resize2fs /dev/vdb 
    resize2fs 1.42.9 (28-Dec-2013)
    Filesystem at /dev/vdb is mounted on /data; on-line resizing required
    old_desc_blocks = 13, new_desc_blocks = 25
    The filesystem on /dev/vdb is now 52428800 blocks long.    #提示已经扩容至52428800个block
    
    备注:如果是xfs,则使用xfs_growfs /dev/vdb扩容

    3、校验磁盘空间扩容情况,使用df -H校验,vdb磁盘已在文件系统扩容至200G

    [root@VM_0_89_centos ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        485M     0  485M   0% /dev
    tmpfs           496M   24K  496M   1% /dev/shm
    tmpfs           496M  444K  496M   1% /run
    tmpfs           496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1        50G  1.8G   46G   4% /
    tmpfs           100M     0  100M   0% /run/user/0
    /dev/vdb        197G   60M  188G   1% /data    #已扩容至200G

    通过上述的操作演示可知,裸盘上并未创建任何磁盘分区,因此扩容过程相当便捷,直接在文件系统上扩容即可,使用简单,这也是云上推荐使用方式。

    2.3 MBR磁盘分区

    如果磁盘需要创建多个分区并将分区挂载到不同的目录中使用需要对磁盘进行分区,传统的磁盘分区方式会使用MBR的格式进行分区,MBR分区具有如下特性:

    • 适用于小于2T的磁盘,大于2T的空间将无法识别
    • 单块磁盘需要创建多个分区的场景
    • MBR最多支持7个分区,即3个主分区+4个扩展分区

    MBR磁盘分区使用

    如上图是对磁盘制作MBR格式分区的操作步骤,在控制台购买并挂载到CVM云主机后,登录到操作系统中对磁盘进行分区和使用,如下以新购的一块100G磁盘为例演示基于cbs云盘上创建MBR磁盘分区的过程

    1、使用fdisk -l获取到到磁盘的名称,包含两块磁盘vda和vdb,vdb是我们需要操作的cbs云盘

    [root@VM_0_89_centos ~]# fdisk -l
    
    Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x0009ac89
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *        2048   104857566    52427759+  83  Linux
    
    Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

    2、使用fdisk工具对磁盘进行分区,fdisk /dev/vdb进入到fdisk交互式界面,通过交互式完成分区创建

    [root@VM_0_89_centos ~]# fdisk  /dev/vdb
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    Device does not contain a recognized partition table
    Building a new DOS disklabel with disk identifier 0x5eeb4bc8.
    
    Command (m for help): m      #输入m可以获取到操作指令的帮助
    Command action
       a   toggle a bootable flag
       b   edit bsd disklabel
       c   toggle the dos compatibility flag
       d   delete a partition             #删除分区
       g   create a new empty GPT partition table
       G   create an IRIX (SGI) partition table
       l   list known partition types
       m   print this menu                #获取帮助
       n   add a new partition            #创建分区
       o   create a new empty DOS partition table
       p   print the partition table      #显示分区情况
       q   quit without saving changes    #退出,不保存
       s   create a new empty Sun disklabel
       t   change a partition's system id
       u   change display/entry units
       v   verify the partition table
       w   write table to disk and exit   #保存分区设置
       x   extra functionality (experts only)
    
    Command (m for help): n         #新建分区,输入n进入到新建分区交互界面
    Partition type:
       p   primary (0 primary, 0 extended, 4 free)
       e   extended
    Select (default p): p            #选择分区类型,p表示主分区,e代表扩展分区
    Partition number (1-4, default 1):          #分区号码
    First sector (2048-209715199, default 2048):   #起始扇区范围 
    Using default value 2048
    Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199):    #结束删除范围
    Using default value 209715199
    Partition 1 of type Linux and of size 100 GiB is set
    
    Command (m for help): p         #显示分区情况,可以看到已创建一个vdb1的分区
    
    Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x5eeb4bc8
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vdb1            2048   209715199   104856576   83  Linux   #磁盘分区的信息
    
    Command (m for help): w      #报错退出
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    Syncing disks.

    3、使用partprobe将分区的信息同步给内核,让内核识别到该分区信息

    [root@VM_0_89_centos ~]# partprobe /dev/vdb

    4、接下来可以对分区制作文件系统,制作成操作系统能够识别的文件系统,以制作xfs文件系统为例

    [root@VM_0_89_centos ~]# mkfs.xfs /dev/vdb1 
    meta-data=/dev/vdb1              isize=512    agcount=4, agsize=6553536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=26214144, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=12799, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    
    [root@VM_0_89_centos ~]# blkid 
    /dev/sr0: UUID="2020-01-13-22-30-05-00" LABEL="config-2" TYPE="iso9660" 
    /dev/vda1: UUID="4b499d76-769a-40a0-93dc-4a31a59add28" TYPE="ext4" 
    /dev/vdb1: UUID="c387af37-56d7-436c-8ceb-0a735e0db5d5" TYPE="xfs"          #文件系统制作为xfs
    
    备注:如果是制作为ext4则使用mkfs.ext4 /dev/vdb1

    5、编写fstab挂载到系统中,确保下次开机后配置生效

    [root@VM_0_89_centos ~]# vim/etc/fstab 
    UUID="c387af37-56d7-436c-8ceb-0a735e0db5d5" /data		  xfs	  defaults 	  0 0

    6、执行mount -a加载挂载配置,并检查挂载情况

    [root@VM_0_89_centos ~]# mount -a
    
    [root@VM_0_89_centos ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        485M     0  485M   0% /dev
    tmpfs           496M   24K  496M   1% /dev/shm
    tmpfs           496M  448K  496M   1% /run
    tmpfs           496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1        50G  1.9G   46G   4% /
    tmpfs           100M     0  100M   0% /run/user/0
    /dev/vdb1       100G   33M  100G   1% /data    #磁盘已经挂载到系统中

    2.4 MBR磁盘扩容

    MBR格式的磁盘扩容需要在MBR磁盘分区中扩展空间,并在文件系统中扩展文件系统空间以识别到扩容的空间,腾讯云为此提供了一个专门扩容的脚本devresize.py,脚本要求条件如下:

    • 文件系统是 EXT2/EXT3/EXT4/XFS
    • 当前文件系统不能有错误
    • 扩容后的磁盘大小不超过2TB
    • 当前工具仅支持 Python 2 版本,不支持 Python 3 版本

    MBR格式磁盘分区扩容

    如上图为MBR格式磁盘的扩容步骤,现在控制台中做好快照,并扩容,然后登录到操作系统中完成分区和文件系统的扩容,如下以扩容至200G为例演示在MBR格式的磁盘分区扩容方法

    1、 检查磁盘的扩容,确认扩容的方式,根据System类型为Linux判断为MBR格式的分区

    [root@VM_0_89_centos ~]# fdisk -l /dev/vdb
    
    Disk /dev/vdb: 214.7 GB, 214748364800 bytes, 419430400 sectors   #空间大小已扩容至200G
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x5eeb4bc8
    
       Device Boot      Start         End      Blocks   Id  System   #System类型为Linux表示使用MBR格式分区
    /dev/vdb1            2048   209715199   104856576   83  Linux

    2、获取扩容的脚本,该脚本可以完成分区的扩容和文件系统的自动扩容,需要离线执行,因此先需要卸载磁盘

    [root@VM_0_89_centos ~]# wget -O /tmp/devresize.py https://raw.githubusercontent.com/tencentyun/tencentcloud-cbs-tools/master/devresize/devresize.py
    
    无法在线执行,需卸载磁盘
    [root@VM_0_89_centos ~]# python /tmp/devresize.py /dev/vdb
    [ERROR] - Target partition /dev/vdb1 must be unmounted.
    [root@VM_0_89_centos ~]# umount  /dev/vdb1

    3、执行扩容步骤

    [root@VM_0_89_centos ~]# python /tmp/devresize.py /dev/vdb
    [INFO] - checking filesystem healthy
    Phase 1 - find and verify superblock...
    Phase 2 - using internal log
            - zero log...
            - scan filesystem freespace and inode maps...
            - found root inode chunk
    Phase 3 - for each AG...
            - scan and clear agi unlinked lists...
            - process known inodes and perform inode discovery...
            - agno = 0
            - agno = 1
            - agno = 2
            - agno = 3
            - process newly discovered inodes...
    Phase 4 - check for duplicate blocks...
            - setting up duplicate extent list...
            - check for inodes claiming duplicate blocks...
            - agno = 0
            - agno = 1
            - agno = 2
            - agno = 3
    Phase 5 - rebuild AG headers and trees...
            - reset superblock...
    Phase 6 - check inode connectivity...
            - resetting contents of realtime bitmap and summary inodes
            - traversing filesystem ...
            - traversal finished ...
            - moving disconnected inodes to lost+found ...
    Phase 7 - verify and correct link counts...
    done
    [INFO] - mount /dev/vdb1 /tmp/mount_point_vdb_2020-01-14_16:04:30
    [INFO] - umount /dev/vdb1
    This operation will extend /dev/vdb1 to the last sector of device. 
    To ensure the security of your valuable data, 
    please create a snapshot of this volume before resize its file system, continue? [Y/n]
    y                                #提示是否创建快照,确保做好快照后输入y继续
    It will resize (/dev/vdb1).
    This operation may take from several minutes to several hours, continue? [Y/n]  #备份并resize,确认输入y      
    y
    [INFO] - Backup MBR to /tmp/MBR_vdb1_2020-01-14_16:04:40_bak
    [INFO] - mount /dev/vdb1 /tmp/mount_point_vdb_2020-01-14_16:04:30
    [INFO] - resize filesystem
    meta-data=/dev/vdb1              isize=512    agcount=4, agsize=6553536 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0 spinodes=0
    data     =                       bsize=4096   blocks=26214144, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal               bsize=4096   blocks=12799, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    data blocks changed from 26214144 to 52428544
    [INFO] - umount /dev/vdb1
    [INFO] - Finished

    4、重新挂载文件系统并确认扩容空间

    [root@VM_0_89_centos ~]# mount -a    #重新挂载
    
    [root@VM_0_89_centos ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        485M     0  485M   0% /dev
    tmpfs           496M   24K  496M   1% /dev/shm
    tmpfs           496M  448K  496M   1% /run
    tmpfs           496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1        50G  1.9G   46G   4% /
    tmpfs           100M     0  100M   0% /run/user/0
    /dev/vdb1       200G   33M  200G   1% /data        #空间已扩容至200G

    注意事项

    1. 扩容前一定要先做好快照,避免数据损坏时可快速恢复。
    2. MBR格式磁盘扩容需要卸载云盘,因此是离线扩容,如果云盘有在使用,请先停止业务后再扩容。

    2.5 MBR新增磁盘分区

    如果需要分区的场景,可以将扩容的空间划分成一个新的分区供操作系统使用,通过在磁盘上新创建分区的方式实现扩容,其具有如下特点:

    • 单盘需要多个分区的场景
    • 扩容空间小于2T
    • 扩容后原分区无法扩容
    • CBS云盘是按需弹性扩展,推荐使用单磁盘单分区挂载,云上推荐使用裸盘创建文件系统

    MBR新增磁盘分区

    如下以一块200G的CBS盘扩容至300G为例演示在MBR格式磁盘上新增分区的方式实现磁盘扩容使用方式

    1、准备工作,控制台做好快照,并在控制台完成磁盘空间扩容

    2、fdisk -l检查磁盘扩容的大小,通过System类型为Linux可得知其为MBR分区格式的磁盘

    [root@VM_0_89_centos ~]# fdisk -l /dev/vdb
    
    Disk /dev/vdb: 322.1 GB, 322122547200 bytes, 629145600 sectors   #磁盘大小已扩容至300G
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x5eeb4bc8
    
       Device Boot      Start         End      Blocks   Id  System   #磁盘分区类型为MBR格式
    /dev/vdb1            2048   419430399   209714176   83  Linux

    3、扩容磁盘上新创建一个磁盘分区 /dev/vdb2,大小为100G

    [root@VM_0_89_centos ~]# fdisk /dev/vdb
    Welcome to fdisk (util-linux 2.23.2).
    
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.
    
    
    Command (m for help): p
    
    Disk /dev/vdb: 322.1 GB, 322122547200 bytes, 629145600 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x5eeb4bc8
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vdb1            2048   419430399   209714176   83  Linux   #当前已有一个分区
    
    Command (m for help): n      #新增一个分区
    Partition type:
       p   primary (1 primary, 0 extended, 3 free)
       e   extended
    Select (default p): p   #分区类型为主分区
    Partition number (2-4, default 2): 
    First sector (419430400-629145599, default 419430400):    #开始扇区大小
    Using default value 419430400
    Last sector, +sectors or +size{K,M,G} (419430400-629145599, default 629145599):    #结束扇区大小
    Using default value 629145599
    Partition 2 of type Linux and of size 100 GiB is set
    
    Command (m for help): p   #查看分区创建的情况
    
    Disk /dev/vdb: 322.1 GB, 322122547200 bytes, 629145600 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x5eeb4bc8
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vdb1            2048   419430399   209714176   83  Linux
    /dev/vdb2       419430400   629145599   104857600   83  Linux   #分区已创建成功
    
    Command (m for help): w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    
    WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
    The kernel still uses the old table. The new table will be used at
    the next reboot or after you run partprobe(8) or kpartx(8)
    Syncing disks.

    4、刷新内核分区以识别到分区内容

    [root@VM_0_89_centos ~]# partprobe /dev/vdb

    5、格式化磁盘分区,创建操作系统能识别的文件系统,以xfs为例

    [root@VM_0_89_centos ~]# mkfs.xfs /dev/vdb2 
    meta-data=/dev/vdb2              isize=512    agcount=4, agsize=6553600 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=26214400, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=12800, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0

    6、挂载至系统中,推荐使用fstab挂载

    获取分区UUID号
    [root@VM_0_89_centos ~]# blkid /dev/vdb2 
    /dev/vdb2: UUID="448467bd-f3fa-41cc-a5ad-ab316f7b62e2" TYPE="xfs"
    
    编写fstab文件
    echo 'UUID="448467bd-f3fa-41cc-a5ad-ab316f7b62e2"    /data1    xfs    defaults    0 0' >>/etc/fstab
    
    创建挂载目录并挂载
    [root@VM_0_89_centos ~]# mkdir /data1 
    [root@VM_0_89_centos ~]# mount -a
    
    检查挂载情况
    [root@VM_0_89_centos ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        485M     0  485M   0% /dev
    tmpfs           496M   24K  496M   1% /dev/shm
    tmpfs           496M  452K  496M   1% /run
    tmpfs           496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1        50G  1.9G   46G   4% /
    tmpfs           100M     0  100M   0% /run/user/0
    /dev/vdb1       200G   33M  200G   1% /data
    /dev/vdb2       100G   33M  100G   1% /data1    #磁盘分区已经挂载至操作系统

    至此云盘上使用MBR格式新增分区的演示使用完毕,这种方式适用于单块磁盘多分区的场景,由于云上的磁盘可以根据按需扩容,且采用分区扩容的方式原有分区(第一个分区)将无法扩容,云上推荐使用裸盘方式。

    2.6 GPT磁盘分区

    前面章节介绍了对磁盘创建MBR格式磁盘分区的使用方式,对于大于2T的磁盘,需要使用GPT格式的方式进行分区,本章节介绍磁盘使用GPT格式进行分区的使用方式。

    GPT磁盘分区

    先在控制台购买云盘并挂载到云主机中,然后再操作系统中对磁盘进行GPT格式分区并创建文件系统,以创建一个2T磁盘为例演示Linux中使用parted对磁盘创建GPT格式分区使用过程。

    1、登录操作系统检查磁盘的名称和空间大小

    [root@VM_0_89_centos ~]# fdisk -l
    
    Disk /dev/vda: 53.7 GB, 53687091200 bytes, 104857600 sectors
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x0009ac89
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/vda1   *        2048   104857566    52427759+  83  Linux
    
    Disk /dev/vdb: 2147.5 GB, 2147483648000 bytes, 4194304000 sectors   #磁盘为vdb,大小为2T
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

    2、使用parted对磁盘打标签和磁盘分区

    磁盘打上label并查看确认
    [root@VM_0_89_centos ~]# parted /dev/vdb mklabel gpt
    [root@VM_0_89_centos ~]# parted /dev/vdb print                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 2147GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt        #分区表类型为gpt
    Disk Flags: 
    
    Number  Start  End  Size  File system  Name  Flags
    
    对磁盘进行分区
    [root@VM_0_89_centos ~]# parted /dev/vdb mkpart primary 2048s 100%
    Information: You may need to update /etc/fstab.
    
    查看分区创建情况
    [root@VM_0_89_centos ~]# parted /dev/vdb print
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 2147GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start   End     Size    File system  Name     Flags
     1      1049kB  2147GB  2147GB               primary   #创建了一个磁盘分区,范围是2048s到2147GB         

    3、磁盘上创建文件系统,以制作xfs文件系统为例

    [root@VM_0_89_centos ~]# mkfs.xfs /dev/vdb1 
    meta-data=/dev/vdb1              isize=512    agcount=4, agsize=131071872 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=524287488, imaxpct=5
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=255999, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0

    4、编写fstab挂载到/data目录中

    获取分区UUID
    [root@VM_0_89_centos ~]# blkid /dev/vdb1 
    /dev/vdb1: UUID="aa6fc333-e702-4daa-ad0b-10efde57a7f0" TYPE="xfs" PARTLABEL="primary" PARTUUID="7dace14b-3093-495b-9d0c-fc63f3b87fd7"
    
     编写fstab将磁盘挂载到/data目录中
     UUID="aa6fc333-e702-4daa-ad0b-10efde57a7f0"     /data             xfs     defaults        0 0

    5、加载挂载配置信息并确认

    [root@VM_0_89_centos ~]# mount -a
    [root@VM_0_89_centos ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        485M     0  485M   0% /dev
    tmpfs           496M   24K  496M   1% /dev/shm
    tmpfs           496M  448K  496M   1% /run
    tmpfs           496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1        50G  1.9G   46G   4% /
    tmpfs           100M     0  100M   0% /run/user/0
    /dev/vdb1       2.0T   33M  2.0T   1% /data        #磁盘当前已经挂载至/data目录

    2.7 GPT磁盘分区扩容

    GPT磁盘扩容

    上图是GPT格式磁盘分区的扩容步骤,需要在控制台中制作快照并完成扩容,然后在GPT分区中识别到扩容空间,文件文件系统识别到空间,如下以2T扩容至3T为例演示扩容过程

    1、确认磁盘空间和扩容方式为GPT

    [root@VM_0_89_centos ~]# fdisk -l /dev/vdb 
    
    Disk /dev/vdb: 3221.2 GB, 3221225472000 bytes, 6291456000 sectors   #磁盘空间大小已扩容至3T
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: dos
    Disk identifier: 0x00000000
    
       Device Boot      Start         End      Blocks   Id  System   #磁盘分区格式为GPT
    /dev/vdb1               1  4194303999  2097151999+  ee  GPT

    2、分区扩容需是离线操作,因此需要先卸载磁盘,卸载前请停止业务使用

    [root@VM_0_89_centos ~]# umount  /data

    3、GPT重新分区,需要先删除原有分区,然后再重建分区,删除前使用unit s获取到磁盘柱面的大小,切记,操作前应要做好快照备份,删除分区重建分区有风险

    [root@VM_0_89_centos ~]# parted /dev/vdb 
    GNU Parted 3.1
    Using /dev/vdb
    Welcome to GNU Parted! Type 'help' to view a list of commands.
    (parted) print                                                            
    Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that another operating system believes the disk is smaller.  Fix, by moving the backup to the end
    (and removing the old backup)?
    Fix/Ignore/Cancel? Fix     #磁盘空间有扩容,因此提示有ERR,输入Fix修复                                                
    Warning: Not all of the space available to /dev/vdb appears to be used, you can fix the GPT to use all of the space (an extra 2097152000 blocks) or continue with the current setting? 
    Fix/Ignore? Fix            #空间并未完全使用提示有Waring,输入Fix修复                                                   
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 3221GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start   End     Size    File system  Name     Flags
     1      1049kB  2147GB  2147GB  xfs          primary  #当前分区的情况
    
    (parted) unit s           #使用单元的方式显示大小范围                                                
    (parted) print                                                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 6291456000s
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start  End          Size         File system  Name     Flags
     1      2048s  4194301951s  4194299904s  xfs          primary #Start起始范围为2048s,后面重建分区需要使用到
    
    (parted) rm 1     #删除分区信息                                                          
    (parted) print                                                             
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 6291456000s
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start  End  Size  File system  Name  Flags #确认分区信息已被删除
    
    (parted) mkpart primary 2048s 100%   #重新创建磁盘分区,起始范围需要和原分区保持一致
    (parted) print                                                            
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 6291456000s
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start  End          Size         File system  Name     Flags
     1      2048s  6291453951s  6291451904s  xfs          primary

    4、GPT分区扩容完毕后,需要在文件系统中扩容空间,切记,不要格式化文件系统,否则数据将会丢失,根据文件系统类型选择扩容方式,以xfs为例

    将磁盘挂载到系统中
    [root@VM_0_89_centos ~]# mount -a
    [root@VM_0_89_centos ~]# df -h 
    文件系统        容量  已用  可用 已用% 挂载点
    devtmpfs        485M     0  485M    0% /dev
    tmpfs           496M   24K  496M    1% /dev/shm
    tmpfs           496M  488K  495M    1% /run
    tmpfs           496M     0  496M    0% /sys/fs/cgroup
    /dev/vda1        50G  1.9G   46G    4% /
    tmpfs           100M     0  100M    0% /run/user/0
    /dev/vdb1       2.0T   33M  2.0T    1% /data
    
    扩容文件系统空间
    [root@VM_0_89_centos ~]# xfs_growfs /dev/vdb1 
    meta-data=/dev/vdb1              isize=512    agcount=4, agsize=131071872 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0 spinodes=0
    data     =                       bsize=4096   blocks=524287488, imaxpct=5
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal               bsize=4096   blocks=255999, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    data blocks changed from 524287488 to 786431488         #已完成空间扩容
    
    
    校验文件系统空间
    [root@VM_0_89_centos ~]# df -h
    文件系统        容量  已用  可用 已用% 挂载点
    devtmpfs        485M     0  485M    0% /dev
    tmpfs           496M   24K  496M    1% /dev/shm
    tmpfs           496M  488K  495M    1% /run
    tmpfs           496M     0  496M    0% /sys/fs/cgroup
    /dev/vda1        50G  1.9G   46G    4% /
    tmpfs           100M     0  100M    0% /run/user/0
    /dev/vdb1       3.0T   33M  3.0T    1% /data         #已扩容至3T
    
    备注:如果是ext3、ext4则使用resize2fs /dev/vdb1实现文件系统的扩容。

    至此,基于GPT的磁盘格式磁盘分区扩容完毕,整个扩容过程中磁盘需要卸载操作,因此业务需要离线进行,扩容过程中需要删除分区,操作较危险,操作前务必做好快照避免误操作导致磁盘分区信息丢失。

    2.8 GPT新增磁盘分区

    对于需要多个磁盘分区的场景,可以在GPT磁盘上新建另外一个分区的方式实现,实现方式和新创建一个分区的过程相类似,如下为基于GPT格式磁盘新增分区的操作过程:

    新增磁盘分区

    以磁盘扩容至3.5T为例,通过GPT格式新创建另外一个/dev/vdb2的分区,并挂载到系统中使用,如下演示操作过程

    1、 登录操作系统,确认磁盘空间扩容大小和磁盘格式为GPT

    [root@VM_0_89_centos ~]# fdisk -l /dev/vdb 
    WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
    
    Disk /dev/vdb: 3758.1 GB, 3758096384000 bytes, 7340032000 sectors #磁盘空间大小为3.5T
    Units = sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk label type: gpt          #磁盘分区格式类型为gpt
    Disk identifier: 15BF58A1-BBE0-466A-B2C5-A243AD6A3108
    
    
    #         Start          End    Size  Type            Name
     1         2048   6291453951      3T  Microsoft basic primary

    2、获取磁盘上一个分区的End范围,print得知结束范围3221GB ,下一个步骤需要使用到

    [root@VM_0_89_centos ~]# parted /dev/vdb print
    Error: The backup GPT table is not at the end of the disk, as it should be.  This might mean that another operating system believes the disk is smaller.  Fix, by moving the backup to the end
    (and removing the old backup)?
    Fix/Ignore/Cancel? Fix
    Warning: Not all of the space available to /dev/vdb appears to be used, you can fix the GPT to use all of the space (an extra 1048576000 blocks) or continue with the current setting? 
    Fix/Ignore? Fix                                                           
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 3758GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start   End     Size    File system  Name     Flags
     1      1049kB  3221GB  3221GB  xfs          primary

    3、 磁盘上新建一个分区/dev/vdb2,开始范围为上一个步骤中获取的磁盘大小

    [root@VM_0_89_centos ~]# parted /dev/vdb mkpart primary 3221GB 100% #开始范围为步骤2获取的大小
    Information: You may need to update /etc/fstab.
    
    [root@VM_0_89_centos ~]# parted /dev/vdb print
    Model: Virtio Block Device (virtblk)
    Disk /dev/vdb: 3758GB
    Sector size (logical/physical): 512B/512B
    Partition Table: gpt
    Disk Flags: 
    
    Number  Start   End     Size    File system  Name     Flags #包含有两个分区
     1      1049kB  3221GB  3221GB  xfs          primary
     2      3221GB  3758GB  537GB                primary

    4、 磁盘格式化创建文件系统,以制作xfs文件系统为例

    [root@VM_0_89_centos ~]# mkfs.xfs /dev/vdb2 
    meta-data=/dev/vdb2              isize=512    agcount=4, agsize=32768000 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=131072000, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=64000, version=2
             =                       sectsz=512   sunit=0 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0

    5、 挂载磁盘分区到系统中,以手动mount为例演示,实际使用时应使用fstab实现持久挂载

    [root@VM_0_89_centos ~]# mount /dev/vdb2 /data1/
    
    [root@VM_0_89_centos ~]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        485M     0  485M   0% /dev
    tmpfs           496M   24K  496M   1% /dev/shm
    tmpfs           496M  484K  495M   1% /run
    tmpfs           496M     0  496M   0% /sys/fs/cgroup
    /dev/vda1        50G  1.9G   46G   4% /
    tmpfs           100M     0  100M   0% /run/user/0
    /dev/vdb1       3.0T   33M  3.0T   1% /data
    /dev/vdb2       500G   33M  500G   1% /data1    #已挂载完毕

    3. 总结

    前面的内容总结了在Linux环境中CBS三种使用方式:1. 裸设备创建文件系统,2. 使用MBR格式分区,3. 使用GPT格式分区,以及三种使用方式对应的扩容方式和操作步骤。相比于裸设创建文件系统,使用MBR和GPT格式扩容时需要卸载磁盘,因此无法做到在线扩容,因此在云环境下推荐使用直接在裸设备上创建文件系统的方式,其更加便捷,易于实现,且扩容过程中可以在线扩容。

    参考文献

    配套视频教程:https://cloud.tencent.com/edu/learning/course-1863-22287

    MBR格式磁盘初始化:https://cloud.tencent.com/document/product/362/6734

    GPT格式磁盘初始化:https://cloud.tencent.com/document/product/362/6735

    Linux云服务器存储扩容:https://cloud.tencent.com/document/product/362/6738

    Windows云服务器存储扩容:https://cloud.tencent.com/document/product/362/6737

    关于作者 刘海平(HappyLau )云计算高级顾问 目前在腾讯云从事公有云相关工作,曾就职于酷狗,EasyStack,拥有多年公有云+私有云计算架构设计,运维,交付相关经验,参与了酷狗,南方电网,国泰君安等大型私有云平台建设,精通Linux,Kubernetes,OpenStack,Ceph等开源技术,在云计算领域具有丰富实战经验,拥有RHCA/OpenStack/Linux授课经验。

    展开全文
  • 戴尔服务器扩内存

    千次阅读 2017-03-07 10:19:26
    该测试使用的16G镁光内存条。 服务器类型DELL-R730XD 目前服务内存为64G。 服务器内存插槽照片: 扩开始:内存展示照片: 扩前服务器内存[root@localhost ~]# free -h total used free shared

    戴尔服务器扩容内存


    内存规格

    1. 厂家的话,三星,镁光都可以使用(目前测试使用可以识别)
    2. 该测试时使用的16G镁光内存条。

    服务器类型DELL-R730XD

    1. 目前服务内存为64G。

    服务器内存插槽照片:
    这里写图片描述

    扩容开始:

    内存展示照片:
    这里写图片描述

    扩容前服务器内存

    [root@localhost ~]# free -h
                 total       used       free     shared    buffers     cached
    Mem:           62G       777M        62G       188K        71M       248M
    -/+ buffers/cache:       457M        62G 
    Swap:          15G         0B        15G
    1. 扩容内存操作前先关闭服务器,待服务器完全关机后,再断电操作。
    2. Dell服务器内存插槽有特定的用法,随意乱插会导致插入的内存不生效。
    3. 服务器机盖上有一层贴纸,上面标注了插槽的使用规则。
    4. 简单来说:A1-B1;A2-B2;A3-B3…以此类推,不可混插。
    5. 附上贴纸内存槽位部分的图片:
      这里写图片描述

    6. 在主板上也有对应的数字,A1,B1,A2,B2…所以按照此方法插入,亲测完全可用。

    7. 附上主板上的插槽图片:
      这里写图片描述

    8. 插入内存时,先取出原槽位上的黑色挡板(防止灰尘落入槽内),然后在插入内存条,听到“咔嚓”一声后表明已经完全插好。盖上防尘盖,盖上服务器机盖。

    9. 扩容操作完毕后,开机,检查内存是否已被系统识别。

    内存扩容完毕

    16:30:43[root@localhost ~]# free -h
    16:30:43             total       used       free     shared    buffers     cached
    16:30:43Mem:          188G       736M       188G       196K       9.4M        42M
    16:30:43-/+ buffers/cache:       684M       188G 
    16:30:43Swap:          15G         0B        15G 

    查看到内存已经增加,说明扩容完成。

    展开全文
  • } 根据传递的取模参数进行调用修改,如果mod为2代表要分两个库: 创建两个数据库及对应表结构 启动服务测试验证 访问接口地址, 服务启动默认只有一个数据源生效, 所有数据都会落在一台数据库节点。 动态调整让第...

    1. ShardingJDBC的集成配置

    1. POM依赖配置

      <dependencies>
          <!--lombok-->
          <dependency>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
              <scope>provided</scope>
          </dependency>
      
          <!-- spring boot 依赖 -->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-web</artifactId>
          </dependency>
      
          <!-- sharding-jdbc 依赖 -->
          <dependency>
              <groupId>org.apache.shardingsphere</groupId>
              <artifactId>sharding-jdbc-core</artifactId>
              <version>${sharding.jdbc.version}</version>
          </dependency>
      
          <!-- sharding-jdbc 服务编排依赖 -->
          <dependency>
              <groupId>org.apache.shardingsphere</groupId>
              <artifactId>sharding-jdbc-orchestration</artifactId>
              <version>${sharding.jdbc.version}</version>
          </dependency>
      
          <!-- mysql-connector-java -->
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>${mysql.version}</version>
          </dependency>
      
          <!-- druid 数据库连接池 -->
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid-spring-boot-starter</artifactId>
              <version>${druid.version}</version>
          </dependency>
      
          <!-- Spring data jpa 依赖 -->
          <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-data-jpa</artifactId>
          </dependency>
      </dependencies>
    2. 数据源配置

      server:
        port: 10692
      spring:
        application:
          name: dynamic-database
        # 第一个数据源配置, 采用Druid
        datasource:
          tradesystem:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            username: root
            password: 654321
            url: jdbc:mysql://10.10.20.130:3306/smooth?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
            druid:
              # 连接池的配置信息
              # 初始化大小,最小,最大
              initial-size: 5
              min-idle: 5
              maxActive: 20
              # 配置获取连接等待超时的时间
              maxWait: 60000
              # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
              timeBetweenEvictionRunsMillis: 60000
              # 配置一个连接在池中最小生存的时间,单位是毫秒
              minEvictableIdleTimeMillis: 300000
              validationQuery: SELECT 1
              testWhileIdle: true
              testOnBorrow: false
              testOnReturn: false
              # 打开PSCache,并且指定每个连接上PSCache的大小
              poolPreparedStatements: true
              maxPoolPreparedStatementPerConnectionSize: 20
              # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
              filters: stat,wall,log4j
              # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
              #connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
    3. ShardingJDBC代码配置

      分库配置规则:

      /**
       * 分库配置规则
       */
      public class ShardingDataSourceRule implements PreciseShardingAlgorithm<Long> {
      
          /**
           * 分片规则, 取模运算
           */
          public static int MOD = 1;
      
          /**
           * 根据账户ID做分库处理
           * @param names
           * @param value
           * @return
           */
          @Override
          public String doSharding(Collection<String> names, PreciseShardingValue<Long> preciseShardingValue) {
              Long accountNo = preciseShardingValue.getValue();
              String dataSource = DatasourceEnum.DATASOURCE_PREFIX.getValue() + accountNo % MOD;
              return dataSource;
          }
      }

      这里假设根据账户ID来做分库处理, 根据账户ID取模计算分库信息。 分表配置规则:

        /**
           * 表分片规则
           */
        public class ShardingTableRule implements PreciseShardingAlgorithm<Long> {
                @Override
                public String doSharding(Collection<String> collection, PreciseShardingValue<Long> preciseShardingValue) {
                        // 不做分表处理, 直接返回表名
                        return preciseShardingValue.getLogicTableName();
                }
        }

      如有需要, 可以在这里设置分表配置规则,因为是做数据库的平滑扩容, 只要实现分库即可, 这里就不做分表的配置, 采用默认表名即可。

      分片规则的集成配置:

      /**
       * 分片规则的集成配置
       */
      private TableRuleConfiguration orderRuleConfig(){
          //订单表, 多个分片示例: "DB_${1..3}.t_order_${1..3}"  ds_0.t_trade_order
          DynamicShardingService.SHARDING_RULE_DATASOURCE =  DatasourceEnum.DATASOURCE_1.getValue();
          String actualDataNodes =  DatasourceEnum.DATASOURCE_1.getValue() + "." + DatasourceEnum.TABLE_ORDER.getValue() ;
          TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration(DatasourceEnum.TABLE_ORDER.getValue(), actualDataNodes);
          //设置分表策略
          tableRuleConfig.setDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("accountNo", new ShardingDataSourceRule()));
          tableRuleConfig.setTableShardingStrategyConfig(new StandardShardingStrategyConfiguration("accountNo",new ShardingTableRule()));
          // 记录订单表的分片规则, 便于后续编排管理
          DynamicShardingService.SHARDING_RULE_TABLE_ORDER = actualDataNodes;
          return tableRuleConfig;
      }
      
      /**
       * 数据源Sharding JDBC配置
       * @return
       */
      @Bean(name = "tradeSystemDataSource")
      @Primary
      @DependsOn("tradeDruidDataSource")
      public DataSource tradeSystemDataSource(@Autowired DruidDataSource tradeDruidDataSource) throws Exception{
      
          ShardingRuleConfiguration shardJdbcConfig = new ShardingRuleConfiguration();
          shardJdbcConfig.getTableRuleConfigs().add(orderRuleConfig());
          ...
      }

      在orderRuleConfig方法里面配置分片规则,在tradeSystemDataSource方法里面加入分片规则配置。

    2.服务编排功能(自定义注册中心)

    2.0.0.M1版本开始,Sharding-JDBC提供了数据库治理编排功能,主要包括:

    • 配置集中化与动态化,可支持数据源、表与分片及读写分离策略的动态切换
    • 数据治理。提供熔断数据库访问程序对数据库的访问和禁用从库的访问的能力
    • 支持Zookeeper和Etcd的注册中心

    这里要实现动态数据源的切换, 需要加入编排功能。

    本地注册中心的实现类,LocalRegistryCenter关键代码:

    public class LocalRegistryCenter implements RegistryCenter {
        /**
         * 注册事件监听缓存记录
         */
        public static Map<String, DataChangedEventListener> listeners = new ConcurrentHashMap<>();
    
        private RegistryCenterConfiguration config;
    
        private Properties properties;
        /**
         * 记录Sharding节点配置信息
         */
        public static Map<String, String> values = new ConcurrentHashMap<>();
        ...
    
        @Override
        public void watch(String key, DataChangedEventListener dataChangedEventListener) {
            if (null != dataChangedEventListener) {
                // 将Sharding事件监听器缓存下来
                listeners.put(key, dataChangedEventListener);
            }
        }
        ...
        @Override
        public String getType() {
            // 标识本地注册中心的注入名称
            return "localRegisterCenter";
        }
        ...
    
    }
    

    通过SPI机制, 自动注入, 创建配置文件:

    file

    org.apache.shardingsphere.orchestration.reg.api.RegistryCenter内容指向刚才创建的配置类:

    com.itcast.database.smooth.config.LocalRegistryCenter

    最后在数据源配置里面加入配置类:

    public DataSource tradeSystemDataSource(@Autowired DruidDataSource tradeDruidDataSource) throws Exception{
    
        ShardingRuleConfiguration shardJdbcConfig = new ShardingRuleConfiguration();
        shardJdbcConfig.getTableRuleConfigs().add(orderRuleConfig());
        shardJdbcConfig.setDefaultDataSourceName(DatasourceEnum.DATASOURCE_1.getValue());
    
        Properties props = new Properties();
        //打印sql语句,生产环境关闭减少日志量
        props.setProperty("sql.show",Boolean.TRUE.toString());
    
        Map<String,DataSource> dataSourceMap = new LinkedHashMap<>() ;
        dataSourceMap.put(DatasourceEnum.DATASOURCE_1.getValue(),tradeDruidDataSource) ;
        // 服务编排配置, 加入本地注册中心配置类
        OrchestrationConfiguration orchestrationConfig = new OrchestrationConfiguration(
                DYNAMIC_SHARDING, new RegistryCenterConfiguration("localRegisterCenter"),
                false);
        return OrchestrationShardingDataSourceFactory.createDataSource(dataSourceMap, shardJdbcConfig, props,
                orchestrationConfig);
    
    }

    3. 动态切换实现(预定义方式)

    1. 在配置文件增加第二个数据源:

      ...
          # 增加第二个数据源配置
          tradesystem2:
            type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            username: root
            password: 654321
            url: jdbc:mysql://10.10.20.126:3306/smooth?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
            druid:
              # 连接池的配置信息
              # 初始化大小,最小,最大
              initial-size: 5
              min-idle: 5
              maxActive: 20
              # 配置获取连接等待超时的时间
              maxWait: 60000
              # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
              timeBetweenEvictionRunsMillis: 60000
              # 配置一个连接在池中最小生存的时间,单位是毫秒
              minEvictableIdleTimeMillis: 300000
              validationQuery: SELECT 1
              testWhileIdle: true
              testOnBorrow: false
              testOnReturn: false
              # 打开PSCache,并且指定每个连接上PSCache的大小
              poolPreparedStatements: true
              maxPoolPreparedStatementPerConnectionSize: 20
              # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
              filters: stat,wall,log4j
              # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
              #connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
    2. 代码配置:

      增加第二个数据源配置的配置, 加入MAP中:

      file

    3. sharding分片规则配置:

      这里会通过接口来调用, 实现Sharding数据源的动态切换:

      /**
        * 替换sharding里的分片规则
        */
      public void replaceActualDataNodes(String newRule){
          // 获取已有的配置
          String rules = LocalRegistryCenter.values
                  .get("/" + DruidSystemDataSourceConfiguration.DYNAMIC_SHARDING + "/config/schema/logic_db/rule");
          // 修改为新的分片规则
          String rule = rules.replace(SHARDING_RULE_TABLE_ORDER, newRule);
          LocalRegistryCenter.listeners.get("/" + DruidSystemDataSourceConfiguration.DYNAMIC_SHARDING + "/config/schema")
                  .onChange(new DataChangedEvent(
                          "/" + DruidSystemDataSourceConfiguration.DYNAMIC_SHARDING + "/config/schema/logic_db/rule",
                          rule, DataChangedEvent.ChangedType.UPDATED));
          LocalRegistryCenter.values.put("/" + DruidSystemDataSourceConfiguration.DYNAMIC_SHARDING + "/config/schema/logic_db/rule",rule);
          SHARDING_RULE_TABLE_ORDER = newRule;
      
      }

      根据传递的取模参数进行调用修改,如果mod为2代表要分两个库:

      file

    4. 创建两个数据库及对应表结构 file

    5. 启动服务测试验证

      访问接口地址, 服务启动默认只有一个数据源生效, 所有数据都会落在一台数据库节点。 file

      动态调整让第二个数据源生效, 扩容为2个数据源:
      file 从后台日志可以看到Sharding分片规则已生效: file

      这样数据, 就会根据取模规则, 落至不同的数据源节点。

    4. 动态切换实现(动态添加方式)

    在实际应用当中,可能并不能预先知道所要扩容的机器节点信息, 这时候就需要实现动态添加的方式。

    1. 删除原来的预定义数据源配置, 只加载一个数据源即可。

    2. 修改动态分片的实现: DynamicShardingService:

      public void dynamicSharding(int mod) {
              ShardingDataSourceRule.MOD = mod;
              String newRule = DatasourceEnum.DATASOURCE_PREFIX.getValue() + "${0.." + (mod - 1) + "}";
              if(mod == 1) {
                 ...
              }else {
                  // 动态数据源配置实现扩容
                  Properties properties = loadPropertiesFile("dynamic_datasource.properties");
                  try {
                      log.info("load datasource config url: " + properties.get("url"));
                      DruidDataSource druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
                      druidDataSource.setRemoveAbandoned(true);
                      druidDataSource.setRemoveAbandonedTimeout(600);
                      druidDataSource.setLogAbandoned(true);
                      // 设置数据源错误重连时间
                      druidDataSource.setTimeBetweenConnectErrorMillis(60000);
                      druidDataSource.init();
                      OrchestrationShardingDataSource dataSource = SpringContextUtil.getBean("tradeSystemDataSource", OrchestrationShardingDataSource.class);
                      Map<String, DataSource> dataSourceMap = dataSource.getDataSource().getDataSourceMap();
                      dataSourceMap.put(DatasourceEnum.DATASOURCE_2.getValue(), druidDataSource);
      
                      Map<String, DataSourceConfiguration> dataSourceConfigMap = new HashMap<String, DataSourceConfiguration>();
                      for(String key : dataSourceMap.keySet()) {
                          dataSourceConfigMap.put(key, DataSourceConfiguration.getDataSourceConfiguration(dataSourceMap.get(key)));
                      }
                      String result = SHARDING_RULE_TABLE_ORDER.replace(SHARDING_RULE_DATASOURCE, newRule);
                      replaceActualDataNodes(result);
                      SHARDING_RULE_DATASOURCE = newRule;
                      // 重新数据源配置
                      dataSource.renew(new DataSourceChangedEvent(
                              "/" + DruidSystemDataSourceConfiguration.DYNAMIC_SHARDING + "/config/schema/logic_db/datasource",
                              dataSourceConfigMap));
                      return;  
                  } catch (Exception e) {
                      log.error(e.getMessage(), e);
                  }   
              }          
              String result = SHARDING_RULE_TABLE_ORDER.replace(SHARDING_RULE_DATASOURCE, newRule);
              replaceActualDataNodes(result);
              SHARDING_RULE_DATASOURCE = newRule;  
          }

      如果取模分片大于1, 走扩容处理逻辑, 在这里可以将扩容数据源信息写至配置文件内(也可以从配置中心读取),然后动态创建数据源, 重写Sharding的编排配置OrchestrationShardingDataSource。

      扩容的数据源配置文件放至资源目录下:

      dynamic_datasource.properties

      driverClassName=com.mysql.cj.jdbc.Driver
      username=root
      password=654321
      url=jdbc:mysql://10.10.20.131:3306/smooth?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
      initialSize=5
      minIdle=5
      maxActive=20
      maxWait=60000
      timeBetweenEvictionRunsMillis=60000
      minEvictableIdleTimeMillis=300000
      validationQuery=SELECT 1
      testWhileIdle=true
      testOnBorrow=false
      testOnReturn=false
    3. 测试验证 参照上面的方式进行测试验证,这样就可以在不需要重启服务的情况下, 任意添加数据源节点。

    5. ShardingJDBC使用注意事项

    Sharding JDBC, Mycat, Drds 等产品都是分布式数据库中间件, 相比直接的数据源操作, 会存在一些限制, Sharding JDBC在使用时, 需要注意以下问题, 避免采坑:

    • 有限支持子查询
    • 不支持HAVING
    • 不支持OR,UNION 和 UNION ALL
    • 不支持特殊INSERT
    • 每条INSERT语句只能插入一条数据,不支持VALUES后有多行数据的语句
    • 不支持DISTINCT聚合
    • 不支持dual虚拟表查询
    • 不支持SELECT LAST_INSERT_ID(), 不支持自增序列
    • 不支持CASE WHEN

    本文由mirson创作分享,如需进一步交流,请加QQ群:19310171或访问www.softart.cn

    展开全文
  • 以前有接触到的阿里云服务器系统盘和挂载盘是分离的,前者固定20GB硬盘大小,后来升级到50GB,但是不可以扩,如果我们数据较大可以挂在数据盘,然后再不够可以升级扩数据盘。但是,刚才在阿里云后台有看到系统盘...
  • 阿里云服务器ECS磁盘扩

    万次阅读 2016-04-26 22:25:57
    ) 状态,才可以进行扩操作。 扩后 使用 ECS 控制台或者 Open API 扩磁盘之后,需要在 ECS 控制台或者使用 Open API 重启实例之后才可以生效。 扩生效之后的磁盘,仍然需要用户手动格式化...
  • 本章是《Kubernetes下web服务的性能测试三部曲》系列的终篇,之前我们用AB和JMeter两种工具压测了k8s环境下的Tomcat,并通过调整内存和CPU来验证纵向扩的效果,本章我们来验证横向扩对吞吐量的影响; 本文地址...
  • 上一章《Kubernetes下web服务的性能测试三部曲之一:准备工作》我们将web服务搭建好,再用AB和JMeter测试了单个Pod的性能,今天我们来测试一下纵向扩服务能力的提升; 原文地址:...
  • 目前有一台已经安装好Windows Server 2008R2操作系统的Huawei RH2288V3服务器,配置存储空间2T*4的SATA硬盘,做好了RAID5,可用空间约5.5T,根据实际需求,还需要扩一块同型号的2T磁盘,微凉确保原来数据不丢失,...
  • #文件缓存, 使用内置的文件缓存, 如果你不相信Linux内核文件缓存和磁盘内置缓存使用, 需要1.16及以上版本 #disk-cache=0 #另一种Linux文件缓存方式, 使用前确保您使用的内核支持此选项, 需要1.15及以上版本(?) ...
  • 阿里云服务器云盘扩踩坑

    千次阅读 2019-09-18 06:40:54
    系统环境:阿里云Centos7.3过程描述:刚上班查看监控,发现几台服务器的磁盘占用99%,于是就排查大容量的log文件,文件删除也没恢复多少,于是就向老板申请云盘扩;扩步骤:登录阿里云控制台 ---> 找到目标...
  • ECS实例的磁盘分为系统盘和数据盘,系统盘之前已经讲过,需要通过更换系统盘的方式进行扩。更换系统盘存在弊端和风险,操作需要注意,这里就不再阐述了。扩充数据盘相对简便。 首先登录管理控制台,点击左侧的云...
  • 记录IBM X3650 m2 服务器向raid组中添加硬盘扩raid组磁盘容量 网上搜了搜很多相关文章,有的没有进BIOS过程,有的配置过程不详细,东拼西凑整合了一篇; 1、开机后,等待出现这个画面,按F1键进入BIOS(部分机器...
  • 数据库服务:数据库表空间扩

    千次阅读 2018-08-23 16:33:33
    http://www.enmotech.com/services/service.html(专业数据库服务)   数据库表空间扩是我们在运维过程中经常需要做的事情,本文分享一次在扩表空间中遇到的情况以及针对本次情况的一些想法。   记一次在...
  • Dell服务器raid5扩及相关技术mark

    千次阅读 2018-07-13 17:52:59
    如果只有一个虚拟磁盘是可以使用OSMA进行在线扩的。...在任务中选择“重新配置”,执行,选择新的3块4T硬盘,按照提示一步一步操作,在raid选项,选择raid5,然后点击完成就进入了漫长的重新构建...
  • 往往在大促等高峰时段都需要对流量提前预估,但实际上预先计算好的资源和应用容量,依然可能不足以支撑流量高峰,需要紧急扩;而容器技术则非常适合这种场景,在需要快速地、自动弹性伸缩。那么在业务需求极速...
  • 实际上zuul和eureka的是可以完美配合,完全可以基于服务名的注册和发现,来动态的实现服务的动态负载和动态注册,从而达到不需要重启zuul即可达到动态扩的。下文将介绍静态配置路由表和从Eureka发现服务的两种方式...
  • 实战—详解—阿里云服务器lvm扩

    千次阅读 2016-01-01 14:42:19
    我们的服务器在阿里上有两块硬盘(/dev/vda 20G、/dev/vdb 700G),起初的时候我们没有用700G的硬盘,后来磁盘不够用之后想把700G...后来使用lvm动态扩,应为我的硬盘是700G的我想全用上,所以设置PE大小为16。这样单个
  • 宝塔面板云磁盘无损扩,扩磁盘宝塔面板未同步 今天客戶的数据盘被log日志占满了,没办法推荐了客户去在线升级云盘,结果…升级成功了,尴尬的是宝塔未同步,可是云磁盘已经显示...服务商:阿里云 系统:CenterOs 7.4 64...
  • RocketMQ 动态扩和缩减

    千次阅读 2020-12-09 11:55:42
    RocketMQ 动态扩和缩减 环境 nameserver 172.16.40.180:9876 需要缩减 nameserver 172.16.40.175:9876 需要缩减 nameserver 172.16.30.159:9876 新增扩 nameserver 172.16.30.133:9876 新增扩 broker-a master...
  • Spring Cloud Eureka动态扩

    千次阅读 2018-10-25 10:10:08
    本文心得包括案例基于《重新定义》,动态扩Eureka是为了不影响已运行服务的情况下进行扩。 正文 利用了config进行统一管理了eureka服务的配置,首先创建一个父module,主要就是把web工程依赖的jar包含在内,...
  • 消息中间件MQ与RabbitMQ面试题(2020最新版)

    万次阅读 多人点赞 2020-03-01 11:11:21
    RabbitMQ是一款开源的,Erlang编写的,基于AMQP协议的消息中间件 rabbitmq 的使用场景 (1)服务间异步通信 (2)顺序消费 (3)定时任务 (4)请求削峰 RabbitMQ基本概念 Broker: 简单来说就是消息队列服务器实体...
  • 迟网简述

    千次阅读 2019-11-27 17:41:21
    迟网 迟网可应用于极端环境下的通信,具有区别于传统网络的新特性、新概念和新技术,值得做深入的研究。现对迟网做一个简单的描述,仅供参考。 概念 起源部分:随着移动自组织网络和车载自组织网络成为人们...
  • 一个不能动态扩的rpc框架是一个残缺的框架。本次优化:引入注册中心概念、实现服务的动态扩、负载均衡等功能。
  • 虚拟机磁盘空间不足,需要扩,ESXI主机未接存储,且虚拟机磁盘模式均为“厚置备延迟置零”,主机仅剩余16GB存储空间,无法满足扩需求,需要为ESXI主机的磁盘组进行扩。 操作过程:插入物理磁盘–>配置磁盘...
  • K8s基础

    万次阅读 多人点赞 2018-07-16 22:50:52
    Replication Controller是实现弹性伸缩、动态扩和滚动升级的核心。 Service Service定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。Service提供了一个统一的服务访问入口以及服务代理和发现机制,关联...
  • centos6.5下根目录扩实战

    千次阅读 2020-05-25 16:23:47
    对于linux初学者,往往在安装linux操作系统,会忽略根目录的磁盘空间的重要性,分配了较小的磁盘空间,导致后续的使用过程中,出现根目录磁盘空间吃紧的情况发生。针对这种情况,可通过对根目录的磁盘空间进行扩...
  • zookeeper怎么扩,增加server

    千次阅读 2018-09-12 21:36:16
    zookeeper版本3.4.6 现有ZK集群是五台,...机房2,热备机房,有全量服务但是机器数量较机房1少,分担少部分负载,在机房1不可用,将会对外提供所有服务。 (3)。机房3(延时较大,在100毫秒)。 需...
  • 阿里云 磁盘扩步骤

    千次阅读 2020-05-11 21:38:52
    若尚未扩,请参见在线扩云盘或离线扩云盘。(通过磁盘管理先在线扩大一下,云盘的空间) 远程连接ECS实例。连接方式请参见连接方式概述。 根据操作系统安装growpart或者xfsprogs扩格式化工具。 CentO

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 136,089
精华内容 54,435
关键字:

容时服务