mysql高可用集羣搭建

環境描述:

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高可用集羣搭建

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高可用集羣搭建

分別拷貝到系統的目錄下(我的安裝包存放在/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
參考鏈接:http://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

到此整個數據庫集羣環境搭建完成,感謝各位瀏覽和指正,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章