要使得 Mariadb Galera Cluster 的节点能够进行数据同步,各节点之间必须能够互相通信。这需要各节点能够解析彼此的域名并能访问相应的网络端口。因为 cluster 中节点的域名和 IP 地址是因具体环境而异的,因此将这些信息定义在 environment 文件里。
清单 5. environments/test.json,定义 cluster 成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{ "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,域名解析和开启端口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
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` ]" end end bash "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 EOF end
配置 Mariadb Galera Cluster
在 Mariadb 中开启 Galera Cluster 需要修改相应的配置文件,通常是/etc/my.cnf.d/server.cnf。这里将所需配置预先定义为 template,然后用它覆盖原来的配置文件,如清单 7、清单 8 所示。
清单 7. templates/default/server.cnf.erb,Mariadb 配置文件
1 2 3 4 5 6 7 8
[galera] wsrep_on=ON wsrep_provider=/usr/lib64/galera/libgalera_smm.so wsrep_cluster_address=gcomm://<%= @node.mariadbp4.cluster.members.keys.join(',') %> binlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 bind-address=0.0.0.0
清单 8. recipes/default.rb,修改 Mariadb 配置文件
1 2 3 4 5 6 7
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
修改操作系统服务