目标:使用两台主机实现 Mysql 的负载均衡及冗余,并做到双主互备; 环境:rhel5.8,mysql-5.0.77,keepalived-1.2.7,haproxy-1.4.20; 说明: keepalived 实现通过 vrrp协议,通过使一个虚拟IP地址(或称浮动IP)在主备设备间的切换来达到主机冗余; 而客户机通过访问这个虚拟IP 来获取服务; haproxy 是一款负载均衡软件,用于将请求按策略转发给不同主机,达到负载均衡的效果; 可以实现网络层或应用层上的判断分配; mysql 开启二进制日志,做到数据库之间的双向复制,保持数据一致性; #提醒一下,实际生产环境没人会这样搭建的,仅通过这个实验来理解这些概念,希望阅者能有所获; [install_mysql]
#在两台主机上安装 mysql ,此处使用 rpm 包安装,yum环境可以搭本地源; yum install -y mysql-server service mysqld start ======================================================= [create_mysql_test_table] #分别创建一张相同名称和字段的表,插入不同的值,方便中途测试 ha 和轮询是否成功; #还有分别创建一个相同的用户 #server1 mysql >use test; >create table mywait(name char(9),phone char(14)); >insert into mywait(name,phone) values('wait',15000000000); #server2 >use test; >create table mywait(name char(9),phone char(14)); >insert into mywait(name,phone) values('chen',15611111111); [new_mysql_test_user] >mysql >grant all on test.* to diaosi@'%' identified by '123456'; >flush privileges; ======================================================= #从客户机上测试一下; mysql -udiaosi -p123456 -h 192.168.5.11 -e "select * from test.mywait;" mysql -udiaosi -p123456 -h 192.168.5.12 -e "select * from test.mywait;" #至此,mysql 基础环境搭建完成; ======================================================= [install_keepalived] yum install -y libnl-devel #解决依赖关系 tar xf /opt/soft/keepalived-1.2.7.tar.gz -C /opt/soft cd /opt/soft/keepalived-1.2.7/ #with-kernel 指定内核版本时,根据本机情况使用TAB键补全 ./configure --prefix=/opt/keepalived --with-kernel-dir=/usr/src/kernels/2.6.18-308.el5-i686/ make && make install [keepalived_config] #因为没有安装在 / 目录下,所以这些启动和配置文件都需要再 copy 一下; cp /opt/keepalived/sbin/keepalived /usr/sbin/ cp /opt/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ cp /opt/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ mkdir /etc/keepalived cp /opt/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ chkconfig keepalived on #设置开机启动 ======================================================= vim /etc/keepalived/keepalived.conf #keepalived 主配文件 #以下的配置适合 keepalived 本身便是服务提供者的情况;
state BACKUP #修改为备份设备 priority 100 #优先级要比主低 #其它地方根据实际情况也可以做调整; ======================================================= #新建刚才配置keepalived 时所定义的脚本,用于在mysql 死亡后结束 keepalived
#开始测试 ip address #查看主设备 11 上是否有生成 vip 地址; #注意事项,keepalived 生成的 VIP 对 ifconfig 命令不可见,所以需要使用 ip 命令; mysql -udiaosi -p123456 -h 192.168.5.111 -e "select * from test.mywait;" #正常情况是只能查询到 MASTER 的数据库的数据; 1、尝试将 MASTER 的keepalived 停掉 2、down 掉 MASTER 的网卡 3、让mysql 启动不了,比如先注释掉mysql这个用户,后killall mysqld , 查看mysql_chke 脚本是否会把 keepalived 结束掉; #这个时后 vip 地址会移动到 Slave 主机上; HA 搭建的是否成功体现于查询所获取值的变化; #当将 MASTER 恢复后,VIP 又会回到 11 的设备上; #至此 keepalived 为 mysql 做HA 模式成功; ======================================================================== [install_haproxy] #用于将请求分别轮询到 192.168.5.11 192.168.5.12 tar xf /opt/soft/haproxy-1.4.20.tar.gz -C /opt/soft/ cd /opt/soft/haproxy-1.4.20/ make TARGET=linux26 PREFIX=/opt/haproxy install mkdir /opt/haproxy/conf mkdir /opt/haproxy/logs touch /opt/haproxy/conf/haproxy.cfg ======================================================================== [mysql_config] #修改 mysql 监听,使 mysql 避开 192.168.5.111,因为 haproxy 也要监听 111:3306 这个IP地址和端口; vim /etc/my.cnf #server1 [mysqld] bind-address=192.168.5.11 #mysql 的监听,添加这一句就好了 #server2 [mysqld] bind-address=192.168.5.12 #重启mysql service mysqld restart #到现在已经不能通过 192.168.5.111 访问数据库了,接下来配置 haproxy ======================================================================== [config_haproxy] #主备服务器的主配文件一致; vim /opt/haproxy/conf/haproxy.cfg
#启动服务 /opt/haproxy/sbin/haproxy -f /opt/haproxy/conf/haproxy.cfg #说明事项,keepalived 的服务主备设备上都可以同时运行,实则只有获得VIP的服务器才有效; #但是 haproxy 启动的时候需要监听 VIP 地址,所以第一次备用设备是手动起不了服务的; #需要在 keepalived 的notify_master配置项中设定脚本,当此设备获得VIP地址后才启动 haproxy; #有个问题在这里,我们只设定了当keepalived 停止服务时,才结束 haproxy ,没有设定移交VIP时是否结束; #其实这也不用担心,因为主机上已经没有VIP地址了,即便是监听也无效果,并无干扰; ======================================================================== ##开始测试 #检测监听 netstat -tunlp | grep ha netstat -tunlp | grep 3306 # master 设备上才会有两个程序监听不同地址的 3306; #暂未配置 mysql 互为主备就是为了方便这一阶段的排错,这样能更准确的测试; mysql -udiaosi -p123456 -h 192.168.5.111 -e "select * from test.mywait;" #返回值应该是在 server1 server2 之间徘徊; sed -i 's/^mysql.*$/#&/' /etc/passwd #注释掉mysql的用户 service mysqld stop #这个时候 mysql 服务已经启动不起了,mysql_chke.sh 脚本会把 keepalived 停止掉; keepalived 停止前,又会把 haproxy 杀死;当备份的设备获得 vip 后,则会通过start_haproxy.sh 脚本将 haproxy 启动起来; 于是并不会因为服务器当机或mysql故障,影响我们客户端对 111 的查询操作,实验完成一半了; #但是测试时,在VIP地址切换过程中,客户端会有那么2-3秒不能访问到数据库,这个暂时忽略不计; sed 's/^#//' /etc/passwd #测试完后,记得恢复mysql用户哦; #恢复mysql 后,启动主设备的 mysqld keepalived ,然后使用 ip a 查看VIP 地址是否有返回来; #在其中一台设备上 killall haproxy ,之后查看集群状态; http://192.168.5.111:8888/status #查看后再将 haproxy 启动 #至此,已经完成 负载均衡 + 高可用 两部分,负载方式为轮询 ======================================================================== ##三个脚本,很简单,就不再介绍了哈;主要是做日志和结束服务;
======================================================= [mysql Manager Slave] #mysql 主备配置;两台设备上添加用户哦;root#mysql create database db1; GRANT REPLICATION SLAVE ON *.* TO 'diaosi1'@'%' IDENTIFIED BY '123456'; #此处注意哦,Slave 权限必须的,我最初使用 all 权限,结果主备始终不同步,改成 Slave 就OK了; flush privileges; show grants for diaosi1@'%'; ================================================================== #server1 的 mysql 配置 server_id=1 #服务器标识,唯一 log_bin=mysqlbinlog #启用二进制日志 log_bin_index=mysqlbinlog-index #日志索引文件 log_slave_updates=1 #让从服务器把自身复制的事件和记录都写到自己的二进制日志里 relay_log=relay-log #中继日志位置;存放slave端获取到master端的二进制文件信息 replicate_do_db=db1 ##指定需要同步的数据库 #server2 的 mysql 配置 server_id=2 log_bin=mysqlbinlog log_bin_index=mysqlbinlog-index log_slave_updates=1 relay_log=relay-log replicate_do_db=db1 #分别重启两服务 service mysqld restart mysql> show master status; #查看mysql 的当前二进制日志文件 |
|