1.MariaDB Galera Cluster介紹
MariaDB Galera Cluster是MariaDB同步多主機集群,它僅支持XtraDB/InnoDB存儲引擎,在MySQLInnoDB存儲引擎基礎上打了wrep(虛擬全同步復制)
MariaDB Galera Cluster主要功能:
同步復制;真正的multi-master,即所有節點可以同時讀寫數據庫;
自動的節點成員控制,失效節點自動被清除;新節點加入數據自動復制;
真正的並行復制,行級;用戶可以直接連接集群,使用感受上與MySQL完全一致.
缺點:
a.加入新節點時開銷大,需要復制完整的數據;
b.不能有效地解決寫擴展的問題,所有的寫操作都發生在所有的節點;
c.有多少個節點,就有多少份重復的數據;
d.由於事務提交需要跨節點通信,即涉及分布式事務操作,因此寫入會比主從復制慢很多,節點越多,寫入越慢,死鎖和回滾也會更加頻繁;
e.對網絡要求比較高,如果網絡出現波動不穩定,則可能會造成兩個節點失聯,Galera Cluster集群會發生腦裂,服務將不可用.
還有一些地方存在局限:
f.僅支持InnoDB/XtraDB存儲引擎,任何寫入其他引擎的表,包括mysql.*表都不會被復制,DDL語句可以復制,但是insert into mysql.user(MyISAM存儲引擎)之類的插入數據不會被復制;
g.Delete操作不支持沒有主鍵的表,因為沒有主鍵的表在不同的節點上的順序不同,如果執行select … limit …將出現不同的結果集;
h.LOCK/UNLOCK TABLES,FLUSH TABLES WITH READ LOCKS不支持單表鎖,以及鎖函數GET_LOCK()、RELEASE_LOCK(),但FLUSH TABLES WITH READ LOCK支持全局表鎖;
i.General Query Log日志不能保存在表中,如果開始查詢日志,則只能保存到文件中;
j.不能有大事務寫入,不能操作wsrep_max_ws_rows=131072(行),且寫入集不能超過wsrep_max_ws_size=1073741824(1GB),否則客戶端直接報錯;
k.由於集群是樂觀鎖並發控制,因此,在commit階段會有事務沖突發生,如果兩個事務在集群中的不同節點上對同一行寫入並提交,則失敗的節點將回滾,客戶端返回死鎖報錯;
l.XA分布式事務不支持Codership Galera Cluster,在提交時可能會回滾;
m.整個集群的寫入吞吐量取決於最弱的節點限制,集群要使用同一的配置.
Galera集群的復制功能是基於認證的復制,其流程如下:
當客戶端發出一個commit的指令,在事務被提交之前,所有對數據庫的更改都會被write-set收集起來,並且將write-set記錄的內容發送給其他節點,write-set 將在每個節點上使用搜索到的主鍵進行確認性認證測試,測試結果決定着節點是否應用write-set更改數據.如果認證測試失敗,節點將丟棄 write-set;如果認證測試成功,則事務提交.
2.配置並啟動集群
MariaDB Server:10.2.24,系統版本:CentOS7.4 # 修改主機名 hostnamectl set-hostname --static MariaDB-Galera-30 cat /etc/hosts 10.0.0.30 MariaDB-Galera-30 10.0.0.31 MariaDB-Galera-31 10.0.0.32 MariaDB-Galera-32 vim /etc/security/limits.conf * soft nofile 65536 * hard nofile 65536 vim /etc/sysctl.conf fs.file-max = 655350 net.ipv4.ip_local_port_range = 1025 65000 net.ipv4.tcp_tw_recycle = 1 sysctl -p # 同步時間,關閉防火牆、selinux ntpdate ntp.aliyun.com # 使用國內yum源 cat /etc/yum.repos.d/mariadb.repo [mariadb] name=MariaDB baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64/ gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1 yum源幫你解決依賴關系,並且給你移除了系統自帶的mariadb-libs-5.5.60這個庫 # MariaDB 10.0版本這么安裝 yum -y install MariaDB-Galera-server MariaDB-client galera # MariaDB 10.1版本開始,Galera Cluster就被包含在MariaDB包里,不需要單獨部署MariaDB-Galera-server和galera yum -y install MariaDB-server MariaDB-client galera # 配置MariaDB 初始化MariaDB,每個節點都需要初始化一次,除了改密碼mariadb123456,其余步驟都按Y /etc/init.d/mysql start /usr/bin/mysql_secure_installation # 也可以使用mysqladmin設置密碼 /usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h MariaDB-Galera-31 password 'new-password'
當使用xtrabackup方式進行熱備時,才需要配置數據同步賬號,而rsync方式不需要,所有節點初始化完成之后,就停掉MySQL,去修改配置文件
/etc/init.d/mysql stop cp /etc/my.cnf.d/server.cnf{,.bak} vim /etc/my.cnf.d/server.cnf [server] [mysqld] server_id=30 bind-address = 10.0.0.30 skip-external-locking skip-name-resolve innodb_file_per_table = on max_connections = 4096 collation-server = utf8_general_ci character-set-server=utf8 innodb_flush_method = O_DIRECT wait_timeout = 28800 binlog_cache_size = 16M max_allowed_packet = 64M expire_logs_days = 30 sort_buffer_size = 128M innodb_buffer_pool_size = 512M [galera] wsrep_on=ON wsrep_provider="/usr/lib64/galera/libgalera_smm.so" wsrep_cluster_address="gcomm://10.0.0.30,10.0.0.31,10.0.0.32" wsrep_cluster_name=galera_cluster wsrep_node_address=10.0.0.30 wsrep_node_name=MariaDB-Galera-30 wsrep_slave_threads=1 wsrep_causal_reads=ON wsrep_certify_nonPK=ON wsrep_sst_method=rsync binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address = 10.0.0.30 innodb_flush_log_at_trx_commit=0 [embedded] [mariadb] [mariadb-10.2]
配置文件在不同服務器上的不同之處有五個:[mysqld]部分的前兩行;[galera]部分的wsrep_node_address、wsrep_node_name、bind-address
在10.0.0.30上使用--wsrep-new-cluster啟動,第一次啟動時才使用此參數,再次啟動不需要加該參數
mysqld_safe --defaults-file=/etc/my.cnf.d/server.cnf --user=mysql --wsrep-new-cluster &
啟動其他節點數據庫
mysqld_safe --defaults-file=/etc/my.cnf.d/server.cnf --user=mysql &
3.測試
# 在10.0.0.30執行命令,查看效果 mysql -uroot -pmariadb123456 # 可以看到集群規模為3 show status like 'wsrep_cluster_size'; show global status like 'ws%'; wsrep_cluster_status為Primary,表示節點為主節點,正常讀寫; wsrep_ready為ON,表示集群正常運行; # 創建數據庫測試,可以在其它兩台數據庫上看到,數據可以同步 create database GaleraTest_db;
上面配置使用的是rsync方式同步數據,如果要使用xtrabackup方式,生產上用的就是這種同步方式,需要授權一個同步賬號,並在配置文件中開啟如下兩行設置:
wsrep_sst_auth=galera:123456
wsrep_sst_method=xtrabackup-v2
默認是rsync全量拷貝,但是需要在donor節點上執行全局讀鎖(flushtables with read lock),建議采用xtrabackup熱備份方式,只有在備份.frm表結構文件才會鎖表.grant all on *.* to 'galera'@'localhost' identified by '123456';
# 創建MyISAM表測試 use GaleraTest_db; create table myisam_tbl (id int,name text) ENGINE MyISAM; insert into myisam_tbl values(1,'hive'); 在其他節點看不到這個表中的數據,可以得出:MyISAM存儲的表,Galera不支持同步的結論. # 模擬節點故障,停掉10.0.0.30的數據庫 mysqladmin -uroot -p "shutdown" 此時集群自動將10.0.0.30故障節點剔除,並且正常提供服務,恢復失敗的節點,會自動上線 # 模擬腦裂后的處理 在網絡抖動發生丟包的情況下,兩個節點失聯導致腦裂 通過這個命令來強制恢復出現腦裂的節點 set global wsrep_provider_options="pc.bootstrap=true"; # 當所有節點都關閉后,怎么重啟Cluster 最后離開集群/停止的數據庫主機,要最啟動,否則可能導致數據丟失 首先,在任意一台主機上編輯/var/lib/mysql/grastate.dat,修改seqno的值,將-1改為1; 然后,使用命令galera_new_cluster啟動集群; 最后,通過/etc/init.d/mysql start啟動其他節點.
4.搭建Haproxy+Keepalived
搭建成功后,前端只需要通過VIP連接數據庫,由Haproxy擔任負載均衡,Galera擔任數據同步
10.0.0.28 Haproxy-28 10.0.0.29 Haproxy-29

