利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb Galera Cluster
簡(jiǎn)介
Chef
Chef提供了一套自動(dòng)化安裝和配置軟件的工具。它允許開發(fā)者以模塊化的方式(cookbook)來定義軟件的安裝和配置流程(recipe),以及流程中的可定制參數(shù)(attribute)。當(dāng)需要在特定的環(huán)境中創(chuàng)建軟件服務(wù)時(shí),用戶指定模塊名稱以及相應(yīng)的參數(shù)值,Chef會(huì)負(fù)責(zé)在目標(biāo)環(huán)境中執(zhí)行預(yù)定義的安裝和配置流程。使用 Chef 需要安裝 Chef Server 以及 Chef Development Kit(ChefDK)。Chef Server 負(fù)責(zé)保存開發(fā)者提供的軟件安裝和配置流程定義,并在目標(biāo)機(jī)器上執(zhí)行。ChefDK 則是開發(fā)者用來定義軟件安裝和配置流程的工具。
Mariadb Galera Cluster
Mariadb Galera Cluster 是 Mariadb 提供的一種同步多主節(jié)點(diǎn)的集群模式。這種模式與傳統(tǒng)的 Maraidb Replication 功能的區(qū)別主要在于:
Galera Cluster 中的所有節(jié)點(diǎn)都在提供數(shù)據(jù)庫服務(wù)。而 Replication 模式下只有一個(gè)主節(jié)點(diǎn)在提供數(shù)據(jù)庫服務(wù),其余的 Slave節(jié)點(diǎn)雖然與主節(jié)點(diǎn)進(jìn)行數(shù)據(jù)同步,但在其成為主節(jié)點(diǎn)之前并不提供數(shù)據(jù)庫服務(wù)。
Galera Cluster 下的數(shù)據(jù)庫操作都是同步的,也就是當(dāng)一個(gè)事務(wù)結(jié)束時(shí),所有節(jié)點(diǎn)上都已經(jīng)包含了這一事務(wù)所做的修改。換言之,在任何一個(gè)時(shí)刻,集群中每個(gè)節(jié)點(diǎn)上的數(shù)據(jù)都是同步的。而在傳統(tǒng)的Replication 模式下,主從節(jié)點(diǎn)的數(shù)據(jù)同步是獨(dú)立于修改數(shù)據(jù)的事務(wù),同步通常存在一定的時(shí)間延遲。
部署準(zhǔn)備
準(zhǔn)備工作主要包括:
準(zhǔn)備至少三臺(tái)機(jī)器并安裝 RHEL(Red Hat Enterprise Linux)操作系統(tǒng)。這里的機(jī)器可以是物理機(jī)也可以是虛擬機(jī)。本文所使用的 RHEL 版本為 7.0,若使用 6.x 及以下版本,所使用的命令會(huì)略有不同。可以到Redhat 官網(wǎng)下載安裝介質(zhì)。
下載 Mariadb Galera Cluster 的安裝介質(zhì)。推薦使用 Mariadb10.1 以上的版本,因?yàn)閺倪@一版本開始,Galera Cluster 已經(jīng)被包含在 Mariadb Server ? ? ? ? ? ? ? ? ? ? ? ? 的安裝介質(zhì)中,而在以前的版本中則是作為獨(dú)立的安裝包下載的。可以從Mariadb 官網(wǎng)下載。
在一臺(tái)機(jī)器上安裝 Chef Server 以及 ChefDK,建議使用 Chef Server 12.6 和 ChefDK 0.14 及以上版本,安裝介質(zhì)可以從Chef 官網(wǎng)下載。
在 Chef Server 所在的機(jī)器上配置 yum 源以及 HTTP Server。這主要是針對(duì)在無法訪問 Internet 的環(huán)境下,能利用自己設(shè)立的 yum 源方便的安裝軟件。HTTP Server 可以使用 RHEL 自帶的 pache HTTP ?Server,或其他同類軟件。
自動(dòng)安裝流程
本文所描述的自動(dòng)安裝流程的目標(biāo)是在至少兩臺(tái)機(jī)器上安裝 Mariadb Galera Cluster,主要包含如下幾個(gè)步驟:
添加 Chef Server 上提供的 yum 源并安裝 Mariadb。
開啟 Cluster 節(jié)點(diǎn)之間的互相通信,主要是在操作系統(tǒng)上配置域名解析以及開放相應(yīng)的防火墻端口。
開啟 Galera Cluster。
修改操作系統(tǒng)上的 Mariadb 服務(wù)啟動(dòng)方式。注意雖然 Galera Cluster 里所有節(jié)點(diǎn)都可以同時(shí)提供數(shù)據(jù)庫服務(wù),但依照它們被加入 Cluster 的時(shí)間順序,第一個(gè)節(jié)點(diǎn)的啟動(dòng)方式和其余節(jié)點(diǎn)有所不同。
詳細(xì)實(shí)現(xiàn)
首先創(chuàng)建一個(gè)名為 mariadb-galera-cluster 的 cookbook 和名為 test.json 的 environment 文件,如清單 1 所示。創(chuàng)建 cookbook 會(huì)在當(dāng)前目錄下生成一個(gè)同名的目錄,后續(xù)定義的大部分文件都放在這個(gè)目錄下。environment 文件將包含所有針對(duì)當(dāng)前環(huán)境的參數(shù)值,例如當(dāng)前環(huán)境下節(jié)點(diǎn)的 IP 地址和域名。創(chuàng)建完成后的目錄結(jié)構(gòu)如清單 2 所示。
清單 1. ? ? ? ? ? ? ? ? 創(chuàng)建 cookbook 和 environment
knife cookbook create mariadb-galera-clustercat environments/test.json <<EOF{??"name": "test",??"description": "",??"cookbook_versions": {??},??"json_class": "Chef::Environment",??"chef_type": "environment",??"default_attributes": {??},??"override_attributes": {??}}EOF清單 2. 目錄結(jié)構(gòu)
安裝 Mariadb
利用在 Chef Server 機(jī)器上配置的 yum 源來安裝 Mariadb,需要在目標(biāo)機(jī)器的/etc/yum.repos.d ? 目錄下加入相應(yīng)的配置文件。將該配置文件的內(nèi)容預(yù)先定義在 mariadb-galera-cluster/templates/default/chef_server.repo.erb 中,如清單 2 所示。同時(shí),在 mariadb-galera-cluster/recipes/default.rb 中定義這一部分的安裝流程,如清單 3 所示。配置好 yum 源后,即可通過 yum 命令安裝預(yù)先下載好的 Mariadb 安裝介質(zhì)。
安裝完成后,可以執(zhí)行一些基本的數(shù)據(jù)庫初始化任務(wù),例如設(shè)置 root 用戶的密碼和權(quán)限,這些任務(wù)可以定義在一個(gè) sql文件中。另外也可以通過編輯/etc/my.cnf 對(duì) Mariadb 進(jìn)行一些基本的配置。全部完成后重啟 Mariadb 的服務(wù)。
清單 3. templates/default/chef_server.repo.erb,定義 yum 配置
[chef_server_repo]name=chef_server_repobaseurl=http://chefserver:80/yum_repoenabled=1gpgcheck=0sslverify=0清單 4. recipes/default.rb,安裝 Mariadb
template "/etc/yum.repos.d" do????????source "chef_server.repo.erb"????????owner 'root'????????mode 0755????????action :createend...execute "Install Mariadb" do????????command "yum clean metadata && yum -y install mariadb-server"end...bash "Config database settings..." do????????cwd "#{CWD}"????????user "root"????????group "root"????????code <<-EOF???????printf "\n[mysqld]\nlower_case_table_names=1" >> /etc/my.cnf????????systemctl enable mariadb.service????????systemctl start mariadb.service????????mysql < init.sql????????systemctl restart mariadb.service????????EOFend
開啟 Cluster 節(jié)點(diǎn)的相互通信
要使得 Mariadb Galera Cluster 的節(jié)點(diǎn)能夠進(jìn)行數(shù)據(jù)同步,各節(jié)點(diǎn)之間必須能夠互相通信。這需要各節(jié)點(diǎn)能夠解析彼此的域名并能訪問相應(yīng)的網(wǎng)絡(luò)端口。因?yàn)?cluster 中節(jié)點(diǎn)的域名和 IP地址是因具體環(huán)境而異的,因此將這些信息定義在 environment 文件里。
清單 5. environments/test.json,定義 cluster 成員
{??"name": "test",??"description": "",??"cookbook_versions": {????},??"json_class": "Chef::Environment",??"chef_type": "environment",??"default_attributes": {????"mariadb-galera-cluster": {????????"cluster": {????????????????"members": {????????????????????????"nodeA": "10.0.0.11",????????????????????????"nodeB": "10.0.0.12"????????????????},????????????????"master": "nodeA"????????}}}
清單 6. recipes/default.rb,域名解析和開啟端口
node['mariadbp4']['cluster']['members'].each_pair do |name, ip|????????bash "Resolve #{name} to #{ip}." do????????????????user "root"????????????????group "root"????????????????code <<-EOF????????????????name=#{name}????????????????echo "#{ip} ${name%%.*} $name" >> /etc/hosts????????????????EOF????????????????not_if "[ #{name} == `hostname -s` ]"????????endendbash "Open ports on OS firewall"????user "root"????group "root"????code <<-EOF????firewall-cmd --zone=public --add-service=mariadb --permanent????firewall-cmd --zone=public --add-port=3306/tcp --permanent????firewall-cmd --zone=public --add-port=4567/tcp --permanent????firewall-cmd --zone=public --add-port=4568/tcp --permanent????firewall-cmd --zone=public --add-port=4444/tcp --permanent????firewall-cmd --zone=public --add-port=4567/udp --permanent????firewall-cmd --reload?????EOFend
配置 Mariadb Galera Cluster
在 Mariadb 中開啟 Galera Cluster 需要修改相應(yīng)的配置文件,通常是/etc/my.cnf.d/server.cnf。這里將所需配置預(yù)先定義為template,然后用它覆蓋原來的配置文件,如清單 7、清單 8 所示。
清單7. templates/default/server.cnf.erb,Mariadb 配置文件
[galera]wsrep_on=ONwsrep_provider=/usr/lib64/galera/libgalera_smm.sowsrep_cluster_address=gcomm://<%= @node.mariadbp4.cluster.members.keys.join(',') %>binlog_format=rowdefault_storage_engine=InnoDBinnodb_autoinc_lock_mode=2bind-address=0.0.0.0
清單 8. recipes/default.rb,修改 Mariadb 配置文件
template "/etc/my.cnf.d/server.cnf" do????????source "server.cnf.erb"????????owner "root"????????mode 0644????????action :create????????not_if "grep '^wsrep_on=ON' /etc/my.cnf.d/server.cnf"end
修改操作系統(tǒng)服務(wù)
在 RHEL7 的中,操作系統(tǒng)服務(wù)是通過 systemd 來管理的,因?yàn)?Mariadb Galera Cluster 需要修改啟動(dòng) Mariadb時(shí)的參數(shù),因此需要對(duì) systemd 啟動(dòng) Mariadb 時(shí)所使用的命令進(jìn)行修改。因?yàn)?Mariadb Galera Cluster對(duì)第一個(gè)啟動(dòng)的節(jié)點(diǎn)(又稱為 master 節(jié)點(diǎn))需要采用特定的啟動(dòng)命令,因此這里準(zhǔn)備兩份 systemd 的配置文件,如清單 9、清單 10所示。在 recipe 中,首先判斷當(dāng)前節(jié)點(diǎn)是否 master 節(jié)點(diǎn),然后用相應(yīng)的配置文件作為當(dāng)前節(jié)點(diǎn)的 systemd 的 Mariadb服務(wù)啟動(dòng)配置文件。最后重啟 Mariadb 服務(wù)。
清單 9. templates/default/systemd.master.conf.erb,master節(jié)點(diǎn)的配置文件
[Service]ExecStart=ExecStart=/usr/sbin/mysqld --wsrep-new-cluster清單 10. templates/default/systemd.master.conf.erb,slave 點(diǎn)的配置文件
[Service]ExecStart=ExecStart=/usr/sbin/mysqld --wsrep_cluster_address=gcomm://<%= node.mariadbp4.cluster.master =%>清單 11. recipes/default.rb,修改 systemd 配置文件
master=node['mariadbp4']['cluster']['master']bash "Add cluster conf for mariadb service in systemd and restart service..." do????????cwd "/etc/systemd/system"????????user "root"????????code <<-EOF????????if [ ! -d "$service_name.d" ]; then????????????????mkdir "mariadb.service.d"????????fi????????if [ `hostname -s` == #{master} ]; then????????????????mv /tmp/master.conf mariadb.service.d/cluster.conf????????else????????????????mv /tmp/slave.conf mariadb.service.d/cluster.conf????????fi????????systemctl daemon-reload????????systemctl restart $service_name????????EOF????????not_if "[[ -f mysql.service.d/cluster.conf || -f mariadb.service.d/cluster.conf ]]"end安裝
首先將上面所定義部署流程上傳到 Chef Server,包括 cookbook 和 environment。然后告訴 Chef Server 在目標(biāo)機(jī)器上執(zhí)行相應(yīng)的部署流程,如清單 12 所示。這里 10.0.0.11 和 10.0.0.12 為組成 Cluster 的兩臺(tái)機(jī)器的 IP,注意執(zhí)行命令時(shí)請(qǐng)確保當(dāng)前目錄為 mariadb-galera-cluster 的上級(jí)目錄,
清單 12. 安裝 Mariadb Galera Cluster 所需命令
knife cookbook upload -a -o .knife environment from file environments/test.jsonknife bootstrap 10.0.0.11 -x root -P password -r "recipe[mariadb-galera-cluster]" -E testknife bootstrap 10.0.0.12 -x root -P password -r "recipe[mariadb-galera-cluster]" -E test
驗(yàn)證
要驗(yàn)證 Mariadb Galera Cluster 的運(yùn)行狀況,可以通過執(zhí)行如清單 13 所示的命令來實(shí)現(xiàn)。如果一切正常,可以看到如圖 1 所示的結(jié)果。
清單 13. 查看 Mariadb Galera Cluster 的運(yùn)行情況
mysql --user=root --password=xxxshow status like 'wsrep_%'
圖1. Mariadb Galera Cluster 的運(yùn)行狀態(tài)
小結(jié)
在企業(yè)級(jí)的應(yīng)用中,數(shù)據(jù)庫的高可用性是不可或缺的,而 Mariadb Galera Cluster 作為 Mariadb 自帶的 Cluster 功能,從功能上可以滿足用戶的這一要求。而本文所描述的自動(dòng)化部署步驟,可以快速的幫助用戶在多個(gè)節(jié)點(diǎn)上部署 Mariadb Galera Cluster,極大的節(jié)省了創(chuàng)建 Mariadb Galera Cluster 所需的時(shí)間。
轉(zhuǎn)載于:https://blog.51cto.com/xiaojielinux/1874048
總結(jié)
以上是生活随笔為你收集整理的利用 Chef 在 Red Hat Enterprise Linux 上自动化部署 Mariadb Galera Cluster的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 旧题复习{6}
- 下一篇: Android 源码解析之AsyncTa