實戰mariadb-galera叢集架構
day6
複習昨天的內容:
資料庫代理--資料庫中介軟體
功能: |
負載均衡LB:將客戶端請求以相對均衡的方式分發給後端的伺服器; 讀寫分離:能夠區分讀和寫,將相應的操作分漢給對應的服務; 分庫分表分片:提高讀效能,讓後端伺服器緩衝不同的資料; sql路由併發查詢:將一條 複雜的sql語句分成多條 sql語句,分發給後端對應的伺服器。 |
軟體: |
mysql-proxy和atlas:mysql官方的,使用的公司有魔獸世界 mycat:在阿里馬馬cobar上的二次開發,是一個神話 |
資料庫高可用――HA
1、什麼是高可用?
表示法:百分比、9規則
例如:0.99999%代表一年中只能有5分鐘的當機時間(365天*24*60*0.00001=5.256分)
當機造成的損失和降低當機時間所花費的成本的衡量
一般能做到兩個9(3天)、3個9(8h)、4個9(52.56分)
2、當機的原因歸納
硬體上最普遍的問題是磁碟空間耗盡;
效能上最普遍的問題是糟糕的sql語句;
複製問題通常是主備資料不一致導致的;
人為誤操作
3、如何實現高可用
降低故障率
優化架構
4、資料庫高可用軟體
mariadb galera cluster
mysql NDB cluster
5、mariadb galera cluster
功能 |
同步複製 新節點加入自動同步資料 失效節點自動清除 |
優勢 |
沒有延遲 擴充能力強 |
適用架構 |
6、網路拓撲
序號 |
主機名 |
IP地址 |
必備軟體(本例用mariadb-10.0.3) |
1 |
node25 |
192.168.10.25 |
mariadb-server、mariadb-cluster-server |
2 |
node26 |
192.168.10.26 |
mariadb-server、mariadb-cluster-server |
3 |
node27 |
192.168.10.27 |
mariadb-server、mariadb-cluster-server |
4 |
node11 |
192.168.10.11 |
atlas或mysql-proxy、MyCat等dbproxy代理軟體 |
7、軟體和版本:
下載安裝
###galera-10.0.31官方rpm包下載(以下實驗首選):
centos6版的galera-10.0.31軟體(首選):http://yum.mariadb.org/10.0.31/centos6-amd64/rpms/
centos7版的galera-10.0.31軟體(首選):http://yum.mariadb.org/10.0.31/centos7-amd64/rpms/
###galera-10.3官方rpm包下載(已測試OK):
centos6版的galera-10.3軟體:http://yum.mariadb.org/10.3/centos6-amd64/rpms/
centos7版的galera-10.3軟體: http://yum.mariadb.org/10.3/centos7-amd64/rpms/
專家建議:直接在官網下載整個rpms目錄中的rpm軟體包。然後在本地搭建galera安裝包yum源,進行安裝。
galera-10.0.31版的安裝(本例已測OK):
yum search galera
yum install -y MariaDB-Galera-server MariaDB-client galera rsync mlocate createrepo
rpm -q MariaDB-Galera-server MariaDB-client galera
ls /etc/my.cnf.d/
galera-10.3版安裝(測試OK):
yum search galera
yum install MariaDB-server MariaDB-client galera rsync mlocate createrepo -y (配置方法同下)
rpm -q MariaDB-server MariaDB-client galera
ls /etc/my.cnf.d/
galera叢集配置思路:
1、在每臺主機上停止執行mysqld或mariadb服務。並設定服務為開機不啟動。
2、在每臺主機上安裝galera軟體,並啟動mysql服務(此處是galera的服務)。
3、在每臺主機上建立用於galera同步資料的使用者賬號,停止mysql服務(此處是galera的服務)。
4、設定每臺galera主機的配置檔案/etc/my.cnf.d/server.cnf,保證設定正確。
5、初始化啟動第1臺galera主機的叢集環境:
service mysql stop
servicemysql start --wsrep-new-cluster
mysql-uroot -p -e "show status like'wsrep_%';"
6、啟動其他galera主機,驗證叢集狀態:mysql -uroot -p -e "show status like 'wsrep_%';"
8、修改hosts檔案,實現本地主機名解析
修改系每臺galera主機的hosts檔案,實現本地域名解析(選做,不做也不影響)。
高效率技巧:在一臺主機上建立好,用scp遠端推送複製到其他主機。
vi /etc/hosts 新增如下內容
-
192.168.10.25 node25
-
192.168.10.26 node26
-
192.168.10.27 node27
-
192.168.10.11 node11
9、關閉安全功能
配置防火牆規則,參考官方的說明,我這裡偷懶就直接關閉了防火牆。
service iptables stop
chkconfig iptables off
setenforce 0
getenforce
sed -i '/^SELINUX=/s/enforcing/permissive/' /etc/selinux/config
10、用vsftpd在物理機共享galera軟體包(192.168.10.1)。
第1步:安裝並共享galera軟體包。
yum install -y vsftpd ftp lftp
service vsftpd restart
chkconfig vsftpd on
cp -rv galera /var/ftp/
firefox ftp://127.0.0.1
第2步:建立galera.repo網路yum源,並測試。
vi /etc/yum.repos.d/galera.repo
[7galera]
name=galera
baseurl=ftp://192.168.10.1/galera
enabled=1
gpgcheck=0
第3步:測試yum源和倉庫
yum clean all
yum repolist
yum search galera
11、需要先解除安裝mariadb-libs或mysql-libs
說明:不解除安裝會導致衝突,服務無法正常執行。
centos7 |
centos6.5 |
rpm -e mariadb-libs --nodeps rpm -e mariadb-common --nodeps |
rpm -e mysql-libs --nodeps rpm -e mysql-common --nodeps |
徹底解除安裝mysql-server:yum remove mysql-server mysql mysql-libs mysql-compact |
12、初始安裝配置
安裝MariaDB和galera軟體
yum search galera yum install -y MariaDB-Galera-server MariaDB-client galera rsync mlocate createrepo rpm -q MariaDB-Galera-server MariaDB-client galera ls /etc/my.cnf.d/ |
安裝和初始化MariaDB資料庫並啟動MariaDB服務,並作安全加固
centos7 |
centos6.5 |
systemctl restart mysql mysql_secure_installation systemctl stop mysql |
service mysql restart mysql_secure_installation service mysql stop |
說明:系統提供了mysql和mariadb兩個服務指令碼,可用service mariadb restart來重啟。 |
附加需求:在每臺主機啟動mysql服務後,用grant建立兩個Mysql賬號,一個管理員賬號admin,密碼也用admin,再建立一個普通賬號。
mysql -uroot grant all on *.* to admin@'%' identified by 'admin' with grant option; grant all on *.* to myroot@'%' identified by 'reppass'; FLUSH PRIVILEGES; select user,host,password from mysql.user; exit |
13、配置檔案講解
主配置檔案:/etc/my.cnf
附加功能配置檔案:/etc/my.cnf.d/*.cnf
查galera的API動態連結庫檔案路徑:
updatedb
locate libgalera_smm.so
vi /etc/my.cnf.d/galera.cnf 參考程式碼如下
[galera] #Mandatory settings #啟用wsrep API介面 wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so #啟動節點時需要指定galera cluster的地址,作為cluster中第一個啟動的節點wsrep_cluster_address="gcomm://",對於後續啟動的節點用wsrep_cluster_address="gcomm://ip1,ip2,ip3 " wsrep_cluster_address="gcomm://" ##wsrep_cluster_address="gcomm://192.168.100.70,192.168.10.71,192.168.10.72" #叢集名稱(群名),所有node必須一樣 wsrep_cluster_name="galera" #本節點的地址 wsrep_node_address=192.168.100.70 #本節點名稱 wsrep_node_name=node70 #Snapshot Stat Transfer快照狀態轉移方法:mysqldump/rsync,預設mysqldump wsrep_sst_method=rsync #mysqldump同步賬號和密碼(grant授權的賬號和密碼) wsrep_sst_auth="myroot:reppass" #binlog的格式也有三種:STATEMENT、ROW、MIXED binlog_format=ROW #預設儲存引擎 default_storage_engine=innodb #調整鎖策略 innodb_autoinc_lock_mode=2 #本機的監聽地址 bind-address=0.0.0.0 #每隔0秒同步重新整理資料 innodb_flush_log_at_trx_commit=0 #設定utf8為預設字符集 #character_set_server=utf8 #指定binlog日誌檔案 log-bin=mysql-bin |
14、galera叢集配置檔案
node25主機的配置檔案(192.168.10.25)
vim /etc/my.cnf.d/galera.cnf
[galera] #Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address="gcomm://" ##wsrep_cluster_address="gcomm://192.168.10.25,192.168.10.26,192.168.10.27" wsrep_cluster_name="galera" wsrep_node_address=192.168.10.25 wsrep_node_name=node25 wsrep_sst_method=rsync wsrep_sst_auth="myroot:reppass" binlog_format=ROW default_storage_engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 innodb_flush_log_at_trx_commit=0 #character_set_server=utf8 log-bin=mysql-bin |
15、重啟服務。
service mysql restart
#檢視本機mysql服務埠
netstat -ntpl | grep sql |
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 15065/mysqld tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 15065/mysqld |
16、其他galera節點上面做相同的配置
需求:依次啟動其他galera節點,其他節點會根據配置自動加入到叢集中並同步資料,一定要關閉防火牆和SELinux安全功能。
service iptables stop ; chkconfig iptables stop
setenforce 0 ; getenforce
service firewalld stop ; chkconfig firewalld off
node26主機的配置檔案(192.168.10.26)
vim /etc/my.cnf.d/galera.cnf
[galera] #Mandatory settings wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so ##wsrep_cluster_address="gcomm://" wsrep_cluster_address="gcomm://192.168.10.25,192.168.10.26,192.168.10.27" wsrep_cluster_name="galera" wsrep_node_address=192.168.10.26 wsrep_node_name=node26 wsrep_sst_method=rsync wsrep_sst_auth="myroot:reppass" binlog_format=ROW default_storage_engine=innodb innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 innodb_flush_log_at_trx_commit=0 #character_set_server=utf8 log-bin=mysql-bin |
說明:galer叢集中的其他主機的galera.cnf配置檔案請參考叢集成員主機192.168.10.26(node26)的配置檔案。
17、觀察日誌
cat /var/lib/mysql/node1.example.com.err
cat /var/lib/mysql/grastate.dat
18、在galera主機上檢視叢集狀態
mysql -uroot -p show global status like 'wsrep%'; |
登入 檢視叢集wsrep介面狀態 |
19、galera叢集關機問題
第1步:逐一關閉galera成員主機。
第2步:最後關閉galera叢集的群主主機。
異常處理:當機房突然停電,所有galera主機都非正常關機,來電後開機,會導致galera叢集服務無法正常啟動。如何處理?
20、galera叢集開機問題。
第1步:開啟galera叢集的群主主機的mysql服務。
第2步:開啟galera叢集的成員主機的mysql服務。
異常處理:galera叢集的群主主機和成員主機的mysql服務無法啟動,,如何處理?
解決方法一:第1步、刪除garlera群主主機的/var/lib/mysql/grastate.dat狀態檔案,service mysql restart重啟服務。啟動正常。登入並檢視wsrep狀態。
第2步:刪除galera成員主機中的/var/lib/mysql/grastate.dat狀態檔案,service mysql restart重啟服務。啟動正常。登入並檢視wsrep狀態。
解決方法二:第1步、修改garlera群主主機的/var/lib/mysql/grastate.dat狀態檔案中的0為1,service mysql restart重啟服務。啟動正常。登入並檢視wsrep狀態。
第2步:修改galera成員主機中的/var/lib/mysql/grastate.dat狀態檔案中的0為1,service mysql restart重啟服務。啟動正常。登入並檢視wsrep狀態。
21、模擬故障實驗
1、 安裝了3個節點
2、 關閉第一個節點後重啟服務,需要修改配置檔案
3、 關閉第3個節點,去檢視錯誤日誌檔案,在叢集中建立庫,重啟服務,看是否能夠同步到資料。
22、mysql-proxy資料庫代理前端(中介軟體)
可用軟體:atlas、mysql-proxy、MyCat等
本例軟體:Atlas代理
##安裝配置atlas讀寫分離(192.168.10.11)
service iptables stop
chkconfig iptables off
setenforce 0
getenforce
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
grep '^SELINUX=' /etc/selinux/config
安裝和配置atlas軟體
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
echo"PATH=$PATH:/usr/local/mysql-proxy/bin/" > /etc/profile.d/mysql-proxy.sh
source /etc/profile.d/mysql-proxy.sh
ll /usr/local/mysql-proxy/
##mysql-proxy檔案功能說明:
bin目錄下放的都是可執行檔案
-
“encrypt”是用來生成MySQL密碼加密的,在配置的時候會用到
-
“mysql-proxy”是MySQL自己的讀寫分離代理
-
“mysql-proxyd”是360弄出來的,後面有個“d”,服務的啟動、重啟、停止。都是用他來執行的
conf目錄下放的是配置檔案
-
“test.cnf”只有一個檔案,用來配置代理的,可以使用vim來編輯
lib目錄下放的是一些包,以及Atlas的依賴
log目錄下放的是日誌,如報錯等錯誤資訊的記錄
進入bin目錄,使用encrypt來對資料庫的密碼進行加密,我的MySQL資料的使用者名稱是admin,密碼是admin,我需要對密碼進行加密
cd /usr/local/mysql-proxy/bin/
./encrypt admin 生成加密密碼,並複製此密碼la1Ux+Bu4zo=
cd /usr/local/mysql-proxy/conf/
cp -v test.cnf test.cnf.bak //備份test.cnf配置檔案
vi test.conf 修改後的讀寫分享的完整配置檔案內容
[mysql-proxy]
admin-username = user
admin-password = pwd
proxy-backend-addresses =192.168.100.25:3306
proxy-read-only-backend-addresses =192.168.100.26:3306@1,192.168.100.27:3306@2
pwds = admin:la1Ux+Bu4zo=, myroot:esSF+VYp1RM=
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /usr/local/mysql-proxy/log
proxy-address = 0.0.0.0:3306
admin-address = 0.0.0.0:2345
設定mysql-proxyd開機啟動:
echo "/usr/local/mysql-proxy/bin/mysql-proxyd test start" >> /etc/rc.local
/usr/local/mysql-proxy/bin/mysql-proxyd test stop
source /etc/rc.local
lsof -i:3306 查埠
netstat -atunlp |grep sql 查mysql網路程式
tcpdump抓包: tcpdump -i eth0 port 3306
說明:抓取經過192.168.10.11代理主機的eth0網路卡的3306埠的資料包,驗證讀寫分離效果。
登入測試:mysql -uadmin -padmin -h 192.168.10.11 -P3306
登入到atlas管理端:mysql -uuser -ppwd -h 192.168.10.11 -P2345
-------------------------------------------------
啟動atlas服務:/usr/local/mysql-proxy/bin/mysql-proxyd test start
重啟atlas服務:/usr/local/mysql-proxy/bin/mysql-proxyd test restart
查狀態:/usr/local/mysql-proxy/bin/mysql-proxy test status
23、phpadmin部署(centos7系統)
第1步:安裝軟體。
yum install -y httpd php php-mysql
yum install -y php-mbstring-5.4.16-36.el7_1.x86_64.rpm (要先下載此包)
wget phpMyAdmin-4.4.15-all-languages.tar.bz2
未完,待續.....
本文轉自rshare 51CTO部落格,原文連結:http://blog.51cto.com/1364952/1955624,如需轉載請自行聯絡原作者
相關文章
- 滴滴 Elasticsearch 多叢集架構實踐Elasticsearch架構
- Apache Kafka – 叢集架構ApacheKafka架構
- MySQL叢集架構:MHA+MySQL-PROXY+LVS實現MySQL叢集架構高可用/高效能MySql架構
- 構建MHA實現MySQL高可用叢集架構MySql架構
- 基於 Nginx 的大型網際網路叢集架構與實戰方案Nginx架構
- ARM架構安裝Kubernetes叢集架構
- vivo 容器叢集監控系統架構與實踐架構
- MongoDB中的分散式叢集架構MongoDB分散式架構
- 架構實戰架構
- 安裝Greenplum 5.2 叢集實戰
- KubeSphere 部署 Kafka 叢集實戰指南Kafka
- 【Redis叢集實戰】Redis Cluster 部署Redis
- Jenkins叢集下的pipeline實戰Jenkins
- java商城系統架構之第三篇——叢集架構搭建Java架構
- PB級資料實時查詢,滴滴Elasticsearch多叢集架構實踐Elasticsearch架構
- 管理 ES 叢集:Hot & Warm 架構與 Shard Filtering架構Filter
- KubeSphere 最佳實戰:Kubernetes 部署叢集模式 Nacos 實戰指南模式
- 老闆:把系統從單體架構升級到叢集架構!架構
- 部署rabbitMQ映象叢集實戰測試MQ
- KubeSphere 最佳實戰:K8s 構建高可用、高效能 Redis 叢集實戰指南K8SRedis
- 保障IDC安全:分散式HIDS叢集架構設計分散式架構
- 『高階篇』docker之Mesos叢集架構圖(23)Docker架構
- dubbo原始碼解析-叢集容錯架構設計原始碼架構
- Kubernetes 叢集日誌 和 EFK 架構日誌方案架構
- 架構師必備:Redis的幾種叢集方案架構Redis
- 微服務實戰之春雲與刀客(四)——dockerswarm叢集實戰微服務DockerSwarm
- 架構設計|基於 raft-listener 實現實時同步的主備叢集架構Raft
- Nginx 高階篇(十一)叢集搭建實戰Nginx
- .NET Core+MongoDB叢集搭建與實戰MongoDB
- MySQL 8 大叢集架構的優缺點總結MySql架構
- Mysql實戰:基礎架構MySql架構
- redis 叢集構建Redis
- Kubernetes實戰:高可用叢集的搭建和部署
- 基於SpringCloud的Microservices架構實戰案例-架構拆解SpringGCCloudROS架構
- Kubernetes/K8s架構師實戰集訓營【高階班】K8S架構
- JAVA架構-使用redis叢集輕鬆應對大併發Java架構Redis
- 容器叢集監控系統架構如何對症下藥?架構
- Rancher首席架構師解讀Fleet:它何以管理百萬叢集?架構
- Mysql學習筆記---MySQL叢集架構之擴容方案MySql筆記架構