yum -y install keepalived cat /etc/keepalived/keepalived.conf global_defs { router_id Haproxy28 } vrrp_script chk_haproxy { script "/etc/keepalived/chk_haproxy.sh" interval 1 weight 2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 201 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_haproxy } virtual_ipaddress { 10.0.0.20/24 } track_interface { eth0 } } virtual_router_id:虛擬路由編號,主從要一致 與10.0.0.28相比,配置參數在10.0.0.29上有三個不同之處: router_id Haproxy29;state BACKUP;priority 99 # 這里我的網卡名是eth0,根據個人機器進行修改.先不要啟動keepalived,最后再起 cat /etc/keepalived/chk_haproxy.sh #!/bin/bash chkha=`ps -C haproxy --no-header |wc -l` if [ $chkha -eq 0 ];then systemctl stop keepalived fi chmod +x /etc/keepalived/chk_haproxy.sh
搭建haproxy可參考:https://www.cnblogs.com/fawaikuangtu123/p/10356418.html

cat /etc/haproxy/haproxy.cfg global log 127.0.0.1 local2 chroot /usr/local/haproxy pidfile /usr/local/haproxy/run/haproxy.pid maxconn 4000 user haproxy group haproxy daemon spread-checks 3 tune.bufsize 32768 tune.maxrewrite 1024 tune.ssl.default-dh-param 2048 defaults log global log 127.0.0.1 local3 mode http option httplog option dontlognull retries 10 option redispatch timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 3000 listen mariadb bind *:3306 mode tcp balance roundrobin server MariaDB-Galera-30 10.0.0.30:3306 weight 5 server MariaDB-Galera-31 10.0.0.31:3306 weight 5 server MariaDB-Galera-32 10.0.0.32:3306 weight 5 listen stats bind *:1080 mode http option httplog maxconn 10 stats enable stats refresh 30s stats uri /stats stats realm MaCluster\ Haproxy stats auth admin:admin stats hide-version stats admin if TRUE 10.0.0.28和10.0.0.29的haproxy.cfg是一樣的,兩台服務器先啟動haproxy,再去啟動keepalived systemctl start haproxy.service systemctl enable haproxy.service systemctl start keepalived.service systemctl enable keepalived.service
現在可以通過虛擬IP訪問數據庫了,先授權一個用戶,拿10.0.0.29當客戶端
# 在10.0.0.30上授權用戶 grant all on *.* to 'remoteuser'@'10.0.0.%' identified by 'Mysql@123'; flush privileges;
10.0.0.29上現在沒有虛擬IP,但是能訪問到,說明達到了實驗效果
MariaDB鏡像設置:https://www.cnblogs.com/liujiacai/p/9042906.html
Galera集群搭建參考:https://blog.csdn.net/jiangshouzhuang/article/details/62468778
Galera排錯博客:https://www.cnblogs.com/nulige/articles/8470001.html
haproxy+keepalived這一篇有詳細注釋:https://www.cnblogs.com/phpstudy2015-6/p/6706465.html
綠肥紅瘦寫的差不多但有點亂:https://www.cnblogs.com/xll970105/p/9881105.html
他的一篇OpenVPN看着像是那么回事:https://www.cnblogs.com/xll970105/p/10382638.html
集群主要參考--智林心語:https://www.andylouse.net/linux-galera-haproxy-keepalived-mariadb
他也有一篇OpenVPN:https://www.andylouse.net/linux-openvpn-server-and-client-configure