环境描述:

Centos6.5
主库:149
从库:148
数据库版本:mariadb-10.0.33

第一步:

安装数据库:
这里我采用的是二进制安装:

创建用户:
useradd -s /sbin/nologin -M mysql
初始化:
./scripts/mysql_install_db --basedir=/data/mariadb-10.0.33/ --datadir=/data/mariadb-10.0.33/data/ --user=mysql
拷贝配置文件:
cp support-files/my-innodb-heavy-4G.cnf /etc/my.cnf
编辑配置文件:
vim /etc/my.cnf
添加以下配置:
basedir=/data/mariadb-10.0.33-linux-x86_64
datadir=/data/mariadb-10.0.33-linux-x86_64/data
修改数据库目录所属:
chown -R mysql:mysql /data/TDserver/mariadb-10.0.33/
拷贝驱动脚本到系统目录:
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
启动数据库:
service mysqld start
新增用户并修改密码:
mysql> grant all privileges on . to 'root'@'%' identified by '密码';
mysql> grant all privileges on . to 'root'@'127.0.0.1' identified by '密码';
Query OK, 0 rows affected (0.00 sec)
刷新权限
mysql> flush privileges;

第二步:

配置数据库的主从复制:
先进行主库的配置:
说明:此处是接第一步步骤之后进行,配置文件的[mysqld]中新增或者修改以下配置
具体的需求安装自己的需要调整即可,此处只是给出环境的搭建步骤:

[mysqld]
#设置编码格式
#character-set-server=utf8
#设置主库配置
log-bin=master-bin
log-bin-index=master-bin.index
innodb_file_per_table=1
binlog_format=mixed
expire_logs_days=7
binlog-do-db=需要同步的数据库名称1
binlog-do-db=需要同步的数据库名称1
binlog-do-db=需要同步的数据库名称1
server-id = 185
slave_skip_errors=1062
#主从复制函数开关
log_bin_trust_function_creators=ON
#主库
#性能
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 8G
#lower_case_table_names=1
#以上需要定制化配置选项

配置完成之后,重启主库,继续进行下面的几步操作:

CREATE USER 'slave'@'从库IP地址' IDENTIFIED BY 'slavepass'; #创建用户
GRANT REPLICATION SLAVE ON . TO 'slave'@'从库IP地址';#分配权限
FLUSH PRIVILEGES;#刷新权限
SHOW MASTER STATUS;#查看master状态
SHOW PROCESSLIST \G #查看连接
FLUSH TABLES WITH READ LOCK;#锁定所有表
UNLOCK TABLES;#解锁表

下面开始从库的配置和操作:
配置文件的[mysqld]中新增或者修改以下配置:

#设置编码格式
#character-set-server=utf8
#设置从库配置
relay-log=relay-log
relay-log-index=relay-log.index
innodb_file_per_table=1
server-id = 101
slave_skip_errors=1062
#需要复制的库名
#主从复制函数开关
log_bin_trust_function_creators=ON

replicate_do_db=需要同步的数据库名1
replicate_do_db=需要同步的数据库名2
replicate_do_db=需要同步的数据库名3

修改完成之后要重启数据库生效
从库中进行以下操作:

连接主库:
CHANGE MASTER TO MASTER_HOST='主库IP地址',MASTER_USER='slave',MASTER_PASSWORD='slavepass',MASTER_LOG_FILE='master-bin.000005', MASTER_LOG_POS=1021;

mysql高可用集群搭建_第1张图片

MASTER_LOG_FILE 对应 master-bin.000005
MASTER_LOG_POS对应194858
开始复制:
start slave;
停止复制:
stop slave;
修改心跳间隔为10s
change master to master_heartbeat_period = 10;
设置25s内没有数据传输则认为网络超时
set global slave_net_timeout = 25;
查看从库心跳状态
show status like 'slave%';
查看从库连接状态
show slave status\G
其中的Senconds_Behind_Master的值表示主从复制延时
参考配置链接:https://blog.csdn.net/JesseYoung/article/details/42914577

好的,到此为止数据库的主从复制已经完成,但是这样远远不能满足生产中对应应用高可用性的要求。

上面配置小伙伴们如果已经配置起来了,下面我们接着进行keepalived的相关配置,

keepalived软件下载链接:
http://www.keepalived.org/software/keepalived-1.3.7.tar.gz

如果你是安照最小化安装的,再解压安装执行之前请务必先安装以下依赖:

yum -y install openssl-devel

下面我们进行标准的三步曲就可以了:

tar -zxvf keepalived-1.3.7.tar.gz
./configure
make && make install

若无报错说明已经安装完成,若是有报错的伙伴百度相关的错误,应该就可轻松解决。

下面是很重要的几步操作,操作时要看清楚:
我们首先在/etc 目录下创建keepalived目录

mkdir /etc/keepalived
进入到解压的软件包目录(你下载的软件所在目录),不是编译安装的目录
使用 tree -l 命令可以看到以下文件
mysql高可用集群搭建_第2张图片

分别拷贝到系统的目录下(我的安装包存放在/usr目录下执行命令即可):

cp /usr/keepalived-1.3.7/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/keepalived-1.3.7/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp -r /usr/keepalived-1.3.7/keepalived/etc/keepalived/keepalived.conf /etc/keepalived

进入到keepalived的安装目录,默认是/usr/local/keepalived

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

以上一共是拷贝四个文件分别到系统的目录中,
启动测试:

