MySQL自動化運維之安裝篇

dbasdk發表於2014-09-15
MySQL安裝一般使用RPM或者原始碼安裝的方式。
RPM安裝的優點是快速,方便.缺點是不能自定義安裝目錄.如果需要調整資料檔案和日誌檔案的存放位置,還需要進行一些手動調整。
原始碼安裝的優點是可以自定義安裝目錄,缺點是編譯時間長,過程複雜

其實還有一種方式,定製RPM包.
它相當於用原始碼安裝的方式定製了一個RPM包.一次打包,可以多次使用
它可以定製路徑,安裝時自動建立帳號,自動配置服務,環境變數等,並且安裝過程快速,簡單。
在大規模部署的場景下,優點十分突出.
缺點是製作RPM包,需要自己編寫Red Hat定義的spec檔案.而spec檔案編寫的學習曲線比較陡.

需求如下
1.建立使用者mysql
2.資料庫軟體安裝在/home/mysql/mysql-5.6.14目錄
3.資料檔案存放在/data目錄下
4.配置服務,自動啟動

首先,下載rpmbuild
yum install rpm-build -y
它是Red Hat用於打RPM包的工具.
安裝之後重啟計算機,可以看到/root/rpmbuild目錄下有如下資料夾

這個工具打包的過程大致如下,
編寫spec指定打包的過程
將原始碼壓縮包放在SOURCES目錄下,
將原始碼解壓縮到BUILD目錄,執行make命令
將make install 的結果放在BUILDROOT目錄下,
最後將BUILDROOT下編譯好的二進位制檔案製作成RPM包。
並且可以指定在RPM安裝之前,安裝之後,解除安裝等過程執行的命令

首先,下載原始碼包

並將其複製到指定的目錄
/root/rpmbuild/SOURCES/mysql-5.6.14.tar.gz

安裝編譯MySQL需要的依賴包
yum -y install make gcc-c++ cmake bison-devel  ncurses-devel

編寫spec指令碼
vim mysql.spec

Name:       MySQL
Version:    5.6.14    
Release:    1%{?dist}
Summary:    MySQL-5.6.14 RPM

Group:      applications/database
License:    GPL    
URL:          
Source0:    mysql-5.6.14.tar.gz
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires:  cmake

AutoReqProv: no
%description
MySQL 5.6.14

%define MYSQL_USER mysql
%define MYSQL_GROUP mysql

%prep
%setup -n mysql-%{version}

%build
cmake \
-DCMAKE_INSTALL_PREFIX=/home/mysql/mysql-5.6.14 \
-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.14/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.14 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.14/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.14/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.14/*


%changelog

這個指令碼各個Segment的作用請參考
http://machael.blog.51cto.com/829462/213477

其中
Source0:    mysql-5.6.14.tar.gz
這個壓縮檔案需要放在指定的目錄中(/root/rpmbuild/SOURCES)
自動解壓的時候,會在這個指定目錄中找這個檔案


AutoReqProv: no
這個引數必須設定,否則在安裝的時候,會顯示有依賴包的缺失.實際上是不需要的。

%setup -n mysql-%{version}
解壓原始碼包之後,會進入目錄執行build,它預設是根據%{name}和%{version}拼接的目錄.
以MySQL為例,在spec中寫的name為MySQL,version為5.6.14
那麼它會進入MySQL-5.6.14的目錄,
但是原始碼包解壓之後的目錄是mysql-5.6.14(小寫)
所以在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.14-1.el6.i386/home/mysql/mysql-5.6.14/
因為我們指定的安裝目錄是/home/mysql/mysql-5.6.14/,它相當於在一個沙盒中安裝了一遍.
它會將沙盒中安裝之後的檔案打成RPM包

%files就是指定哪些沙盒中的檔案打入RPM包
%files指定的檔案是相對路徑,絕對路徑應該是%{buildroot}/home/mysql/mysql-5.6.14
預設的%{buildroot}就是/root/rpmbuild/BUILDROOT/MySQL-5.6.14-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.14/scripts/mysql_install_db --basedir=/home/mysql/mysql-5.6.14 --datadir=/data --user=mysql
cp /home/mysql/mysql-5.6.14/support-files/mysql.server /etc/init.d/mysql
chkconfig mysql on
service mysql start
echo "export PATH=.:$PATH:/home/mysql/mysql-5.6.14/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


AutoReqProv引數的解釋
http://blog.csdn.net/peng_zhou/article/details/3530230

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1269989/,如需轉載,請註明出處,否則將追究法律責任。

相關文章