【MySQL】 MySQL的自动化安装部署

有过MySQL运维的人应该都清楚,线上的MySQL一般都采用源码编译,因为这样才可以根据企业的各自需要选择要编译的功能,虽然MySQL的源码编译挺简单的,但是试想一下,如果你有几百台服务器同时要安装MySQL,难道你还一台台去手动编译、编写配置文件吗?这显然太低效了,本文讨论MySQL的自动化安装部署。

1、制作符合自己需求的RPM包

我们要根据MySQL的源码编译符合企业需求的RPM包,源码获取命令如下:
[plain]  view plain  copy
  1. wget http://downloads.mysql.com/archives/get/file/mysql-5.6.16.tar.gz  
  2. tar -zxvf mysql-5.6.16.tar.gz  
  3. cd mysql-5.6.16  
  4. mkdir rpm  
  5. cd rpm  
在上面我们获取了源码,并在源码主目录下创建rpm目录,接着我们在该目录下创建mysql.spec文件:
[plain]  view plain  copy
  1. Name: mysql  
  2. Version:5.6.16  
  3. Release: guahao  
  4. License: GPL  
  5. URL: http://downloads.mysql.com/archives/get/file/mysql-5.6.16.tar.gz  
  6. Group: applications/database  
  7. BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root   
  8. BuildRequires: cmake  
  9. Packager: [email protected]  
  10. Autoreq: no  
  11. prefix: /opt/mysql  
  12. Summary: MySQL 5.6.16  
  13.   
  14. %description   
  15. The MySQL(TM) software delivers a very fast, multi-threaded, multi-user,  
  16. and robust SQL (Structured Query Language) database server. MySQL Server  
  17. is intended for mission-critical, heavy-load production systems as well  
  18. as for embedding into mass-deployed software.  
  19.   
  20. %define MYSQL_USER mysql  
  21. %define MYSQL_GROUP mysql  
  22. %define __os_install_post %{nil}  
  23.   
  24. %build  
  25. cd $OLDPWD/../  
  26. CFLAGS="-O3 -g -fno-exceptions -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing"  
  27. CXX=g++  
  28. CXXFLAGS="-O3 -g -fno-exceptions -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing"  
  29. export CFLAGS CXX CXXFLAGS  
  30.   
  31. cmake .                                                  \  
  32.   -DSYSCONFDIR:PATH=%{prefix}                            \  
  33.   -DCMAKE_INSTALL_PREFIX:PATH=%{prefix}                  \  
  34.   -DCMAKE_BUILD_TYPE:STRING=Release                      \  
  35.   -DENABLE_PROFILING:BOOL=ON                             \  
  36.   -DWITH_DEBUG:BOOL=OFF                                  \  
  37.   -DWITH_VALGRIND:BOOL=OFF                               \  
  38.   -DENABLE_DEBUG_SYNC:BOOL=OFF                           \  
  39.   -DWITH_EXTRA_CHARSETS:STRING=all                       \  
  40.   -DWITH_SSL:STRING=bundled                              \  
  41.   -DWITH_UNIT_TESTS:BOOL=OFF                             \  
  42.   -DWITH_ZLIB:STRING=bundled                             \  
  43.   -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON                \  
  44.   -DWITH_INNOBASE_STORAGE_ENGINE:BOOL=ON                 \  
  45.   -DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON                  \  
  46.   -DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON                \  
  47.   -DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON               \  
  48.   -DDEFAULT_CHARSET=utf8                                 \  
  49.   -DDEFAULT_COLLATION=utf8_general_ci                    \  
  50.   -DWITH_EXTRA_CHARSETS=all                              \  
  51.   -DENABLED_LOCAL_INFILE:BOOL=ON                         \  
  52.   -DWITH_EMBEDDED_SERVER=0                               \  
  53.   -DINSTALL_LAYOUT:STRING=STANDALONE                     \  
  54.   -DCOMMUNITY_BUILD:BOOL=ON                              \  
  55.   -DMYSQL_SERVER_SUFFIX='-r5436';  
  56.   
  57. make -j `cat /proc/cpuinfo | grep processor| wc -l`  
  58.   
  59. %install  
  60. cd $OLDPWD/../  
  61. make DESTDIR=$RPM_BUILD_ROOT install  
  62.   
  63. %clean  
  64. rm -rf $RPM_BUILD_ROOT  
  65.   
  66. %files  
  67. %defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})  
  68. %attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) %{prefix}/*  
  69.   
  70. %pre  
  71.   
  72. %post  
  73. ln -s %{prefix}/lib %{prefix}/lib64  
  74.   
  75. %preun  
  76.   
  77. %changelog  
有了这个spec文件之后,就可以执行如下命令生成我们自己的RPM包:
[plain]  view plain  copy
  1. rpmbuild -bb ./mysql.spec  

2、编写my.cnf模板

my.cnf模板如下:
[plain]  view plain  copy
  1. [mysqld_safe]  
  2. pid-file=/opt/mysql/run/mysqld.pid  
  3.   
  4. [mysql]  
  5. prompt=\\u@\\d \\r:\\m:\\s>  
  6. default-character-set=gbk  
  7. no-auto-rehash  
  8.   
  9. [client]  
  10. socket=/opt/mysql/run/mysql.sock  
  11.   
  12. [mysqld]  
  13. #dir  
  14. basedir=/opt/mysql  
  15. datadir=/data/mysql/data  
  16. tmpdir=/data/mysql/tmp  
  17. log-error=/data/mysql/log/alert.log  
  18. slow_query_log_file=/data/mysql/log/slow.log  
  19. general_log_file=/data/mysql/log/general.log  
  20. socket=/opt/mysql/run/mysql.sock  
  21.   
  22. #innodb  
  23. innodb_data_home_dir=/data/mysql/data  
  24. innodb_log_group_home_dir=/data/mysql/data  
  25. innodb_data_file_path=ibdata1:2G;ibdata2:16M:autoextend  
  26. innodb_buffer_pool_size=10G  
  27. innodb_buffer_pool_instances=4  
  28. innodb_log_files_in_group=4  
  29. innodb_log_file_size=1G  
  30. innodb_log_buffer_size=200M  
  31. innodb_flush_log_at_trx_commit=1  
  32. innodb_additional_mem_pool_size=20M  
  33. innodb_max_dirty_pages_pct=60  
  34. innodb_io_capacity=200  
  35. innodb_thread_concurrency=32  
  36. innodb_read_io_threads=8  
  37. innodb_write_io_threads=8  
  38. innodb_open_files=60000  
  39. innodb_file_format=Barracuda  
  40. innodb_file_per_table=1  
  41. innodb_flush_method=O_DIRECT  
  42. innodb_change_buffering=all  
  43. innodb_adaptive_flushing=1  
  44. innodb_old_blocks_time=1000  
  45. innodb_stats_on_metadata=0  
  46. innodb_read_ahead=0  
  47. innodb_use_native_aio=0  
  48. innodb_lock_wait_timeout=50  
  49. innodb_rollback_on_timeout=0  
  50. innodb_purge_threads=1  
  51. innodb_strict_mode=1  
  52. transaction-isolation=READ-COMMITTED  
  53.   
  54. #myisam  
  55. key_buffer_size=100M  
  56. myisam_sort_buffer_size=64M  
  57. concurrent_insert=2  
  58. delayed_insert_timeout=300  
  59.   
  60. #replication  
  61. master-info-file=/data/mysql/log/master.info  
  62. relay-log=/data/mysql/log/mysql-relay  
  63. relay_log_info_file=/data/mysql/log/mysql-relay.info  
  64. relay-log-index=/data/mysql/log/mysql-relay.index  
  65. slave_load_tmpdir=/data/mysql/tmp  
  66. slave_type_conversions="ALL_NON_LOSSY"  
  67. slave_net_timeout=4  
  68. skip-slave-start  
  69. sync_master_info=1000  
  70. sync_relay_log_info=1000  
  71.   
  72. #binlog  
  73. log-bin=/data/mysql/log/mysql-bin  
  74. server_id=2552763370  
  75. binlog_cache_size=32K  
  76. max_binlog_cache_size=2G  
  77. max_binlog_size=500M  
  78. binlog_format=ROW  
  79. sync_binlog=1000  
  80. log-slave-updates=1  
  81. expire_logs_days=0  
  82.   
  83. #server  
  84. default-storage-engine=INNODB  
  85. character-set-server=gbk  
  86. lower_case_table_names=1  
  87. skip-external-locking  
  88. open_files_limit=65536  
  89. safe-user-create  
  90. local-infile=1  
  91. performance_schema=0  
  92.   
  93. log_slow_admin_statements=1  
  94. log_warnings=1  
  95. long_query_time=1  
  96. slow_query_log=1  
  97. general_log=0  
  98.   
  99. query_cache_type=0  
  100. query_cache_limit=1M  
  101. query_cache_min_res_unit=1K  
  102.   
  103. table_definition_cache=65536  
  104.   
  105. thread_stack=512K  
  106. thread_cache_size=256  
  107. read_rnd_buffer_size=128K  
  108. sort_buffer_size=256K  
  109. join_buffer_size=128K  
  110. read_buffer_size=128K  
  111.   
  112. port=3306  
  113. skip-name-resolve  
  114. skip-ssl  
  115. max_connections=4500  
  116. max_user_connections=4000  
  117. max_connect_errors=65536  
  118. max_allowed_packet=128M  
  119. connect_timeout=8  
  120. net_read_timeout=30  
  121. net_write_timeout=60  
  122. back_log=1024  
  123.   
  124. #server id  
细心的读者应该会注意在,在my.cnf的末尾在server id上留了空白,在后面的shell脚本会动态加上,这是因为在一个企业内部的所有MySQL的server id必须保持全局一致性,这样在主备复制时才不会导致混乱。
其实如果想把这个脚本写的更通用,完全可以把更多的参数留白,如port、datadir、内存相关参数等,这里我只是以server id为例,抛砖引玉。

3、准备MySQL数据目录模板

你得事先准备一台MySQL,可以根据自己的需求,把通用性的东西放在上面(如账户等),下面是一个最简单的已安装好的MySQL的数据目录结构:
[plain]  view plain  copy
  1. [root@lx25 mysql]# ls -l  
  2. total 12  
  3. drwxr-xr-x 5 mysql mysql 4096 Jul  2 09:26 data  
  4. drwxr-xr-x 2 mysql mysql 4096 Jul  1 18:21 log  
  5. drwxr-xr-x 2 mysql mysql 4096 Jul  2 09:26 tmp  
  6. [root@lx25 mysql]# cd data  
  7. [root@lx25 data]# ls -l  
  8. total 6314044  
  9. drwx------ 2 mysql mysql       4096 Jul  1 17:17 mysql  
  10. drwx------ 2 mysql mysql       4096 Jul  1 17:17 performance_schema  
  11. drwx------ 2 mysql mysql       4096 Jul  1 17:17 test  
把该目录用tar打包(命名为data.tar),然后以这个为模板解压至新装MySQL实例的数据目录下即可。

4、编写自动化安装部署脚本

在运行这个脚本之前,我们必须得把前面几部制作的rpm包、my.cnf模板和数据目录模板放到一个固定的地方,本例中是放在企业内部的ftp上。
MySQL自动化安装部署脚本(命名为:mysql_install.sh)如下:
[plain]  view plain  copy
  1. #!/bin/sh  
  2.   
  3. #Step 1: Prepare  
  4. yum install cmake gcc g++ bison ncurses-devel zlib   
  5.   
  6. groupadd mysql  
  7. useradd -g mysql mysql  
  8.   
  9. #Step 2: Get Source  
  10. ftp -n<
  11. open **  
  12. user ** **  
  13. binary  
  14. cd mysql  
  15. prompt  
  16. mget *  
  17. EOF  
  18.   
  19. #Step 3: Install  
  20. unique_id=`date "+%Y%m%d%M%S"`  
  21. echo 'server_id='$unique_id >> my.cnf  
  22. rpm -ivh mysql-5.6.16-guahao.x86_64.rpm  
  23. cp my.cnf /opt/mysql  
  24. chown -R mysql:mysql /opt/mysql  
  25.   
  26. tar xvf data.tar -C /data  
  27. chown -R mysql:mysql /data/mysql  
  28.   
  29. #step 4: Start MySQL  
  30. cp /opt/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld  
  31. chmod 755 /etc/init.d/mysqld  
  32. chkconfig mysqld on  
  33.   
  34. /etc/init.d/mysqld start  

你可能感兴趣的:(数据库)