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