Galera Cluster mysql+keepalived叢集部署

來源:互聯網
上載者:User

標籤:ase   cti   記錄操作   行修改   伺服器   off   組成   sre   out   

1、卸載mysql

尋找本機安裝的mysql
rpm -qa | grep -i mysql

--nodeps --force

rpm -ev MySQL-server-5.6.15-1.el6.x86_64
rpm -ev --nodeps mysql-libs-5.1.71-1.el6.x86_64 (強制卸載)


尋找之前老版本mysql的目錄、並且刪除老版本mysql的檔案和庫

find / -name mysql

rm -rf /usr/lib64/mysql


卸載後/etc/my.cnf不會刪除,需要進行手工刪除
rm -rf /etc/my.cnf

 

2、安裝mysql
rpm -ivh libaio-0.3.107-10.el6.x86_64.rpm
rpm -ivh MySQL-server-5.6.38-1.el6.x86_64.rpm
rpm -ivh MySQL-client-5.6.38-1.el6.x86_64.rpm
rpm -ivh MySQL-shared-5.6.38-1.el6.x86_64.rpm
rpm -ivh MySQL-shared-compat-5.6.38-1.el6.x86_64.rpm


配置selinux
gedit /etc/sysconfig/selinux
SELINUX=permissive

shell終端執行
setenforce permissive


開啟連接埠
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 4444 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 4567 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 4568 -j ACCEPT

/etc/rc.d/init.d/iptables save

/etc/init.d/iptables status

3、安裝Galera補丁

rpm -qa|grep galera(模糊尋找安裝程式)
rpm -e --nodeps openssl-1.0.1e-42.el6.x86_64 (卸載)


rpm -ivh openssl-1.0.1e-57.el6.x86_64.rpm

rpm -ivh lsof-4.82-5.el6.x86_64.rpm --force
rpm -ivh boost-program-options-1.41.0-28.el6.x86_64.rpm --force
rpm -ivh rsync-3.0.6-12.el6.x86_64.rpm --force

rpm -ivh galera-3-25.3.22-2.el6.x86_64.rpm
rpm -ivh mysql-wsrep-server-5.6-5.6.38-25.21.el6.x86_64.rpm --force
rpm -ivh mysql-wsrep-client-5.6-5.6.38-25.21.el6.x86_64.rpm --force
rpm -ivh mysql-wsrep-5.6-5.6.38-25.21.el6.x86_64.rpm
rpm -ivh mysql-wsrep-libs-compat-5.6-5.6.38-25.21.el6.x86_64.rpm
rpm -ivh mysql-wsrep-shared-5.6-5.6.38-25.21.el6.x86_64.rpm --force

配置/etc/my.cnf
[mysqld]
server_id = 1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
port=3306
user=mysql
binlog_format=ROW
log_bin = /var/lib/mysql/logs/mysql-bin
log_slave_updates=1
#expire_logs_days=7
max_binlog_size=64M
log_bin_trust_function_creators=1
bind-address=0.0.0.0
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=2048M
innodb_log_buffer_size=16M
innodb_log_file_size=128M
innodb_log_files_in_group=3
innodb_max_dirty_pages_pct=90
innodb_lock_wait_timeout=120
innodb_use_sys_malloc=1
lower_case_table_names=1
explicit_defaults_for_timestamp=true
character-set-server=utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
symbolic-links=0
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so
wsrep_provider_options="gcache.dir=/var/lib/mysql/galera/;gcache.name=galera.cache;gcache.size=3G;gcache.page_size=3G"
wsrep_cluster_name="mysql_cluster"
wsrep_cluster_address="gcomm://192.168.40.20,192.168.40.21,192.168.40.22"
wsrep_sst_method=rsync
wsrep_node_name="node1"
wsrep_node_address="192.168.40.20"
wsrep_slave_threads=4
wsrep_log_conflicts=ON
max_connections=200
log-error=/var/lib/mysql/mysqld.log
skip-name-resolve
local-infile=1
[mysql_safe]
!includedir /etc/my.cnf.d/
#sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES


#########################################################

4、啟動叢集
所有節點配置完畢後,在主節點執行

mkdir /var/lib/mysql/logs
mkdir /var/lib/mysql/galera

chown -R mysql.mysql /var/lib/mysql/logs
chown -R mysql.mysql /var/lib/mysql/galera

service mysql start --wsrep-new-cluster


5、查看mysql預設密碼,並登陸修改密碼

cat /root/.mysql_secret

mysql -uroot -p預設密碼


mysql> SET PASSWORD = PASSWORD(‘root‘);

執行完畢後,登入mysql,執行

mysql>show global status like ‘wsrep_cluster_size’;
mysql>show global status like ‘wsrep_ready’;

正常的話返回size為1,wsrep_ready為on。

其他節點執行
mysql>service mysql start

