MariaDB+Galera+Haproxy+Keepalived搭建集群


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
在10.0.0.28上操作,搭建keepalived

搭建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
haproxy配置文件

現在可以通過虛擬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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM