Linux LVM硬盘管理及LVM扩容

LVM磁盘管理

一、LVM简介… 1

二、 LVM基本术语… 2

三、 安装LVM… 3

四、 创建和管理LVM… 4

2、 创建PV.. 6

3、 创建VG.. 7

4、 创建LV.. 9

5、LV格式化及挂载… 10

一、LVM简介

LVM是 Logical Volume Manager(逻辑卷管理)的简写,它由Heinz Mauelshagen在Linux 2.4内核上实现。LVM将一个或多个硬盘的分区在逻辑上集合,相当于一个大硬盘来使用,当硬盘的空间不够使用的时候,可以继续将其它的硬盘的分区加入其中,这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性。

与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它使系统管理员可以更方便的为应用与用户分配存储空间。在LVM管理下的存储卷可以按需要随时改变大小与移除(可能需对文件系统工具进行升级)。LVM也允许按用户组对存储卷进行管理,允许管理员用更直观的名称(如”sales’、 ‘development’)代替物理磁盘名(如’sda’、’sdb’)来标识存储卷。

如图所示LVM模型:

clip_image002[7]

由四个磁盘分区可以组成一个很大的空间,然后在这些空间上划分一些逻辑分区,当一个逻辑分区的空间不够用的时候,可以从剩余空间上划分一些空间给空间不够用的分区使用。

二、 LVM基本术语

前面谈到,LVM是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。首先我们讨论以下几个LVM术语:

物理存储介质(The physical media):这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda等等,是存储系统最低层的存储单元。

物理卷(physical volume):物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数。

卷组(Volume Group):LVM卷组类似于非LVM系统中的物理硬盘,其由物理卷组成。可以在卷组上创建一个或多个“LVM分区”(逻辑卷),LVM卷组由一个或多个物理卷组成。

逻辑卷(logical volume):LVM的逻辑卷类似于非LVM系统中的硬盘分区,在逻辑卷之上可以建立文件系统(比如/home或者/usr等)。

PE(physical extent):每一个物理卷被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。

LE(logical extent):逻辑卷也被划分为被称为LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE的大小和PE是相同的,并且一一对应。

简单来说就是:

PV:是物理的磁盘分区

VG:LVM中的物理的磁盘分区,也就是PV,必须加入VG,可以将VG理解为一个仓库或者是几个大的硬盘。

LV:也就是从VG中划分的逻辑分区

如下图所示PV、VG、LV三者关系:

clip_image004[7]

三、 安装LVM
首先确定系统中是否安装了lvm工具:
[root@www root]# rpm –qa|grep lvm
lvm-1.0.3-4
如果命令结果输入类似于上例,那么说明系统已经安装了LVM管理工具;如果命令没有输出则说明没有安装LVM管理工具,则需要从网络下载或者从光盘装LVM rpm工具包。

四、 创建和管理LVM

要创建一个LVM系统,一般需要经过以下步骤:
1、 创建分区

使用分区工具(如:fdisk等)创建LVM分区,方法和创建其他一般分区的方式是一样的,区别仅仅是LVM的分区类型为8e。如下列图所示:

clip_image006[8]

查看磁盘分区表

clip_image008[6]

使用fdisk创建分区,根据设备文件的绝对路径(/dev/hda)进入分区管理

clip_image010[6]

clip_image012[6]

一定要指定分区的格式为8e,这是LVM的分区格式

2、 创建PV

 

clip_image014[6]

3、 创建VG

clip_image016[6]

clip_image018[6]

创建完成VG之后,才能从VG中划分一个LV。

4、 创建LV

clip_image020[6]

创建了一个名字为lvData,容量大小是100M的分区,其中:-L:指定LV的大小 -n:指定LV的名。Vo1Group00:表示从这个VG中划分LV;

5、LV格式化及挂载

下一步需要对LV进行格式化(使用mksf进行格式化操作),然后LV才能存储资料

clip_image022[6]

将格式化后的LV分区挂载到指定的目录下,就可以像普通目录一样存储数据了

clip_image024[6]

挂载之后,可以看到此LV的容量。

如果要在系统启动的时候启动LV,最好是将lvData写入fstable 文件中,如下所示:

clip_image026[6]

使用Vim编辑器,打开/etc/fstab,在最后一行添加如图中所示,其中/dev/VolGroup00/lvData指定需要挂载的分区LV,/root/test指定要挂载的目录(挂载点),ext3分区文件系统格式,其它使用默认即可

 

扩容当前分区

一、首先创建一块新的分区:

fdisk  /dev/hda

n

l        #选择逻辑分区,如果没有,则首先创建扩展分区,然后再添加逻辑分区(硬盘:最多四个分区P-P-P-P或P-P-P-E)

6        #分区号(从5开始),/dev/hda6

t      8e   #分区类型8e表示LVM分区

w        #写入分区表

partprobe   #重读分区表

mkfs –t ext3 /dev/hda6 #格式化

partx /dev/hda #查看当前硬盘的分区表及使用情况

二、创建PV,扩容VG,LV

pvcreate /dev/hda6

vgdisplay #查看当前已经存在的VG信息,以存在VG:VolGroup00为例

vgextend VolGroup00 /dev/hda6    #扩展VolGroup00

lvdisplay #查看已经存在的LV信息,以存在LV:LogVol01为例

lvextend –L 1G /dev/VolGroup00/LogVol01 #扩展LV

resize2fs /dev/VolGroup00/LogVol01 #执行该重设大小,对于当前正在使用的LogVol01有效

df –h #查看挂载情况,已经扩容

使用Amoeba for mysql实现mysql读写分离

可惜 amoeba 不支持 事务 和一些 关键词方法等,基本不可用。
—————-

Amoeba for MySQL致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当query 路由功能,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、Query过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。 在Amoeba上面你能够完成多数据源的高可用、负载均衡、数据切片的功能。目前在很多企业的生产线上面使用。
www.centos.bz这里使用Amoeba for mysql来实现mysql的读写分离,起到缓解主数据库服务器的压力,下面是实现这一方案的架构图:

mysql主从复制配置

因为读写分离,所以一台负责mysql的写操作,另一台负责mysql的读操作,所以我们这里使用mysql的主从复制再合适不过了。关于这一配置,请移步:
http://www.centos.bz/2011/07/linux-mysql-replication-sync-configure/

java环境配置

Amoeba框架是基于Java SE1.5开发的,建议使用Java SE 1.5版本。目前Amoeba经验证在JavaTM SE 1.5和Java SE 1.6能正常运行,(可能包括其他未经验证的版本)。
Java SE 1.6下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u32-downloads-1594644.html
我这里下载jdk-6u32-linux-i586-rpm.bin。
下载完成后执行sh jdk-6u32-linux-i586-rpm.bin开始安装,将会安装到/usr/java/jdk1.6.0_32目录。

Amoeba的安装

Amoeba下载地址:http://sourceforge.net/projects/amoeba/
下面是安装步骤:

  1. cd /tmp
  2. mkdir /usr/local/amoeba
  3. wget http://softlayer.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz
  4. tar xzf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C /usr/local/amoeba

配置用户环境变量

  1. vi ~/.bash_profile

设置为:

  1. PATH=$PATH:$HOME/bin:/usr/local/amoeba/bin
  2. JAVA_HOME=/usr/java/jdk1.6.0_32
  3. export JAVA_HOME
  4. export PATH

立即生效:

  1. source  ~/.bash_profile

Amoeba for mysql配置

配置Amoeba for mysql的读写分离主要涉及两个文件:
1、/usr/local/amoeba/conf/dbServers.xml
此文件定义由Amoeba代理的数据库如何连接,比如最基础的:主机IP、端口、Amoeba使用的用户名和密码等等。
2、/usr/local/amoeba/conf/amoeba.xml
此文件定义了Amoeba代理的相关配置。

dbServers.xml文件配置