正常的話返回size為3。

6、keepalived的安裝

rpm -qa|grep libnl(模糊尋找安裝程式)

rpm -ivh keepalived-1.2.13-5.el6_6.x86_64.rpm


rpm -ivh net-snmp-libs-5.5-60.el6.x86_64.rpm
rpm -ivh lm_sensors-3.1.1-17.el6.x86_64.rpm
rpm -ivh libnl-1.1.4-2.el6.x86_64.rpm


7、配置keepalived檔案

gedit /etc/keepalived/keepalived.conf

##########################################
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk {
script "/etc/keepalived/checkmysql.sh"
interval 2
weight -50
}
vrrp_script chk2 {
script "/etc/keepalived/icmp.sh"
interval 15
weight -50
}
vrrp_instance VI_1 {
state MASTER #其他兩台配置為BACKUP
interface eth0
virtual_router_id 60
priority 150 #其他兩台的優先順序分別為140、130
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk
chk2
}
virtual_ipaddress {
192.168.40.51/24
}
notify_master "/root/master.sh"
}
#####################################################
建立使用者
mysql>create user ‘keepalived’@’localhost’;

配置checkmysql.sh檔案
gedit /etc/keepalived/checkmysql.sh
##########################################
#!/bin/sh
mysql -ukeepalived -e "select VARIABLE_VALUE from information_schema.GLOBAL_STATUS where VARIABLE_NAME=‘WSREP_READY‘\G"|grep -c "ON" 1> /dev/null 2&>1
if [ $? -ne 0 ];then
service keepalived stop;
#curl 執行post請求,通知警示平台mysql異常 ,實施時定義
exit 1;
fi
exit 0;
###############################################

配置master.sh檔案
gedit /etc/keepalived/master.sh
##########################################
#!/bin/sh
#curl 通知警示平台虛擬位址完成切換
###############################################

配置icmp.sh檔案
gedit /etc/keepalived/icmp.sh
##########################################
#!/bin/sh
host=‘192.168.40.254‘;
temp=‘/etc/keepalived/ping.temp‘;
if [ -f ${temp} ];then
rm -f ${temp};
fi
ping ${host} -c 5 -W 1 > ${temp};
loss=`grep -i "packet loss" ${temp} |grep -o -e ‘[0-9]\{0,3\}%‘|sed ‘s/%//g‘`;
if [ ${loss} -gt 50 ];then
exit 1;
fi
exit 0;
###############################################


8、匯入生產環境資料結構
galera cluster for mysql以及keepalived都部署完成且啟動完成之後,將準備好的生產環境表結構struct.sql匯入到新的資料庫中。
mysql>source struct.sql
匯入成功後,再執行sql指令碼,檢查資料庫結構是否滿足以下要求:
?儲存引擎都為InnoDB;
?所有表都含有主鍵;
?不能有有全文索引以及空間索引。
Sql指令碼:
SELECT DISTINCT
CONCAT(t.table_schema,‘.‘,t.table_name) AS tbl,
t.engine,
IF(ISNULL(c.constraint_name),‘NOPK‘,‘‘) AS nopk,
IF(s.index_type = ‘FULLTEXT‘,‘FULLTEXT‘,‘‘) AS ftidx,
IF(s.index_type = ‘SPATIAL‘,‘SPATIAL‘,‘‘) AS gisidx
FROM information_schema.tables AS t
LEFT JOIN information_schema.key_column_usage AS c
ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name
AND c.constraint_name = ‘PRIMARY‘)
LEFT JOIN information_schema.statistics AS s
ON (t.table_schema = s.table_schema AND t.table_name = s.table_name
AND s.index_type IN (‘FULLTEXT‘,‘SPATIAL‘))
WHERE t.table_schema NOT IN (‘information_schema‘,‘performance_schema‘,‘mysql‘)
AND t.table_type = ‘BASE TABLE‘
AND (t.engine <> ‘InnoDB‘ OR c.constraint_name IS NULL OR s.index_type IN (‘FULLTEXT‘,‘SPATIAL‘))
ORDER BY t.table_schema,t.table_name;
上述指令碼會將不滿足要求的表列舉出來,根據結果進行修改即可。

 

