1. 程式人生 > >Galera Cluster mysql+keepalived集群部署

Galera Cluster mysql+keepalived集群部署

user 數據庫 位置 skip inpu server variables ble -s

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 root@"%" identified by ".";(開放數據庫操作權限)

Galera Cluster mysql+keepalived集群部署