本文讲述mysql的master/slave集群安装和配置,安装的版本是最新的稳定版本ga 5.6.19。
为了支持有限的ha,我们使用master/slave简单的读写分离集群。有限的ha是指当master不可用时,数据不会丢失,但在master宕机的情况下是不可写的,必须手工处理故障。如果要支持更高的可用性,可以使用两台master来做热切换。
master和slave的mysql安装是相同的,只是my.cnf的配置不同,需要配置二进制日志文件复制。
没有特殊说明,命名中带#的为root用户操作,带$的为mysql linux用户的操作。
安装准备1. 在安装mysql前,需要确认下面的系统软件已经安装在linux中。
软件名称
软件描述
gcc-4.4.7
编程语言编译器
gcc-c++-4.4.7
c++语言编译器
cmake-2.6.4-5
跨平台的开源构建系统
ncurses-devel-5.7-3.20090208
控制打印控制台屏幕
2. 创建mysql linux用户# groupadd mysql
# useradd -g mysql mysql
# passwd mysql
3. 准备安装目录
创建mysql安装目录,并赋权限给mysql用户:
# mkdir /usr/local/mysql-5.6.19
# chown mysql:mysql /usr/local/mysql-5.6.19
# chmod -r 770 /usr/local/mysql-5.6.19
4. 创建mysql数据存储目录:
# mkdir /data
# mkdir /data/mysql
# chown mysql:mysql /data/mysql
5. 授权mysql解压源码目录/usr/local/src目录的可执行权限给所有用户:
# chmod -r 757 /usr/local/src
安装mysql1. 解压缩安装包:
$ cd /usr/local/src
$ tar -xzvf mysql-5.6.19.tar.gz
2. 配置mysql编译参数
$ cd /usr/local/src/mysql-5.6.19
$ cmake . -dcmake_install_prefix=/usr/local/mysql-5.6.19\
-dmysql_datadir=$mysql_data_path\
-dsysconfdir=/usr/local/mysql-5.6.19/conf\
-ddefault_charset=utf8\
-ddefault_collation=utf8_general_ci\
-dwith_readline=1\
-dwith_innobase_storage_engine=1\
-dwith_archive_storage_engine=1 \
-dwith_blackhole_storage_engine=1 \
-dwith_perfschema_storage_engine=1备注:
-dcmake_install_prefix: 配置mysql的安装目录。
-dmysql_datadir: 配置mysql的数据目录。
-dsysconfdir: 配置mysql的配置文件目录。
-ddefault_charset: 默认字符集。
-ddefault_collation:设定默认语言的排序规则。
-dwith_readline:支持批量导入mysql数据。
-dwith_innobase_storage_engine:使用innobase存储引擎。
-dwith_archive_storage_engine:常应用于日志记录和聚合分析,不支持索引。
-dwith_blackhole_storage_engine:黑洞存储引擎。
-dwith_perfschema_storage_engine:性能模式引擎。3. 执行make
$ make
$ make install
4. 修改myql用户的环境变量,增加mysql_home,并把bin加到path:
$ vi ~/.bash_profile
在文件中增加蓝色字体部分:
# user specific environment and startup programs
# mysql home目录
export mysql_home=/usr/local/mysql-5.6.19
path=$path:$home/bin:$mysql_home/bin
export path
$ source ~/.bash_profile
初始化mysql1. 安装service脚本
# cp /usr/local/mysql-5.6.19/support-files/mysql.server/etc/init.d/mysqld
# chown mysql:mysql/etc/init.d/mysqld
# chmod 700 /etc/init.d/mysqld
2. 创建mysql权限数据库
$ $mysql_home/scripts/mysql_install_db--basedir=$mysql_home --datadir=/data/mysql
3. 创建pid文件目录
$ mkdir $mysql_home/var
4. 为master配置my.cnf
my.cnf格式不正确,很容易在启动时错误,最好在原有文件的基础上通过vi工具在linux上修改。
如果文件已经损坏,可以通过默认的模板中拷贝:
$ cp $mysql_home/support-files/my-default.cnf$mysql_home/my.cnf
编辑my.cnf
$ vi $mysql_home/my.cnf
在文件中增加蓝色字体部分:
# for advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
[mysqld]
# remove leading # and set to the amount of ram for the most important data
# cache in mysql. start at 70% of total ram for dedicated server, else 10%.
innodb_buffer_pool_size = 256m
innodb_flush_log_at_trx_commit=1
# remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
log_bin=master-bin
log_bin_index=master-bin.index
# these are commonly set, remove the # and set as required.
# basedir = .....
datadir = /data/mysql
port = 3306
# first master server id
server_id = 1
socket = /tmp/mysql.sock
pid-file = /usr/local/mysql-5.6.19/var/master.pid
# remove leading # to set options mainly useful for reporting servers.
# the server defaults are faster for transactions and fast selects.
# adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128m
# sort_buffer_size = 2m
# read_rnd_buffer_size = 2m
sql_mode=no_engine_substitution,strict_trans_tables
5. 为slave配置my.cnf
和master的配置文件一样进行修改,但注意文件中的log文件名、datadir和server_id等内容不同。
编辑my.cnf
$ vi $mysql_home/my.cnf
在文件中增加蓝色字体部分:
# for advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
[mysqld]
# remove leading # and set to the amount of ram for the most important data
# cache in mysql. start at 70% of total ram for dedicated server, else 10%.
innodb_buffer_pool_size = 256m
innodb_flush_log_at_trx_commit=1
# replication
# relay-log=slave-relay-bin
# relay-log-index=slave-relay-bin.index
# these are commonly set, remove the # and set as required.
# basedir = .....
datadir = /data/mysql
port = 3306
# first slave server id of master 1
server_id = 101
socket = /tmp/mysql.sock
pid-file = /usr/local/mysql-5.6.19/var/slave.pid
# remove leading # to set options mainly useful for reporting servers.
# the server defaults are faster for transactions and fast selects.
# adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128m
# sort_buffer_size = 2m
# read_rnd_buffer_size = 2m
sql_mode=no_engine_substitution,strict_trans_tables
6. 启动mysql
启动和停止master和slave都完全一样。
$ service mysqldstart
通过下面命令查看是否启动成功:
$ service mysqldstatus
7. 停止mysql
$ service mysqld stop
管理mysql安全性默认mysql的root的用户密码为空,为了提高安全性,应该设置root用户一个安全的密码。
在服务器上通过mysql用户打开mysql客户端:$ mysql –u root
设置一个安全的密码:
mysql> set password forroot@localhost=password('secret');
配置master和slave之间的复制1. 创建执行复制的mysql用户
在master上创建一个复制用户,其中secret为用户的密码:
mysql> createuser repl_user identified by 'secret';
并赋给复制权限:
mysql>grantreplication slave on *.* to repl_user;
2. 锁定master并获取二进制日志位置值
获取读锁:
mysql> flush tables withread lock;
显示当前二进制文件名及位置值:
mysql> show master status;
3. 通过mysqldump工具获取master数据快照
在另外一个会话中在master上执行:
$ mysqldump -u root-p --all-databases --master-data > data_dump.sql
执行后,保存在当前目录中。4. 释放master上的读锁
在获取读锁的会话中,执行释放锁命令:
mysql> unlock tables;5. 导入dump数据到slave中
通过scp拷贝data_dump.sql到slave的机器上。
$ scp data_dump.sqlmysql@:/home/mysql
在slave上通过下面的命令导入到slave的mysql中。
$ mysql –u root -p
mysql> source data_dump.sql;6. 配置master和slave之间的复制
mysql> change master to master_host='',
master_user='repl_user',
master_password='secret',
master_port = 3306,
master_log_file='master-bin.000003',
master_log_pos=881;
上面的master_log_file和master_log_pos需要配置6.2中查询到的信息。是master的ip或主机名。
启动slave:mysql> start slave;
7. 验证master和slave的状态
在master上执行:
mysql> show master status;
在slave上执行:
mysql> show slave status;
上面信息显示没有任何错误,slave_io_state信息为‘waitigfor master to send event’,说明复制连接配置ok。
至此,两个mysql的master/slave模式的集群已经部署成功,可以在master上执行数据更新操作,发现可以正常复制到slave上。