9、Galera Cluster維護
重啟Cluster
1.叢集正常重啟
重啟整個Cluster之前,最好先停掉keepalived服務,使外部應用程式無法繼續訪問mysql
#service keepalived stop
這樣做的好處是可以保證叢集中的資料在重啟前後是一致的,不會存在差異,可以避免重啟時需要進行資料同步而耗費大量時間。
關閉keepalived服務後,依次在所有伺服器上執行
#service mysql stop
關閉mysql後,檢查三台伺服器上#vi /var/lib/mysql/grastate.dat檔案,此檔案包含叢集uuid以及sequence number。我們需要找參數seqno值最大的節點。
在所有伺服器是正常關閉的情況下,我們看到的grastate.dat檔案應該是類似下面的內容
# GALERA saved state
version: 2.1
uuid: d7b6d215-d935-11e5-bd08-36ff08c40499
seqno: 361475525
cert_index:
我們需要將seqno值最大的節點作為叢集第一個節點啟動
#service mysql start --wsrep-new-cluster
#service keepalived start
其他節點執行
#service mysql start #service keepalived start
2.叢集異常重啟
如果遇到機房斷點等異常情況導致所有節點同時crashed,我們重啟叢集的步驟就稍微複雜點。
這種情況下,叢集中所有節點的#vi /var/lib/mysql/grastate.dat檔案的通常與以下內容類別似
# GALERA saved state
version: 2.1
uuid: d7b6d215-d935-11e5-bd08-36ff08c40499
seqno: -1
cert_index:
檔案中seqno值為-1,此時,為了保險起見,我們首先將某一節點做為一個普通mysql服務啟動,即將my.cnf檔案中關於wsrep的內容注釋,然後執行
#service mysql start
#service keepalived start
執行完畢後,然後以恢複二進位日誌記錄的,恢複所有日誌記錄操作
#mysqlbinlog --server-id=## mysql-bin.000### |mysql -uroot -p
server-id為my.cnf檔案中配置中server_id,mysql-bin.000###為二進位記錄檔。
節點資料恢複成功後,恢複my.cnf關於wsrep的配置項,然後將此節點以叢集中第一個節點啟動方式進行啟動
#service mysql start --wsrep-new-cluster
#service keepalived start
其他節點執行
#service mysql start
#service keepalived start

(三)刪除與添加節點
可能存在某台伺服器硬體發生故障,需要將其移出機房的情況,這時需要用新的裝置替代被移除的裝置。
此種情況下,我們僅需要在故障裝置移出後再到新裝置上按照galera cluster for mysql部署流程重新安裝一遍,包括安裝mysql、安裝galera補丁,安裝keepalived服務。
此時存在兩種情況,一種是新裝置IP地址不變,另外一種是新裝置IP地址改變。
對於IP地址不變的情況,我們僅需要在完成配置後執行如下語句即可讓新裝置加入叢集並自動完成資料同步。
#service mysql start
#service keepalived start
對於IP地址改變的情況,首先需要修改mysql.cnf的幾項配置。
安裝部署結構圖,假設node1節點192.168.40.20故障,新的裝置ip為192.168.40.24則新的my.cnf設定檔下列參數值為:
wsrep_cluster_address="gcomm://192.168.40.21,192.168.40.22,192.168.40.24"
wsrep_node_name="node1"
wsrep_node_address="192.168.40.24"
server_id = 1
其他節點node2與node3的mysql.cnf檔案wsrep_cluster_address參數也需要按照新的叢集環境修改
#wsrep_cluster_address="gcomm://192.168.40.21,192.168.40.22,192.168.40.24"
當然,node2與node3修改配置後並不能立即生效,我們分別登入node2與node3,然後執行
mysql>set global wsrep_cluster_address=‘gcomm://192.168.40.21,192.168.40.22,192.168.40.24‘;
然後在新的node1節點執
#service mysql start
#service keepalived start
node1將自動加入叢集並完成資料同步。
關於 Unknown Command Errors
當叢集網路故障時可能會在執行query時出現Unknown command 的錯誤。但是如果在節點故障時我們可以做到及時警示以及處理,就可以有效避免這個錯誤。
當然如果出現了這個錯誤,也可以很快的處理。
登入資料庫後再節點上執行
SHOW STATUS LIKE ‘wsrep_last_committed‘;
查詢會返回last committed的值,在傳回值最大的節點上執行
SET GLOBAL wsrep_provider_options=‘pc.bootstrap=YES‘;
執行完畢後,其他節點會自動加入並進行資料同步。


10、備份與恢複
一、備份
資料庫的備份採用二進位日誌的方式進行備份,可以定期將二進位記錄檔備份到指定伺服器的路徑下。
在我們的my.cnf設定檔中,日誌選項有如下幾個
binlog_format=ROW
log_bin = /var/lib/mysql/logs/mysql-bin
log-bin-index= /var/lib/mysql/logs/mysql-bin.index
log_slave_updates=1
max_binlog_size=64M
二進位日誌格式為ROW,儲存路徑為#vi /var/lib/mysql/logs目錄,日誌以mysql-bin開頭,索引檔案為mysql-bin.index,並且儲存slave動作記錄,為避免記錄檔過大,我們設定記錄檔最大為64M。
這樣,我們就可以儲存資料動作記錄,在發生意外情況時,我們可以根據我們備份的資料庫日誌對資料庫進行恢複操作。
為安全起見,我們可以將#vi /var/lib/mysql/logs裡面儲存的二進位日誌增量備份到本地目錄或者儲存到遠程nfs伺服器上。
比如,本地掛的nfs路徑為/mnt/nfs,則我們同步/var/lib/mysql/logs至/mnt/nfs的方式為:
#rsync -avzP /var/lib/mysql/logs /mnt/nfs
將此命令配置為定時任務,每隔5分鐘同步一次
*/5****/usr/bin/rsync -avzP /var/lib/mysql/logs /mnt/nfs 1>/dev/null 2&>1
對於二進位日誌,需要特別注意的是,不要輕易執行以下語句:

