1. 程式人生 > >Mysql+keepalived雙主

Mysql+keepalived雙主

搭建環境說明

第一、資料庫安裝

第二、備份資料庫

第三、雙主熱備的配置

第四、keepalived原理

第五、keepalived的安裝和配置

搭建環境說明:

master1:192.168.175.210   主

master2:192.168.175.211

keepalived的vip: 192.168.175.11(注意這是虛擬IP,無需存在這臺主機,只要保證這個ip是沒有人用的即可)

 

一、MySQL資料庫安裝(兩臺主機都要操作)

本次筆者是在Centos7上安裝的是mysql的,如果有其他需求可以自行下載。

1、下載安裝包,如果下載不了請自己到官網下載相匹配的rpm,我下載的不需要安裝其他依賴,如果去官網下載可能要安裝一些依賴包,依次安裝即可。這種形式安裝後是通過生成yum源的形式,然後通過yum形式安裝。

wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

2、安裝mysql源

yum -y localinstall mysql57-community-release-el7-11.noarch.rpm

3、mysql安裝

yum -y install mysql-community-server

在安裝mysql時有較多的東西需要安裝,稍等片刻即可。

4、啟動mysql

啟動前請關閉selinux,有兩種方式關閉

方式一,臨時關閉,下次開機啟動後會重啟

setenforce 0

方式二、永久關閉,通過設定配置檔案的方式,將 SELINUX改為disabled的形式,如下:

vim /etc/selinux/config

 

 開始啟動mysql服務:

systemctl start mysqld

可以將其設定為開機啟動:

[[email protected] ~]# systemctl enable mysqld
[[email protected] ~]# systemctl daemon-reload

登入mysql,注意第一次登入需要先找到mysql的root使用者的密碼,一般情況下root使用者密碼存放在/var/log/mysqld.log下,如果不在該目錄下可以通過 find / -name mysqld.log查詢該檔案

我的是在該目錄下,所以直接檢視:

[[email protected] ~]# vi /var/log/mysqld.log
mysql -uroot -p

輸入密碼即可登入。

二、關於備份資料庫問題。

mysql的雙機高熱,需要對那些需要備份的資料庫的資料進行同步,所以需要我們先將主庫的資料進行資料同步,如果是兩個新建的資料庫進行資料備份,無需做這一步 。不過筆者聽別人說

可以不進行同步,可以指定到具體位置就可以實現自動同步,但是這種情況筆者認為,對應資料庫的高可用這方面是行不通的。假設其中一臺機器宕機,另一臺機器進行服務的時候就會因為

資料的不同步而出現問題,所以筆者認為還是有必要進行資料同步的。

一般情況下資料庫備份分為多種,有壓縮檔案的形式,有直接寫sql檔案的形式,若想了解這方面的情況,可以自行在網上搜索,筆者在這裡就不進行整理。

第一步:鎖定資料庫,防止有新的資料進行寫入,造成資料不完全同步。所以一般情況下,如果是在公司搭建,會在下班時間進行搭建。(192.168.175.210操作)

mysql>flush tables with read lock; 

第二步:將需要同步的資料庫進行sql檔案輸出。

mysqldump -uroot -p --databases test1 test2 test3>master.sql

這時會在當前目錄下建立一個master.sql檔案,當然也可以指定路徑,不過如果僅僅是用一次,同步完畢刪除即可。

第三步:生成的sql檔案遠端複製到備份機上,隨意指定

scp master.sql master2_mysql:/tmp/

第四步:在備份機上進行資料同步(192.168.175.211)操作

mysql -uroot -p <back.sql

第五步:檢查一下,看看在備份機上有沒有資料,如果有資料同步完成。

三、資料庫熱備

資料庫熱備的定義在這裡就不進行贅述,網上有很多這方面的原理解讀。這裡採用的是通過記錄資料庫操作,備份資料庫讀取這些操作,從而達到熱備的效果。

第一步:分別在兩個資料庫中建立用於備份是時的使用者並授權

在192.168.175.210上進行操作:

mysql>create user 'replicate'@'192.168.175.211' identified by 'qwe123';   # 192.168.175.211是備份機的ip
Query OK, 0 rows affected (0.09 sec)
mysql
>grant replication slave on *.* to 'replicate'@'192.168.175.211';
Query OK, 0 rows affected (0.09 sec)
mysql
>flush privileges;
Query OK, 0 rows affected (0.09 sec)

在192.168.175.211上進行操作:

mysql>create user 'replicate'@'192.168.175.210' identified by 'qwe123';   # 192.168.175.211是備份機的ip
Query OK, 0 rows affected (0.09 sec)

mysql>grant replication slave on *.* to 'replicate'@'192.168.175.210';
Query OK, 0 rows affected (0.09 sec)

mysql>flush privileges; 
Query OK, 0 rows affected (0.09 sec)

分別在兩臺主機上用備份使用者進行訪問

# 在192.168.175.210 (操作)
mysql -h192.168.175.211 -ureplicate -pqwe123

# 在192.168.175.211 (操作)
mysql -h192.168.175.210 -ureplicate -pqwe123

