记录一次失败的 Upgrade MySQL to MariaDB 经历

摘要

每次“折腾”其实都是有不少收获的,比如这次的折腾虽然以失败告终,但是至少也算是体验了一番Upgrade MySQL to MariaDB的过程,对MariaDB也算是有了一个初步的认识了。有条件还是要尽早将MySQL替换为MariaDB最好,至于说数据的导入、导出完全不用担心“转换”的,它们之间的兼容性那真的是“刚刚的”,毕竟是出自同一个创始人之手的开源数据库嘛!

其实这次升级 MySQL 是个很偶然的决定,主要就是看到了 wooCommerce 插件升级的时候联想到了最近总是发现在使用了 wooCommerce 插件后数据库总有不正常错误出现,从 wooCommerce 插件的支持情况来看可能是因为 MySQL 版本低于 5.6 造成的,所以就想升级 MySQL 的打算了,受制于服务器只有 1G 内存一直没有实现,还以为 MariaDB 对内存没有这个要求呢!

未分类

想到就要行动起来,因为使用的是军哥的 LNMP1.5 测试版,在 upgrade.sh 脚本里就自带了 Upgrade MySQL to MariaDB 的选项,就直接用脚本升级了,数据库太大了,编译安装耗时近一个多小时。结果是彻底失败,MariaDB 里竟然没有任何数据表,PhpMyAdmin 里也是彻底乱了套,界面错位,无法正常操作。折腾了两个多小时才发现是 ngx_lua_waf 拦截造成的,无奈暂时关闭 WAF。这时候站点已经都无法访问了。没有办法只能请出阿里云的镜像回滚恢复了。

恢复正常后还是不甘心呀!所以继续努力继续折腾,这次提前把数据库都导出来以备不时之需,关闭 WAF 防火墙重新来过,近一个小时的等待后终于成功了,这次很完美,数据表依然是丢失的,还好编译前有备份,立马导入数据,又发现 MariaDB 的 root 密码竟然无效了,只能重置数据库密码了。终于恢复网站访问了!么么哒!!!

未分类

等等,有点儿不对劲儿,服务器控制台终端好卡的感觉,一看负载,我去一直在“飙升”直至网站打开出现 503 错误,负载还在持续飙升一路到 50 多了!我去,这也太猛了吧!难道是因为 MariaDB 没有优化所致?于是又对 MariaDB 的配置文件进行了一番研究调整了一些参数优化了一番,重新载入 MariaDB 后,CPU 的负载依然是 90%以上,这时候突然想起来 MySQL 5.6 以后的版本对服务器内存有要求至少是 2G 以上,难道 MariaDB 也有这个要求,MariaDB 的版本我选的是 10.2.12 版,百度、谷姐一番后基本上可以确定就是服务器物理内存太小造成的了!哎,无语了,看来升级到 MariaDB 也是没有办法的,只能是镜像回滚恢复了。

至此,这次 Upgrade MySQL to MariaDB 的折腾还是以失败而告终了,服务器配置太低是主要原因,虽然 MariaDB 那么的诱人,但至少目前来看是无福消受了!我说为啥阿里云 ECS 1G1 核的卖的这么便宜,原来又是“套路”呀!唉,真的是彻底的服了!

不过,每次“折腾”其实都是有不少收获的,比如这次的折腾虽然以失败告终,但是至少也算是体验了一番 Upgrade MySQL to MariaDB 的过程,对 MariaDB 也算是有了一个初步的认识了。有条件还是要尽早将 MySQL 替换为 MariaDB 最好,至于说数据的导入、导出完全不用担心“转换”的,它们之间的兼容性那真的是“刚刚的”,毕竟是出自同一个创始人之手的开源数据库嘛!

MariaDB/MySQL配置文件my.cnf解读

MariaDB/MySQL的默认设置性能非常差,仅仅起一个功能测试的作用,不能用在生产环境中,因此要对一些参数进行调整优化。当然,对配置文件各参数的调整需要根据实际环境,不同时期不同数量级的数据进行性能优化。

未分类

MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后你需要重启 MySQL 服务,以使更改生效。本文的参数配置基于MariaDB 10.2,硬件内存4G。文中一些选项值的设置只是推荐值,不要盲目的接受这些建议。每个 MySQL 设置都是不同的,在进行任何更改之前需要慎重考虑。

基本结构

[client]
port        = 3306 #客户端默认连接端口
socket      = /tmp/mysql.sock  #用于本地连接的socket套接字

[mysqld]  # 服务端基本配置
port        = 3306 # mysql监听端口
socket      = /tmp/mysql.sock #为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
user    = mariadb # mysql启动用户
basedir = /usr/local/mariadb # 安装目录
datadir = /data/mysql # 数据库数据文件存放目录
log_error = /data/mysql/mariadb.err #记录错误日志文件
pid-file = /data/mysql/mariadb.pid  #pid所在的目录
skip-external-locking  #不使用系统锁定,要使用myisamchk,必须关闭服务器
...

my.cnf配置文件以方括号如[client]区分模块作用域,其中[client]表示客户端配置,[mysqld]是服务端配置。以上几个选项是最基础的,每个选项有简单说明,其中有关路径的配置是基于本站文章:CentOS7下源码编译安装MariaDB 10.2和Linux下使用二进制格式安装MariaDB的安装路径来配置的,所以在配置前可以先按照两文先安装好MairaDB。