abstractServer配置:

  1. <dbServer name=”abstractServer” abstractive=”true”>
  2.                 <factoryConfig class=”com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory”>
  3.                         <property name=”manager”>${defaultManager}</property>
  4.                         <property name=”sendBufferSize”>64</property>
  5.                         <property name=”receiveBufferSize”>128</property>
  6.                         <!– mysql port –>
  7.                         <property name=”port”>3306</property>
  8.                         <!– mysql schema –>
  9.                         <property name=”schema”>dbname</property>
  10.                         <!– mysql user –>
  11.                         <property name=”user”>root</property>
  12.                         <!–  mysql password –>
  13.                         <property name=”password”>root</property>
  14.                 </factoryConfig>
  15.                 <poolConfig class=”com.meidusa.amoeba.net.poolable.PoolableObjectPool”>
  16.                         <property name=”maxActive”>500</property>
  17.                         <property name=”maxIdle”>500</property>
  18.                         <property name=”minIdle”>10</property>
  19.                         <property name=”minEvictableIdleTimeMillis”>600000</property>
  20.                         <property name=”timeBetweenEvictionRunsMillis”>600000</property>
  21.                         <property name=”testOnBorrow”>true</property>
  22.                         <property name=”testWhileIdle”>true</property>
  23.                 </poolConfig>
  24.         </dbServer>

此部分定义真实mysql服务器的端口,数据库名称,mysql用户及密码。
主从数据库定义:

  1. <dbServer name=”Master”  parent=”abstractServer”>
  2.                 <factoryConfig>
  3.                         <!– mysql ip –>
  4.                         <property name=”ipAddress”>192.168.0.1</property>
  5.                 </factoryConfig>
  6.         </dbServer>
  7. <dbServer name=”Slave1″  parent=”abstractServer”>
  8.                 <factoryConfig>
  9.                         <!– mysql ip –>
  10.                         <property name=”ipAddress”>192.168.0.2</property>
  11.                 </factoryConfig>
  12.         </dbServer>
  13. <dbServer name=”Slave2″  parent=”abstractServer”>
  14.                 <factoryConfig>
  15.                         <!– mysql ip –>
  16.                         <property name=”ipAddress”>192.168.0.3</property>
  17.                 </factoryConfig>
  18.         </dbServer>
  19.         <dbServer name=”virtualSlave” virtual=”true”>
  20.                 <poolConfig class=”com.meidusa.amoeba.server.MultipleServerPool”>
  21.                         <!– Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA–>
  22.                         <property name=”loadbalance”>1</property>
  23.                         <!– Separated by commas,such as: server1,server2,server1 –>
  24.                         <property name=”poolNames”>Slave1,Slave2</property>
  25.                 </poolConfig>
  26.         </dbServer>

此部分定义主服务器,从服务器,及从服务器连接池。这里只定义数据库地址,它们的用户及密码就是上面的abstractServer里的设置。注意用来连接真实mysql服务器的用户必须拥有远程连接权限。

amoeba.xml配置

amoeba连接验证配置:

  1. <property name=”authenticator”>
  2.                                 <bean class=”com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator”>
  3.                                         <property name=”user”>root</property>
  4.                                         <property name=”password”>root</property>
  5.                                         <property name=”filter”>
  6.                                                 <bean class=”com.meidusa.amoeba.server.IPAccessController”>
  7.                                                         <property name=”ipFile”>${amoeba.home}/conf/access_list.conf</property>
  8.                                                 </bean>
  9.                                         </property>
  10.                                 </bean>
  11.                         </property>

这里定义连接amoeba时用来验证的用户及密码。
读写分离配置:

  1. <property name=”defaultPool”>Master</property>
  2.                 <property name=”writePool”>Master</property>
  3.                 <property name=”readPool”>virtualSlave</property>

defaultPool:配置了默认的数据库节点,一些除了SELECTUPDATEINSERTDELETE的语句都会在defaultPool执行。
writePool :配置了数据库写库,通常配为Master,如这里就配置为之前定义的Master数据库。
readPool :配置了数据库读库,通常配为Slave或者Slave组成的数据库池,如这里就配置之前的virtualSlave数据库池。

amoeba启动

启动命令:

  1. amoeba start

