分享MySQL的自动化安装部署的方法
有过MySQL运维的人应该都清楚,线上的MySQL一般都采用源码编译,因为这样才可以根据企业的各自需要选择要编译的功能,虽然MySQL的源码编译挺简单的,但是试想一下,如果你有几百台服务器同时要安装MySQL,难道你还一台台去手动编译、编写配置文件吗?这显然太低效了,本文讨论MySQL的自动化安装部署。
1、制作符合自己需求的RPM包
我们要根据MySQL的源码编译符合企业需求的RPM包,源码获取命令如下:
wgethttp://downloads.mysql.com/archives/get/file/mysql-5.6.16.tar.gz
tar-zxvfmysql-5.6.16.tar.gz
cdmysql-5.6.16
mkdirrpm
cdrpm
在上面我们获取了源码,并在源码主目录下创建rpm目录,接着我们在该目录下创建mysql.spec文件:
Name:mysql
Version:5.6.16
Release:guahao
License:GPL
URL:http://downloads.mysql.com/archives/get/file/mysql-5.6.16.tar.gz
Group:applications/database
BuildRoot:%{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires:cmake
Packager:zhuxj@guahao.com
Autoreq:no
prefix:/opt/mysql
Summary:MySQL5.6.16
%description
TheMySQL(TM)softwaredeliversaveryfast,multi-threaded,multi-user,
androbustSQL(StructuredQueryLanguage)databaseserver.MySQLServer
isintendedformission-critical,heavy-loadproductionsystemsaswell
asforembeddingintomass-deployedsoftware.
%defineMYSQL_USERmysql
%defineMYSQL_GROUPmysql
%define__os_install_post%{nil}
%build
cd$OLDPWD/../
CFLAGS="-O3-g-fno-exceptions-static-libgcc-fno-omit-frame-pointer-fno-strict-aliasing"
CXX=g++
CXXFLAGS="-O3-g-fno-exceptions-fno-rtti-static-libgcc-fno-omit-frame-pointer-fno-strict-aliasing"
exportCFLAGSCXXCXXFLAGS
cmake. \
-DSYSCONFDIR:PATH=%{prefix} \
-DCMAKE_INSTALL_PREFIX:PATH=%{prefix} \
-DCMAKE_BUILD_TYPE:STRING=Release \
-DENABLE_PROFILING:BOOL=ON \
-DWITH_DEBUG:BOOL=OFF \
-DWITH_VALGRIND:BOOL=OFF \
-DENABLE_DEBUG_SYNC:BOOL=OFF \
-DWITH_EXTRA_CHARSETS:STRING=all \
-DWITH_SSL:STRING=bundled \
-DWITH_UNIT_TESTS:BOOL=OFF \
-DWITH_ZLIB:STRING=bundled \
-DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON \
-DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON \
-DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON \
-DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON \
-DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DENABLED_LOCAL_INFILE:BOOL=ON \
-DWITH_EMBEDDED_SERVER=0 \
-DINSTALL_LAYOUT:STRING=STANDALONE \
-DCOMMUNITY_BUILD:BOOL=ON \
-DMYSQL_SERVER_SUFFIX='-r5436';
make-j`cat/proc/cpuinfo|grepprocessor|wc-l`
%install
cd$OLDPWD/../
makeDESTDIR=$RPM_BUILD_ROOTinstall
%clean
rm-rf$RPM_BUILD_ROOT
%files
%defattr(-,%{MYSQL_USER},%{MYSQL_GROUP})
%attr(755,%{MYSQL_USER},%{MYSQL_GROUP})%{prefix}/*
%pre
%post
ln-s%{prefix}/lib%{prefix}/lib64
%preun
%changelog
有了这个spec文件之后,就可以执行如下命令生成我们自己的RPM包:
rpmbuild-bb./mysql.spec
2、编写my.cnf模板
my.cnf模板如下:
[mysqld_safe]
pid-file=/opt/mysql/run/mysqld.pid
[mysql]
prompt=\\u@\\d\\r:\\m:\\s>
default-character-set=gbk
no-auto-rehash
[client]
socket=/opt/mysql/run/mysql.sock
[mysqld]
#dir
basedir=/opt/mysql
datadir=/data/mysql/data
tmpdir=/data/mysql/tmp
log-error=/data/mysql/log/alert.log
slow_query_log_file=/data/mysql/log/slow.log
general_log_file=/data/mysql/log/general.log
socket=/opt/mysql/run/mysql.sock
#innodb
innodb_data_home_dir=/data/mysql/data
innodb_log_group_home_dir=/data/mysql/data
innodb_data_file_path=ibdata1:2G;ibdata2:16M:autoextend
innodb_buffer_pool_size=10G
innodb_buffer_pool_instances=4
innodb_log_files_in_group=4
innodb_log_file_size=1G
innodb_log_buffer_size=200M
innodb_flush_log_at_trx_commit=1
innodb_additional_mem_pool_size=20M
innodb_max_dirty_pages_pct=60
innodb_io_capacity=200
innodb_thread_concurrency=32
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_open_files=60000
innodb_file_format=Barracuda
innodb_file_per_table=1
innodb_flush_method=O_DIRECT
innodb_change_buffering=all
innodb_adaptive_flushing=1
innodb_old_blocks_time=1000
innodb_stats_on_metadata=0
innodb_read_ahead=0
innodb_use_native_aio=0
innodb_lock_wait_timeout=50
innodb_rollback_on_timeout=0
innodb_purge_threads=1
innodb_strict_mode=1
transaction-isolation=READ-COMMITTED
#myisam
key_buffer_size=100M
myisam_sort_buffer_size=64M
concurrent_insert=2
delayed_insert_timeout=300
#replication
master-info-file=/data/mysql/log/master.info
relay-log=/data/mysql/log/mysql-relay
relay_log_info_file=/data/mysql/log/mysql-relay.info
relay-log-index=/data/mysql/log/mysql-relay.index
slave_load_tmpdir=/data/mysql/tmp
slave_type_conversions="ALL_NON_LOSSY"
slave_net_timeout=4
skip-slave-start
sync_master_info=1000
sync_relay_log_info=1000
#binlog
log-bin=/data/mysql/log/mysql-bin
server_id=2552763370
binlog_cache_size=32K
max_binlog_cache_size=2G
max_binlog_size=500M
binlog_format=ROW
sync_binlog=1000
log-slave-updates=1
expire_logs_days=0
#server
default-storage-engine=INNODB
character-set-server=gbk
lower_case_table_names=1
skip-external-locking
open_files_limit=65536
safe-user-create
local-infile=1
performance_schema=0
log_slow_admin_statements=1
log_warnings=1
long_query_time=1
slow_query_log=1
general_log=0
query_cache_type=0
query_cache_limit=1M
query_cache_min_res_unit=1K
table_definition_cache=65536
thread_stack=512K
thread_cache_size=256
read_rnd_buffer_size=128K
sort_buffer_size=256K
join_buffer_size=128K
read_buffer_size=128K
port=3306
skip-name-resolve
skip-ssl
max_connections=4500
max_user_connections=4000
max_connect_errors=65536
max_allowed_packet=128M
connect_timeout=8
net_read_timeout=30
net_write_timeout=60
back_log=1024
#serverid
细心的读者应该会注意在,在my.cnf的末尾在serverid上留了空白,在后面的shell脚本会动态加上,这是因为在一个企业内部的所有MySQL的serverid必须保持全局一致性,这样在主备复制时才不会导致混乱。
其实如果想把这个脚本写的更通用,完全可以把更多的参数留白,如port、datadir、内存相关参数等,这里我只是以serverid为例,抛砖引玉。
3、准备MySQL数据目录模板
你得事先准备一台MySQL,可以根据自己的需求,把通用性的东西放在上面(如账户等),下面是一个最简单的已安装好的MySQL的数据目录结构:
[root@lx25mysql]#ls-l
total12
drwxr-xr-x5mysqlmysql4096Jul 209:26data
drwxr-xr-x2mysqlmysql4096Jul 118:21log
drwxr-xr-x2mysqlmysql4096Jul 209:26tmp
[root@lx25mysql]#cddata
[root@lx25data]#ls-l
total6314044
drwx------2mysqlmysql 4096Jul 117:17mysql
drwx------2mysqlmysql 4096Jul 117:17performance_schema
drwx------2mysqlmysql 4096Jul 117:17test
把该目录用tar打包(命名为data.tar),然后以这个为模板解压至新装MySQL实例的数据目录下即可。
4、编写自动化安装部署脚本
在运行这个脚本之前,我们必须得把前面几部制作的rpm包、my.cnf模板和数据目录模板放到一个固定的地方,本例中是放在企业内部的ftp上。
MySQL自动化安装部署脚本(命名为:mysql_install.sh)如下:
#!/bin/sh
#Step1:Prepare
yuminstallcmakegccg++bisonncurses-develzlib
groupaddmysql
useradd-gmysqlmysql
#Step2:GetSource
ftp-n<<EOF
open10.10.100.254
userzhuxianjiezxj321
binary
cdmysql
prompt
mget*
EOF
#Step3:Install
unique_id=`date"+%Y%m%d%M%S"`
echo'server_id='$unique_id>>my.cnf
rpm-ivhmysql-5.6.16-guahao.x86_64.rpm
cpmy.cnf/opt/mysql
chown-Rmysql:mysql/opt/mysql
tarxvfdata.tar-C/data
chown-Rmysql:mysql/data/mysql
#step4:StartMySQL
cp/opt/mysql/support-files/mysql.server/etc/rc.d/init.d/mysqld
chmod755/etc/init.d/mysqld
chkconfigmysqldon
/etc/init.d/mysqldstart