有过MySQL运维的人应该都清楚,线上的MySQL一般都采用源码编译,因为这样才可以根据企业的各自需要选择要编译的功能,虽然MySQL的源码编译挺简单的,但是试想一下,如果你有几百台服务器同时要安装MySQL,难道你还一台台去手动编译、编写配置文件吗?这显然太低效了,本文讨论MySQL的自动化安装部署。
1、制作符合自己需求的RPM包
我们要根据MySQL的源码编译符合企业需求的RPM包,源码获取命令如下:
- wget http://downloads.mysql.com/archives/get/file/mysql-5.6.16.tar.gz
- tar -zxvf mysql-5.6.16.tar.gz
- cd mysql-5.6.16
- mkdir rpm
- cd rpm
- 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: MySQL 5.6.16
- %description
- The MySQL(TM) software delivers a very fast, multi-threaded, multi-user,
- and robust SQL (Structured Query Language) database server. MySQL Server
- is intended for mission-critical, heavy-load production systems as well
- as for embedding into mass-deployed software.
- %define MYSQL_USER mysql
- %define MYSQL_GROUP mysql
- %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"
- export CFLAGS CXX CXXFLAGS
- 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 | grep processor| wc -l`
- %install
- cd $OLDPWD/../
- make DESTDIR=$RPM_BUILD_ROOT install
- %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
- 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
- #server id
其实如果想把这个脚本写的更通用,完全可以把更多的参数留白,如port、datadir、内存相关参数等,这里我只是以server id为例,抛砖引玉。
3、准备MySQL数据目录模板
你得事先准备一台MySQL,可以根据自己的需求,把通用性的东西放在上面(如账户等),下面是一个最简单的已安装好的MySQL的数据目录结构:
- [root@lx25 mysql]# ls -l
- total 12
- drwxr-xr-x 5 mysql mysql 4096 Jul 2 09:26 data
- drwxr-xr-x 2 mysql mysql 4096 Jul 1 18:21 log
- drwxr-xr-x 2 mysql mysql 4096 Jul 2 09:26 tmp
- [root@lx25 mysql]# cd data
- [root@lx25 data]# ls -l
- total 6314044
- drwx------ 2 mysql mysql 4096 Jul 1 17:17 mysql
- drwx------ 2 mysql mysql 4096 Jul 1 17:17 performance_schema
- drwx------ 2 mysql mysql 4096 Jul 1 17:17 test
4、编写自动化安装部署脚本
在运行这个脚本之前,我们必须得把前面几部制作的rpm包、my.cnf模板和数据目录模板放到一个固定的地方,本例中是放在企业内部的ftp上。
MySQL自动化安装部署脚本(命名为:mysql_install.sh)如下:
- #!/bin/sh
- #Step 1: Prepare
- yum install cmake gcc g++ bison ncurses-devel zlib
- groupadd mysql
- useradd -g mysql mysql
- #Step 2: Get Source
- ftp -n<<EOF
- open **
- user ** **
- binary
- cd mysql
- prompt
- mget *
- EOF
- #Step 3: Install
- unique_id=`date "+%Y%m%d%M%S"`
- echo 'server_id='$unique_id >> my.cnf
- rpm -ivh mysql-5.6.16-guahao.x86_64.rpm
- cp my.cnf /opt/mysql
- chown -R mysql:mysql /opt/mysql
- tar xvf data.tar -C /data
- chown -R mysql:mysql /data/mysql
- #step 4: Start MySQL
- cp /opt/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
- chmod 755 /etc/init.d/mysqld
- chkconfig mysqld on
- /etc/init.d/mysqld start