此命令以前台的方式启动,会输出启动时的信息,检查没有错误信息后,中断,并后台运行:

  1. amoeba start &

FAQ

1、无法正常连接?
首先根据执行amoeba start输出的信息排除配置文件没有问题,之后确认mysql用户是否有远程连接的权限,然后检查网站的数据库配置文件是否设置正确。
2、如何配置网站数据库连接文件?
默认的端口应该为8066,用户及密码在amoeba.xml里设置。
参考:http://docs.hexnova.com/amoeba/single-dbserver.html
http://docs.hexnova.com/amoeba/rw-splitting.html

monit 配置 监控启动 nginx php mysql redis mongodb 单台服务器永不宕机

安装参考:

http://linuxjcq.blog.51cto.com/3042600/717843

启动:monit -Ic /etc/monitrc &
crontab -e
*/600 * * * * /usr/local/bin/monit -Ic /etc/monitrc &
conf 配置:
—————nginx php mysql redis mongodb 配置 完美OK——————–
# nginx
check process nginx with pidfile /usr/local/nginx/logs/nginx.pid
start program = “/usr/local/nginx/sbin/nginx”
stop program = “/usr/bin/killall nginx”
if failed host 127.0.0.1 port 80 then restart
if cpu is greater than 40% for 2 cycles then alert
if cpu > 60% for 5 cycles then restart
if 10 restarts within 10 cycles then timeout
# php5-fpm
check process php-fpm with pidfile /var/run/php-fpm.pid
start program = “/usr/local/php5.3/sbin/php-fpm”
stop program = “/usr/bin/killall php-fpm”
if failed port 9000 then restart
if cpu is greater than 40% for 2 cycles then alert
if cpu > 60% for 5 cycles then restart
if 10 restarts within 10 cycles then timeout# php5-fpm binary.
check file php5-fpm-tcp_bin with path /usr/local/php5.3/sbin/php-fpm
if 10 restarts within 10 cycles then timeout
if failed checksum then unmonitor
if failed permission 755 then unmonitor
if failed uid root then unmonitor
if failed gid root then unmonitor
alert root@localhost# Test the init scripts.
check file php5-fpm-tcp_init with path /usr/local/php5.3/sbin/php-fpm
if failed checksum then unmonitor
if failed permission 755 then unmonitor
if failed uid root then unmonitor
if failed gid root then unmonitor
alert root@localhost
# mysql
check process mysql with pidfile /var/lib/mysql/localhost.localdomain.pid
group database
start program = “/sbin/service mysql start”
stop program = “/sbin/service mysql stop”
if failed port 8306 then restart
if 3 restarts within 10 cycles then timeout
# redis
check process redis with pidfile /var/run/redis.pid
start program = “/usr/local/redis/redis-server /usr/local/redis/redis.conf”
stop program = “/usr/bin/killall redis-server”
if failed host 127.0.0.1 port 6379 then restart
if cpu is greater than 40% for 2 cycles then alert
if cpu > 60% for 5 cycles then restart
if 10 restarts within 10 cycles then timeout
# mongodb
check process mongod with pidfile /usr/local/mongodb/data/mongod.lock
start program = “/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/”
stop program = “/usr/bin/killall mongod”
if failed port 27017 protocol http and request “/” with timeout 10 seconds then restart
if 10 restarts within 10 cycles then timeout
—————-end——————-
/usr/local/mmonit/bin/mmonit -c /usr/local/mmonit/conf/server.xml -t
/usr/local/mmonit/bin/mmonit -c /usr/local/mmonit/conf/server.xml start
monit  -t
killall monit
monit -Ic /etc/monitrc &
telinit q
ps aux |grep monit
kill -1 1
ps aux |grep redis-server
killall redis-server
ll /var/run/redis.pid
/usr/local/redis/redis-server /usr/local/redis/redis.conf &
ps aux |grep php-fpm
killall php-fpm
/usr/local/php5.3/sbin/php-fpm
ps aux |grep mongod
killall mongod
/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/ &
set mmonit http://monit:monit@142.4.48.50:8080/collector
set nginx port 80 and
    use address 142.4.48.50
    allow localhost
    allow 142.4.48.50
  location /monit/ {
        rewrite ^/monit/(.*) /$1 break;
        proxy_ignore_client_abort on;
        proxy_pass   http://192.168.1.10:2812; 
        proxy_redirect  http://192.168.1.10:2812/monit; 
    }