mysql>reset master;
這個命令會清空並重設所有已產生的日誌記錄。除非做好了完全備份,否則請不要執行。
二、恢複
當發生意外情況時,我們可能需要根據二進位日誌記錄恢複資料庫系統。
二進位記錄檔格式為row,因此如果我們需要查看記錄檔,可以執行以下命令
mysqlbinlog --base64-output=decode-row -v mysql-bin.00000#
使用二進位日誌進行恢複時,請先關閉mysql叢集中其他節點,將資料庫已普通的獨立資料庫方式啟動,即先注釋掉my.cnf中關於wsrep的配置項,然後啟動資料庫。
#service mysql start
啟動後,我們根據找到的需要恢複的start dataetime、stop datetime或者start position 、stop position進行恢複
比如要恢複mysql-bin.00003開始位置為25845之後的記錄,則執行
mysqlbinlog --server-id=2 -j 25845 mysql-bin.00003 |mysql -uroot -p
恢複資料以後,恢複設定檔wsrep的配置項,再將此節點作為叢集中第一個節點啟動
#service mysql start --wsrep-new-cluster
#service keepalived start
其他節點執行
#service mysql start
#service keepalived start

MySQL Galera監控
查看MySQL版本: mysql> SHOW GLOBAL VARIABLES LIKE ‘version‘;
查看wsrep版本: mysql> SHOW GLOBAL STATUS LIKE ‘wsrep_provider_version‘;
查看wsrep有關的所有變數: mysql> SHOW VARIABLES LIKE ‘wsrep%‘ \G
查看Galera叢集狀態: mysql> show status like ‘wsrep%‘;

監控狀態參數說明:
叢集完整性檢查:
wsrep_cluster_state_uuid:在叢集所有節點的值應該是相同的,有不同值的節點,說明其沒有串連入叢集.
wsrep_cluster_conf_id:正常情況下所有節點上該值是一樣的.如果值不同,說明該節點被臨時"分區"了.當節點之間網路連接恢複的時候應該會恢複一樣的值.
wsrep_cluster_size:如果這個值跟預期的節點數一致,則所有的叢集節點已經串連.
wsrep_cluster_status:叢集組成的狀態.如果不為"Primary",說明出現"分區"或是"split-brain"狀況.
節點狀態檢查:
wsrep_ready: 該值為ON,則說明可以接受SQL負載.如果為Off,則需要檢查wsrep_connected.
wsrep_connected: 如果該值為Off,且wsrep_ready的值也為Off,則說明該節點沒有串連到叢集.(可能是wsrep_cluster_address或wsrep_cluster_name等配置錯造成的.具體錯誤需要查看錯誤記錄檔)
wsrep_local_state_comment:如果wsrep_connected為On,但wsrep_ready為OFF,則可以從該項查看原因.
複製健全狀態檢查:
wsrep_flow_control_paused:表示複製停止了多長時間.即表明叢集因為Slave延遲而慢的程度.值為0~1,越靠近0越好,值為1表示複製完全停止.可最佳化wsrep_slave_threads的值來改善.
wsrep_cert_deps_distance:有多少事務可以並行應用處理.wsrep_slave_threads設定的值不應該高出該值太多.
wsrep_flow_control_sent:表示該節點已經停止複製了多少次.
wsrep_local_recv_queue_avg:表示slave事務隊列的平均長度.slave瓶頸的預兆.

最慢的節點的wsrep_flow_control_sent和wsrep_local_recv_queue_avg這兩個值最高.這兩個值較低的話,相對更好.
檢測慢網路問題:
wsrep_local_send_queue_avg:網路瓶頸的預兆.如果這個值比較高的話,可能存在網路瓶
衝突或死結的數目:
wsrep_last_committed:最後提交的事務數目
wsrep_local_cert_failures和wsrep_local_bf_aborts:復原,檢測到的衝突數目

 


11、補充
mysqlbinlog --server-id=1 /var/lib/mysql/logs/mysql-bin.000010 |mysql -uroot -proot

ip add ls dev eth5

GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘192.168.40.51‘ IDENTIFIED BY ‘root‘ WITH GRANT OPTION;

grant all privileges on *.* to [email protected]"%" identified by ".";(開放資料庫操作許可權)

 

Galera Cluster mysql+keepalived叢集部署

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.