CENTOS7环境下配置MYSQL MHA方案

更新时间:2024-01-26 19:32:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

CENTOS7环境下配置MYSQL MHA方案

序号 1 软件环境

虚拟机: VMware? Workstation-10.0.1 build-1379776-Win 操作系统: Window 2008

虚拟机系统环境 描述 OS硬盘空间 内存 网卡 MySQL 操作系统 拓扑结构

说明 30G 8G 1 5.6.24 Linux Centos 备注 Ver 14.14 Distrib 5.6.24, for linux-glibc2.5 (x86_64) centos-release-7-1.1503.el7.centos.2.8.x86_64 版本 V1.0.0.0 日期 2015/05/20 作者 黄种龙 描述 CENTOS7环境下MySQL安装和MHA高可用性方案的配置。

一、 安装MySQL

参见以上的拓扑图,IP 172.16.0.202的主机和 IP 172.16.0.203的主机都才用以下的方式安装MYSQL数据库。

(一) 检查安装先决条件 1、依赖库的安装

MySql的linux版本依赖于libaio库,必须先检查一下系统是否已经安装了此库。 # yum search libaio 若没有安装,必须先安装 # yum install libaio

推荐安装一个epel源

# yum install epel-release-7-5.noarch

2、防火墙设置

CENTOS7系统,模式是开启SELINUX设置的,所以先检查SELINUX的设置,若开启则必须禁用。

#sudo vim /etc/selinux/config

把SELINUX=enforcing改为SELINUX=disabled

必须设置CentOs操作系统的防火墙,以便让相应的端口数据例如可以通过。CentOS 7.0默

认使用的是firewall作为防火墙,本文档只是简单的禁用此防火墙,需要生产环境级的安全,请具体参考防火墙设置手册。

#systemctl start firewalld.service#启动firewall #systemctl stop firewalld.service#停止firewall

#systemctl disable firewalld.service#禁止firewall开机启动 (二)安装和配置MySql Binaries包 【创建用户和目录】 #groupadd mysql

#useradd -r -g mysql mysql #cd /usr/local 【解压Binaries包】

#sudo tar zxvf mysql-advanced-5.6.24-linux-glibc2.5-x86_64.tar.gz #sudo ln -s mysql-advanced-5.6.24-linux-glibc2.5-x86_64 mysql #export PATH=$PATH:/usr/local/mysql/bin #source /etc/profile 【配置my.cnf】

需要特别注意,在以下的my.cnf文件中server-id 的值必须不一样。例如IP 172.16.0.202的centos主机上的/etc/my.cnf文件的server-id分别为:server-id=1、server-id=2、server-id=3,则IP 172.16.0.203的centos主机上的/etc/my.cnf文件的server-id可以为server-id=4、

server-id=5、server-id=6

#cd /etc

#sudo touch my.cnf #sudo vim my.cnf 输入如下的配置:

[mysqld_multi]

mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin log = /home/mysql/mydata/log/mysqld_multi.log [mysqld1]

socket = /home/mysql/mydata/data1/socket/mysqld.sock port = 3306

pid-file = /home/mysql/mydata/data1/mysqld.pid datadir = /home/mysql/mydata/data1

log_bin=/home/mysql/mydata/data1/binlog/mysql-bin server-id = 1

[mysqld2]

socket = /home/mysql/mydata/data2/socket/mysqld.sock port = 3307

pid-file = /home/mysql/mydata/data2/mysqld.pid datadir = /home/mysql/mydata/data2

log_bin=/home/mysql/mydata/data2/binlog/mysql-bin server-id = 2

relay_log = /home/mysql/mydata/data2/relay_log/mysql-relay-bin log_slave_updates = 1 read_only = 1

[mysqld3]

socket = /home/mysql/mydata/data3/socket/mysqld.sock port = 3308

pid-file = /home/mysql/mydata/data3/mysqld.pid datadir = /home/mysql/mydata/data3

log_bin=/home/mysql/mydata/data3/binlog/mysql-bin server-id = 3

relay_log = /home/mysql/mydata/data3/relay_log/mysql-relay-bin log_slave_updates = 1 read_only = 1

【创建数据目录】 cd /home mkdir mysql cd mysql mkdir mydata cd mydata

mkdir data1 cd data1 mkdir socket mkdir binlog

cd /home/mysql/mydata

mkdir data2 cd data2 mkdir socket mkdir binlog

mkdir relay_log

cd /home/mysql/mydata

mkdir data3 cd data3

mkdir socket mkdir binlog mkdir relay_log

cd /home/mysql/mydata mkdir log

cd /home/mysql/ chown -R mysql . chgrp -R mysql .

【初始化数据库】

/usr/local/mysql/scripts/mysql_install_db

--basedir=/usr/local/mysql --datadir=/home/mysql/mydata/data1 /usr/local/mysql/scripts/mysql_install_db

--basedir=/usr/local/mysql --datadir=/home/mysql/mydata/data2

--user=mysql

--user=mysql

/usr/local/mysql/scripts/mysql_install_db

--basedir=/usr/local/mysql --datadir=/home/mysql/mydata/data3

【启动数据库】

# mysqld_multi --defaults-extra-file=/etc/my.cnf start 1,2,3 启动后,可以使用如下查看服务运行情况:

#mysqld_multi --defaults-extra-file=/etc/my.cnf report

--user=mysql

到此,MYSQL数据库已经在172.16.0.202和172.16.0.203的机器上安装完毕。

(三)配置Mysql服务的复制 【master库配置】

1、进入数据库

在172.16.0.202上:

$ mysql -uroot -P3306 -p -h127.0.0.1

2、创建复制账号

进入数据库中,执行如下,创建复制账号: $ grant replication slave, replication client on *.* to repl@'172.16.0.%' identified by 'repl';

3、修改远程访问权限

update user set password=PASSWORD('XXXXX') where user='root'; update user set host='%' where host='localhost'; flush privileges;

【slave库配置】

1、步骤一:

在172.16.0.202上:

$ mysql -uroot -P3307 -p -h127.0.0.1 $change master to master_host='172.16.0.202', MASTER_PORT=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000001',

master_log_pos=0; $start slave;

可以查看复制状态: $show slave status\\G;

2、步骤二:

在172.16.0.202上:

$ mysql -uroot -P3308 -p -h127.0.0.1 $change master to master_host='172.16.0.202', MASTER_PORT=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000001', master_log_pos=0; $start slave; 3、步骤三:

在172.16.0.203上:

$ mysql -uroot -P3306 -p -h127.0.0.1 $change master to master_host='172.16.0.202', MASTER_PORT=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000001', master_log_pos=0; $start slave; 4、步骤四:

在172.16.0.203上:

$ mysql -uroot -P3307 -p -h127.0.0.1 $change master to master_host='172.16.0.202', MASTER_PORT=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000001', master_log_pos=0; $start slave; 5、步骤五:

在172.16.0.203上:

$ mysql -uroot -P3308 -p -h127.0.0.1 $change master to master_host='172.16.0.202', MASTER_PORT=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000001', master_log_pos=0; $start slave; 【查看复制进程】

在172.16.0.202上:

$ mysql -uroot -P3307 -p -h127.0.0.1

配置完成以上步骤后,可以使用如下命令查看复制进程:

【安装半同步插件】 1、在master上安装插件 在172.16.0.202上:

$mysql -uroot -P3306 -p -h127.0.0.1

$ install plugin rpl_semi_sync_master SONAME 'semisync_master.so';

继续执行如下:

$ set global rpl_semi_sync_master_enabled = 1; $ set global rpl_semi_sync_master_timeout = 1000;

2、在slave上安装插件 在

172.16.0.202:3307 172.16.0.202:3308 172.16.0.203:3306 172.16.0.203:3307 172.16.0.203:3308

的mysql数据实例上都执行如下步骤:

install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so';

show variables like \(如果看到新增的semi变量的话证明安装模块成功) set global rpl_semi_sync_slave_enabled = 1; stop slave; start slave;

至此mysql的复制功能配置完毕。

最后可以把常用的配置参数写入my.cnf配置文件中: 在172.16.0.202的/etc/my.cnf配置文件补充如下: [mysqld1]

rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000

[mysqld2]

rpl_semi_sync_slave_enabled=1 [mysqld3]

rpl_semi_sync_slave_enabled=1

在172.16.0.203的/etc/my.cnf配置文件补充如下: [mysqld1]

rpl_semi_sync_slave_enabled=1 [mysqld2]

rpl_semi_sync_slave_enabled=1 [mysqld3]

rpl_semi_sync_slave_enabled=1

二、 安装MHA 1、安装依赖

如上图所示在MHA NODE节点172.16.0.202、172.16.0.203上执行 #yum install perl-DBD-MySQL

在manager节点172.16.0.201上执行: # yum install perl-DBD-MySQL # yum install perl-Config-Tiny # yum install perl-Log-Dispatch

# yum install perl-Parallel-ForkManager

# yum install -y rrdtool perl-rrdtool rrdtool-devel perl-Params-Validate 2、 安装RPM包

在MHA Manger主机172.16.201的机器上执行: #rpm -ivh

mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm

分别在两台MHA NODE主机172.16.0.202和172.16.0.203的机器上执行 #rpm –ivh mha4mysql-node-0.56-0.el6.noarch

3、 配置MHA Manager (主机IP:172.16.0.201) 在MHA Manager主机172.16.0.201上执行: #mkdir -p /etc/masterha/

#mkdir -p /var/log/masterha/app1/

将下面的内容写进/etc/masterha/app1.cnf:

[server default]

manager_workdir=/var/log/masterha/app1

manager_log=/var/log/masterha/app1/manager.log

user=root #数据库账号MySQL数据库管理账户及密码,因为要执行一些必要的管理命令,比如:Stop Slave、Change Master、#Reset Slave,所以该账户应该为root,这也是缺省值。 password=xxxxx #数据库账号密码 ssh_user=root repl_user=repl repl_password=repl ping_interval=1 shutdown_script=\

master_ip_online_change_script=\report_script=\

[server1]

hostname=172.16.0.202 port=3306

candidate_master=1

master_binlog_dir=\

[server2]

hostname=172.16.0.203 port=3306

candidate_master=1

master_binlog_dir=\

[server3]

hostname=172.16.0.202 port=3307

[server4]

hostname=172.16.0.202 port=3308

[server5]

hostname=172.16.0.203 port=3307

[server6]

hostname=172.16.0.203 port=3308

4、 设置SSH互信

4.1、修改sshd_config配置

在172.16.0.201、172.16.0.202、172.16.0.203三台机器上分别执行更改SSH的配置文件 /etc/ssh/sshd_config的操作:

RSAAuthentication yes # 启用 RSA 认证

PubkeyAuthentication yes # 启用公钥私钥配对认证方式 AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径 重启SSH服务: service sshd restart 4.2、执行SSH秘钥创建

4.2.1、在MHA MANAGER 172.16.0.201主机上执行 #ssh-keygen -t rsa

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.201

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.202 #ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.203

完成以上操作后,可以执行以下命令,检查SSH无密码登陆是否配置好了。

4.2.2、在MHA NODE 172.16.0.202主机上执行

#ssh-keygen -t rsa

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.201 #ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.202

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.203 4.2.3、在MHA NODE 172.16.0.203主机上执行

#ssh-keygen -t rsa

#ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.201 #ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.202 #ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.0.203 4.3、检查三台主机间的SSH互信设置

在MHA Manager主机172.16.0.201上执行

#masterha_check_ssh --conf=/etc/masterha/app1.cnf

5、 启动MHA Manager服务

注意小节的操作,都需要在MHA Manager主机172.16.0.201上进行。 启动之前,可以先检查下MYSQL的复制状态,执行:

# masterha_check_repl --conf=/etc/masterha/app1.cnf

(注意:以上的截图不全,仅供参考)

启动MHA Manager服务:

#nohup masterha_manager --conf=/etc/masterha/app1.cnf > /tmp/mha_manager.log 2>&1 &

启动服务之后,可以执行服务状态检查:

#masterha_check_status --conf=/etc/masterha/app1.cnf

6、 测试故障切换

首先,新开一个terminal连接到MHA Manager主机172.16.0.201上面,执行: #tail -f /var/log/masterha/app1/manager.log

从这个terminal可以查看MHA Manager日志的实时刷新。

这个时候使用 #kill -9 进程号

来强制关掉My Sql 172.16.0.202:3306上的Master数据库实例。 通过运行