service keepalived start
正常启动会有三个进程
mysql高可用集群搭建

若是可以正常启动表示已经完成了大半(主库和从库都要安装上),相关的配置文件和脚本下面会给出,小伙伴们直接拿来使用就行
keepalived.conf(主)

! Configuration File for keepalived

global_defs {
   notification_email {
   **@163.com
}

   notification_email_from [email protected]
   smtp_server smtp.163.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_run {
   script "/home/sh/check_mysql.sh"
   interval 5
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        200.200.6.155/24 dev eth0 label eth0:0
    }
    track_script {
    check_run
    }
    notify_master /home/sh/close_iptables.sh
    notify_backup /home/sh/close_iptables.sh
}
virtual_server  虚拟IP 3306 {
     delay_loop 2
     lb_algo wrr
     lb_kind DR
     persistence_timeout 60
     protocol TCP
     real_server 主库IP 3306 {
         weight 3
         TCP_CHECK {
             connect_timeout 10
             nb_get_retry 3
             delay_before_retry 3
             connect_port 3306
         }
     }
}

以上需要注意几个地方:

虚拟IP:表示对应的VIPbr/>@163.com:表示报警的邮箱地址
主库IP:表示你主库的IP地址
virtual_ipaddress {
虚拟IP/24 dev eth0 label eth0:0
}
网口要对应自己服务器的网口做修改。

keepalived.conf(从)

! Configuration File for keepalived

global_defs {
   notification_email {
   **@163.com
}

   notification_email_from **@163.com
   smtp_server smtp.163.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_run {
   script "/home/sh/check_mysql.sh"
   interval 5
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        虚拟IP/24 dev eth0 label eth0:0
    }
    track_script {
    check_run
    }
    notify_master /home/sh/close_iptables.sh
    notify_backup /home/sh/close_iptables.sh
}
virtual_server 虚拟IP 3306 {
     delay_loop 2
     lb_algo wrr
     lb_kind DR
     persistence_timeout 60
     protocol TCP
     real_server 从库IP 3306 {
         weight 3
         TCP_CHECK {
             connect_timeout 10
             nb_get_retry 3
             delay_before_retry 3
             connect_port 3306
         }
     }
}

从库设置注意的地方:

priority 99 这个值要比主库小
state 这个值要为BACKUP
virtual_router_id 51 这个值要和主一致

check_mysql.sh mysql检查脚本:

#!/bin/bash  
MYSQL=/usr/bin/mysql  
MYSQL_HOST=localhost 
MYSQL_USER=数据库用户名
MYSQL_PASSWORD=数据库密码 
CHECK_TIME=3  
#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0  
MYSQL_OK=1 
function check_mysql_health (){  
$MYSQL -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASSWORD -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"  ##(小提示这里我们采用的是let进行整数的运算当然您可以用expr,感觉let省去了$比较方便)
     check_mysql_health  
     if [ $MYSQL_OK = 1 ] ; then  
          CHECK_TIME=0 
          exit 0  
     fi  

     if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]  
     then  
          /etc/init.d/keepalived stop  
     exit 1   
     fi  
     sleep 1  
done  

close_iptables.sh 关闭防火墙:

 #! /bin/bash

/etc/init.d/iptables stop

restart_jboss.sh 重启远程服务器上的jboss

#! /bin/bash

#重启远程jboss服务器
/usr/bin/ssh root@远程IP "/bin/sh /home/sh/restart_jboss.sh"

远程服务器上脚本:

#! /bin/bash
#重启jboss

/sbin/service jboss-eap-5Fdating restart

配置完成之后验证测试,若是遇到相关问题可以留言,或者自行搜索即可。

看似我们的数据库已经达到生产的要求了,但还是不行,我们对主从同步的数据并不能进行有效的监控,所以我们还需要部署一个监控主从同步状态的程序, percona-toolkit 闪亮登场,下面我们接着进行percona-toolkit的相关配置。

我们首先先安装好相关的依赖程序:

yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes perl perl-DBI -y
下载链接:https://www.percona.com/downloads/percona-toolkit/2.2.7/RPM/percona-toolkit-2.2.7-1.noarch.rpm
参考链接:https://blog.51cto.com/azhuang/1590396
主库从库分别执行以下SQL语句:

mysql> GRANT SELECT, PROCESS, SUPER, REPLICATION SLAVE,CREATE,DELETE,INSERT,UPDATE ON *.* TO 'checksum'@'200.200.6.%' identified by '123456';
mysql> flush privileges;

检测生成checksum表文件

pt-table-checksum --host=主库IP --port=3306 --user=checksum --password=123456  --databases=需要检查的库名 --create-replicate-table --replicate=需要检查的库名.checksums  --no-check-binlog-format  --nocheck-replication-filters

修复主从不同步的数据:

pt-table-sync --replicate=被检测的数据库名.checksums h=主库IP,u=root,p=123456 h=从库IP,u=root,p=123456 --print --charset=utf8

--print :打印,但不执行命令。
--execute :执行命令。

#自动检测数据是否一致脚本(进行对应修改即可使用)

#!  /bin/bash
NUM=$(/usr/bin/pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu  h=192.168.1.101,u=root,p=123456,P=3306|awk -F" " '{print $3}'|sed -n '2p')
if [ $NUM -eq 1 ];then
  /usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
  /usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
  echo "data is ok"
fi

到此整个数据库集群环境搭建完成,感谢各位浏览和指正,谢谢!