选项配置及说明

key_buffer_size = 32M 这个参数用来缓存MyISAM存储引擎的索引参数。MySQL5.5默认为InnoDB存储引擎,所以这个参数可以设置小点,64MB即可。

max_allowed_packet = 1M 允许最大接收数据包的大小,防止服务器发送过大的数据包。可以设置为16MB或者更大,但设置的太大也可能有危险。

table_open_cache = 128 #MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。默认值64,假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上。

sort_buffer_size = 768K 在表进行order by和group by排序操作时,由于排序的字段没有索引,会出现Using filesort,为了提高性能,可用此参数增加每个线程分配的缓冲区大小。默认为256KB,这个参数不要设置过大,一般在128~256KB即可。另外,一般出现Using filesort的时候,要通过增加索引来解决。

net_buffer_length = 8K 包消息缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节。

read_buffer_size = 768K 该参数用于表的顺序扫描,表示每个线程分配的缓冲区大小。比如在进行全表扫描时,MySQL会按照数据的存储顺序依次读取数据块,每次读取的数据块首先会暂存在read_buffer_size中,当buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。默认为128K,这个参数不要设置过大,一般在128~256之间。

read_rnd_buffer_size = 512K 该参数用于表的随机读取,表示每个线程分配的缓冲区大小。比如,按照一个非索引字段做order by排序操作时,就会利用这个缓冲区来暂存读取的数据。默认为256KB,这个参数不要设置过大,一般在128~512KB。

myisam_sort_buffer_size = 8M 当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;设置太小时可能会遇到” myisam_sort_buffer_size is too small”

thread_cache_size = 16 线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁,如果线程缓存在的空闲线程,需要重新建立新连接,则会优先调用线程池中的缓存,很快就能响应连接请求。每建立一个连接,都需要一个线程与之匹配。

query_cache_size = 16M 缓存select语句和结果集大小的参数。查询缓存会存储一个select查询的文本与被传送到客户端的相应结果。如果之后接收到一个相同的查询,服务器会从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。如果你的环境中写操作很少,读操作频繁,那么打开query_cache_type=1,会对性能有明显提升。如果写操作频繁,则应该关闭它(query_cache_type=0)。

tmp_table_size = 32M 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。

explicit_defaults_for_timestamp = true 是否显示默认时间戳

#skip-networking

max_connections = 500 该参数用来设置最大连接数,告诉你当前你的服务器允许多少并发连接。默认为100,一般设置为512-1000即可。请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。

max_connect_errors = 100 如果有时网络抽风,或者应用配置错误,或者其他原因导致客户端短时间内不断的尝试连接,客户端可能会被列入黑名单,然后将无法连接,直到再次刷新主机缓存。这个选项默认值太小了,可以考虑设的足够大(如果你的服务器配置够强大的话)。

open_files_limit = 65535 mysql打开最大文件数

log-bin=mysql-bin 这些路径相对于datadir

binlog_format=mixed 日志格式

server-id = 1 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。在复制数据同步的时候会用到,Helloweba后面会有文章介绍。

expire_logs_days = 10 启用二进制日志后,保留日志的天数。服务器会自动清理指定天数前的日志文件,如果不设置则会导致服务器空间耗尽。一般设置为7~14天。

default_storage_engine = InnoDB 新数据表的默认存储引擎(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。

innodb_file_per_table = 1 InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。

innodb_data_home_dir = /data/mysql InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。

innodb_data_file_path = ibdata1:10M:autoextend 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。

innodb_log_group_home_dir = /data/mysql 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。

innodb_buffer_pool_size = 128M 这个参数是InnoDB存储引擎的核心参数,默认为128KB,这个参数要设置为物理内存的60%~70%。

innodb_log_file_size = 32M 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。

innodb_log_buffer_size = 8M 事务日志所使用的缓存区。InnoDB在写事务日志的时候,为了提高性能,先将信息写入Innodb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)时,再将日志写到文件(或者同步到磁盘)中。可以通过innodb_log_buffer_size参数设置其可以使用的最大内存空间。默认是8MB,一般为16~64MB即可。

innodb_flush_log_at_trx_commit = 1 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。

innodb_lock_wait_timeout = 50 如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。

示例:内存4G的my.cnf配置

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
user    = mariadb
basedir = /usr/local/mariadb
datadir = /data/mysql
log_error = /data/mysql/mariadb.err
pid-file = /data/mysql/mariadb.pid
skip-external-locking
key_buffer_size = 64M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
net_buffer_length = 8K
read_buffer_size = 1M
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 16M
thread_cache_size = 32
query_cache_size = 32M
tmp_table_size = 64M

explicit_defaults_for_timestamp = true
#skip-networking
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

log-bin=mysql-bin
binlog_format=mixed
server-id   = 1
expire_logs_days = 10

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_data_home_dir = /data/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data/mysql
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 1M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

使用sysbench测试mariadb性能的经验总结