# /usr/local/mysql/bin/mysqld_multi --defaults-extra-file=/etc/my.cnf report 可以看到172.16.0.202:3306的Msql Master已经不运行了。

在本小节开头打开的那个MHA Manager主机172.16.0.201的terminal可以看到:

这个时候通过登录172.16.0.203:3306的Mysql实例,可以看到:

管理节点查看到的日志(failover之后,mha manager进程会自动关闭)。

所以,注意:如果MHA已经进行过一次failover,MHA进程就会自动退出。

如果这个时候,想试验STOP掉172.16.0.203:3306看能不能再次自动故障转移MASTER到 172.16.0.202:3306上。

必须首先启动172.16.0.202:3306实例。 接着执行

#mysql -uroot -p -P3306 -h172.16.0.202 登录172.16.0.202:3306的MySQL实例 执行 #change master to master_host='172.16.0.203', MASTER_PORT=3306, master_user='repl', master_password='repl', master_log_file='mysql-bin.000001', master_log_pos=0; start slave

然后在MHA Manager主机172.16.0.201上执行:

#rm /var/log/masterha/app1/app1.failover.complete 重启mha manager:

#masterha_manager --conf=/etc/masterha/app1.cnf

这样。如果172.16.0.203:3306挂掉了,将自动故障转移MASTER回到172.16.0.202:3306的Mysql实例上。 三、 MySQL代理中间件 1、 奇虎Atlas

在IP172.16.0.201的机器上执行以下的操作。

1.1下载安装:

#wget

https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm

rpm -iv Atlas-2.2.1.el6.x86_64.rpm 1.2配置

Atlas的安装目录是 /usr/local/mysql-proxy,进入安装目录下conf目录,编辑test.cnf文件,很多选项用默认值即可。

1)主库的ip和端口,可设置多项,用逗号分隔 proxy-backend-addresses = 192.168.29.128:3306

2)(非必备,根据实际情况配置)从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔。如果想让主库也能分担读请求的话,只需要将主库信息加入到下面的配置项中。

proxy-read-only-backend-addresses = 192.168.29.129:3306

3)(必备,根据实际情况配置)用户名与其对应的加密过的MySQL密码,密码使用安装路径 /bin目录下的加密程序encrypt加密,用户名与密码之间用冒号分隔。主从数据库上需要先创建该用户并设置密码(用户名和密码在主从数据库上要一致)。 加密密码:

./encrypt 123456 配置密码

pwds = root:/iZxz+0GRoA= 4)(必备,默认值即可)Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true daemon = true 5)(必备,默认值即可)Atlas监听的工作接口IP和端口,proxy-address = 0.0.0.0:1234代表客户端应该使用1234这个端口连接Atlas来发送SQL请求。 proxy-address = 0.0.0.0:1234 6)(必备,默认值即可)Atlas监听的管理接口IP和端口,admin-address = 0.0.0.0:2345代表DBA应该使用2345这个端口连接Atlas来执行运维管理操作。 admin-address = 0.0.0.0:2345

7)(可选项,可不设置)默认字符集,若不设置该项,则默认字符集为latin1 charset = utf8

8)(必备,根据实际情况配置)SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,该模式下日志刷新是基于缓冲区的,当日志填满缓冲区后,才将日志信息刷到磁盘。REALTIME用于调试,代表记录SQL日志且实时写入磁盘,默认为OFF sql-log = REALTIME

日志路径在 /usr/local/mysql-proxy/log 下

我们的测试配置如下截图所示:

1.3启动Atlas

进入/usr/local/mysql-proxy/bin目录,执行下面的命令启动、重启或停止Atlas。 ./mysql-proxyd test start,启动Atlas。 ./mysql-proxyd test restart,重启Atlas。 ./mysql-proxyd test stop,停止Atlas。 启动:

# ./mysql-proxyd test start

# ps -ef | grep mysql-proxy

注意:

(1). 运行文件是:mysql-proxyd(不是mysql-proxy)。

(2). test是conf目录下配置文件的名字,也是配置文件里instance项的名字,三者需要统一。

(3). 可以使用ps -ef | grep mysql-proxy查看Atlas是否已经启动或停止。

客户端使用刚才配置的Atlas监听端口连接到Atlas代理服务

