MySQL节点部署说明
1.MySQL的编译安装
考虑到MySQL多版本和多分支的特点,综合性能、可用性、成本等因素,我们建议使用Percona公司开发的MySQL,该版本主要使用了XtraDB存储引擎(对于这个存储引擎的特性,以后再专门介绍),完全兼容Innodb,在Innodb_Plugin基础之上进行了增强,支持标准事务的ACID(原子性、一致性、隔离性、持久性)、支持MVCC(Multi-Version Concurrency Control,提供并发控制)、具备更佳的性能、开源可以免费使用,同时Percona公司还提供了开源的物理备份工具(xtrabackup),可以顺利地对使用XtraDB存储引擎的数据库进行快速的物理备份。关于这个分支的详细信息可以查看博客: http://www.mysqlperformanceblog.com/ 。
考虑到版本的成熟性和稳定度,我们建议下载MySQL-5.1版本的源代码,下载的地址列表见: http://www.percona.com/downloads/Percona-Server-5.1/ ,可以考虑选用5.1.47-11.2 (源代码大小 23.7 MB),这个版本网易线上也在大规模的使用,从使用的效果来看,还是非常稳定的。
在安装之前需要检查编译MySQL所需的一些库是否已经安装。在一般的Linux 系统中,可能需要用如下命令安装这些依赖库:
autoconf automake1.9 libtool m4 libncurses5-dev bison ncurses-devel gcc g++
从Percona网站上下载MySQL源代码,保存在本地
http://www.percona.com/downloads/Percona-Server-5.1/Percona-Server-5.1.47-11.2/source/Percona-Server.tar.gz ,或者可以从我这儿来取,对MySQL打了部分的Patch
将压缩文件解压到$dir目录下
进入到$dir下,添加configure 文件为可执行权限
$ cd $dir
$ chmod +x configure
开始编译安装,分下面三步执行
$./configure --prefix=/usr/local/mysql --with-extra-charsets=all --enable-local-infile --enable-thread-safe-client --enable-assembler --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --with-plugins=innodb_plugin,partition --with-big-tables --with-readline
$ make
$ make install //由于是安装在/usr目录下,这步需要切换到root用户下执行
MySQL 源码编译参数说明
参数 涵义
--prefix 指定MySQL安装路径,最好是安装到指定的目录
--with-extra-charsets 指定安装扩展字符集
--enable-local-infile 指定允许本地导入文件
--enable-thread-safe-client 指定线程安全模式
--enable-assembler 指定支持汇编,可提升性能
--with-client-ldflags 静态编译,提升性能13%
--with-mysqld-ldflags 静态编译,提升性能13%
--with-plugins=innodb_plugin,partition 指定安装xtradb存储引擎,分区插件,如果想要利用分区功能,必须指定partition插件
--with-big-tables 指定支持超大表
编译完毕后,需要在相应的目录下创建MySQL启动时所需要的配置文件
编译过程中的常见异常:
checking for termcap functions library... configure: error: No curses/termcap library found
ncurses-devel 没有安装
../depcomp: line 571: exec: g++: not found
g++ 没有安装
Warning: Bison executable not found in PATH
bision没有安装
2.MySQL的配置启动
MySQL安装完毕后,需要做相应的配置后,再启动MySQL。
禁用swap
su root
echo 0 > /proc/sys/vm/swappiness
这样修改的话,只是临时有效,如果机器重启,这个值会重新恢复为100 ;为了达到永
久生效,可以修改/etc/sysctl.conf文件,在/etc/sysctl.conf上添加vm.swappiness=0 。这
里需要解释下原因。
Linux有很多很好的内存、IO调度机制,但是并不会适用于所有场景。对于DBA来说,
Linux比较让人头疼的一个地方是,它不会因为MySQL很重要就避免将分配给MySQL的
地址空间映射到swap上。对于频繁进行读写操作的系统而言,数据看似在内存而实际上在
磁盘是非常糟糕的,响应时间的增长很可能直接拖垮整个系统。作为DBA,怎样尽量避免
MySQL使用swap?比如说为什么会产生swap。假设我们的物理内存是16G,swap是4G。
如果MySQL本身已经占用了12G物理内存,而同时其他程序或者系统模块又需要6G内存,
这时候操作系统就可能把MySQL所拥有的一部分地址空间映射到swap上去)。
/etc/sysctl.conf上中的参数vm.swappiness决定了Linux是倾向于使用swap,还是倾向
于释放文件系统cache和buffer(这个大小是多少,可以在root用户下利用FREE命令查看
之)。
在内存紧张的情况下,数值越低越倾向于释放文件系统cache。当然,这个参数只能减少
使用swap的概率,并不能避免Linux使用swap。想想有内存可以使用,干嘛还要使用SWAP
呢?swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=
100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。
创建MySQL帐号
useradd mysql
passwd mysql
创建MySQL数据目录,这里MySQL的数据目录和配置文件最好放在统一的文件
目录下,数据目录最好采用软链接的形式,这里要注意原始数据目录的权限,如:
[mysql@localhost mysql]$ ls -lh /home/mysql/mysql/
total 4.0K
-rw-r--r-- 1 mysql mysql 2.1K Jul 5 14:54 my1.cnf
lrwxrwxrwx 1 mysql mysql 16 Jul 4 10:50 mysql -> /opt/mysql-test/
[mysql@localhost mysql]$ ls -lh /opt/|grep mysql-test
drwxr-xr-x 4 mysql mysql 4.0K Jul 5 14:54 mysql-test
生成MySQL配置文件
根据MySQL配置文件模板生成MySQL配置文件my.cnf,放在/home/mysql/mysql这个目录下,my.cnf根据模板进行以下修改:
替换#port_holder#为你自己打算使用的端口,这里假设为4321
替换#path_holder#为数据存放的目录,假定为 /home/mysql/mysql/mysql
替换#ip_holder#为当前主机的内网IP
替换#user_holder#为启动MySQL的用户,一般为mysql
模板配置文件如下:
[client]
port = #port_holder#
socket = #path_holder#/mysqld.sock
[mysqld_safe]
user = #user_holder#
nice = 0
ledir =/usr/local/mysql/libexec
[mysqld]
server-id = 3
bind-address = #ip_holder# //注意:如果是配置VIP的话,这个参数不要设置
port = #port_holder#
pid-file = #path_holder#/mysqld.pid
socket = #path_holder#/mysqld.sock
basedir = /usr/local/mysql
datadir = #path_holder#
innodb_data_home_dir = #path_holder#
innodb_log_group_home_dir = #path_holder#
tmpdir = #path_holder#
log-error = #path_holder#/mysqld.log
slow_query_log =1
slow_query_log_file = #path_holder#/mysql-slow.log
log_bin = #path_holder#/mysql-bin.log
log_slave_updates //中继操作使用也记录日志到binary-log
skip-slave-start //MySQL启动的时候,不启动复制
auto_increment_increment =2 //如果是M-M结构,该参数为M的个数
auto_increment_offset =2 //如果是M-M结构,该参数为该实例的编号
user = #user_holder#
language = /usr/local/mysql/share/mysql/english
table_cache = 512
long_query_time = 4
max_connections = 800
query_cache_type = 0
default-character-set = utf8
default-storage-engine = innodb
skip-external-locking
expire_logs_days = 7
max_binlog_size = 100M
innodb_buffer_pool_size = 200M //根据机器的实际情况设置,一般为内存的75%
innodb_data_file_path = ibdata1:512M:autoextend
innodb_autoextend_increment = 128
innodb_log_files_in_group = 2
innodb_log_file_size = 512M
innodb_lock_wait_timeout = 5
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1
innodb_file_format =Barracuda
innodb_file_format_check =Barracuda
innodb_adaptive_checkpoint =estimate
innodb_expand_import = 1
innodb_read_io_threads = 1
innodb_stats_method = nulls_unequal
innodb_thread_concurrency = 12
innodb_write_io_threads = 1
innodb_io_capacity =800
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
default-character-set = utf8
[mysql]
default-character-set = utf8
具体的各个参数的含义,在后续的优化文档中介绍说明。
初始化MySQL数据库
cd /home/mysql/mysql
mysql_install_db --defaults-file=my.cnf
启动MySQL
mysqld_safe --defaults-file=/home/mysql/mysql/my.cnf &
查看文件列表
[mysql@localhost mysql]$ ls -lh /home/mysql/mysql/mysql/
total 1.6G
-rw-rw---- 1 mysql mysql 512M Jul 5 14:54 ibdata1
-rw-rw---- 1 mysql mysql 512M Jul 5 14:54 ib_logfile0
-rw-rw---- 1 mysql mysql 512M Jul 4 10:51 ib_logfile1
-rw-rw---- 1 mysql mysql 63 Jul 5 14:54 master.info
drwx------ 2 mysql mysql 4.0K Jul 4 10:48 mysql
-rw-rw---- 1 mysql mysql 125 Jul 5 14:54 mysql-bin.000001
-rw-rw---- 1 mysql mysql 106 Jul 5 14:54 mysql-bin.000002
-rw-rw---- 1 mysql mysql 82 Jul 5 14:54 mysql-bin.index
-rw-rw---- 1 mysql mysql 19K Jul 5 14:54 mysqld.log
-rw-rw---- 1 mysql mysql 12K Jul 4 18:27 mysqld.log-old
-rw-rw---- 1 mysql mysql 5 Jul 5 14:54 mysqld.pid
-rw-rw---- 1 mysql mysql 156 Jul 5 14:54 mysqld-relay-bin.000003
-rw-rw---- 1 mysql mysql 251 Jul 5 14:54 mysqld-relay-bin.000004
-rw-rw---- 1 mysql mysql 52 Jul 5 14:54 mysqld-relay-bin.index
srwxrwxrwx 1 mysql mysql 0 Jul 5 14:54 mysqld.sock
-rw-rw---- 1 mysql mysql 2.8K Jul 5 14:54 mysql-slow.log
-rw-rw---- 1 mysql mysql 51 Jul 5 14:54 relay-log.info
drwx------ 2 mysql mysql 4.0K Jul 4 10:48 test
MySQL默认为生成一个名为root的超级用户,且没有密码,安全性不好,因此先设置MySQL本机超级用户密码:
mysql --defaults-file=/home/mysql/mysql/my.cnf -u root
mysql> set password = password(‘xxxxxx‘);
至此MySQL的启动已经完毕,遇到异常的情况下要多多查看错误日志文件mysqld.log,上面记录了MySQL在运行过程中的详细信息,类似于Oracle中的alter日志文件。千万不要执行rm -rf /home/mysql/mysql 操作,对于线上环境的话,尽量让最少的人使用root帐号和mysql帐号,尽量在自己的帐号下进行操作(把自己的帐号添加到mysql这个用户组下即可完成大部分的操作)。
本文出自 “DavideyLee” 博客,请务必保留此出处http://davideylee.blog.51cto.com/8703117/1530105