# include /etc/monit.d/*
# mysql
check process mysqld with pidfile /var/lib/mysql/localhost.localdomain.pid
  group database
  start program = “/etc/init.d/mysql start”
  stop program = “/etc/init.d/mysql stop”
  if failed host 127.0.0.1 port 8306 then restart
  if 5 restarts within 5 cycles then timeout
# nginx
check process nginx with pidfile /usr/local/nginx/logs/nginx.pid
  start program = “/usr/local/nginx/sbin/nginx”
  stop program = “/usr/bin/killall nginx”
  if failed host 127.0.0.1 port 80 then restart
  if cpu is greater than 40% for 2 cycles then alert
  if cpu > 60% for 5 cycles then restart
  if 10 restarts within 10 cycles then timeout
# redis
check process redis with pidfile /var/run/redis.pid
  start program = “/usr/local/redis/redis-server /usr/local/redis/redis.conf”
  stop program = “/usr/bin/killall redis-server”
  if 10 restarts within 10 cycles then timeout
check file dump.rdb with path /usr/local/redis/dump.rdb
  if size > 100 MB then alert
# php5-fpm
check process php-fpm with pidfile /var/run/php-fpm.pid
  start program = “/usr/local/php5.3/sbin/php-fpm”
  stop program = “/usr/bin/killall php-fpm”
  if failed host 127.0.0.1 port 9000 then restart
  if cpu is greater than 40% for 2 cycles then alert
  if cpu > 60% for 5 cycles then restart
  if 10 restarts within 10 cycles then timeout
# php5-fpm binary.
check file php5-fpm-tcp_bin with path /usr/local/php5.3/sbin/php-fpm
  if 10 restarts within 10 cycles then timeout
  if failed checksum then unmonitor
  if failed permission 755 then unmonitor
  if failed uid root then unmonitor
  if failed gid root then unmonitor
  alert root@localhost
# Test the init scripts.
check file php5-fpm-tcp_init with path /usr/local/php5.3/sbin/php-fpm
  if failed checksum then unmonitor
  if failed permission 755 then unmonitor
  if failed uid root then unmonitor
  if failed gid root then unmonitor
  alert root@localhost
# mysql
check process mysqld with pidfile /var/lib/mysql/localhost.localdomain.pid
  group database
  start program = “/sbin/service mysql start”
  stop program = “/sbin/service mysql stop”
  if failed host 127.0.0.1 port 8306 then restart
  if 2 restarts within 6 cycles then timeout
# mongodb
check process mongod with pidfile /usr/local/mongodb/data/mongod.lock
  start program = “/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/”
  stop program = “/usr/bin/killall mongod”
  if failed port 27017 protocol http and request “/” with timeout 10 seconds then restart
  if 10 restarts within 10 cycles then timeout
#mongodb
check process mongod with pidfile “/usr/local/mongodb/data/mongod.lock”
  start program = “/usr/local/mongodb/bin/mongod –dbpath=/usr/local/mongodb/data/”
  stop program = “/usr/bin/killall  mongod”
  if failed port 27017 protocol http and request “/” with timeout 10 seconds then restart
  if 5 restarts within 5 cycles then timeout
# tomcat
check process tomcat with pidfile /var/run/tomcat/tomcat.pid
  start program = “/etc/init.d/tomcat start”
  as uid solr gid solr
  stop program = “/etc/init.d/tomcat stop”
  as uid solr gid solr
  if failed port 8080 then alert
  if failed port 8080 for 5 cycles then restart
set mmonit http://monit:monit@142.4.48.50:8080/collector
set httpd port 12112 and
    use address 142.4.48.50 //monit主机的IP
    allow localhost
    allow 142.4.48.50 //mmonit主机的IP