[root@Luxh-03 ~]# mysql -h192.168.29.130 -P1234 -uroot -p123456

执行sql进行测试,可以通过日志看到写操作都在Master,读操作都连接到Slave了

1.4连接Atlas代理

客户端使用刚才配置的Atlas监听端口连接到Atlas代理服务

以下的演示在主机172.16.0.201上执行:

连接到以上配置文件设置的管理端口2345 #mysql -h127.0.0.1 -P2345 -uuser –ppwd

执行select * from help;

可以查看Atlas管理端提供的管理功能

1.5 进行读写分离测试。

注意,172.16.0.201主机上,并没有运行的MYSQL实例,通过 #px-aux|grep –I mysqld

可以查看本机并没有mysql实例在运行。

# mysql -h172.16.0.201 -P1234 -uroot –poopay

执行sql进行测试,可以通过日志看到写操作都在Master,读操作都连接到Slave了 测试如下:

如上面的1.2小节中的配置:

172.16.0.203:3306的MYSQL实例日志只有insert或者update的如下所示:

172.16.0.203:3306的MYSQL实例日志只有select的如下所示:

1.6 使用mysqlslap工具进行性能测试 执行一次测试,100个并发。

执行一次测试,分别500和1000个并发,执行1000次总查询:

下面进行使用Atlas代理的进程的性能与不使用代码接连MASTER数据库的性能比较。

如下使用代理:

不使用代理:

四、 使用JAVA的进行实时可用性测试

(一)、设计说明

1、 首先使用SELECT COUNT(1) FROM 表名 读取Master MySQL数据库中的现有的数据总

条数。假设这个值的变量名称为TOTAL_COUNT 2、 设计一个类用于模拟,每隔N秒向Atlas代理提交M条的数据。此类implements Runnable。

此时TOTAL_COUNT=TOTAL_COUNT+M 3、 设计一个类用于模拟,每隔N秒从Atlas代理执行SELECT COUNT(1) FROM 表名。 假

设得到这个值为 SELECT_COUNT。此类implements Runnable。 4、 SELECT_COUNT=TOTAL_COUNT 则读取正确,反之则读取失败。 (二)、测试环境的虚拟机硬件配置 CPU CPU核心数 内存 Mysql 配置 Intel(R) Xeon(R) CPU E5-2603 v2 @ 1.80GHz 1 4G set global slave_parallel_workers=20; set global sync_binlog=1; set global sync_master_info=1; set global sync_relay_log=1; set global sync_relay_log_info=1; set global wait_timeout=31536000 set global interactive_timeout=31536000 注意,设置global slave_parallel_workers的参数会严重影响测试结果。应该根据机器的具体配置来做优化。 (三)、测试结果 测试的条件 每线程插入频率 1秒执行一次插入 每次插入的数据条数 1次提交10条数据 每线程读取频率 1秒执行一次读取 测试的结果 总计提交插入数据条数(A) 总计执行的读取测试次数(B) 正确读取次数(C) 错误读取次数(D) 测试时间 10分钟 错误率D/B 0.0043 并发插入的线程数 2个线程 并发读取的线程数 100个线程 2070 6886 6856 30 测试的条件 每线程插入频率 1秒执行一次插入 每次插入的数据条数 1次提交10条数据 每线程读取频率 1秒执行一次读取 测试的结果 总计提交插入数据条数(A) 总计执行的读取测试次数(B) 正确读取次数(C) 错误读取次数(D) 197 测试时间 10分钟 错误率D/B 0.0274 并发插入的线程数 10个线程 并发读取的线程数 100个线程 8550 7165 6968 测试的条件 每线程插入频率 1秒执行一次插入 每次插入的数据条数 1次提交10条数据 每线程读取频率 1秒执行一次读取 测试的结果 总计提交插入数据条数(A) 6460 总计执行的读取测试次数(B) 7183 正确读取次数(C) 7025 错误读取次数(D) 158 测试时间 10分钟 错误率D/B 0.0219 并发插入的线程数 10个线程 并发读取的线程数 200个线程 Master数据库上的主机执行top的结果:

测试的项目代码

Constants.java

Insert.java

Select.javaMain.java

本文来源:https://www.bwwdw.com/article/ba0w.html

Top