mysql+MHA+keepalived-Loading
Mysql版本mysql-5.5.35.tar.gzMHA节点版本mha4mysql-node-0.54-0.el6.noarch.rpm
MHAmanager版本mha4mysql-manager-0.54.tar.gz
Keepalived版本keepalived-1.2.9.tar.gz
主:192.168.2.220
从:192.168.2.221
VIP:192.168.2.222
主+从分别安装
1、配置安装编译环境
主从均安装
yum groupinstall "Development Tools" -y
主从均安装安装epel源
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
主mysql安装
yum install -y perl-DBD-MySQL
从mysql+MHAmanager安装
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
主从均安装
yum -y install vim wget gcc-c++ ncurses ncurses-devel cmake make bison openssl openssl-devel gcc* libxml2 libxml2-devel curl-devel libjpeg* libpng* freetype*
2、建立mysql所需账号、目录及权限
useradd -d /usr/local/mysql/ mysql #创建一个Mysql用户,指定家目录到/use/local目录下。
mkdir /usr/local/mysql/data
mkdir /usr/local/mysql/log #新建mysql下data和log子目录
chown -R mysql:mysql /usr/local/mysql/data/
chown -R mysql:mysql /usr/local/mysql/log/
chmod 750 /usr/local/mysql/data
chmod 750 /usr/local/mysql/log #修改目录的所属者以及所属组
3、解压并安装mysql
tar xf mysql-5.5.35.tar.gz
cd mysql-5.5.35
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data/ \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DSYSCONFDIR=/etc \
-DWITH_SSL=yes
make & make install
编译注解:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装目录
-DDEFAULT_CHARSET=utf8 \ #默认字符
-DDEFAULT_COLLATION=utf8_general_ci \ #校验字符
-DEXTRA_CHARSETS=all \ #安装所有扩展字符集
-DWITH_MYISAM_STORAGE_ENGINE=1 \ #安装myisam存储引擎
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ #安装innodb存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ #安装archive存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #安装blackhole存储引擎
-DWITH_MEMORY_STORAGE_ENGINE=1 \ #安装memory存储引擎
-DWITH_FEDERATED_STORAGE_ENGINE=1 \ #安装frderated存储引擎
-DWITH_READLINE=1 \ #快捷键功能
-DENABLED_LOCAL_INFILE=1 \ #允许从本地导入数据
-DMYSQL_DATADIR=/usr/local/mysql/data/ \ #数据库存放目录
-DMYSQL_USER=mysql \ #数据库属主
-DMYSQL_TCP_PORT=3306 \ #数据库端口
-DSYSCONFDIR=/etc \ #MySQL配辑文件
-DWITH_SSL=yes #数据库SSL
4.编写mysql配置项:
vi /etc/my.cnf
# CLIENT #
port = 3306
socket = /tmp/mysql.sock
# GENERAL #
user = mysql
default_storage_engine = InnoDB
socket = /tmp/mysql.sock
pid_file = /var/run/mysqld/mysqld.pid
# MyISAM #
key_buffer_size = 32M
myisam_recover = FORCE,BACKUP
# SAFETY #
max_allowed_packet = 16M
max_connect_errors = 1000000
skip_name_resolve
sql_mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
sysdate_is_now = 1
innodb = FORCE
innodb_strict_mode = 1
# DATA STORAGE #
datadir = /usr/local/mysql/data
# CACHES AND LIMITS #
key_buffer_size = 256M
max_allowed_packet = 32M
sort_buffer_size = 16M
read_buffer_size = 4M
read_rnd_buffer_size = 16M
thread_stack = 8M
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
max_connections = 2048
thread_cache_size = 512
open_files_limit = 65535
table_definition_cache = 1024
table_open_cache = 2048
# INNODB #
innodb_log_files_in_group = 2
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_buffer_pool_size = 128M
# LOGGING #
log-error=/usr/local/mysql/log/error.log
general_log=1
general_log_file=/usr/local/mysql/log/mysql.log
slow_query_log=1
slow_query_log_file=/usr/local/mysql/log/slowquery.log
log-output=FILE
skip-external-locking
local-infile=1
# BINARY LOGGING #
log-bin =/usr/local/mysql/log/bin.log
expire_logs_days = 30
sync_binlog = 1
5.将mysql的库文件路径加入系统的库文件搜索路径中
利用ldconfig导入系统库
echo "/usr/local/mysql/lib" >> /etc/ld.so.conf.d/mysql.conf
ldconfig
6.输出mysql的头文件到系统头文件
ln -s /usr/local/mysql/include/mysql /usr/include/mysql
7.进入安装路径,初始化配置脚本
cd /usr/local/mysql
scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data
8.复制mysql启动脚本到系统服务目录
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
9.系统启动项相关配置
chkconfig --add mysqld#添加开机启动服务
chkconfig mysqld on#设置mysql启动
10.启动mysql
service mysqld start
注:编译时若socket路径自定义为/var/lib/mysql/mysql.sock,这里需要创建一个mysql接口的软链接,防止登陆后台或安装论坛报错.
# ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
vim /etc/profile
配置mysql环境变量
export PATH=$PATH:/usr/local/mysql/bin
加载环境变量
. /etc/profile
11. 设置初始账户,并登陆后台:
/usr/local/mysql/bin/mysqladmin -u root password 111111 #设置密码
进入mysql
mysql -u root -p111111 #连接数据库
-----------------------------------
mysql> grant all privileges on *.* to root@'%'>
mysql> flush privileges; #刷新
mysql> show variables; #查看mysql设置.
12、配置主从同步
主mysql配置
# vi /etc/my.cnf
添加
-----------------
# Replication Master Server
log-bin = /usr/local/mysql/log/bin.log
# ServerID
server-id = 1
# 忽略mysql系统库复制
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=test
------------
重启服务
# service mysqld restart
登录mysql后台
# mysql -u root -p111111
查看此刻登录账号
> select user();
在master为slave添加同步帐号
> grant replication slave on *.* to 'slave'@'192.168.2.221'>
查看创建的用户
> select user.host from mysql.user;
查看权限
> show grants for 'slave'@'192.168.2.221';
mysql锁表只读(其他账户登录mysql后无法进行写表操作防止备份数据库后主mysql表更新导致和从数据库内容不一致)
> flush tables with read lock;
查看锁表倒计时时间
> show variables like '%timeout%';
------------------------
....
wait_timeout| 28800
------------------------
将master的数据库表全部备份导出并传送到slave服务器上。
/usr/local/mysql/bin/mysqldump -u root -p111111 --opt --flush-logs --all-database > /root/allbak.sql
cd ~
scp allbak.sql root@192.168.2.221:/root/allbak.sql
查看mysql偏移量(数据库如果有写操作偏移值会递增)
# mysql -u root -p111111 -e "show master status"
----------------------
+------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------+----------+--------------+------------------+-------------------+
| bin.000009 | 120 || | |
+------------+----------+--------------+------------------+-------------------+
----------------------
保证FILE列和Position列与从库配置一致
从mysql配置mysql slave
修改mysql配置文件,候选主服务器log-bin必须开启
# vi /etc/my.cnf
添加
--------------------
# Replication Slave Server
log-bin = /usr/local/mysql/log/bin.log
server-id=2
# 只读
read-only
# 忽略mysql系统库复制
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=test
---------------------
重启服务
service mysqld restart
恢复server的数据库到slave
/usr/local/mysql/bin/mysql -u root -p111111 < /root/allbak.sql
配置连接同步到server端
# mysql -u root -p111111
> stop slave;
> reset slave;
> change master to master_host='192.168.2.220',master_user='slave',master_password='111111',master_log_file="bin.000009",master_log_pos=120;
> start slave;
> show slave status;
同步设置好后执行
> set global read_only=1;
> set global>
注master_log_file表示从主数据库哪个bin-log文件开始同步
master_log_pos表示从该bin-log文件哪条记录点开始同步
需与主库偏移值保持同步
回到主mysql数据库解锁mysql master
mysql -u root -p111111
> unlock tables;
最后登陆从mysql后台查看主从连接状态
mysql -u root -p111111 -e "show slave status\G"
找到这五行如下则主从配置成功
------------------------
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Read_Master_Log_Pos: 120
Relay_Master_Log_File: bin.000009
13、部署MHA
MHA节点包含三个脚本,依赖perl模块。
save_binary_logs:保存和复制当掉的主服务器二进制日志。
apply_diff_relay_logs:识别差异的relay log事件,并应用于其他salve服务器。
purge_relay_logs:清除relay log文件。
需要在所有mysql服务器上安装MHA节点,MHA管理服务器也需要安装。MHA管理节点模块内部依赖MHA节点模块。MHA管理节点通过ssh连接管理mysql服务器和执行MHA节点脚本。MHA节点依赖perl的DBD::mysql模块。
安装MHA节点(主从都要安装)
rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm
安装MHA manager (目前规定manager部署在slave服务器上192.168.2.221)
rpm -ivh mha4mysql-manager-0.54-0.el6.noarch.rpm
建立ssh无密码登录环境
主mysql(192.168.2.220)
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.2.221
从mysql(192.168.2.221)
ssh-keygen -t rsa
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.2.220
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.2.221
因为mha运行时需要用到/usr/bin下的两个mysql命令(貌似路径写死了,更改/etc/profile对mha无效),所以建立两个软连接
ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
部署mha
cd mha4mysql-manager-0.54
mkdir /etc/mha
将manager的配置文件和脚本考到/etc/mha目录下
cp -r samples/* /etc/mha/
vim /etc/mha/conf/masterha_default.cnf
user=root
password=111111
ssh_user=root
repl_user=slave
repl_password=111111
master_binlog_dir= /usr/local/mysql/data,/usr/local/mysql/log
remote_workdir=/usr/local/mha
ping_interval=1
# master_ip_failover_script= /etc/mha/scripts/master_ip_failover
# shutdown_script= /etc/mha/scripts/power_manager
report_script= /etc/mha/scripts/send_report
master_ip_online_change_script= /etc/mha/scripts/master_ip_online_change
vim /etc/mha/conf/app1.cnf
manager_workdir=/usr/local/mha
manager_log=/usr/local/mha/manager.log
hostname=192.168.2.220
candidate_master=1
hostname=192.168.2.221
candidate_master=1
测试ssh连接
masterha_check_ssh --global_conf=/etc/mha/conf/masterha_default.cnf--conf=/etc/mha/conf/app1.cnf
测试复制
masterha_check_repl --global_conf=/etc/mha/conf/masterha_default.cnf--conf=/etc/mha/conf/app1.cnf
启动mha
nohup masterha_manager --global_conf=/etc/mha/conf/masterha_default.cnf--conf=/etc/mha/conf/app1.cnf
也可在screen命令中启动
在备节点,从节点,执行定期删除中继日志
00 00 * * * /usr/local/bin/purge_relay_logs -host=192.168.2.221 -user=root -password=111111 -disable_relay_log_purge >> /usr/local/purge_relay_logs.log 2>&1
安装keepalived
tar zxvf keepalived-1.2.7.tar.gz
cd keepalived-1.2.7
./configure --prefix=/usr/local/keepalived --with-kernel-dir=/usr/src/kernels/2.6.32-431.el6.x86_64
make && make install
设置keepalived开机启动脚本
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
chkconfig keepalived on
mkdir /etc/keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
47532732@qq.com
}
notification_email_from monitor@mchina.cn
smtp_server smtp.exmail.qq.com
smtp_connect_timeout 30
router_id mha
}
vrrp_script check_run {
script "/etc/keepalived/check_mysql.sh"
interval 1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100 #master要高于slave,slave上的设置为90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_run
}
virtual_ipaddress {
192.168.2.222
}
}
vim /etc/keepalived/check_mysql.sh
#!/bin/bash
MYSQL=/usr/local/mysql/bin/mysql
MYSQL_HOST=127.0.0.1
MYSQL_USER=root
MYSQL_PASSWORD=
CHECK_TIME=3
#mysqlis working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
MYSQL_OK=1
else
MYSQL_OK=0
fi
return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
let "CHECK_TIME -= 1"
check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
CHECK_TIME=0
exit 0
fi
if [ $MYSQL_OK -eq 0 ] &&[ $CHECK_TIME -eq 0 ]
then
pkill keepalived
exit 1
fi
sleep 1
done
chmod +x /etc/keepalived/check_mysql.sh
主从均启动keepalived
查看虚拟ip地址是否生效
ip addr
注意
如果master上的mysql服务停止后,master上的keepalived服务也将停止,并将虚拟ip:192.168.2.222漂移给slave服务器。
如果master上的mysql服务停止后,安放在slave上的masterha_manager进程会把slave上的mysql服务提升为master,read_only会自动变为off,relay_log_purge会变为on。并且mysql从slave提升为master动作后,masterha_manager进程会自动关闭。
在masterha_manager的工作目录/usr/local/mha/下会产生app1.failover.complete文件。如果想恢复原来主mater的mysql,并恢复原来的主从+mha+keepalived构架,需要重新部署原master的mysql数据库(停掉web服务,主还原备主上的最新的数据库,并重新部署主从),并且需要删除app1.failover.complete文件,否则可能会导致切换不成功。
恢复后在从(如果就两台服务器的话,这里指的是备主那台服务器)mysql里执行以下命令重新同步
> stop slave;
> reset slave;
> change master to master_host='192.168.2.220',master_user='slave',master_password='111111',master_log_file="bin.000009",master_log_pos=120;
> start slave;
> show slave status;
同步设置好后执行
> set global read_only=1;
> set global>
注master_log_file表示从主数据库哪个bin-log文件开始同步
master_log_pos表示从该bin-log文件哪条记录点开始同步
需与主库偏移值保持同步
页:
[1]