github地址: https://github.com/akopytov/sysbench
我测试用的系统: CentOS Linux release 7.2.1511 (Core)
sysbench版本用了最新的, 1.1.0
过程中也搜了很多教程, 所以重复的就不多说, 主要说一下教程中没看到的或不够清楚的

1. 安装

安装可以用yum也可以自己下下来编译, 我两种都尝试了一下, 自己编译注意看情况指定–with-mysql-includes和 –with-mysql-libs, 比如:

./configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib

如果是上面这种方式编译安装的, 将会只带mysql驱动, 跑测试的时候就不用指定 –db-driver

如果是yum安装的, 默认除了mysql还会带一个PostgreSQL的驱动, 就得指定 –db-driver=mysql, 否则会报错提示没指定驱动啥的

带了哪些驱动可以从sysbench –help里看到

2. 跑测试

勤看帮助。

sysbench –help的最上面是通用选项, 主要用到的比如线程数(–threads), 限制跑多久(–time), 跑多少次事件(–events)
sysbench –help的最后, 可以看到自带的测试方式有这些, 这就是–test=后面可以带的参数

Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test

基础用法(help, prepare, run, cleanup)参考github页面

想测数据库的, 一开始可能会有点懵逼, 因为这里没看到测试数据库的参数, 网上教程大都是旧的, 按那些填也没用, 而github主页上好像也没找到说明?

我也蛋疼了好一会儿, –help和github主页看了无数遍, 终于才在github主页最上面瞄到这个:

未分类

我tm也是醉了, 这里一般都当作介绍区域看一眼就跳过了, 谁会想到唯一能找到使用方式的线索在这里???

所以搜一下这个oltp_.lua吧, find / -name oltp_.lua, 会列出一堆lua脚本, 选择你要测的直接复制完整路径作为参数传给–test, 然后其他一堆参数该填的填, 就可以跑起来了

要注意的主要是这个参数–rand-type=, 这里官网给了可选的范围: {uniform, gaussian, special, pareto, zipfian}, 其他几个还能勉强看出是一些数学分布, uniform和special完全不知道是干什么的, uniform只知道有个统一的意思, 并不能确定, 搜也搜不到, 于是提了个issue问了一下:

未分类

好吧原来uniform就是离散均匀分布, 简单来说就是普通随机, special如作者所说,是不科学的,但它又是默认值……(还能说啥,前面的白测了_(:з」∠)
(简单对比了一下uniform和special, special测出来的性能大致是uniform的1.7倍)

3. 各lua脚本的区别

虽然没写过lua, 不过打开脚本看看基本能看出来, 我只测了下面三个(下列为后缀), 它们分别干的事是:

•  insert:, 即为纯insert
•  read_write 包括:  select (range, sum, order, distinct) ,  update,  update(non-index),  delete
•  read_only: select (range, sum, order, distinct)

--range_selects 参数决定select是否是仅单点 (只使用where=,而不使用上面括号中条件)

4. 其他

注意帮助最后一句写的See ‘sysbench help’ for a list of options for each test.
所以要看参数的话就是 sysbench xx.lua help, 可以看到参数用来设置测试用的表数量, 表大小之类的

自己撸了个python脚本测insert(主要是为了测别的), 用了sqlalchemy, 性能和测试脚本差距比较大…

我是三台虚拟机做了galera分布式集群的, 实测发现单节点跑测试时其他节点cpu也会飚起来, 所以就不贴结果了, 可能参考性不够强.

编译安装MariaDB

环境centOS6.9 MariaDB10.1.8

1、环境准备

yum -y install ncurses-devel 
yum -y install gcc-c++

2、介质准备

mariadb10.1.8,cmake3.8.2

3、安装cmake

tar xfz cmake-3.8.2.tar.gz
    cd cmake-3.8.2
    ./bootstrap
    make
    make install
    cmake --version

4、创建用户和组、数据目录

groupadd mysql
useradd -r -g mysql -s /sbin/nologin mysql
mkdir -p /home/data/mariadbdata
chown -R mysql:mysql /home/data/mariadbdata

5、解压、编译安装

tar xfz mariadb-10.1.8.tar.gz
cd mariadb-10.1.8

cmake . -DCMAKE_INSTALL_PREFIX=/home/opt/mariadb -DMYSQL_DATADIR=/home/date/mariadbdata -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

make
make install

6、安装数据库,配置my.cnf

cp -pv /home/opt/mariadb/support-files/my-innodb-heavy-4G.cnf /home/opt/mariadb/my.cnf
scripts/mysql_install_db --defaults-file=${INSTALL_DIR}/my.cnf --user=mysql --basedir=/home/opt/mariadb --datadir=/home/date/mariadbdata

7、配成Linux服务(名称mariadb)

cp -pv ${INSTALL_DIR}/support-files/mysql.server /etc/init.d/mariadb
chkconfig --add /etc/init.d/mariadb
chkconfig --list mariadb
service mariadb start

Linux之mariaDB的应用(论坛的搭建)

在mariadb的学习后,可以简单搭建一个论坛;
由于我之前已经下载了论坛文件的压缩包,这里就直接使用了

(1)下载模板Discuz_X3.2_SC_UTF8.zip

未分类

(2)解压包Discuz_X3.2_SC_UTF8.zip ##有readme,upload,utility,database四个目录

未分类

(3)cp -r upload/ /var/www/html/ ##把解压出来的upload目录复制到/var/www/html/

未分类

(4)chmod 777 /var/www/html/upload/* -R ##给目录下所有文件权限

未分类

测试:地址栏:IP/upload ##进行安装

未分类

安装

未分类

设置管理员用户密码

未分类

登录

未分类

主页

未分类

每一步都有提示,按提示安装

curl  -I   域名    域名         ##查看网站详情

baidu:

未分类

网易邮箱163:服务器采用nginx(俄罗斯的)

未分类

MariaDB基本命令

MariaDB名称来自Michael Widenius的女儿Maria的名字。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

1. 数据库安装并初始化

yum install mariadb-server.x86_64 -y    ##安装数据库
systemctl start mariadb         ##开启数据库服务
netstat -antlupe|grep mysql     ##查看数据库的接口信息
mysql                   ##测试能否打开数据库
vim /etc/my.cnf             ##关闭数据库对外接口
    skip-networking=1       ##在第6行添加命令(跳过网络服务)
:wq
systemctl restart mariadb       ##重启服务
netstat -antlupe|grep mysql     ##此时查看数据库端口已经关闭
mysql_secure_installation       ##数据库初始化,这里我们输入密码后全部选择y

2. MYSQL基本操作指令

mysql -uroot -p123  ##进入数据库(这里不要养成习惯因为输入密码时明文的)

1)查看****重点内容

show databases;                 ##显示数据库
use mysql;                  ##进入数据库
show tables;                    ##显示数据库中的表
select * from mysql.user;           ##查询mysql库下的user表中的数据
desc user;                  ##查看user表的数据结构
flush privileges;               ##刷新数据库信息
select host,user,password from user;        ##查询user表中的host,user,password字段
select host,user,password from user where host="::1"##查询表中字段中有关::1的数据

未分类

未分类

2)创建

create database westos;             ##创建westos数据库
use westos;                 ##进入westos数据库
create table linux(             ##创建表,user,passwd字段
user varchar(15) not null,
passwd varchar(15) not null             ##varchar可变型字符变量
 );
insert into linux values ('student','student');     ##在linux表中插入值为student student
select * from linux;                    ##查询linux中的数据

未分类

未分类

3)更改

alter table linux rename messages;          ##将linux表重命名为messages
alter table linux add age varchar(4);           ##添加age字段到linux表中
ALTER TABLE linux DROP age;             ##删除age字段
ALTER TABLE linux ADD age VARCHAR(5) AFTER name;    ##在name字段后添加字段age
ALTER TABLE linux ADD age VARCHAR(5)            
update linux set password=student where username=student;##更新linux表中user1的密码为password2

4)删除

delete from linux where username=user1;         ##删除linux表中user1的所有内容
drop table linux;                   ##删除linux表
drop database westos;                   ##删除westos数据库

5)用户授权

CREATE USER lee@localhost identified by 'lee';      ##创建用户lee密码为lee
grant select insert on  *.* to lee@localhost;   ##授权user1 密码为passwd1只能在本地 查询数据库的所以内容 
grant all on mysql.* to lee@'%' identified by 'lee2';   ##授权user2 密码为passwd2  可以从远程任意主机登录mysql 并且可以对mysql数据库任意操作
show grants for lee@localhost;          ##查看已经修改的权限;        
revoke insert on *.* from lee@localhost;    ##删除掉用户lee的添加数据权限;

6)备份

/var/lib/mysql
mysqldump -uroot -p123 westos > /mnt/mysql.sql  ##备份mysql库到mysql.bak
mysql -uroot -p123 -e "DROP database westos"
mysql -uroot -p123 westos < /mnt/mysql.sql      ##恢复mysql.bak 到westos库

7)mysql 密码恢复

/etc/init.d/mysqld stop
或者systemctl stop mariadb
mysqld_safe --skip-grant-tables &   ##跳过grant-tables授权表  不需要认证登录本地mysql数据库
update mysql.user set password=password('westos') where user='root';    ##更新mysql.user 表中条件为root用户的密码为加密westos
修改完成后
ps aux|grep mysql
kill -9 +端口号 结束所有关于mysql的进程
systemctl start mysql 

3. php-mysq

@@php -m 可以查看php所支持的服务,因为本身默认不支持mysql
所以需要安装php-mysql模块才能使用@@
phpmyadmin

yum install php php-mysql httpd mysql mysql-server  ##安装需要的服务
tar jxf phpmyadmin-*.tar.bz2 -C /var/www/html       ##将下载好的东西解压
mv phpmyadmin phpadmin                  ##重命名
cp config.sample.inc.php config.inc.php         ##复制文件
vim config.inc.php                  ##php3.4版本不需要
add 
$cfg['blowfish_secret'] = 'test';
/etc/init.d/httpd start

测试:http://172.25.254.117/phpadmin

未分类

未分类

4. discuz论坛建立

下载DISCUZ压缩包

unzip解压
cp -r upload /var/www/html/
chomd 777 /var/www/html/upload/* -R

测试:http://172.25.254.117/upload

未分类

LVM之Cache加速

概述

我们知道LVM是管理本地磁盘,更好的提供块设备服务的机制;

在现实环境中,我们的机器通常都有几种不同类型的磁盘存在,高性能的磁盘容量低,容量大的磁盘性能差,那如何利用Linux系统的各种cache机制来提升LVM卷的性能呢?

存储磁盘分类

通常我们使用的存储磁盘有三种,分别对应不同的容量、性能、价格,有:SATA盘,SSD盘和PCIE-SSD;

他们三个的大致性能容量和价格如下表所示:

未分类

从上面可以看出,可以作为普通磁盘加速的磁盘有:SSD盘和PCIE-SSD,其中SSD盘是最常见和用的最多的,PCIE卡在超高性能需求场所有使用。

注:其实现在SSD/PCIE-SSD的每GB价格相差不大了,若对超高性能有需求,PCIE-SSD是个很好的选择;

Cache算法

通常我们使用高性能磁盘来加速低性能磁盘时,都会选择一种Linux内核支持的Cache算法,现在Linux内核支持的常用Cache算法有如下几种;

flashcache

flashcache 是 facebook 开源的 ssd 存储产品,它基于内核的 devicemapper 机制,允许将 ssd 设备映射为机械存储设备的缓存,堆叠成为一个虚拟设备供用户读写,从而在一定程度上兼顾 ssd 的高速与机械存储设备的高容量,更加经济高效地支撑线上业务。

flashcache 支持三种缓存策略:

  • 回写(Write Back):修改内容之后,并不立即写入后端设备
  • 写透(Write Through): 修改内容时写入后端设备,同时也更新前端设备中的缓存块
  • 环写(Write Around): 修改内容时,先写入后端设备,同时使前端设备中对应的缓存块失效

参考:

https://github.com/facebookarchive/flashcache

https://en.wikipedia.org/wiki/Flashcache

bcache

bcache是linux内核块设备层cache,类似于flashcache使用ssd作为hdd的缓存方案,相比于flashcache,bcache更加灵活,支持ssd作为多块hdd的共享缓存,并且还支持多块ssd(还未完善),能够在运行中动态增加,删除缓存设备和后端设备。

从3.10开始,bcache进入内核主线。bcache支持writeback、writethrough、writearoud三种策略,默认是wriththrough,可以动态修改,缓存替换方式支持lru、fifo和random三种。

参考:

https://bcache.evilpiepirate.org/

http://www.sysnote.org/2014/06/20/bcache-analysis/

dm-cache

作为linux内核的一部分,dm-cache采用device mapper机制允许用户建立混合卷。dm-cache可以采用一个或多个快速设备为后端慢速存储系统扮演缓存的角色。

dm-cache设计成由3个物理存储设备来混合成一个逻辑卷的形式。操作模式和缓存策略决定了缓存数据的性能。这三个物理设备分别为:

  • 原始设备:提供主要的慢速存储(通常是一个硬盘或者SAN)
  • 缓存设备:提供高速原始设备数据的缓存(通常是一个SSD)
  • 元数据设备:记录硬盘块在缓存中的位置,脏标志以及执行缓存策略所需的内部数据

dm-cache支持写回,写通和旁路三种模式。

参考:

https://en.wikipedia.org/wiki/Dm-cache

LVM加速策略

flashcache

基于flashcache的使用策略(SSD-SATA 1对1),我们有如下策略:

未分类

bcache

bcache可以用一块SSD盘做多个SATA盘的缓存,有如下策略:

未分类

LVM自带Cache策略

LVM自带Cache策略可以配置两个LV之间做缓存,有如下策略:

未分类

LVM Cache策略选择

现实中,考虑稳定性和可靠性,使用flashcache作为Cache策略的比较多。

但最近bcache也越来越得到大范围的使用,在某些测试报告中,其性能多数场景优于flashcache。

逻辑卷管理(LVM)的创建与使用

未分类

我想告诉你的是,当 LVM (逻辑卷管理)首次出现在 Fedora Linux 中时,我是非常抗拒它的。我最初的反应是,我并不需要在我和我的设备之间有这种额外的抽象层。结果是我错了,逻辑卷管理是非常有用的。

管理磁盘空间对系统管理员来说是一件重要的日常工作。一旦磁盘空间耗尽就需要进行一系列耗时而又复杂的任务,以提升磁盘分区中可用的磁盘空间。它也需要系统离线才能处理。通常这种任务会涉及到安装一个新的硬盘、引导至恢复模式或者单用户模式、在新硬盘上创建一个分区和一个文件系统、挂载到临时挂载点去从一个太小的文件系统中移动数据到较大的新位置、修改 /etc/fstab 文件的内容来反映出新分区的正确设备名、以及重新引导来重新挂载新的文件系统到正确的挂载点。

我想告诉你的是,当 LVM (逻辑卷管理)首次出现在 Fedora Linux 中时,我是非常抗拒它的。我最初的反应是,我并不需要在我和我的设备之间有这种额外的抽象层。结果是我错了,逻辑卷管理是非常有用的。
LVM 让磁盘空间管理非常灵活。它提供的功能诸如在文件系统已挂载和活动时,很可靠地增加磁盘空间到一个逻辑卷和它的文件系统中,并且,它也允许你将多个物理磁盘和分区融合进一个可以分割成逻辑卷(LV)的单个卷组(VG)中。

卷管理也允许你去减少分配给一个逻辑卷的磁盘空间数量,但是,这里有两个要求,第一,卷必须是未挂载的。第二,在卷空间调整之前,文件系统本身的空间大小必须先被减少。

有一个重要的提示是,文件系统本身必须允许重新调整大小的操作。当重新提升文件系统大小的时候,EXT2、3 和 4 文件系统都允许离线(未挂载状态)或者在线(挂载状态)重新调整大小。你应该去认真了解你打算去调整的文件系统的详细情况,去验证它们是否可以完全调整大小,尤其是否可以在线调整大小。

即时扩展一个文件系统

在我安装一个新的发行版到我的生产用机器中之前,我总是喜欢在一个 VirtualBox 虚拟机中运行这个新的发行版一段时间,以确保它没有任何的致命的问题存在。在几年前的一个早晨,我在我的主要使用的工作站上的虚拟机中安装了一个新发行的 Fedora 版本。我认为我有足够的磁盘空间分配给安装虚拟机的主文件系统。但是,我错了,大约在安装到三分之一时,我耗尽了我的文件系统的空间。幸运的是,VirtualBox 检测到了磁盘空间不足的状态,并且暂停了虚拟机,然后显示了一个明确指出问题所在的错误信息。

请注意,这个问题并不是虚拟机磁盘太小造成的,而是由于宿主机上空间不足,导致虚拟机上的虚拟磁盘在宿主机上的逻辑卷中没有足够的空间去扩展。

因为许多现在的发行版都缺省使用了逻辑卷管理,并且在我的卷组中有一些可用的空余空间,我可以分配额外的磁盘空间到适当的逻辑卷,然后即时扩展宿主机的文件系统。这意味着我不需要去重新格式化整个硬盘,以及重新安装操作系统或者甚至是重启机器。我不过是分配了一些可用空间到适当的逻辑卷中,并且重新调整了文件系统的大小 —— 所有的这些操作都在文件系统在线并且运行着程序的状态下进行的,虚拟机也一直使用着宿主机文件系统。在调整完逻辑卷和文件系统的大小之后,我恢复了虚拟机的运行,并且继续进行安装过程,就像什么问题都没有发生过一样。

虽然这种问题你可能从来也没有遇到过,但是,许多人都遇到过重要程序在运行过程中发生磁盘空间不足的问题。而且,虽然许多程序,尤其是 Windows 程序,并不像 VirtualBox 一样写的很好,且富有弹性,Linux 逻辑卷管理可以使它在不丢失数据的情况下去恢复,也不需要去进行耗时的安装过程。

LVM 结构

逻辑卷管理的磁盘环境结构如下面的图 1 所示。逻辑卷管理允许多个单独的硬盘和/或磁盘分区组合成一个单个的卷组(VG)。卷组然后可以再划分为逻辑卷(LV)或者被用于分配成一个大的单一的卷。普通的文件系统,如 EXT3 或者 EXT4,可以创建在一个逻辑卷上。

在图 1 中,两个完整的物理硬盘和一个第三块硬盘的一个分区组合成一个单个的卷组。在这个卷组中创建了两个逻辑卷和文件系统,比如,可以在每个逻辑卷上创建一个 EXT3 或者 EXT4 的文件系统。

未分类
图 1: LVM 允许组合分区和整个硬盘到卷组中

在一个主机上增加磁盘空间是非常简单的,在我的经历中,这种事情是很少的。下面列出了基本的步骤。你也可以创建一个完整的新卷组或者增加新的空间到一个已存在的逻辑卷中,或者创建一个新的逻辑卷。

增加一个新的逻辑卷

有时候需要在主机上增加一个新的逻辑卷。例如,在被提示包含我的 VirtualBox 虚拟机的虚拟磁盘的 /home 文件系统被填满时,我决定去创建一个新的逻辑卷,以存储包含虚拟磁盘在内的虚拟机数据。这将在我的 /home 文件系统中释放大量的空间,并且也允许我去独立地管理虚拟机的磁盘空间。

增加一个新的逻辑卷的基本步骤如下:

☉ 如有需要,安装一个新硬盘。
☉ 可选: 在硬盘上创建一个分区。
☉ 在硬盘上创建一个完整的物理卷(PV)或者一个分区。
☉ 分配新的物理卷到一个已存在的卷组(VG)中,或者创建一个新的卷组。
☉ 从卷空间中创建一个新的逻辑卷(LV)。
☉ 在新的逻辑卷中创建一个文件系统。
☉ 在 /etc/fstab 中增加适当的条目以挂载文件系统。
☉ 挂载文件系统。

为了更详细的介绍,接下来将使用一个示例作为一个实验去教授关于 Linux 文件系统的知识。

示例

这个示例展示了怎么用命令行去扩展一个已存在的卷组,并给它增加更多的空间,在那个空间上创建一个新的逻辑卷,然后在逻辑卷上创建一个文件系统。这个过程一直在运行着和已挂载的文件系统上执行。

警告:仅 EXT3 和 EXT4 文件系统可以在运行和挂载状态下调整大小。许多其它的文件系统,包括 BTRFS 和 ZFS 是不能这样做的。

安装硬盘
如果在系统中现有硬盘上的卷组中没有足够的空间可以增加,那么可能需要去增加一块新的硬盘,然后创建空间增加到逻辑卷中。首先,安装物理硬盘,然后,接着执行后面的步骤。

从硬盘上创建物理卷
首先需要去创建一个新的物理卷(PV)。使用下面的命令,它假设新硬盘已经分配为 /dev/hdd。

pvcreate /dev/hdd

在新硬盘上创建一个任意分区并不是必需的。创建的物理卷将被逻辑卷管理器识别为一个新安装的未处理的磁盘或者一个类型为 83 的 Linux 分区。如果你想去使用整个硬盘,创建一个分区并没有什么特别的好处,而且元数据所用的磁盘空间也能用做 PV 的一部分使用。

扩展已存在的卷组
在这个示例中,我将扩展一个已存在的卷组,而不是创建一个新的;你可以选择其它的方式。在物理磁盘已经创建之后,扩展已存在的卷组(VG)去包含新 PV 的空间。在这个示例中,已存在的卷组命名为:MyVG01。

vgextend /dev/MyVG01 /dev/hdd

创建一个逻辑卷
首先,在卷组中从已存在的空余空间中创建逻辑卷。下面的命令创建了一个 50 GB 大小的 LV。这个卷组的名字为 MyVG01,然后,逻辑卷的名字为 Stuff。

lvcreate -L +50G --name Stuff MyVG01

创建文件系统
创建逻辑卷并不会创建文件系统。这个任务必须被单独执行。下面的命令在新创建的逻辑卷中创建了一个 EXT4 文件系统。

mkfs -t ext4 /dev/MyVG01/Stuff

增加一个文件系统卷标
增加一个文件系统卷标,更易于在文件系统以后出现问题时识别它。

e2label /dev/MyVG01/Stuff Stuff

挂载文件系统
在这个时候,你可以创建一个挂载点,并在 /etc/fstab 文件系统中添加合适的条目,以挂载文件系统。
你也可以去检查并校验创建的卷是否正确。你可以使用 df、lvs 和 vgs 命令去做这些工作。

在 LVM 文件系统中调整逻辑卷大小

从 Unix 的第一个版本开始,对文件系统的扩展需求就一直伴随,Linux 也不例外。随着有了逻辑卷管理(LVM),现在更加容易了。

☉ 如有需要,安装一个新硬盘。
☉ 可选: 在硬盘上创建一个分区。
☉ 在硬盘上创建一个完整的物理卷(PV)或者一个分区。
☉ 分配新的物理卷到一个已存在的卷组(VG)中,或者创建一个新的卷组。
☉ 从卷空间中创建一个新的逻辑卷(LV),或者用卷组中部分或全部空间扩展已有的逻辑卷。
☉ 如果创建了新的逻辑卷,那么在上面创建一个文件系统。如果对已有的逻辑卷增加空间,使用 resize2fs 命令来增大文件系统来填满逻辑卷。
☉ 在 /etc/fstab 中增加适当的条目以挂载文件系统。
☉ 挂载文件系统。

示例

这个示例展示了怎么用命令行去扩展一个已存在的卷组。它会给 /Staff 文件系统增加大约 50GB 的空间。这将生成一个可用于挂载的文件系统,在 Linux 2.6 内核(及更高)上可即时使用 EXT3 和 EXT4 文件系统。我不推荐你用于任何关键系统,但是这是可行的,我已经成功了好多次;即使是在根(/)文件系统上。是否使用自己把握风险。

警告:仅 EXT3 和 EXT4 文件系统可以在运行和挂载状态下调整大小。许多其它的文件系统,包括 BTRFS 和 ZFS 是不能这样做的。

安装硬盘
如果在系统中现有硬盘上的卷组中没有足够的空间可以增加,那么可能需要去增加一块新的硬盘,然后创建空间增加到逻辑卷中。首先,安装物理硬盘,然后,接着执行后面的步骤。

从硬盘上创建物理卷
首先需要去创建一个新的物理卷(PV)。使用下面的命令,它假设新硬盘已经分配为 /dev/hdd。

pvcreate /dev/hdd

在新硬盘上创建一个任意分区并不是必需的。创建的物理卷将被逻辑卷管理器识别为一个新安装的未处理的磁盘或者一个类型为 83 的 Linux 分区。如果你想去使用整个硬盘,创建一个分区并没有什么特别的好处,而且元数据所用的磁盘空间也能用做 PV 的一部分使用。

增加物理卷到已存在的卷组
在这个示例中,我将使用一个新的物理卷来扩展一个已存在的卷组。在物理卷已经创建之后,扩展已存在的卷组(VG)去包含新 PV 的空间。在这个示例中,已存在的卷组命名为:MyVG01。

vgextend /dev/MyVG01 /dev/hdd

扩展逻辑卷
首先,在卷组中从已存在的空余空间中创建逻辑卷。下面的命令创建了一个 50 GB 大小的 LV。这个卷组的名字为 MyVG01,然后,逻辑卷的名字为 Stuff。

lvcreate -L +50G --name Stuff MyVG01

扩展文件系统
如果你使用了 -r 选项,扩展逻辑卷也将扩展器文件系统。如果你不使用 -r 选项,该操作不行单独执行。下面的命令在新调整大小的逻辑卷中调整了文件系统大小。

resize2fs /dev/MyVG01/Stuff

你也可以去检查并校验调整大小的卷是否正确。你可以使用 df、lvs 和 vgs 命令去做这些工作。

提示

过去几年来,我学习了怎么去做让逻辑卷管理更加容易的一些知识,希望这些提示对你有价值。

◈ 除非你有一个明确的原因去使用其它的文件系统外,推荐使用可扩展的文件系统。除了 EXT2、3、和 4 外,并不是所有的文件系统都支持调整大小。EXT 文件系统不但速度快,而且它很高效。在任何情况下,如果默认的参数不能满足你的需要,它们(指的是文件系统参数)可以通过一位知识丰富的系统管理员来调优它。
◈ 使用有意义的卷和卷组名字。
◈ 使用 EXT 文件系统标签

我知道,像我一样,大多数的系统管理员都抗拒逻辑卷管理。我希望这篇文章能够鼓励你至少去尝试一个 LVM。如果你能那样做,我很高兴;因为,自从我使用它之后,我的硬盘管理任务变得如此的简单。

CentOS 7下如何配置KVM虚拟化环境

KVM是一个开源的虚拟化模块,是基于硬件的完全虚拟化,所以需要硬件的支持。废话不多说,操作步骤如下:

0x01 硬件检测

$ egrep '(vmx|svm)' /proc/cpuinfo   ##检测CPU是否支持虚拟化

如果输出的结果包含vmx,则是Intel处理器虚拟机技术标志;如果包含SVM,则是AMD处理器虚拟机技术的标志;如果什么都没有,则需要在BISO中开启VT(Virtual Technolege)功能。

0x02 软件包安装

$ yum -y install kvm python-virtinst libvirt tunctl bridge-utils virt-manager qemu-kvm-tools virt-viewer

安装完成后,检查kvm模块有没有加载上

$  lsmod |grep kvm   ##有输出类似下面结果则正常

kvm_intel 148081 0

kvm 461126 1 kvm_intel

0x03 创建网桥

1、创建br0文件

$ cp ifcfg-eth0 ifcfg-br0  ##如果管理IP配置再eth0,则这就复制一个br0即可

2、编辑br0

TYPE=Bridge

BOOTPROTO=static

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

DEVICE=br0

ONBOOT=yes

IPADDR=192.168.2.10

NETMASK=255.255.255.0

GATEWAY=192.168.2.1

3、编辑eth0

TYPE=Ethernet

BOOTPROTO=none

NM_CONTROLLED=no

NAME=eth0

DEVICE=eth0

BRIDGE=br0

ONBOOT=yes

配置完成后重启下机器,查看下网桥状态

$ brctl show

bridge name bridge id STP enabled interfaces

br0 8000.90b11c5a7c89 no eth0

virbr0 8000.5254000908ac yes virbr0-nic

至此,KVM环境配置完成。可以创建虚拟机尽情玩耍了。

修改kvm虚拟机镜像文件大小

1、查看kvm镜像的格式信息

[root@base-12-199 bakup]# qemu-img info 10.1.12.201_base-12-201
image: 10.1.12.201_base-12-201
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 88G
cluster_size: 65536

2、给镜像增加100G空间

[root@base-12-199 bakup]# qemu-img resize 10.1.12.201_base-12-201 +100G
Image resized.
[root@base-12-199 bakup]# qemu-img info 10.1.12.201_base-12-201
image: 10.1.12.201_base-12-201
file format: qcow2
virtual size: 300G (322122547200 bytes)
disk size: 88G
cluster_size: 65536

3、给镜像减少100G空间

qcow2格式降低空间

[root@base-12-199 bakup]# qemu-img resize 10.1.12.201_base-12-201-- -100G
This image format does not support resize

由于qcow2格式不支持空间减少,所以要使用raw格式。

[root@base-12-199 bakup]# qemu-img convert -O raw 10.1.12.201_base-12-201 10.1.12.201_base-12-201.raw

查看镜像信息

[root@base-12-199 bakup]# qemu-img info 10.1.12.201_base-12-201.raw
image: 10.1.12.201_base-12-201.raw
file format: raw
virtual size: 300G (429496729600 bytes)
disk size: 88G
[root@base-12-199 bakup]# qemu-img resize 10.1.12.201_base-12-201.raw -- 100G
Image resized.
[root@base-12-199 bakup]# qemu-img info 10.1.12.201_base-12-201.raw
image: 10.1.12.201_base-12-201.raw
file format: raw
virtual size: 200G (214748364800 bytes)
disk size: 88G

转换为qcow2

[root@base-12-199 bakup]# qemu-img convert -O qcow2 10.1.12.201_base-12-201.raw 10.1.12.201_base-12-201.qcow2
[root@base-12-199 bakup]# qemu-img info 10.1.12.201_base-12-201.qcow2
image: 10.1.12.201_base-12-201.qcow2
file format: qcow2
virtual size: 200G (214748364800 bytes)
disk size: 88G