如果都能夠進入mysql 說明操作成功

第二步:配置資料庫的配置檔案

一般情況下,mysql的配置檔案路徑是在 /etc/my.cnf  如果你的沒有可以用  find / -name my.cnf  的方式查詢, 如果查不到,可以檢視/usr/share/mysql目錄下的.cnf檔案,應該是mysql開頭,對其負責一份到/etc/下,並改名為my.cnf即可。

注意:在修改my.cnf之前,先對其進行備份,不要直接修改

cp my.cnf my.cnf.bak

第三步:修改資料庫配置(注意這了的配置是關於熱備的主要配置,其他資料庫配置需要自己新增)

在192.168.175.210上配置

vim /etc/my.cnf
[mysqld]
server-id=1 # 唯一id
innodb_flush_log_at_trx_commit=2  # 預設為1,防止資料丟失
log-bin=mysql-bin-1    #binlog日誌檔名(可以任意命名)
binlog-do-db=test # 記錄日誌的資料庫(如果沒有此項,表示同步所有的庫)
binlog-ignore-db=mysql     # 不需要同步的資料庫
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys log
-slave-updates=ON relay_log=mysql-relay-bin slave_skip_errors=1062 # 跳過1062錯誤 auto_increment_increment=2 auto_increment_offset=1
# 注意
# bind_address = 127.0.0.1 若在配置檔案中有這一項,需要將其註釋,不然在同步資料時,的連線資料庫情況會出錯

在192.168.175.211上配置:

vim /etc/my.cnf
[mysqld]
server-id=2 # 唯一id
innodb_flush_log_at_trx_commit=2  # 預設為1,防止資料丟失
log-bin=mysql-bin-2   #binlog日誌檔名(可以任意命名)
binlog-do-db=test # 記錄日誌的資料庫(如果沒有此項,表示同步所有的庫)
binlog-ignore-db=mysql     # 不需要同步的資料庫
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
log-slave-updates=ON
relay_log
=mysql-relay-bin
slave_skip_errors
=1062 # 跳過1062錯誤 auto_increment_increment=1 auto_increment_offset=1
# 注意
# bind_address = 127.0.0.1 若在配置檔案中有這一項,需要將其註釋,不然在同步資料時,的連線資料庫情況會出錯

第四步:重啟資料庫,主備都需要重啟

systemctl restart mysqld 或 service mysqld restart

第五步:登入資料庫檢視狀態

在192.168.175.210上登入資料庫,執行操作

mysql> show master status\G;
*************************** 1. row ***************************
            File: mysql-bin-1.00001   # 記住這個值,後面有用
        Position: 154                 # 記住這個值,後面有用
    Binlog_Do_DB: test
Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys
Executed_Gtid_Set: 
1 row in set (0.00 sec)
ERROR: 
No query specified

在192.168.175.211上登入資料庫,執行操作

mysql> show master status\G;
*************************** 1. row ***************************
            File: mysql-bin-2.00001   # 記住這個值,後面有用
        Position: 154                 # 記住這個值,後面有用
    Binlog_Do_DB: test
Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys
Executed_Gtid_Set: 
1 row in set (0.00 sec)
ERROR: 
No query specified

在192.168.175.210上登入資料庫,執行操作

mysql>unlock tables;  # 必須執行,否則就會報錯
Query OK, 0 rows affected (0.09 sec)
mysql>stop slave; # 停止slave服務執行緒
mysql>change master to
mysql>master_host='192.168.175.211', # 備用ip
mysql>master_user='replicate', # 前面建立的user
mysql>master_password='qwe123', # 密碼
mysql>master_log_file='mysql-bin-2.000001', # show master 上得出
mysql>master_log_pos=154;
mysql>start slave;    # 重啟執行緒

在192.168.175.211上登入資料庫,執行操作

mysql>unlock tables;  # 必須執行,否則就會報錯
Query OK, 0 rows affected (0.09 sec)
mysql>stop slave;     # 停止slave服務執行緒
mysql>change master to
mysql>master_host='192.168.175.210',  # 備用ip
mysql>master_user='replicate',                # 前面建立的user
mysql>master_password='qwe123',        # 密碼
mysql>master_log_file='mysql-bin-1.000001', # show master 上得出
mysql>master_log_pos=154;   
mysql>start slave;    # 重啟執行緒

第七步:show slave status\G檢視狀態

兩臺機器上都執行:

show slave status\G;

若如下都為兩個yes則標識熱備成功,有時可能出現一個是connecting狀態,可以稍等片刻。如長時間不為yes,則檢查防火牆,主要問題可能就是資料庫連線問題。如有其它情況可以檢視日誌進行解決。

四、keepalived原理及安裝

  keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。

虛擬路由冗餘協議,可以認為是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裡面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在區域網內其他機器的預設路由為該vip),master會發組播,當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先順序來選舉一個backup當master。這樣的話就可以保證路由器的高可用了。

  keepalived主要有三個模組,分別是core、check和vrrp。core模組為keepalived的核心,負責主程序的啟動、維護以及全域性配置檔案的載入和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模組是來實現VRRP協議的。

  這裡僅僅是對keepalived進行了一個簡單的介紹,方便大家理解,若需要深入瞭解,可以參考官方文件。

五、keepalived的安裝和配置

第一步:依賴安裝

yum install -y openssl-devel
yum install -y libnfnetlink-devel
yum install -y libnl libnl-devel
yum install -y ipvsadm

第二步:keepalived安裝

cd /usr/local/src/
wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
tar -zvxf keepalived-1.3.5.tar.gz
cd keepalived-1.3.5
./configure --prefix=/usr/local/keepalived
make && make install
cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
echo "/etc/init.d/keepalived start" >> /etc/rc.local

複製配置檔案:

[[email protected] ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[[email protected] ~]# vim /etc/keepalived/keepalived.conf 

keepalived兩臺機器都得安裝:

第三步:修改配置檔案

在192.168.175.210上編輯

! Configuration: command not found
global_defs {  # 全域性配置,關於郵箱的問題
notification_email {
[email protected]
}

notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MASTER-HA
}
vrrp_instance HA_2 {
    state MASTER     # 設定主節點的標識
    interface em1    # 設定例項繫結的網絡卡
    virtual_router_id 51   # 唯一標識id主從必須一致
    priority 101     # 優先順序 這個和下面的權重結合使用
    advert_int 1
    nopreempt        # 非搶佔式,在主節點上不需要設定
    authentication { # 主從必須一致
        auth_type PASS    # 認證方式
        auth_pass 1111      # 認證密碼
    }
    virtual_ipaddress {
    192.168.175.11     # 虛擬的ip
    }
}

virtual_server 192.168.175.11 3306 {
     delay_loop 2
     lb_algo wrr   # lvs排程演算法 有rr|wrr|lc|wlc|lblc|sh|dh等
     lb_kind DR    # 負載均衡轉發規則NAT|DR|RUN
     persistence_timeout 60  # 從新連線的時間
     protocol TCP              # 協議名稱
     real_server 192.168.175.210 3306 { # 真實的ip地址
         weight 3   # 權重
         notify_down /opt/script/chk_mysql.sh  # 檢測指令碼
         TCP_CHECK {
             connect_timeout 10   # 連線時長
             nb_get_retry 3       # 重複次數
             delay_before_retry 3 # 
             connect_port 3306

在192.168.175.211上編輯

! Configuration: command not found
global_defs {  # 全域性配置,關於郵箱的問題
notification_email {
[email protected]
}

notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MASTER-HA
}
vrrp_instance HA_2 {
    state BACKUP    # 設定從節點的標識
    interface em1    # 設定例項繫結的網絡卡
    virtual_router_id 51   # 唯一標識id主從必須一致
    priority 101     # 優先順序 這個和下面的權重結合使用
    advert_int 1
    nopreempt        # 非搶佔式,在主節點上不需要設定
    authentication { # 主從必須一致
        auth_type PASS    # 認證方式
        auth_pass 1111      # 認證密碼
    }
    virtual_ipaddress {
    192.168.175.11     # 虛擬的ip
    }
}

virtual_server 192.168.175.11 3306 {
     delay_loop 2
     #lb_algo wrr   # 這裡在從節點上不需要設定否則會出現從節點無法連線上vip的情況
     #lb_kind DR    # 這裡也無需設定
     persistence_timeout 60  # 從新連線的時間
     protocol TCP              # 協議名稱
     real_server 192.168.175.211 3306 { # 真實的ip地址
         weight 3   # 權重
         notify_down /opt/script/chk_mysql.sh  # 檢測指令碼
         TCP_CHECK {
             connect_timeout 10   # 連線時長
             nb_get_retry 3       # 重複次數
             delay_before_retry 3 # 
             connect_port 3306

第四步:編寫chk_mysql.sh指令碼

vim /opt/script/chk_mysql.sh
#!/bin/bash
killall keepalived

第五步:啟動keepalived

兩臺機器通過ip addr的形式檢視一下:我的主節點在210上,所以這裡會多一個虛擬ip 

 

到這裡為止所有的配置就已經完成,老鐵們可以進行測試了。在測試之前先建立一個賬號,這個賬號對外有許可權:

分別在兩個資料庫上進行建立:

grant all on *.* to [email protected]'%' identified by "qwe123";
flush privileges;

然後通過這個進行測試:

mysql -h 192.168.175.11 -utest -pqwe123

注意在高可用這一點上,若通過虛擬IP 進行連線時,主節點宕機,在連線從節點時可能會需要幾秒鐘的時間,可以設定連線次數解決。其實keepalived和mysql熱備無關,所以不用擔心資料缺失的問題。

關於priority 和weight的權重選擇問題可以看一下下面的連線文章。

https://blog.csdn.net/hzsunshine/article/details/62041036

 

最後希望大家幫忙點個贊和新增關注,小編會繼續寫一下通俗易懂的文章來和大家一起分享,最後送大家一句話:當你的能力撐不起你的野心時,就安靜下來學習吧!!!!!!!!!!