MySQL自动化安装部署
MySQL的安装分为三种:
1、RPM包安装;
2、二进制包安装;
3、源码安装。
第一种方式比较简单,直接RPM包安装就OK了,或者通过yum源来安装,一般rpm包安装不支持自定义目录。
二进制安装虽然相对源码安装简单些,但是不是根据当前机器编译出的适合当前机器的高性能MySQL。
有过MySQL运维的人应该都清楚,线上的MySQL一般都采用源码编译,因为这样才可以根据企业的各自需要选择要编译的功能,虽然MySQL的源码编译挺简单的,但是试想一下,如果你有几百台服务器同时要安装MySQL,难道你还一台台去手动编译、编写配置文件吗?这显然太低效了,本文讨论MySQL的自动化安装部署。
其实还有一种方式,定制RPM包.
它相当于用源码安装的方式定制了一个RPM包.一次打包,可以多次使用
它可以定制路径,安装时自动创建帐号,自动配置服务,环境变量等,并且安装过程快速,简单。
在大规模部署的场景下,优点十分突出.
缺点是制作RPM包,需要自己编写Red Hat定义的spec文件.而spec文件编写的学习曲线比较陡.
需求如下
1.创建用户mysql
2.数据库软件安装在/home/mysql/mysql-5.6.26目录
3.数据文件存放在/data目录下
4.配置服务,自动启动
制作符合自己需求的RPM包
首先,下载rpmbuild
yum install rpm-build -y
它是Red Hat用于打RPM包的工具.
安装之后重启计算机,可以看到/root/rpmbuild目录下有如下文件夹
[root@guo ~]# cd rpmbuild/
[root@guo rpmbuild]# ls
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS
[root@guo rpmbuild]#
这个工具打包的过程大致如下,
编写spec指定打包的过程
将源码压缩包放在SOURCES目录下,
将源码解压缩到BUILD目录,执行make命令
将make install 的结果放在BUILDROOT目录下,
最后将BUILDROOT下编译好的二进制文件制作成RPM包。
并且可以指定在RPM安装之前,安装之后,卸载等过程执行的命令
首先,下载源码包
http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.26.tar.gz
并将其复制到指定的目录
/root/rpmbuild/SOURCES/mysql-5.6.26.tar.gz
安装编译MySQL需要的依赖包
yum -y install make gcc-c++ cmake bison-devel ncurses-devel
编写spec脚本
Name: MySQL
Version: 5.6.26
Release: 1%{?dist}
Summary: MySQL-5.6.26 RPM
Group: applications/database
License: GPL
URL: http://www.mysql.com
Source0: mysql-5.6.26.tar.gz
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: cmake
AutoReqProv: no
%description
MySQL 5.6.26
%define MYSQL_USER mysql
%define MYSQL_GROUP mysql
%prep
%setup -n mysql-%{version}
%build
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql/mysql-5.6.26 \
-DMYSQL_DATADIR=/data \
-DSYSCONFDIR=/etc \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DEXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
make -j `cat /proc/cpuinfo | grep processor| wc -l`
%install
rm -rf %{buildroot}
make install DESTDIR=%{buildroot}
%pre
mkdir -p /data
useradd -m -s /bin/bash mysql
chown -R mysql:mysql /data
%post
/home/mysql/mysql-5.6.26/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.26 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.26/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.26/bin;" >> /home/mysql/.bashrc
source /home/mysql/.bashrc
%preun
service mysql stop
chkconfig --del mysql
userdel mysql
rm -rf /home/mysql
rm -rf /data
rm -rf /etc/init.d/mysql
%clean
rm -rf %{buildroot}
%files
%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})
%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) /home/mysql/mysql-5.6.26/*
%changelog
有了这个spec文件之后,就可以执行如下命令生成我们自己的RPM包:
rpmbuild -bb ./mysql.spec
查看rpm包信息
[root@guo ~]# cd /root/rpmbuild/RPMS/x86_64
[root@guo x86_64]# ls
MySQL-5.6.26-1.el6.x86_64.rpm MySQL-debuginfo-5.6.26-1.el6.x86_64.rpm
[root@guo x86_64]# rpm -qpi MySQL-5.6.26-1.el6.x86_64.rpm
Name : MySQL Relocations: (not relocatable)
Version : 5.6.26 Vendor: (none)
Release : 1.el6 Build Date: Tue 29 Mar 2016 10:31:21 AM CST
Install Date: (not installed) Build Host: guo
Group : applications/home/mysql/database Source RPM: MySQL-5.6.26-1.el6.src.rpm
Size : 353781822 License: GPL
Signature : (none)
URL : http://www.mysql.com
Summary : MySQL-5.6.26 RPM
Description :
MySQL 5.6.26
[root@new x86_64]#
检查/etc/my.cnf文件参数是否正确
检查MySQL各目录中文件权限是否正确
启动MySQL服务
[root@guo data]# service mysql start
Starting MySQL. [ OK ]
修改密码
[root@guo data]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.26 Source distribution
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> set password=password('root');
Query OK, 0 rows affected (0.01 sec)
这个脚本各个Segment的作用请参考
http://machael.blog.51cto.com/829462/213477
其中
Source0: mysql-5.6.26.tar.gz
这个压缩文件需要放在指定的目录中(/root/rpmbuild/SOURCES)
自动解压的时候,会在这个指定目录中找这个文件
AutoReqProv: no
这个参数必须设置,否则在安装的时候,会显示有依赖包的缺失.实际上是不需要的。
%setup -n mysql-%{version}
解压源码包之后,会进入目录执行build,它默认是根据%{name}和%{version}拼接的目录.
以MySQL为例,在spec中写的name为MySQL,version为5.6.26
那么它会进入mysql-5.6.26的目录,
但是源码包解压之后的目录是mysql-5.6.26(小写)
所以在setup这个段使用-n参数,匹配这个目录.(就是说默认的设置不灵,需要自己匹配目录)
make -j cat /proc/cpuinfo | grep processor| wc -l
查看计算机有几个核,然后多线程编译
这个脚本的过程是这样的
首先解压源码包
%prep
%setup -n mysql-%{version}
然后执行%build的过程,make编译
然后执行%install
将编译之后的代码真实的安装一遍,
它安装的目录是/root/rpmbuild/BUILDROOT/mysql-5.6.26-1.el6.i386/home/mysql/mysql-5.6.26/
因为我们指定的安装目录是/home/mysql/mysql-5.6.26/,它相当于在一个沙盒中安装了一遍.
它会将沙盒中安装之后的文件打成RPM包
%files就是指定哪些沙盒中的文件打入RPM包
%files指定的文件是相对路径,绝对路径应该是%{buildroot}/home/mysql/mysql-5.6.26
默认的%{buildroot}就是/root/rpmbuild/BUILDROOT/mysql-5.6.26-1.el6.i386/
这个%{buildroot}是由spec文件的BuildRoot设置的
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
%pre是RPM安装之前执行的命令
这里主要是创建数据文件的目录和帐号
mkdir -p /data
useradd -m -s /bin/bash mysql
chown -R mysql:mysql /data
%post是RPM安装之后执行的命令
这里主要是创建数据库实例,配置服务,配置环境变量
/home/mysql/mysql-5.6.26/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.26 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.26/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.26/bin;" >> /home/mysql/.bashrc
source /home/mysql/.bashrc
%preun是卸载RPM包执行的命令,主要用于清理
service mysql stop
chkconfig --del mysql
userdel mysql
rm -rf /home/mysql
rm -rf /data
rm -rf /etc/init.d/mysql
其实编写spec文件本质上是在写一个回调函数,rpmbuild根据spec的回调函数,生成一个Shell脚本,打包的过程就是执行Shell脚本的过程。
定制RPM安装包可以满足大规模自动化部署的场景
因为它可以
定制配置文件(将配置文件放在ftp或者http上,在%post段下载这个配置文件放在/etc下)
定制安装目录和数据文件,日志文件的目录(生产系统不同的挂载点,底层可能是不同的物理设备)
自动创建帐号,配置服务和环境变量
这些特性在规模很小时微不足道,
比如给研发和测试安装,人家还嫌你有毛病.明明一个rpm能搞定,你还整这么复杂,不是臭显摆吗?
生产环境装一个库运行好几年,再装的时候,这个RPM估计都忘了放哪里了…
但是一旦规模上来了,一天需要装个10台8台的,这个自动化安装的优点就显现出来了
参考:
源码安装MySQL
http://www.cnblogs.com/xiongpq/p/3384681.html
rpmbuild spec文件详解
http://machael.blog.51cto.com/829462/213477
http://www.worldhello.net/2011/04/02/2405.html
AutoReqProv参数的解释
http://blog.csdn.net/peng_zhou/article/details/3530230